A self-hosted health dashboard for my Apple Health data, plus a native iOS app that syncs everything to it automatically. Runs entirely on my homelab inside the home network — none of it is public.
The whole thing started after a heart rate incident in May 2026 — a reentry tachycardia, suddenly 160 bpm at rest. After that I wanted my numbers in front of me instead of digging through the Apple Health app, and to drop a few kilos at the same time. Apple Health has all the data, but it never shows you the thing you actually need right now. So I built my own dashboard.

The backend is a Symfony app on SQLite that reads the Apple Health export and turns it into something useful: resting heart rate, HRV and SpO2 as charts, a weight history with a projection calculator, a rough food log with a calorie calendar, my bike rides from the GPX files including map and elevation profile, plus lab values with reference ranges and supplements. It's multi-user, my wife is in there too. Charts come from Chart.js, maps from Leaflet, no build step, runs as a small container behind Traefik.
The weight part got a little out of hand: instead of a simple curve, the page now estimates my real daily expenditure across four different formulas, reconciles that against the actual deficit derived from the weight trend, and predicts when I'll hit my target weight. Overkill for a diet, but it was fun.

Importing the Apple Health export by hand got old fast, so there's a native iOS app in SwiftUI to go with it: one screen, one big SYNC button. The app pushes weight, heart rate, sleep and daily totals from HealthKit into the backend, and pulls the logged meals back into Apple Health as calories. Via HKObserverQuery and background delivery it also runs automatically in the background whenever new measurements come in — home network only, because the backend isn't reachable from outside.

The most fun part is the AI assistant. Instead of tediously typing in my food, I just write "skyr oat crunch apple and 2 peaches" into the chat, and an LLM with tool access looks up the items, adds up the calories and proposes the entry. The same in reverse: it knows my real daily expenditure, my dislikes and what I've already eaten today, and then suggests concrete meals that fit my deficit.
Since I'm sitting in Claude Code all day anyway, I also built the most common flows as Claude skills. That way I maintain the dashboard straight from the terminal: "I ate X today" logs the meal, "suggest something to eat" queries the backend data and makes a proposal, "I don't like X" updates my dislike list, and an import skill grabs the latest health export zip from iCloud and kicks off the import. For the standard stuff I don't even have to open the web UI.
Tech stack: Symfony 7.2, Doctrine, SQLite, Twig, Chart.js, Leaflet, SwiftUI, HealthKit, Docker, Traefik, Claude skills