prd-helpMake your own PRD

Read-only PRD for a coding agent

Tägliche Gesundheits- und Stimmungsdaten sollen schnell festgehalten und über Wochen und…

18 of 18 sections ready

What Lotte learned

Ich fand den Kurs sehr interessant und spannend und hätte nicht erwartet, dass ich am ersten Tag schon eine App erstellen würde. Genau das habe ich aber getan und dann den Rest der Woche immer weiter daran gebastelt. Ein großes learning ist, Keine PRD von einer anderen App erstellt hier hochladen, wenn sie auf einem schon bestehenden Projekt mit Code aufbaut, da sich sonst das neue PRD eventuell auf den Code bezieht, welchen der Agent aber gar nicht zur Verfügung hat. Es ist besser hier mit Screenshots von Apps, die einem gefallen zu arbeiten, als zu versuchen alles mit Worten zu beschreiben.

1. Problem, goal & success metric

Problem: Tägliche Gesundheits- und Stimmungsdaten sollen schnell festgehalten und über Wochen und Jahre mit Garmin-Werten verglichen werden.

Ziel: Ein Check-in dauert unter 60 Sekunden; wöchentlich ist sichtbar, wie Stress, Schlaf und Stimmung zusammenhängen.

Erfolgsmaß: Check-in unter 60 Sekunden, gemessen mit Stoppuhr vom Öffnen der App bis zum Speichern, dreimal wiederholt, Median zählt (siehe Abnahme).

2. Users & roles

Nutzer:

  • Hauptsächlich du, plus einige wenige weitere Personen.
  • Jede Person hat ein eigenes Konto und getrennte Daten.
  • Gast-Modus ohne Konto; Konto nur für Cloud-Sicherung und Teilen mit eigenem Datenraum.

Rollen: Keine. Alle Nutzer sind gleichberechtigt; es gibt keine Admin-Rolle und niemand sieht die Daten anderer.

3. Core workflows

Kernabläufe:

  1. Check-in: Schnell-Check-in mit Stimmung, Symptomen, Momenten und Tagesnotizen.
  2. Tagesübersicht: Eintrag ansehen und bearbeiten.
  3. Analyse: Verlaufskarten mit 7 Tagen (Standard), 30 Tagen oder einem Jahr, inklusive Garmin-Werten.
  4. Sicherung und Export: nur nach ausdrücklichem Klick; die automatische Sicherung ist standardmäßig aus und wird vom Nutzer selbst aktiviert.
4. Features & requirements

Hintergrund anpassen:

  • Du wählst den Hintergrund der App in den Einstellungen.
  • Zur Auswahl stehen mehrere vorgegebene Muster, darunter das dezente Blütenmuster aus dem Screenshot, sowie Hell und Dunkel.
  • Die Auswahl bleibt gespeichert und gilt für alle Ansichten, auch nach dem Neustart der App.
  • Die fünf Stimmungsfarben bleiben bei jeder Hintergrundwahl gleich.
5. Scope: must / later / never

Muss:

  • Check-in und Tagesübersicht (lokal, Gast-Modus)
  • Garmin-Dienst mit Zugangsschlüssel auf dem eigenen Rechner
  • Garmin-Verlaufskarte (7 Tage Standard, 30 Tage, 1 Jahr)
  • Analysekarten und Krankheitsmodus
  • Export/Import (JSON-Datei zum Herunterladen, Konfliktauswahl pro Tag)
  • Konto mit Cloud-Sicherung und Freigabe über Firebase (kostenloser Tarif)
  • Hintergrund in den Einstellungen wählbar (vorgegebene Muster, Hell und Dunkel)

Später:

  • Garmin-Synchronisation unterwegs
  • App über das Internet erreichbar
  • Eigene Hintergrundbilder hochladen

Nie:

  • Daten anderer Personen ohne Freigabe sichtbar machen
  • Fotos hochladen
  • Garmin-Passwörter dauerhaft speichern
  • Admin-Rolle
  • Daten selbst ausdenken (keine Beispielwerte, keine Schätzungen oder Ersatzwerte für fehlende Garmin-Werte)
6. Screens & UI

Check-in (Schnell-Check-in): Fünf Stimmungsgesichter oben von Rot (schlecht) bis Grün (gut), darunter Emotionen als Chips nach Gruppen (positiv/negativ, energisiert/ruhig), Aktivitäten als Symbol-Raster, Tagebuch-Feld, Standort, Fotos (lokal), Schlaf- und Bewegungsregler.

Tagesübersicht: Tagesfarbe oben mit denselben fünf Stimmungsfarben von Rot bis Grün wie im Check-in; Einträge als Karten mit Uhrzeit, Chips und Standort; Verlauf als Linie.

