Diese Case Study beschreibt die technische Umsetzung einer App zum Erfassen und Visualisieren von Tagesdaten — konkret Temperaturwerte, Periodentage und freie Notizen — als Web-App (Next.js) und native iOS-App (SwiftUI) mit gemeinsamem Backend. Es geht ausschließlich um Architektur, Datenmodell und Auslieferung; die App ist ein Erfassungs- und Visualisierungs-Werkzeug ohne fachliche Bewertung der Daten.
Funktionsumfang
- Wert eintragen – tägliche Temperatur auf 0,01 °C genau erfassen
- Periodentage markieren – Start- und Endtage dokumentieren
- Freie Notiz – optionales Textfeld pro Tag für eigene Beobachtungen
- Kalender – Monatsübersicht mit markierten Tagen
- Temperaturkurve – interaktiver Chart mit Coverline als reiner Visualisierungs-Hilfslinie
- Verlaufsstatistik – durchschnittliche Abstände und Kurvenvergleich über mehrere Aufzeichnungen (Premium)
- Prognose – statistische Schätzung des nächsten Periodenbeginns aus der eigenen Historie (Premium)
- PDF-Export – Kurve und Werte als druckbarer Report (Premium)
Architektur: Hybrid-App
Die Web-App läuft als Next.js (App Router), die iOS-App als native SwiftUI-App. Beide teilen sich dasselbe Supabase-Backend (Auth + PostgreSQL). Vorteil: Web-Updates gehen sofort live, die iOS-App liefert native Performance.
Datenbankmodell
Vier Kerntabellen bilden das System ab:
-- 1. Profile mit Lifetime-Flag CREATE TABLE profiles ( id uuid PRIMARY KEY, has_lifetime_access boolean DEFAULT false, created_at timestamptz ); -- 2. Temperatureinträge (auf 0,01 °C genau) CREATE TABLE temperature_entries ( id uuid PRIMARY KEY, user_id uuid REFERENCES profiles, date date NOT NULL, temperature numeric(4,2), note text ); -- 3. Periodeneinträge CREATE TABLE period_entries ( user_id uuid, date date, PRIMARY KEY (user_id, date) ); -- 4. Berechnete Zyklen (Abstand Periode-zu-Periode) CREATE TABLE cycles ( id uuid PRIMARY KEY, user_id uuid, start_date date, end_date date, length integer );
iOS-App: 5 Tabs
Die native SwiftUI-App bietet dieselben Funktionen, organisiert in fünf Tabs:
- Dashboard – aktueller Tag, nächster prognostizierter Periodenbeginn, Quick-Actions
- Kalender – Monatsansicht mit markierten und prognostizierten Tagen (bei Lifetime)
- Anleitung – kurze Hilfe zur konsistenten Messung
- Eintrag – Temperatur, Periode und Notiz schnell erfassen
- Mehr – Profil mit „Lifetime"-Badge, Einstellungen, rechtliche Seiten
Die iOS-App zeigt keinen externen Kauf-Link in der Paywall (ALLOW_WEB_UPGRADE_LINK=NO) – konform zu Apples Richtlinien für In-App-Käufe.
Monetarisierung: Stripe Lifetime-Zugang
Bewusst einfach: Grundfunktionen (Wert eintragen, Periodentage markieren, Kalender) sind kostenlos. Premium kostet einmalig 9,99 € – kein Abo. Technisch über Stripe Checkout; nach Zahlung setzt der Webhook profiles.has_lifetime_access = true, und Premium ist auf Web und iOS sofort frei, weil beide dasselbe Supabase-Profil lesen.
Verlaufsberechnung
Die App erkennt Abstände automatisch anhand der Periodeneinträge. Aus den historischen Längen berechnet sie rein statistisch:
- Durchschnittlicher Abstand (Median der letzten Aufzeichnungen)
- Prognostizierter nächster Periodenbeginn (Median-basiert)
- Coverline (rein grafische Hilfslinie aus den tiefsten Werten vor dem Niveauwechsel)
Diese Größen sind Statistik über die eigenen Eingaben — Kalender-Mathematik, keine Bewertung und keine Empfehlung.
Tech Stack
- Web: Next.js (App Router), React, TypeScript
- iOS: SwiftUI, Swift
- Backend: Supabase (PostgreSQL + Auth + RLS)
- Payments: Stripe Checkout + Webhook
- Deployment: VPS / Plesk (Next.js Standalone)
Datenschutz
Persönliche Tagesdaten sind sensibel. Die App speichert alles in Supabase (Frankfurt/EU) mit Row Level Security: Jeder Account sieht ausschließlich die eigenen Daten. Kein Tracking, keine Analytics, keine Weitergabe an Dritte. Die rechtlichen Seiten werden dynamisch generiert.
→ Projekt ansehen: Basaltemperatur-Tracking – Projektdetails
→ Live: basaltemperatur.online
Sorgfalt bei der Messung — die häufigsten Fehlerquellen
Die Lesbarkeit einer Temperaturkurve steht und fällt mit standardisierten Bedingungen. Verbreitete Störfaktoren:
- Wechselnde Messzeit oder unterschiedlich langer Schlaf vor der Messung
- Wechselnder Messort oder wechselndes Thermometer
- Alkohol, erhöhte Temperatur, Schichtarbeit, Zeitzonenwechsel
- Zu frühe Deutung einzelner Werte statt des Musters über mehrere Tage
Solche Werte werden markiert, nicht gelöscht — eine ehrliche Kurve mit Lücken ist auswertbarer als eine geglättete.
Häufige Fragen
Was leistet die App inhaltlich?
Sie erfasst, visualisiert und exportiert Daten und rechnet statistische Verläufe. Sie bewertet die Daten nicht und gibt keine Empfehlungen.
Warum Hybrid statt nur Web oder nur App?
Web ermöglicht sofortige Updates und Reichweite, die native iOS-App bessere Performance/UX. Ein gemeinsames Backend hält beide konsistent.
Sind die Daten geschützt?
Daten liegen auf EU-Servern mit Zugriffsschutz pro Account, ohne Tracking oder Weitergabe (Details in der Datenschutzerklärung der App).
Hinweis: Diese Case Study beschreibt ein Software-Projekt (Erfassung und Darstellung eigener Daten). Sie trifft keine fachlichen Aussagen; die Einordnung von Daten ist Sache der Nutzer bzw. zuständiger Fachpersonen.
Fazit
Der Reiz des Projekts liegt im Hybrid-Ansatz: ein Datenmodell, zwei Clients, ein einfaches Lifetime-Monetarisierungsmodell. Die fachliche Deutung der Werte ist bewusst kein Bestandteil — die App ist Werkzeug zur Erfassung, Visualisierung und zum Export. Siehe auch Basalthermometer-Vergleich und die Projekt-Übersicht.