docs: add Agent API docs, OpenAPI field descriptions, and project context files
This commit is contained in:
@@ -0,0 +1,203 @@
|
||||
# SOUL — TakeYourMeds
|
||||
|
||||
> Herzstück des Projekts: **wofür** die App existiert und **wie** wir daran arbeiten.
|
||||
> Persönliche Medikamenten-PWA — nicht Produkt, nicht Arztberatung, sondern ein Werkzeug für ein ADHS-Gehirn mit Humor-Schutzschicht.
|
||||
|
||||
---
|
||||
|
||||
## Was dieses Projekt ist
|
||||
|
||||
**TakeYourMeds** (UI-Kurzname: **Medis**) ist eine **Single-User-PWA** für Medikamenten-Erinnerungen, Einnahme-Logging und leichte Compliance-Übersicht — mit Push, Offline-Sync und bewusst übertriebenem Sarkasmus.
|
||||
|
||||
**Tagline (Login):** *Dein Gehirn. Deine Medis. Unser Sarkasmus.*
|
||||
|
||||
**Der 3-Sekunden-Test:** *„Ah, Erinnerung an Medis — aber nicht so ein nerviger Gesundheits-App-Vibe."*
|
||||
**Nicht:** *„Noch eine sterile Pillen-Tracker-App mit Mindset-Quotes."*
|
||||
|
||||
**Domain:** [medis.schwenk.online](https://medis.schwenk.online)
|
||||
|
||||
**Das ist nicht:**
|
||||
- Kein SaaS, kein Multi-User-Produkt, keine öffentliche Registrierung
|
||||
- Keine medizinische Beratung, keine Dosierungs-„Optimierung“ durch die App
|
||||
- Kein Ersatz für Therapeut:in oder Neurolog:in — nur **Merken + Loggen + Erinnern**
|
||||
|
||||
**Kernrollen (mehr nicht):**
|
||||
1. **Erinnern** — dezent um 8:00 und 12:00 (`Europe/Berlin`), `silent`, kein Alarm-Gebrüll
|
||||
2. **Erfassen** — genommen / verpasst / snooze (+15/+30), inkl. Notification-Actions und Homescreen-Shortcuts
|
||||
3. **Motivieren ohne nerven** — Dopamin-Momente, Streak, Heatmap, Easter Eggs — **Spaß als Compliance-Hack**, nicht als Gamification-Zwang
|
||||
|
||||
Alles andere (Agent-API, KI-Roast, Badges) ist **Erweiterung für Automatisierung und Laune**, nicht der Hauptzweck.
|
||||
|
||||
---
|
||||
|
||||
## Vision
|
||||
|
||||
ADHS bedeutet: Erinnerungen kommen zu spät, zu früh oder gar nicht — und Schuldgefühle sind gratis. TakeYourMeds existiert, damit **eine feste Routine (Morgens/Mittags)** mit minimaler Friction am Handy hängen bleibt: ein Tap, ein Log, ein Push der nicht schreit.
|
||||
|
||||
Die App soll **ehrlich über Vergessen** sein (Humor statt Moralpredigt), aber **zuverlässig im Hintergrund** (Server-Push, Scheduler, SQLite, Migrationen ohne Datenverlust). Karenzzeit (`reminder_window_minutes`, typisch 90 Min) ist bewusst **ADHS-realistisch** — nicht um 08:01 schon „verpasst“.
|
||||
|
||||
---
|
||||
|
||||
## Zielgruppe
|
||||
|
||||
| Wer | Erwartung |
|
||||
|-----|-----------|
|
||||
| **Primär: Fränky** | Ein Nutzer, ein Gerät, PIN + lange Session (90 Tage), Meds in `meds.yaml` |
|
||||
| **ADHS-Kontext** | Kurze Wege, große Buttons, Dopamin-Feedback, Snooze ohne Drama |
|
||||
| **Technisch** | PWA installierbar, offline-tolerant, Push auf Android/iOS-Browser wo möglich |
|
||||
|
||||
Keine generische „Patient:in“-Persona — Texte in `messages.yaml` sind **persönlich-sarkastisch** und dürfen roh sein. Neue UI-Texte sollen in dieselbe Schublade passen.
|
||||
|
||||
---
|
||||
|
||||
## Stimme & Ton
|
||||
|
||||
Wie die App in UI, Toasts, Fehlern, Push und `messages.yaml` spricht:
|
||||
|
||||
- **Sprache:** Deutsch (UI, Notifications, Humor-Pool). Code/Kommentare/README: wie im Repo (oft Deutsch).
|
||||
- **Ansprache:** **Du**, locker, direkt — kein Sie, kein Klinik-Broschüren-Deutsch.
|
||||
- **Voice:** Freundlich-sarkastisch, selbstironisch, **ADHS-interner Monolog** — Filter gegen Scham, nicht gegen Ernst.
|
||||
- **Fehler:** Ehrlich + kurz; Nutzer nicht beschuldigen („Falscher PIN. Dein Gehirn auch.“ ist Stil, nicht Mobbing).
|
||||
- **Push:** Dezent, `silent` — **kein** Alarm-Charakter, kein „VERPASST!!!“-Panic.
|
||||
- **Verboten:** Wellness-Influencer-Sprech („self-care journey“, „du schaffst das“-Platitüden), Corporate-Health („Synergien“, „Leverage“), falsche Klinik-Sicherheit („wir garantieren…“).
|
||||
|
||||
### Wording-Beispiele
|
||||
|
||||
| Kontext | Gut | Schlecht |
|
||||
|---------|-----|----------|
|
||||
| Erfolg | „Genommen! Dein Gehirn gibt dir einen langsamen High-Five.“ | „Einnahme erfolgreich protokolliert.“ |
|
||||
| Fehler Login | „Falscher PIN. Dein Gehirn auch.“ | „Authentifizierung fehlgeschlagen (401).“ |
|
||||
| Leer / Laden | „Dein Gehirn ist nicht kaputt. Es wartet nur auf den richtigen Treiber.“ | „Bitte warten…“ |
|
||||
| Push-Hinweis (Settings) | „Push-Erinnerungen um 8:00 und 12:00 — dezent, kein Alarm.“ | „Aktivieren Sie Benachrichtigungen für optimale Therapieadhärenz.“ |
|
||||
|
||||
Motivation-Karte im Dashboard: bewusst **absurd-meta** („ADHD live, laugh, toaster bath motivational“) — das ist Markenfarbe, nicht Bug.
|
||||
|
||||
---
|
||||
|
||||
## Visuelle DNA
|
||||
|
||||
| Element | Ja | Nö |
|
||||
|---------|----|----|
|
||||
| Dark UI, Mobile-first (max ~480px), portrait PWA | ✓ | |
|
||||
| Akzent `#F12F12` (schwenk-Familie), Fredoka | ✓ | |
|
||||
| Dopamin-Animation, Confetti, Streak 🔥 | ✓ | |
|
||||
| Bunte Akzente (Gelb/Cyan/Lila) auf dunklem Grund | ✓ | |
|
||||
| Klinisches Weiß, Stock-Foto-Wellness | | ✓ |
|
||||
| Informationsüberladung auf „Heute“ | | ✓ |
|
||||
| Englische UI-Labels ohne Grund | | ✓ |
|
||||
|
||||
**Feel:** Spielerisch-utilitarisch — **ernste Funktion** (Medis nicht vergessen) in **unernstem Outfit**.
|
||||
|
||||
---
|
||||
|
||||
## Technische DNA
|
||||
|
||||
Philosophie: **KISS, ein Container, eine SQLite-Datei**, schnelle Iteration ohne Frontend-Framework-Ballast.
|
||||
|
||||
| Element | Ja | Nö |
|
||||
|---------|----|----|
|
||||
| FastAPI + uvicorn (API + Static in einem Prozess) | ✓ | |
|
||||
| SQLite `data/medis.sqlite` + versionierte SQL-Migrationen | ✓ | |
|
||||
| Vanilla JS, `python tools/build_frontend.py` → `public/` | ✓ | |
|
||||
| Web Push (VAPID) + APScheduler (8:00, 12:00, 21:00 Check) | ✓ | |
|
||||
| Docker Compose + Traefik auf boka | ✓ | |
|
||||
| OpenRouter nur für Roast/Motivation (mit `messages.yaml`-Fallback) | ✓ | |
|
||||
| Agent-API `/agent/*` mit separatem `AGENT_TOKEN` | ✓ | |
|
||||
| Postgres, Microservices, React-Build-Pflicht | | ✓ |
|
||||
| Alembic-Overhead für dieses Schema | | ✓ |
|
||||
| User-PIN hashen „weil Best Practice“ ohne Bedarf | | ✓ (bewusst: Single-User, `.env`) |
|
||||
|
||||
**Daten heilig:** `./data` Volume, Backups (`tools/backup_db.py`), nie `docker compose down -v` auf Prod-Daten. Migrationen additive, schema_version-tracked.
|
||||
|
||||
**Konfiguration lebt in Dateien:** `meds.yaml` (Slots, Meds), `messages.yaml` (~95 Texte) — editierbar ohne Code-Deploy für Texte (Container-Neustart für YAML-Reload).
|
||||
|
||||
---
|
||||
|
||||
## Non-Goals
|
||||
|
||||
Was dieses Projekt **nicht** werden soll:
|
||||
|
||||
- **Kein** öffentlicher Medikamenten-Tracker für Fremde (kein Sign-up, kein Marketing)
|
||||
- **Keine** Medizin-App mit Dosierungs-Empfehlungen, Wechselwirkungs-Checks oder „AI Doctor“
|
||||
- **Kein** Engagement-Bait (daily login rewards, Social Feed, Leaderboards mit Fremden)
|
||||
- **Keine** lauten/alarmierenden Notifications — Vertrauen in den Reminder zerstört den Zweck
|
||||
- **Kein** Feature-Bloat der den „Heute“-Screen überlädt (Shortcuts und Agent-API ja; Dashboard-Explosion nein)
|
||||
- **Kein** Tracking/Drittanbieter-Analytics — Privacy by „es ist eh nur ich“
|
||||
|
||||
---
|
||||
|
||||
## Anti-Manifest
|
||||
|
||||
- Steriler Pillen-Tracker mit generischen Icons
|
||||
- „Du bist genug“-Wellness ohne Witz
|
||||
- Schuld-Trips schlimmer als Vergessen selbst
|
||||
- Komplexer Stack für ein persönliches Habit-Tool
|
||||
- Datenverlust beim Deploy (unverzeihlich hier)
|
||||
|
||||
---
|
||||
|
||||
## Project-Specific Rules
|
||||
|
||||
- **`reminder_window_minutes`** respektieren — Business-Logik für pending/overdue/missed, nicht „optimieren“ ohne Absprache
|
||||
- **Streak** zählt nur Tage, an denen **alle** Slots `taken` sind — nicht umbiegen für „bessere“ Stats
|
||||
- **Badge am Icon = Streak**, nicht offene Dosen (bewusste Dopamin-Wahl)
|
||||
- **Humor** neue Texte → `messages.yaml` oder gleicher Ton in UI; KI-Roast bleibt optional, Fallback muss gut sein
|
||||
- **PWA-Updates:** Build-Hash / `version.json` / SW-Cache-Strategie laut `docs/PWA-STRATEGY.md` — keine halben Deploys
|
||||
- **Health-Daten:** minimal loggen, keine PII in Logs/Chat; `.env` und DB nie committen
|
||||
|
||||
---
|
||||
|
||||
## Wie wir zusammenarbeiten
|
||||
|
||||
| Aktion | Default |
|
||||
|--------|---------|
|
||||
| Code ändern | ✅ Agent |
|
||||
| Dependencies | ✅ Agent (sinnvoll, KISS halten) |
|
||||
| Docs / README | ✅ Agent wenn Aufgabe es braucht |
|
||||
| `meds.yaml` / `messages.yaml` Inhalt | ⚠️ Fränky oder explizit — echte Med-Daten |
|
||||
| Git commit / push | 🚫 Nur auf explizite Anweisung |
|
||||
| Deploy prod (boka) | 🚫 Fränky, unless Chat sagt anders |
|
||||
| Diese Datei ändern | ⚠️ Vorschlagen oder explizit |
|
||||
|
||||
### Prioritäten bei Konflikten
|
||||
|
||||
```
|
||||
Zuverlässigkeit (Push, DB, Migrationen) > neues Feature
|
||||
ADHS-Friction (weniger Taps) > mehr Statistik
|
||||
Ehrlicher Humor > klinisch korrekt klingend
|
||||
Daten erhalten > schneller Refactor
|
||||
KISS-Stack > „modernster“ Stack
|
||||
```
|
||||
|
||||
**Verification:** Nach nicht-trivialen Änderungen `python -m pytest tests/ -v` und bei Frontend-Touch `python tools/build_frontend.py`. Smoke: lokal `uvicorn` oder Compose-Health.
|
||||
|
||||
---
|
||||
|
||||
## Infrastructure (project-local)
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Repo (lokal)** | `~/git/froxxxy/takeyourmeds` |
|
||||
| **Server (boka)** | `/home/frank/medis.schwenk.online` |
|
||||
| **Domain** | `medis.schwenk.online` → Container :8000, Traefik `websecure` + `myresolver` |
|
||||
| **Daten** | `./data/medis.sqlite`, Backups unter `data/backups/` |
|
||||
| **Git remote** | Gitea `froxxxy/takeyourmeds` (siehe `INFRASTRUCTURE.md`) |
|
||||
| **Lokal** | http://localhost:8000 nach venv + `.env` + optional VAPID |
|
||||
|
||||
---
|
||||
|
||||
## Für Agents: Quick Start
|
||||
|
||||
1. [`SOUL.md`](SOUL.md) — du bist hier (Ton + Non-Goals)
|
||||
2. [`README.md`](README.md) — Stack, API, Deploy, Entscheidungsprotokoll
|
||||
3. [`meds.yaml`](meds.yaml) — Slots und Medikamente (Single-User-Schedule)
|
||||
4. [`messages.yaml`](messages.yaml) — Humor-Pool (Reminder, Success, …)
|
||||
5. [`frontend/`](frontend/) → `python tools/build_frontend.py` → [`public/`](public/)
|
||||
6. `uvicorn server.app:app --reload --port 8000` oder `docker compose up -d --build`
|
||||
7. UI-Texte und neue Toasts gegen **Stimme & Ton** prüfen
|
||||
|
||||
---
|
||||
|
||||
## Ein Satz zum Mitnehmen
|
||||
|
||||
**TakeYourMeds** ist Fränkys ADHS-freundlicher Medis-Sidekick: zuverlässig im Hintergrund, lautlos im Push, im UI ein sarkastischer Freund der dich an die Kapsel erinnert — ohne so zu tun, als wäre Vergessen ein moralisches Versagen.
|
||||
Reference in New Issue
Block a user