Analyse: Verlaufskarten, Balkenvergleiche und Heatmaps in denselben fünf Stimmungsfarben von Rot bis Grün wie Check-in und Tagesübersicht; der Vergleich zwischen zwei Monaten erscheint als Umschalter.

7. Design system & visual style

Komponenten: Eigene Tailwind-Komponenten: abgerundete Pill-Chips für Emotionen, Aktivitäten und Personen (weiß auf dunklem Grund, Tönung je Person), farbige Balken und Verlaufskarten, weiche Karten mit dezentem Rand. Keine externe Komponentenbibliothek.

Ecken: Karten mit 12 px Radius, Chips komplett rund (Pill-Form).

Schrift: Systemschrift des Handys (sans-serif), ohne zusätzliche Schriftdateien.

Abstände: Mittlere Dichte, Abstände in 4-px-Schritten; nichts gedrängt.

Hintergrund: Dunkel mit dezentem Blütenmuster wie im Screenshot (images/WhatsApp-Image-2026-10-20-at-10.17.06.jpg); keine zusätzliche Dekoration.images/WhatsApp-Image-2026-10-20-at-10.17.06.jpg

Modus: Dunkel als Standard, Umschalter auf hell im Menü. Der Umschalter bleibt gespeichert. Die fünf Stimmungsfarben bleiben in beiden Modi gleich; nur der Hintergrund wechselt.

Heatmap-Zellen: Im hellen Modus dünner grauer Rand, 1 px. Im dunklen Modus kein Rand.

Farben (Hex): Stimmung von Rot (schlecht) über Gelb nach Grün (gut), Farben aus dem bestehenden Kalender-Projekt übernommen.

Ton: ruhig, zurückhaltend, sachlich, deutsch, ohne Gamification oder Wertung.

Vorbild: Screenshots der Analysen-Ansicht (images/WhatsApp-Image-2026-10-20-at-10.17.11-*.jpg) und der Check-in-Ansicht (images/WhatsApp-Image-2026-10-20-at-10.17.10.jpg).images/WhatsApp-Image-2026-10-20-at-10.17.10.jpg

8. Data model

Cloud-Sicherung (Konto, Firebase Firestore): alle eigenen Daten unter users/{uid}: Tageslogs (daily_logs), Einstellungen (settings) und eigene Listen (custom_*). Fotos sind nicht Teil der Cloud-Sicherung.

Freigaben: shares/{eintrag-id} mit Besitzer-uid, Verweis auf genau einen Tageseintrag und Liste der eingeladenen uids; nur Lesen für eingeladene Personen; Entzug löscht den Eintrag.

FeldTypPflicht
uidTextja
Tageslogs (daily_logs)Sammlungnein
Einstellungen (settings)Objektnein
eigene Listen (custom_*)Liste je Typnein
Freigabe (shares)Sammlung je Tageseintragnein
9. APIs & integrations

Garmin-Dienst (eigener Rechner):

  • Der Dienst server/garmin-api.js (Node/Express) wird neu angelegt; die Datei existiert im Projekt noch nicht.
  • Er nutzt den persönlichen API-Zugang von Garmin (vom Garmin-Konto erstellt) und ruft darüber deine Tageswerte ab.
  • Ein Login mit Konto-Passwort entfällt vollständig.
  • Der Zugang wird einmal eingerichtet; der API-Schlüssel muss je nach Einstellung bei Garmin alle 1 Monat bis 1 Jahr erneuert werden.
  • Er bündelt die benötigten Tageswerte und liefert Jahresdaten in einer einzigen Anfrage als kompakte Liste zurück.
  • Enthalten sind je Tag: Stress (Ø, 0–100), Schlaf, Schritte, Ruhepuls. Fehlende Werte sind als fehlend markiert, nicht geschätzt.
  • Der Zugang zum Dienst selbst erfolgt über den selbst gewählten Zugangsschlüssel bei jeder Anfrage.
  • Annahme: Der persönliche API-Zugang liefert die genannten Werte und die Bündelung in einer Anfrage gelingt. Gilt, bis der Test am echten Konto (Build-Reihenfolge, Schritt 1) sie bestätigt.
10. Auth, permissions & security

Garmin-Zugang:

  • Der Garmin-Dienst nutzt den persönlichen API-Zugang von Garmin; ein Login mit Konto-Passwort entfällt.
  • Garmin-Passwörter werden nicht im Dienst verwendet oder gespeichert.
  • Jede Anfrage an den Garmin-Dienst braucht den selbst gewählten Zugangsschlüssel, den nur du kennst.
  • Die Zugangsdaten des persönlichen API-Zugangs liegen ausschließlich lokal auf deinem Rechner (nicht im Projekt-Code, nicht im Repository).
  • Der API-Schlüssel von Garmin läuft nach der vom Nutzer bei Garmin gewählten Dauer (1 Monat bis 1 Jahr) ab und muss dann erneuert werden; der Dienst meldet den Ablauf statt Werte zu liefern.
  • Die Einrichtung erfolgt einmal; die Erneuerung ist die einzige regelmäßige Handlung.
