Departed Summer 2025
Health App
my body · iOS app · Shipped
[image: Three custom dark-mode iOS screens side by side — Dumbbell Bench Press logger with Weight/Reps/RIR for Set 1 and Set 2, Nutrition Log with Calories/Protein/Carbs/Fat progress bars and a Gemini Vision food-scan card, and a 30-day analytics screen with a six-axis muscle-distribution radar chart]
Departure
MyFitnessPal is for someone else's body — a fitness influencer's, a generic adult's, a database average. I wanted Josh-shaped: my lifts, my macros, my cadence, with no nag screens or paywalls between me and the numbers I just generated. Max personalization isn't a feature — it's what's left when you delete every assumption a generic app has to make about who you are.
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
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.
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.
[image: iOS dumbbell bench press logger in dark mode — Weight/Reps/RIR fields stacked for Set 1 and Set 2, large numeric keypad below]
The whole app, in three fields. RIR over 1RM
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.
Pointing the camera at a Fairlife bottle
Photographing replaced typing. Aim, snap, write to meal_logs. The only way logging survives a real day.
[image: Gemini Vision food-log card analyzing a Fairlife Chocolate Protein Shake bottle and extracting 150 kcal and 30g protein straight into the Nutrition Log]
150 kcal, 30g protein, no typing. 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.
[image: Nutrition Log screen — Calories, Protein, Carbohydrates, and Fat progress bars filling against personalized daily targets, list of today's logged meals beneath]
Radar chart of the body
Six axes — Back, Chest, Core, Shoulders, Arms, Legs — pulled from 30 days of sets. Leg day becomes undeniable when the polygon is visibly lopsided.
[image: Radar chart of 30-day muscle distribution: Back, Chest, Core, Shoulders, Arms, Legs, with the polygon stretched toward Back and Chest and clearly pinched on Legs]
The split, drawn by the data. meal_logs, raw
Opened the Supabase dashboard and saw it all unfiltered. Typos and all — that's the truth of the week.
[image: Supabase meal_logs table with logged rows including Scrambled Eggs with Gems and Mozzar, BelVita Crunchy Breakfast Biscuits, Bottled Beverage, Dried Apricots, and General Tso's Chicken with Rice — columns for id, created_at, title, calories, protein, fat, carbohydrates]
The backend doesn't lie about what I ate. Mid-July, the gap
Sets per day, meals per day, macro intake — all three rolling averages drop to exactly 0 for a week. That's Belize. The graph already remembered; the slide just had to admit it.
[image: Three charts on a pink background — 7-day rolling avg sets/day and meals/day line graphs both flatlining at 0 in mid-July, and a stacked area chart of daily macros (Protein, Carbs, Fat) collapsing to zero across the same window, with a large red circle around the gap and a red arrow labeled 'Vacation' pointing at it]
Belize, drawn as a hole.
From the gallery
[image: 30-day stats block — Workouts, Duration, Volume, and Sets totals stacked above the muscle-distribution radar on the analytics screen]
[image: Close-up of one Supabase meal_logs row — General Tso's Chicken with Rice, calories/protein/fat/carbohydrates filled in, created_at timestamped]
[image: Phone held one-handed mid-set in the gym, Dumbbell Bench Press logger open with Set 1 just confirmed]
What I came back with
30-day training view, end-to-end on my own data.
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.
Cross-links
This fed into / from