Portrait Michael Malura

Health Dashboard

Ein selbstgehostetes Health-Dashboard für meine Apple-Health-Daten, dazu eine native iOS-App, die alles automatisch dorthin synct. Läuft komplett im Heimnetz auf meinem Homelab, nichts davon ist öffentlich.

Angefangen hat das Ganze nach einem Herzfrequenz-Vorfall im Mai 2026 — eine Reentry-Tachykardie, plötzlich 160 bpm im Ruhezustand. Danach wollte ich meine Werte selbst im Blick haben statt mich durch die Apple-Health-App zu wühlen, und gleichzeitig ein paar Kilo loswerden. Apple Health hat zwar alle Daten, zeigt sie aber nie so, dass man das sieht, was man gerade braucht. Also hab ich mir mein eigenes Dashboard gebaut.

Health-Dashboard im Browser mit Charts für Ruhepuls, HRV, Gewicht und gefahrene Kilometer
Health-Dashboard im Browser mit Charts für Ruhepuls, HRV, Gewicht und gefahrene Kilometer

Das Backend ist eine Symfony-App mit SQLite, die den Apple-Health-Export einliest und alles aufbereitet: Ruhepuls, HRV und SpO2 als Charts, Gewichtsverlauf mit einem Prognose-Rechner, ein grobes Essens-Log mit Kalorien-Kalender, meine Radtouren aus den GPX-Dateien inklusive Karte und Höhenprofil, dazu Laborwerte mit Referenzbereichen und Supplemente. Das Ganze ist Multi-User, meine Frau hängt mit drin. Die Charts kommen von Chart.js, die Karten von Leaflet, kein Build-Step, läuft als kleiner Container hinter Traefik.

Der Gewichts-Teil ist mir ein bisschen aus dem Ruder gelaufen: statt einer simplen Kurve rechnet die Seite jetzt meinen realen Tagesumsatz über vier verschiedene Formeln, gleicht das gegen das echte Defizit aus dem Gewichtstrend ab und prognostiziert, wann ich mein Zielgewicht erreiche. Klingt übertrieben für eine Diät, hat aber Spaß gemacht.

Gewichts-Seite mit Umsatz- und Prognose-Rechner über vier Formeln
Gewichts-Seite mit Umsatz- und Prognose-Rechner über vier Formeln

Das Einlesen des Apple-Health-Exports von Hand hat schnell genervt, also gibt es dazu eine native iOS-App in SwiftUI: ein Screen, ein fetter SYNC-Button. Die App schiebt Gewicht, Herzfrequenz, Schlaf und Tagessummen aus HealthKit ins Backend und holt im Gegenzug die geloggten Mahlzeiten als Kalorien zurück nach Apple Health. Per HKObserverQuery und Background-Delivery läuft das auch automatisch im Hintergrund, sobald neue Messungen anfallen — nur im Heimnetz, weil das Backend nicht öffentlich erreichbar ist.

Essens-Log mit Schnell-Presets, Tagesbudget und 7-Tage-Übersicht
Essens-Log mit Schnell-Presets, Tagesbudget und 7-Tage-Übersicht

Der spannendste Teil ist der KI-Assistent. Statt mein Essen mühsam einzutippen, schreib ich einfach "skyr haferflocken crunch apfel und 2 pfirsiche" in den Chat, und ein LLM mit Tool-Zugriff sucht die Lebensmittel raus, rechnet die Kalorien zusammen und schlägt mir den Eintrag vor. Dasselbe in der anderen Richtung: es kennt meinen realen Tagesumsatz, meine Abneigungen und was ich heute schon gegessen hab, und schlägt mir dann konkrete Mahlzeiten vor, die zu meinem Defizit passen.

Weil ich eh den ganzen Tag in Claude Code hänge, hab ich die wichtigsten Abläufe zusätzlich als Claude-Skills gebaut. Damit pflege ich das Dashboard direkt aus dem Terminal: "ich hab heute X gegessen" trägt die Mahlzeit ein, "schlag mir was zu essen vor" fragt die Backend-Daten ab und macht einen Vorschlag, "ich mag X nicht" pflegt meine Abneigungsliste, und ein Import-Skill holt die neueste Health-Export-Zip aus iCloud und startet den Import. So muss ich für die Standard-Sachen gar nicht erst die Weboberfläche aufmachen.

Tech-Stack: Symfony 7.2, Doctrine, SQLite, Twig, Chart.js, Leaflet, SwiftUI, HealthKit, Docker, Traefik, Claude-Skills