11. Performance, privacy & accessibility

Datenschutz:

  • Sicherung und Export starten nur nach ausdrücklichem Klick, außer der Nutzer hat den automatischen Sicherungs-Schalter selbst aktiviert (Standard: aus).
  • Fotos bleiben auf dem Gerät und werden nicht hochgeladen.
12. Edge cases & errors

Garmin-API-Schlüssel läuft bald ab:

  • Sobald der Schlüssel unter 14 Tage gültig ist, zeigt die App eine Meldung mit der verbleibenden Anzahl Tage.
  • Die Meldung erscheint beim Öffnen der App, bis der Schlüssel erneuert ist.
  • Test: Mit einem Schlüssel, der in 10 Tagen abläuft, App öffnen; die Meldung mit „10 Tage“ erscheint.

Garmin-Dienst nicht erreichbar:

  • Die App zeigt eine kurze Meldung mit der wahrscheinlichen Ursache (Rechner aus, Heimnetz getrennt, Zugangsschlüssel falsch).
  • Check-in, Tagesübersicht und Analyse ohne Garmin-Werte bleiben vollständig nutzbar.
  • Fehlende Garmin-Werte werden als „fehlt“ markiert, nicht als Null.
  • Test: Dienst auf dem Rechner beenden, Analyse öffnen; Meldung erscheint, übrige Funktionen laufen weiter.

Garmin-API-Schlüssel abgelaufen:

  • Der Dienst erkennt den abgelaufenen Schlüssel und zeigt eine Meldung mit dem Hinweis zur Erneuerung bei Garmin.
  • Die Meldung ist klar von einem Ausfall des Rechners unterscheidbar.
  • Test: Mit abgelaufenem Schlüssel Analyse öffnen; Erneuerungshinweis erscheint, übrige Funktionen laufen weiter.
13. Stack & constraints

Frontend: Vite + React + Tailwind, als PWA installierbar; Android-Build über Capacitor.

Konto und Cloud: Firebase Auth und Firestore im kostenlosen Tarif, nur mit Konto. Gast-Modus ausschließlich lokal im Gerät.

Garmin-Dienst: Node/Express-Dienst (server/garmin-api.js, neu anzulegen) auf deinem eigenen Rechner, Port 3000, erreichbar im Heimnetz. Kein gehosteter Server.

Einschränkungen: Bestehendes Kalender-Projekt bleibt erhalten; Farben und Stimmungsfarben werden übernommen. Die bestehende Projektstruktur ist vor dem Bau zu prüfen, da die Dateipfade hier nicht belegt sind.

14. Existing code & do-not-change

Bestehender Code: Vorhandenes Kalender-Projekt mit Farben und Stimmungsfarben, die übernommen werden.

Tabu ohne Rückfrage: Bestehende Dateien nicht umbenennen oder löschen. Farben und Stimmungsfarben nur übernehmen, nicht umbauen.

15. Build order
  1. Garmin-Jahresabruf am echten Konto prüfen – Erst server/garmin-api.js anlegen; Ein Jahr Tageswerte in einer Anfrage unter 2 Sekunden. Ergebnis dokumentieren, bevor weitergebaut wird. Scheitert der Test, wird die 2-Sekunden-Vorgabe neu bewertet.
  2. Check-in und Tagesübersicht lokal – Gast-Modus, Schnell-Check-in, Momente, Tagesübersicht mit Bearbeitung. Läuft allein ohne Netz.
  3. Garmin-Dienst mit Zugangsschlüssel – Node/Express auf dem eigenen Rechner, Schlüssel bei jeder Anfrage, Demo-Fallback, Fehlerdiagnose, MFA-Code.
  4. Konto und Cloud-Sicherung – Firebase Auth und Firestore, users/{uid}, Offline-Nachholen mit echtem Konto testen, Backup-Abbruch-Regel.
  5. Analysekarten, Krankheitsmodus, Export/Import – Analysekarten, Garmin-Verlaufskarte, Krankheitsmodus, Export/Import mit Konfliktmeldung.
16. Acceptance criteria & tests

