FitTrack
A mobile-first way to log workouts and stay consistent.
Consistency needs a good log.
FitTrack is for people who want to record their workouts and keep a consistent routine. Staying consistent starts with tracking, and tracking has to be quick enough to do between sets on a phone.
The goal is a mobile-friendly experience for fitness tracking, backed by a real API and database so that data stays reliable and in sync.
A gym log, in your pocket.
Mobile app
Built with React Native and Expo, so most of the code is shared across platforms.
- Log a workout as exercises and sets, with weight, reps and a completed tick for each set
- Totals for volume, sets and muscle groups are worked out for you when a workout is saved
- A numeric keypad made for entering sets quickly
- An exercise library, training programs and body measurements
- A community feed, plus an onboarding flow for new users
Backend & media
A Node/Express API with MongoDB for data, and Cloudinary for media storage.
- REST API for app data
- MongoDB for users and workouts
- Cloudinary for images
Mobile front, containerised back.
The Expo app talks to an Express API over REST. The API and MongoDB run in Docker, and media goes to Cloudinary so the API stays light.
Three choices that shaped it.
One codebase, two platforms
React Native with Expo shares most of the code between Android and iOS, and Expo Go makes testing on a real phone fast during development.
Free for everyone
I removed the premium tier and payments so every feature is free to use.
Media off the server
Images go to Cloudinary, so the API and database only store references.
Inside Docker, localhost isn't where you think it is.
Inside a container, localhost points at that container itself, not at the MongoDB container next to it. I fixed the connection by treating the database as a service on a shared network:
- Run the API and MongoDB on the same Docker network
- Connect by service name, e.g.
mongodb://mongodb:27017/fittrack, instead oflocalhost - Keep the connection string in environment variables, so each environment gets the right value
What it taught me.
using React Native and Expo to share most of the code across platforms.
wiring the app, API and database carefully so data moves reliably.
how database connections, environment variables and container networking change behaviour between environments.