
Departure
MyFitnessPal is for a database average. Strong is for people willing to tap through somebody else's workout model. I wanted the smaller, more useful thing: an app shaped around how I actually lift and eat. Three numbers for a set, four macro bars for the day, and a camera path for meals because typing food is where every nutrition tracker starts dying.
Approach
- Swift
- Gemini Vision
- Supabase
- AVFoundation
Phone-only — every entry has to be one-thumb-fast or I won't log it mid-set, and that's the whole game.
Field log
Generic trackers ask the body to fit the schema. I wanted the schema to fit the body. Three screens: log a set, log a meal, see the month.
Dumbbell Bench Press, SET 1: weight, reps, RIR. Three numbers, three taps. The schema for the entire app is essentially that row.
Picked Reps in Reserve instead of estimated 1RM. 1RM is a theoretical number; RIR is what I actually felt at the top of the set. Honesty in the moment beats a fiction I'd recompute later.
Photographing replaced typing. Aim at the label, let Gemini Vision extract the nutrition, then confirm the meal. The Fairlife bottle path was the important one: 150 kcal, 30g protein, no database search.
Calories, Protein, Carbs, Fat — four progress bars across the top of the Nutrition Log. Targets are mine, not a database default for a 30-year-old male.
The analytics view turned 30 days of sets into the thing I actually wanted to know: am I training evenly, and what am I avoiding? Leg day becomes harder to lie about when the month is drawn from your own rows.
Opened the Supabase dashboard and saw it all unfiltered. Typos and all — that's the truth of the week.
Sets per day, meals per day, macro intake — all three rolling averages dropped to exactly 0 for a week. That's Belize. The app did not need an excuse field; the missing rows were already honest.
From the gallery

What I came back with
Lesson from the terrain
Building a tracker for your own body is a different problem than building one for everyone's — there's no edge case I have to politely accommodate, no field I have to surface because some other user might want it. The radar is calibrated to my split, the macro targets are mine, meal_logs is full of the things I actually eat. The graph also remembers the things I didn't do — mid-July is just zero, and the zero is honest.