projects shipped

myFitTracker

A personal fitness tracker with natural language workout logging and a three-tier AI parsing system. Built for my own training, mobile-first and practically free to run.

I wanted a workout logger that got out of the way.

Most fitness apps want you to navigate menus, find exercises from dropdowns, set rep counts with spinners. By the time you have logged the set, the rest period is over. I wanted to type the way I think in the gym. “bench press 80kg 12 reps 3 sets”. And have it just work.

So I built it.

The interesting part is not the logging itself. It is the parsing architecture underneath it.

Natural language input sounds simple until you realise you need it to be fast, reliable, and cheap. A full AI call on every set adds latency and cost. So the system runs three tiers in sequence.

First, a local regex parser. It handles 60–80% of inputs instantly. Under 10ms, no API call, free. Common formats like bench 80kg 12x3 or squat 100 5x5 are resolved immediately.

Second, Google Gemini 2.0 Flash as the primary AI parser. Free tier covers 10 million requests per day. For anything the regex misses, Gemini handles it.

Third, OpenAI GPT-4o-mini as a fallback only. Costs roughly $0.001 per request and only fires when Gemini fails.

The result is a system that is fast for the common case, smart for the edge case, and costs less than a dollar a month to run.

Beyond parsing, the app tracks what I actually care about: personal records are detected automatically across max weight, reps, and volume. The app surfaces a PR the moment a new one is hit during a session. Post-workout summaries show muscle group breakdown, PR highlights, and a comparison to the previous session for the same exercises.

Progress trends are visible across sessions. The history is searchable and filterable. The reference modal shows previous weights for any exercise so I do not have to remember what I lifted last week.

This is one of those projects that started as a scratch-my-own-itch build and ended up being a proper application. The constraint of building only for myself meant every feature had to earn its place. There was no imaginary user to design for. That focus made the decisions easier.

Built with React, Convex for the real-time backend, Clerk for auth, and the Vercel AI SDK to unify the AI provider interface.