← Projects

Health App

Personal iOS tracker for lifts and nutrition, using Gemini to read meal-label photos for review.

Summer 2025 · iOS · Completed personal project

Three iOS Health App screens side by side: a dark-mode Dumbbell Bench Press set logger, a Nutrition Log with macro progress bars and meal list, and a Confirm Meal screen using a photo of a Fairlife bottle to extract nutrition details
The whole loop: log a set, track the day, scan the meal.

Stack

Stack: 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.

Log

  1. Summer 2025 — opening

    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.

  2. First lift logged

    Dumbbell Bench Press, SET 1: weight, reps, RIR. Three numbers, three taps. The schema for the entire app is essentially that row.

  3. RIR over 1RM

    Picked Reps in Reserve instead of estimated 1RM because it is more useful to me at the end of a set. Three numbers, three taps; that's the schema for the whole app.

  4. Pointing the camera at a Fairlife bottle

    Photographing replaced typing. Aim at the nutrition label, let Gemini Vision read the listed details, then review and confirm them before saving the meal. For the Fairlife shake, that meant 150 kcal and 30g protein without a database search.

  5. Macros, four bars

    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.

  6. Radar chart of the body

    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.

  7. meal_logs, raw

    Workout sets and confirmed meals landed in Supabase. I opened the dashboard and saw the rows unfiltered. Typos and all — that's the truth of the week.

  8. Mid-July, the gap

    For a week in mid-July, I logged no sets or meals, and the rolling averages fell to zero. The graph shows the gap in my logging; it doesn't need an excuse field.

Result

30-day training view, end-to-end on my own data.

What I learned

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.

Related