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:

supabase/migrations
-- 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.

Projekt in diesem Umfeld?

Ich baue Web-Apps und Tools auch in Nischen wie dieser. Kurze Mail mit dem Ziel genügt.

Projekt anfragen