Abnahmetests (je Muss-Punkt ein Test):

  • Check-in: Auf dem eigenen Handy mit der installierten App; Stoppuhr vom Öffnen bis zum Speichern, dreimal messen, Mittelwert unter 60 Sekunden.
  • Tagesübersicht: Einen Eintrag öffnen, ändern, speichern; die Änderung ist danach sichtbar.
  • Garmin-Dienst: Mit richtigem Zugangsschlüssel liefert eine Anfrage Werte; mit falschem Schlüssel wird abgelehnt.
  • Garmin-Schlüssel läuft bald ab: Mit einem Schlüssel unter 14 Tagen Restlaufzeit erscheint beim Öffnen die Meldung mit der Anzahl Tage und bleibt bis zur Erneuerung sichtbar.
  • Garmin-Verlaufskarte: Umschalter 7 Tage, 30 Tage, 1 Jahr zeigt jeweils den passenden Zeitraum; fehlende Werte sind als „fehlt“ markiert.
  • Analysekarten und Krankheitsmodus: Ein als krank markierter Tag fließt nicht in die Durchschnitte ein.
  • Export/Import: Export lädt eine JSON-Datei mit Exportdatum im Namen herunter; Import dieser Datei mit einem Konflikt zeigt beide Einträge, ohne Auswahl bleibt der bestehende.
  • Konto und Cloud-Sicherung: Nach Anmeldung speichert ein Eintrag in Firebase; in einem zweiten Konto ist er nicht sichtbar, solange er nicht freigegeben ist.
  • Freigabe: Eine eingeladene Person sieht den freigegebenen Eintrag, kann ihn nicht ändern; nach Entzug sieht sie ihn nicht mehr.
  • Garmin-Ausfall: Bei abgeschaltetem Dienst erscheint eine Meldung mit Ursache; Check-in und Tagesübersicht funktionieren weiter.
  • Hintergrund wählen: In den Einstellungen ein anderes Muster wählen; die Auswahl ist nach dem Neustart der App noch da und die Stimmungsfarben bleiben gleich.
17. Deployment, environments & secrets
  • Jetzt: Der Garmin-Dienst läuft nur auf dem eigenen Rechner, Port 3000, erreichbar im Heimnetz über dessen Adresse (z. B. http://192.168.1.20:3000).
  • Jeder Zugriff braucht den selbst gewählten Zugangsschlüssel.
  • Unterwegs: Die App auf dem Handy funktioniert ohne Rechner (Check-in, Cloud-Sicherung); Garmin-Werte erscheinen nur, wenn der Rechner zu Hause läuft und erreichbar ist.
  • Später: App als echte PWA über das Internet erreichbar und Garmin-Synchronisation auch unterwegs; dafür wäre ein Server oder ein sicherer Zugang nötig (nicht im Umfang).
18. Open questions & assumptions
  • Beantwortet: Export als JSON-Datei zum Herunterladen, Import liest genau diese Datei.
  • Beantwortet: Garmin-Synchronisation unterwegs ist nicht im Muss-Umfang; unterwegs funktionieren Check-in und Cloud-Sicherung ohne Rechner.
  • Beantwortet: Automatische Sicherung ist standardmäßig aus; der Nutzer aktiviert sie selbst.
  • Beantwortet: Analysekarten, Krankheitsmodus, Verlaufskarte und Design wie besprochen.
  • Beantwortet: Export-Datei landet im Downloads-Ordner des Browsers, Dateiname mit Exportdatum.
  • Beantwortet: Garmin-Zugang läuft über den persönlichen API-Zugang; Login mit Konto-Passwort entfällt.
  • Beantwortet: Der Zugang wird einmal eingerichtet; der API-Schlüssel muss je nach Garmin-Einstellung alle 1 Monat bis 1 Jahr erneuert werden.
  • Annahme: Der persönliche Garmin-API-Zugang liefert die Ein-Jahres-Daten in einer Anfrage; gilt bis zum Test am echten Konto (Build-Reihenfolge, Schritt 1).
  • Annahme: Die lokale Konfiguration bleibt nach einem Neustart des Dienstes erhalten; die Erneuerung des API-Schlüssels bei Ablauf ist davon getrennt.

Images

WhatsApp-Image-2026-10-20-at-10.17.06-1-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.06-1-.jpg
WhatsApp-Image-2026-10-20-at-10.17.06.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.06.jpg
WhatsApp-Image-2026-10-20-at-10.17.07.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.07.jpg
WhatsApp-Image-2026-10-20-at-10.17.08.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.08.jpg
WhatsApp-Image-2026-10-20-at-10.17.10-1-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.10-1-.jpg
WhatsApp-Image-2026-10-20-at-10.17.10-2-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.10-2-.jpg
WhatsApp-Image-2026-10-20-at-10.17.10.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.10.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-1-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-1-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-2-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-2-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-3-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-3-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-4-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-4-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-5-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-5-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-6-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-6-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11-7-.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11-7-.jpg
WhatsApp-Image-2026-10-20-at-10.17.11.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.11.jpg
WhatsApp-Image-2026-10-20-at-10.17.12.jpg
images/WhatsApp-Image-2026-10-20-at-10.17.12.jpg