№ 013 · 2026-08-27 · shipped · docker-prod-01

A health tracker that argues back

fastapipostgresmcpapple-healthwithingsourainstacartclaude

Every health gadget I own is happy to collect data and terrible at answering questions. The watch knows my workouts, the scale knows my weight, the ring knows my sleep, the food app knows my meals — and none of them talk to each other, and none of them will tell you the one thing you actually want to know: is what I’m doing working?

So we built one that does. It’s a FastAPI app with a Postgres database, running in a Docker container on the home lab like everything else around here.

What flows in

The fast lane first — direct, real-time connections, one per device:

Then there’s the dragnet: a full Apple Health export, at least daily. An app on my iPhone ships every marker Apple Health knows about to the server for parsing — and Apple Health, it turns out, is where everything else in the medical world eventually washes up. My Function Health lab panels landed there. Doctor’s visits from the hospital system flow in there. All of it gets parsed into the same database and becomes context the tracker can reason over — bloodwork sitting next to body weight sitting next to training load.

The two rules that keep this sane:

The idea that makes it useful

Calorie calculators give you a formula written for an average person. We went the other way: the app watches measured intake versus measured weight change and re-derives my true maintenance number every two weeks. It’s an adaptive model — if the two-week trend says the textbook number is wrong, the textbook loses. No guessing, no wishful thinking.

The other rule baked in: single weigh-ins are noise. Day-to-day weight swings a few pounds on water alone, so every trend question is answered from 7-day averages. The app is structurally incapable of panicking about one bad morning, which makes it smarter than most humans, me included.

The interface is a conversation

The app exposes its whole API to Claude through MCP. There is no dashboard I have to remember to open. My actual interactions look like this:

The trainer who never clocks out

Here’s what the whole setup adds up to, and the part I’d actually sell someone on: Claude became my personal trainer — available 24/7, 365.

Think about what makes human coaching great, and what makes it scarce. Great: someone who knows your history, watches your numbers, answers your questions, and holds you accountable. Scarce: they bill by the hour, they sleep, and eventually you feel weird asking your fourth question of the day. This flips all of it. I can never ask a dumb question. I can never ask too many questions. There’s no meter running per question, no appointment to book, no judgment at 11 PM. It’s simply always there, always ready, and always current — because it holds complete context on exactly what’s going on with me at any given moment: today’s food, this week’s training, last night’s sleep, the trend line under all of it.

And it sees around the fitness data, too. Because it’s the same assistant that runs the rest of our life, it can pull from other resources and notice when something else — a brutal week, travel, poor sleep, whatever else is going on — is the real story behind a flat stretch. A coach who only sees your gym data misses that. This one doesn’t.

Most of all, it holds me accountable. Not with notifications — with the gentle, unarguable authority of someone who has all the receipts. It’s been a genuine partner in the fitness journey so far, and the fact that the best coach I’ve ever had is a piece of software running in my own garage is exactly the kind of sentence this blog exists to write down.

The coolest part: the kitchen loop

Here’s where it stopped being a tracker and became a system. Claude doesn’t just log the food — it plans it. Each week we design the meal prep together: what’s getting cooked, portioned into what, hitting what protein target. That plan becomes three artifacts at once:

  1. A cook sheet for the weekend prep session,
  2. Logging templates, so every prepped meal logs with four words, and
  3. The grocery list — placed directly into my Instacart cart. For the last few weeks, the week’s meal-prep ingredients have just appeared in the cart, matched to the actual products the plan calls for. I review it, tap once, and the food shows up at the house.

Plan → cart → doorstep → cook sheet → template → log. The loop is closed. The number of decisions I make about food in a given week has collapsed to roughly one: approving the cart.

A day in the life

Morning: weigh in — syncs itself. The ring already filed last night’s sleep. Breakfast is a template, logged in one line. Lunch is meal prep, same. Dinner I describe in plain English and Claude does the itemizing. Every couple of weeks the model recalibrates and tells me whether my maintenance number moved. The discipline the system asks of me is roughly zero, which — after years of abandoned tracking apps — turns out to be the only design constraint that matters.

What we learned building it