fuelivo ist ein regelbasierter Rechner für Sporternährung. Ausdauersportler und Trainer geben Session-Parameter ein - Gewicht, Dauer, Intensität, Sportart, Bedingungen - und bekommen konkrete Kohlenhydrat-, Natrium- und Flüssigkeitsziele in g, ml und mg, aufgeteilt auf vor, während und nach der Einheit. Die Empfehlungen sind bewusst deterministisch: keine Blackbox, jede Ausgabe trägt eine Begründung und Warnhinweise. Backend, Web-App und eine native iOS-App teilen sich dieselbe Logik.
ProblemAusdauersportler müssen im Training und Wettkampf gezielt Kohlenhydrate, Flüssigkeit und Elektrolyte zuführen - zu wenig führt zum Leistungseinbruch, zu viel oder das Falsche zu Magen-Darm-Problemen. Die richtige Menge hängt von vielen Faktoren gleichzeitig ab: Dauer, Intensität, Sportart, Hitze, Magentoleranz. Pauschale Faustregeln wie '60 g Kohlenhydrate pro Stunde' ignorieren das, generische Ernährungs-Apps rechnen Tagesbilanzen statt Sessions, und KI-Coaches liefern Empfehlungen, die man nicht nachvollziehen kann.
RolleAlles - Idee, Domänenrecherche, Berechnungslogik, Design, Backend, Web-Frontend und die native iOS-App. KI war dabei Entwicklungswerkzeug, nicht Autopilot.
Die Lösungfuelivo bildet publizierte Sporternährungs-Heuristiken als deterministische Regel-Engine ab. Für jede Session werden Ziele pro Stunde berechnet, auf die Gesamtdauer hochgerechnet und in konkrete Produkte übersetzt - Getränk, Gel, Riegel, Banane. Jeder Rechenschritt erzeugt einen Klartext-Grund, Grenzfälle erzeugen Warnungen. Es positioniert sich bewusst als Sportwissenschafts-Rechner, nicht als KI-Coach.
- Kohlenhydrate pro Stunde: ein Basiswert aus der Dauer plus additive Modifikatoren für Intensität, Sportart und Hitze, gedeckelt durch eine Toleranz-Matrix aus Magenempfindlichkeit und Magentraining.
- Flüssigkeit und Natrium pro Stunde, je nach Intensität und Sportart, optional durch eine gemessene Schweißrate übersteuert.
- Drei Phasen: Aufladen vorher, getaktete Zufuhr während, Recovery mit Protein danach - plus ein Race-Schedule mit Aid-Station-Timing.
- Die Gesamtmenge wird in einkaufsfertige Produkte übersetzt: je nach Verpflegungszugang reines Getränk, Getränk plus Gel oder ein Realkost-Mix.
- Eigene Engines für Gym-Training und Race-Day, weil deren Rechenmodelle grundlegend anders sind - getrennt gehalten für unabhängige Wartbarkeit.
Features- Öffentlicher Rechner ohne Loginfertig
- Transparente Begründung und Warnhinweisefertig
- Drei-Phasen-Empfehlung (vor, während, nach)fertig
- Konkrete Produkt-Optionen pro PhaseProfertig
- Race-Plan mit Aid-Station-TaktungProfertig
- Gym- und Kraft-Rechnerfertig
- Athleten-Dashboard mit HistorieProfertig
- Coach-Portal mit Roster und VorlagenCoachfertig
- Auth, Google-OAuth und Sign in with Applefertig
- Stripe- und Apple-StoreKit-Abosfertig
- i18n Deutsch/Englischfertig
- Native iOS-Appfertig
ArchitekturFastAPI liefert eine Jinja2-Shell aus, die die gebaute React-SPA lädt und Auth- und Entitlement-Status direkt ins HTML injiziert - kein zusätzlicher Roundtrip. Die iOS-App spricht dieselbe Domänenlogik über eine dedizierte, versionierte Mobile-API. Innen gilt durchgängig Route → Service → Repository.
- Route → Service → Repository: dünne Routen, testbar isolierte Geschäftslogik, beim zweiten Client wiederverwendbar.
- Berechnungszeilen sind append-only - ein unveränderlicher Audit-Trail statt mutierter Datensätze.
- State-mutierende POSTs sind mit einem Double-Submit-CSRF-Token abgesichert.
- Sentry, PostHog und die DB sind fail-open: fehlende Config blockiert den lokalen Start nicht.
- Ein Contract-Check in der CI verhindert, dass Backend und iOS-App auseinanderdriften.
HerausforderungenDie Kernformel migrieren, ohne Ergebnisse zu verfälschen
ProblemDas ursprüngliche multiplikative Modell sollte auf ein nachvollziehbareres additives Matrix-Modell umgestellt werden - ohne dass sich Empfehlungen unbemerkt verschieben.
LösungBeide Modi bleiben im Code, umschaltbar per Env-Flag, mit einem Shadow-Compare-Modus zum Parallelvergleich. Die Umstellung war risikoarm, die alte Logik bleibt reproduzierbar.
Ein Entitlement-Modell über zwei Zahlungswelten
ProblemPro-Zugang kann via Stripe im Web oder via Apple StoreKit auf iOS bestehen. Routen dürfen den Zahlungsstatus nie direkt prüfen.
LösungEin zentraler Entitlement-Service löst Free, Pro und Coach über beide Anbieter hinweg auf - eine einzige Quelle der Wahrheit für Feature-Flags.
Backend und native iOS-App synchron halten
ProblemZwei Clients an einer API: Vertragsbrüche fallen sonst erst spät und beim Nutzer auf.
LösungEine dedizierte, versionierte Mobile-API mit OpenAPI-Spec und einem eigenen Contract-Check-Workflow. Drift wird schon im Pull Request erkannt.
Der Sportart-Spezialfall Schwimmen
ProblemGel oder Riegel während der Einheit sind im Becken unpraktisch - generische Verpflegung ergibt keinen Sinn.
LösungEine eigene Pool-Flaschen-Logik mit Kohlenhydratpulver und Elektrolyttablette samt Sip-Timing an der Wand, plus Elektrolyt-Warnung.
Verlauf- März 2026
Fundament
In wenigen Wochen entstehen Rechen-Engine, Web-SPA, Auth, Billing und Coach-Portal - 257 der 269 Commits fallen in diesen Monat.
- Ende März
Reife
CI-Workflows, OpenAPI-Contract-Check, Dokumentation und das neue Matrix-Rechenmodell neben der Legacy-Formel.
- April - Mai
iOS & Billing
Native SwiftUI-App, i18n und Accessibility, Apple-StoreKit-Abos und die vereinheitlichte Entitlement-Auflösung über Stripe und Apple.
- Juni
Feinschliff
Anpassung der Fueling-Dauergrenzen und letzte Politur; der letzte Commit fällt auf den 17.06.2026.
Was ich gelernt habe- Zum ersten Mal Backend, Web-Frontend und eine native iOS-App in einem Projekt vereint. Die saubere Schichtung hat sich beim zweiten Client ausgezahlt: die Logik war wiederverwendbar, nur die Transportschicht kam neu dazu.
- Zahlungen über zwei Welten - Stripe im Web und Apple StoreKit auf iOS - hinter einem einzigen Entitlement-Service: eine Quelle der Wahrheit für Feature-Flags.
- Eine versionierte Mobile-API mit OpenAPI und Contract-Check in der CI ist der Punkt, an dem 'Backend und App driften auseinander' aufhört, ein Problem zu sein.
- Erstes Projekt, das über ein einzelnes Python-Skript mit README hinausgewachsen ist - inklusive eigener Domain, DNS, CI/CD und Deployment.
- Beim nächsten Mal: ein klarer Deployment-Pfad statt parallel Docker und Vercel, und früher gemeinsame Typen zwischen Backend und iOS.