Fittracker is a full-stack app to keep track of your training and what you eat on the same dashboard. I built it to scratch my own itch: I wanted one place to log a workout, write down what I cooked, and see how both things were going over time without juggling two or three different apps.
Stack: React + Vite on the frontend, Node + Express + MongoDB on the backend, deployed on Fly.io.
- Auth: register / login with JWT, bcrypt for passwords.
- Workouts: create routines, log sessions, see history.
- Exercises: catalog of exercises reused across routines.
- Calendar: every training day and every meal in a monthly view.
- Food & Recipes: search a food database, log meals, save your own recipes with a rich-text editor.
- Profile: edit your info and stats.
- Charts:
rechartsfor quick visual feedback over time.
Backend (api/)
- Node.js + Express
- MongoDB + Mongoose
- JWT auth, bcrypt
- nodemon for local dev
Frontend (web/)
- React 18 + Vite
react-router-domv6axiosfor the API layerrecharts(progress charts)react-calendar(calendar view)- TinyMCE (recipe editor)
dayjsfor dates
# Backend
cd api
npm install
npm run dev # http://localhost:3000
# Frontend (another terminal)
cd web
npm install
npm run dev # http://localhost:5173You'll need a .env inside api/ with at least MONGO_URI and JWT_SECRET.
The app is deployed on Fly.io. The repo ships with a Dockerfile and fly.toml that build the backend and serve the frontend static bundle.
fly deployLive: fit-tracker.fly.dev
Fittracker/
├── api/ # Express API
│ ├── controllers/ # user, workout, exercise, food, recipe, calendarEntry
│ ├── models/
│ ├── routes/
│ └── index.js
├── web/ # React + Vite
│ ├── src/
│ │ ├── pages/
│ │ ├── components/
│ │ └── services/
│ └── vite.config.js
├── Dockerfile
└── fly.toml
Fittracker is the V1. The follow-up is gymtrackerv2, where I rebuilt the gym side of the app with a better routine builder (drag-and-drop), in-session tracking and a cleaner stack (React 19, Zustand, Tailwind v4, split fly.io apps for frontend/backend).