Zum Inhalt springen
Zurück zu den Projekten
Projekt

fuelivo

Live

Fueling für Ausdauerathleten - konkrete Strategien aus wenigen Eingaben.

fuelivo.de
Vorschau von fuelivo

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.

Problem

Ausdauersportler 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.

Rolle

Alles - Idee, Domänenrecherche, Berechnungslogik, Design, Backend, Web-Frontend und die native iOS-App. KI war dabei Entwicklungswerkzeug, nicht Autopilot.

Die Lösung

fuelivo 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.
Interaktiver Beweis

Deterministisch, keine Blackbox

Stell eine Session ein und sieh die Fueling-Ziele sofort neu berechnet - jede Zahl trägt ihre Begründung. Gleiche Eingaben ergeben immer dieselbe Ausgabe.

Intensität
Sportart
Hitze
pro Stunde
Kohlenhydrate85 g/h

Basis 60 · +15 Intensität · +10 Sportart

Flüssigkeit800 ml/h

Basis 700 · +100 Hitze

Natrium700 mg/h

Basis 600 · +100 Hitze

Vereinfachtes Modell der echten Engine - zeigt die Art der Begründung, nicht die exakten Gramm-Werte.

Echten Rechner öffnen
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
Architektur

FastAPI 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.
Herausforderungen

Die Kernformel migrieren, ohne Ergebnisse zu verfälschen

Problem

Das ursprüngliche multiplikative Modell sollte auf ein nachvollziehbareres additives Matrix-Modell umgestellt werden - ohne dass sich Empfehlungen unbemerkt verschieben.

Lösung

Beide 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

Problem

Pro-Zugang kann via Stripe im Web oder via Apple StoreKit auf iOS bestehen. Routen dürfen den Zahlungsstatus nie direkt prüfen.

Lösung

Ein 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

Problem

Zwei Clients an einer API: Vertragsbrüche fallen sonst erst spät und beim Nutzer auf.

Lösung

Eine dedizierte, versionierte Mobile-API mit OpenAPI-Spec und einem eigenen Contract-Check-Workflow. Drift wird schon im Pull Request erkannt.

Der Sportart-Spezialfall Schwimmen

Problem

Gel oder Riegel während der Einheit sind im Becken unpraktisch - generische Verpflegung ergibt keinen Sinn.

Lösung

Eine eigene Pool-Flaschen-Logik mit Kohlenhydratpulver und Elektrolyttablette samt Sip-Timing an der Wand, plus Elektrolyt-Warnung.

Verlauf
  1. 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.

  2. Ende März

    Reife

    CI-Workflows, OpenAPI-Contract-Check, Dokumentation und das neue Matrix-Rechenmodell neben der Legacy-Formel.

  3. April - Mai

    iOS & Billing

    Native SwiftUI-App, i18n und Accessibility, Apple-StoreKit-Abos und die vereinheitlichte Entitlement-Auflösung über Stripe und Apple.

  4. 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.