Read-only PRD for a coding agent
Überfordert von Terminen, To-dos, Training, Anfahrten, Mahlzeiten, Schlaf, Periode und…
What Sophia learned
- auf over-engeneering achten ist wichtig, vieles ist einfacher als KI es gestaltet - präzise Beschreibungen und Bilder sind der Schlüssel -> KI arbeitet besser nach deinen Vorstellungen, je mehr Gedanken du mit ihr teilst
1. Problem, goal & success metric
- Problem: Überfordert von Terminen, To-dos, Training, Anfahrten, Mahlzeiten, Schlaf, Periode und Energie an einem Ort zu planen und auszubalancieren.
- Ziel: Private Tracking- und Planungs-App für den persönlichen Alltag auf dem Handy.
- Erfolgsmessung: An mindestens 25 von 30 Tagen wird mindestens eine Aktivität eingetragen oder bearbeitet. App-Vorschläge für Terminplanung, Sporteinheiten, Alltagsroutinen und Gerichte werden mindestens 5-mal pro Woche angezeigt (Annahme ist freiwillig).
- Erfolgskriterium für den Coding-Agent: In den ersten 30 Tagen kann der Nutzer an jedem Tag mindestens eine Aktivität erstellen, bearbeiten oder als erledigt markieren. Vorschläge erscheinen mindestens 5-mal pro Woche und können angenommen oder abgelehnt werden, ohne dass ein Eintrag erstellt wird.
2. Users & roles
- Nutzer: eine Privatperson, die ihren eigenen Alltag plant.
- Rolle: eigener Planer und Tracker; keine Zusammenarbeit, kein soziales Teilen.
3. Core workflows
- Beim ersten Start: PIN festlegen (zweimal eingeben), danach Einwilligungsabfrage für Chefkoch, Cookidoo und Hevy beantworten (Schalter standardmäßig aus), danach Monatskalender.
- Kalender öffnen und Termine sowie Periode-Einträge ansehen (auch offline).
- Neuen Termin, Training, Routine oder Gericht anlegen und in den Kalender eintragen.
- App-Vorschläge für Planung, Sport, Alltagsroutine oder Gericht anzeigen lassen. Beim Annehmen wählt der Nutzer Datum (Vorauswahl heute, frei änderbar) und Uhrzeit (optional), bevor der Eintrag entsteht; beim Ablehnen entsteht kein Eintrag.
- Eingetragene Aktivitäten als erledigt markieren und verfolgen.
- Nach 5 Minuten Inaktivität im Vordergrund erscheint die PIN-Abfrage; offene Formulare werden gespeichert und nach der Eingabe wieder angezeigt.
4. Features & requirements
- Offline-Installation als PWA: Die App funktioniert offline und bietet die Installation auf dem Startbildschirm aktiv an.
- Anfahrtszeit: Das Feld Dauer in Minuten ist optional und wird nur bei Typ Anfahrt angezeigt. Bei allen anderen Typen ist es ausgeblendet und wird nicht gespeichert.
- Gültige Dauer: Nur ganze Minuten von 1 bis 1440 sind erlaubt; 0, leer oder Dezimalzahlen bedeuten keine Dauer.
- Uhrzeit bei Anfahrt: Optional, wird nur im Bearbeitungsformular angezeigt, nicht im Kalender oder in der Tagesansicht.
- Anzeige der Dauer: Bei Anfahrt mit Dauer steht "30 Min." im Monatskalender und in der Tagesansicht am Eintrag. Bei Dauer 0 oder ohne Angabe erscheint nichts zur Dauer.
- Keine Summe: Keine Summe der Anfahrtszeiten je Tag.
- Anfahrt ohne Dauer: Am Eintrag steht nur der Titel.
- Pläne und Vorschläge: Lokale feste Liste plus individuelle Vorschläge, beide gleich angezeigt und gleich bedient.
5. Scope: must / later / never
- 9 must-haves is a lot for v1: move some to Later?
Must (Pflicht für v1):
- Monatskalender und Tagesansicht mit Einträgen
- Einträge erstellen, bearbeiten, löschen und als erledigt/offen markieren (Typen: Termin, Periode, Training, Routine, Gericht, Schlafen, Energie, To-do, Anfahrt)
- Grafiken zum Tracking von Sport, Schlaf und Zyklus
- Individuelle Pläne und Vorschläge anlegen, annehmen und ablehnen
- Lokale Vorschläge (feste Liste) für Terminplanung, Sport, Alltagsroutine und Gericht, offline nutzbar
- PIN-Schutz beim Start und nach 5 Minuten Inaktivität im Vordergrund
- Einwilligungsabfrage nur beim ersten Start nach der PIN-Festlegung; danach nur über die Einstellungen erreichbar
- Einstellungen: PIN ändern, Einwilligungs-Schalter für Chefkoch, Cookidoo und Hevy (ohne externe Aufrufe) und App zurücksetzen
- Offline-Nutzung als PWA mit Installationsangebot
Later:
- Externe Abfragen bei Chefkoch, Cookidoo oder Hevy
Never:
- Konten, Login oder Social-Login
- Eigener Server oder Backend-API
- Microservices, Queues, Caches oder Kubernetes
6. Screens & UI
- Einwilligungsabfrage: Der Hinweis "In dieser Version werden keine Daten an Chefkoch, Cookidoo oder Hevy gesendet." steht immer oberhalb der drei Schalter, auch wenn alle Schalter ausgeschaltet sind.
- Anfahrt im Bearbeitungsformular: Das Feld Dauer zeigt den Wert als "30 Min." an, wenn eine Dauer vorhanden ist.
- Monatskalender: Einträge zeigen Titel und Typ; bei Anfahrt mit Dauer zusätzlich "30 Min.". Die Uhrzeit wird nicht angezeigt.
- Tagesansicht: Einträge sortiert nach Uhrzeit; Einträge ohne Uhrzeit folgen danach, sortiert nach Titel ohne Unterscheidung von Groß- und Kleinschreibung. Anfahrt mit Dauer zeigt "30 Min." neben dem Eintrag, ohne Summe. Ohne Dauer nur der Titel.
- Zurücksetzen-Dialog (Einstellungen): Warnhinweis, dass alle Daten, die PIN und alle Einwilligungen dauerhaft gelöscht werden; Textfeld für "LÖSCHEN"; Button "Zurücksetzen" erst aktiv bei genau "LÖSCHEN"; Button "Abbrechen" bringt zurück in die Einstellungen und verändert nichts.
7. Design system & visual style
- Komponente Library: Radix UI primitives mit Tailwind CSS, Next.js App Router.
- Farben (hex): Primär Burgundy #7C2E44, Sekundär dunkles Grün #2E4F3A, Akzent Nude #E8D5C5, Hintergrund #FAF7F4 (hell) / #1E1B18 (dunkel), Text #2B2520.
- Schrift: Inter für UI, Playfair Display für Überschriften (hübsche Serifen-Schrift).
- Ecken: Border-Radius 12px für Karten und Buttons, 8px für Eingabefelder.
- Abstand: 4px Raster (4, 8, 12, 16, 24, 32px).
- Dark Mode: ja, automatisch nach Systemeinstellung umschaltbar.
- Symbole: Feather Icons (Linien-Icons).
- Töne: Ruhevoll, erwachsen, nicht verspielt; orientiert funktional an Hevy (Sport) und Flo (Periode), aber mit eigenem Farbsystem.
- Referenz: Keine Screenshots vorhanden; Farben und Schriften dienen als Design-Vorgabe.
8. Data model
Alle Daten (Einträge, Vorschläge, Einwilligungen, PIN) werden ausschließlich lokal im Gerät in IndexedDB über Dexie gespeichert. Es gibt keine Synchronisation und keine Daten, die zwischen Geräten oder Nutzern geteilt werden.
Entity: Eintrag
| field | type | required |
|---|---|---|
| id | string | ja |
| typ | enum (Termin, Periode, Training, Routine, Gericht, Schlafen, Energie, To-do, Anfahrt) | ja |
| titel | string | ja |
| datum | date | ja |
| uhrzeit | time | nein (bei Anfahrt optional) |
| dauer_minuten | integer 1–1440 | nein (nur bei Anfahrt) |
| erledigt | boolean | ja |
Entity: Vorschlag
| field | type | required |
|---|---|---|
| id | string | ja |
| kategorie | enum (Terminplanung, Sport, Alltagsroutine, Gericht) | ja |
| titel | string | ja |
| individuell | boolean | ja |
Entity: Einwilligung
| field | type | required |
|---|---|---|
| dienst | enum (Chefkoch, Cookidoo, Hevy) | ja |
| aktiv | boolean | ja (Standard: aus) |
| entschieden_am | datetime | nein |
Entity: PIN
| field | type | required |
|---|---|---|
| pin_hash | string | ja |
9. APIs & integrations
Externe Dienste (in v1 nur als Einwilligungs-Schalter, ohne externe Aufrufe):
- Rezepte: Chefkoch, Cookidoo
- Sport/Training: Hevy
Die Einwilligungsabfrage zeigt den Hinweis: „In dieser Version werden keine Daten an Chefkoch, Cookidoo oder Hevy gesendet.“ Die Einwilligung wird nach der PIN-Festlegung abgefragt und ist in den Einstellungen widerrufbar. Ohne Einwilligung oder ohne Internetverbindung zeigen lokale Vorschläge (feste Liste) die Ergebnisse an.
10. Auth, permissions & security
- Keine Konten, kein Social-Login, kein Passwort-Reset.
- PIN: 4 Ziffern, beim ersten Start festzulegen (zweimal eingeben zur Bestätigung).
- PIN-Speicherung: lokal in IndexedDB, nicht auf einem Server.
- PIN-Abfrage: beim App-Start und nach 5 Minuten Inaktivität im Vordergrund, auch wenn gerade ein Eintrag bearbeitet wird.
- Inaktivitätszeit: Die 5 Minuten zählen nur, während die App im Vordergrund ist. Im Hintergrund ruht die Uhr; beim Zurückkehren in den Vordergrund startet sie neu.
- Falsche PIN: Fehlermeldung „PIN falsch“, das Eingabefeld wird sofort geleert; unbegrenzte Versuche ohne Wartezeit.
- Einwilligungen (Chefkoch, Cookidoo, Hevy) sind standardmäßig ausgeschaltet und werden nur durch aktive Zustimmung eingeschaltet.
- Widerruf: Jede Einwilligung ist jederzeit in den Einstellungen widerrufbar. Der Widerruf setzt den Schalter auf aus; der gespeicherte Zeitpunkt der Entscheidung bleibt erhalten. Die App wird dabei nicht zurückgesetzt.
- Vergessene PIN: Zurücksetzen in den Einstellungen (Bestätigung durch Eingabe von „LÖSCHEN“), danach PIN-Neuvergabe, Einwilligungsabfrage und anschließend Monatskalender. Alle Einwilligungen werden dabei gelöscht und stehen wieder auf aus.
- Ein einzelner Nutzer, keine Rollen.
11. Performance, privacy & accessibility
Filled
12. Edge cases & errors
- Zurücksetzen: Vor dem Löschen erscheint der Warnhinweis, dass alle Daten, die PIN und alle Einwilligungen dauerhaft gelöscht werden. Erst nach Eingabe von „LÖSCHEN“ wird gelöscht; danach PIN-Neuvergabe, Einwilligungsabfrage, Monatskalender.
13. Stack & constraints
- Frontend: Next.js (App Router), React, TypeScript, Tailwind CSS, Radix UI
- Lokale Datenbank: IndexedDB über Dexie. Alle Daten bleiben auf dem Gerät; keine Synchronisation, kein eigener Server, kein Backend.
- Icons: Feather Icons (react-feather)
- PWA: next-pwa, offline nutzbar und installierbar
- Hosting: Vercel (Hobby-Tarif, kostenlos), nur für die statische App-Auslieferung
- Nicht verwendet: Microservices, Queues, Caches, eigene API-Server, Kubernetes
14. Existing code & do-not-change
Not needed: Dies ist ein neues Projekt, es gibt keinen bestehenden Code.
15. Build order
- Slice 1 – Grundgerüst & Kalender: PWA-Gerüst auf Vercel, Monats- und Tagesansicht, lokale Speicherung von Terminen und Periode-Einträgen in IndexedDB, offline nutzbar.
- Slice 2 – Aktivitätseintrag: Erstellen, Bearbeiten, Löschen (direkt, ohne Bestätigung) und als erledigt markieren für alle Typen (Termin, Periode, Training, Routine, Gericht, Schlafen, Energie, To-do, Anfahrt).
- Slice 3 – App-Vorschläge: Lokale feste Liste plus individuelle Vorschläge für Terminplanung, Sport, Routine und Gericht; Buttons „Annehmen“ (Datum und Uhrzeit frei wählbar, Uhrzeit optional) und „Ablehnen“ (kein Eintrag).
- Slice 4 – PIN, Einwilligung & Einstellungen: PIN-Schutz beim Start und nach Inaktivität, Einwilligungsabfrage nach PIN-Festlegung (Schalter standardmäßig aus), PIN ändern, App zurücksetzen, Einwilligungs-Schalter in den Einstellungen (ohne externe Aufrufe).
16. Acceptance criteria & tests
- 9 must-haves but only 7 acceptance checks
- Abbrechen im Zurücksetzen-Dialog: Der Button "Abbrechen" bringt zurück in die Einstellungen, löscht nichts und verändert keine Einstellungen.
- Zurücksetzen-Button: Erst aktiv, wenn genau "LÖSCHEN" eingegeben wurde.
- Falsche PIN: Die Meldung "PIN falsch" erscheint sofort nach der Eingabe, das Eingabefeld wird sofort geleert, Versuche sind unbegrenzt ohne Wartezeit.
- Anfahrt mit Dauer: Bei Typ Anfahrt ist die Uhrzeit optional, auch wenn eine Dauer angegeben wird; der Eintrag wird ohne Uhrzeit gespeichert.
- Anfahrtszeit: Das Feld Dauer in Minuten erscheint nur beim Typ Anfahrt, ist dort optional und bei allen anderen Typen nicht sichtbar.
- Anzeige der Dauer: Bei Anfahrt mit Dauer steht "30 Min." im Monatskalender, in der Tagesansicht und im Bearbeitungsformular; bei Dauer 0 oder ohne Angabe steht dort nichts zur Dauer.
- Keine Summe: Die Tagesansicht zeigt keine Summe der Anfahrtszeiten.
17. Deployment, environments & secrets
- Build: Next.js statischer Export (vercel build), PWA via next-pwa.
- Environments: production auf Vercel (Hobby, kostenlos, eigene Domain optional).
- Secrets: keine serverseitigen Secrets nötig; externe API-Keys (falls später genutzt) nur clientseitig nach Einwilligung, nie im Repository.
- CI/CD: automatischer Deploy bei Push auf main über Vercel-Git-Integration.
- Rollback: vorheriger Vercel-Deployment ist jederzeit aktivierbar.
18. Open questions & assumptions
- Default: Beim Widerrufen einer Einwilligung wird nur der Schalter auf aus gesetzt; der Zeitpunkt der Entscheidung bleibt gespeichert.
- Default: Nach dem Zurücksetzen der App sind alle drei Einwilligungen wieder ausgeschaltet.
- Default: Die Anfahrtszeit (Dauer in Minuten) ist optional und nur beim Typ Anfahrt sichtbar.
- Default: Die Uhrzeit ist bei Anfahrt optional, auch wenn eine Dauer angegeben wird.
- Default: Der Titel einer Anfahrt ohne Dauer steht im Kalender ohne Zusatz, ohne das Wort "Anfahrt".
- Default: Dexie wird als Hilfsbibliothek für IndexedDB verwendet.