Dieses Dokument gibt Claude Code den Kontext für die Entwicklung von Phylax.
Phylax ist eine persönliche, datensouveräne Gesundheitsplattform als Progressive Web App, basierend auf dem Prinzip der lebenden Gesundheit. Der Nutzer erstellt und pflegt ein lebendes medizinisches Profil mit Beobachtungen (Fakt/Muster/Selbstregulation), Laborwerten, Ergänzungsplänen und offenen Punkten. Local-first, Zero-Knowledge, kein eigener Backend-Service. KI-gestützte Profilerstellung über API-Key des Nutzers. Siehe docs/CONCEPT.md für die vollständige Vision.
- Kein Backend: Jeder Vorschlag für einen Server wird abgelehnt. Phylax ist reine Browser-App.
- Keine eigenen externen Services: Keine Fonts von Google, keine Analytics, keine CDN-Abhängigkeiten zur Laufzeit. Alles wird gebundled. Ausnahme: nutzerinitiierte KI-Requests mit eigenem API-Key des Nutzers an einen vom Nutzer gewählten KI-Anbieter (siehe ADR-0019).
- Verschlüsselung vor Persistierung: Kein Klartext darf jemals in IndexedDB landen. Tests müssen das absichern.
- KI strukturiert, KI diagnostiziert nicht: Die KI in Phylax ist ein Strukturierungspartner. Sie stellt keine Diagnosen, gibt keine Therapieempfehlungen und übernimmt keine klinische Verantwortung.
- Keine medizinische Beratung: Kein Code, der Diagnosen stellt oder Empfehlungen gibt. UI-Disclaimer an relevanten Stellen.
- TypeScript strict mode:
strict: trueintsconfig.json, keineany-Types ohne explizite Begründung im Kommentar. - Keine Formatierung mit Em-Dashes: In UI-Texten, Dokumentation und Kommentaren nur Bindestriche oder Kommata, keine Em-Dashes.
- React 19 + TypeScript + Vite (siehe ADR-0021)
- Dexie.js für IndexedDB
- Web Crypto API (nativ, keine Crypto-Library)
- Tailwind CSS
- jsPDF + jspdf-autotable für PDF-Export (siehe ADR-0020)
- pdfjs-dist für PDF-Import (siehe ADR-0017)
- vite-plugin-pwa
- Vitest für Unit-Tests
- Playwright für E2E
- i18next für i18n
Keine weiteren Dependencies ohne Rücksprache. Jede neue Dependency erhöht die Angriffsfläche.
phylax/
├── docs/
│ ├── CONCEPT.md
│ └── ROADMAP.md
├── public/
│ └── icons/
├── src/
│ ├── main.tsx
│ ├── App.tsx
│ ├── crypto/ # Web Crypto Wrapper, Key-Derivation
│ ├── db/ # Dexie-Schema, Repositories
│ ├── domain/ # Reine Geschäftslogik (Typen, Validierung)
│ ├── features/ # React Features (profile, ai-input, documents, export, backup, settings)
│ ├── ui/ # Shared UI-Komponenten
│ ├── i18n/ # Übersetzungen (de, en)
│ └── lib/ # Utilities
├── tests/
│ ├── unit/
│ └── e2e/
├── .claude/
│ └── rules/
├── CLAUDE.md
├── README.md
├── package.json
├── tsconfig.json
├── vite.config.ts
└── tailwind.config.ts
- Ein einziges Modul
src/crypto/ist für alle Verschlüsselung zuständig - Kein Aufruf von
crypto.subtleausserhalb dieses Moduls - Tests prüfen Round-Trip (encrypt dann decrypt ergibt Original) und dass falsche Keys fehlschlagen
- PBKDF2-Iterationen als Konstante definiert, Default 1.200.000 (siehe ADR-0001)
- Alle DB-Zugriffe via Repository-Pattern in
src/db/ - Kein direkter Dexie-Aufruf aus UI-Komponenten
- Repositories nehmen Klartext-Objekte entgegen und verschlüsseln intern vor
put - Bei
getwird intern entschlüsselt und Klartext zurückgegeben - Schema-Migrationen sind dokumentiert und getestet
- Funktionale Komponenten mit Hooks
- Kein Redux, React-Context reicht für globalen State (Auth, Theme, i18n)
- Tailwind-Utility-Classes, keine eigenen CSS-Dateien ausser
index.css - Mobile-First: jede Komponente muss auf 360px Breite funktionieren
- Dark Mode via Tailwind
dark:-Variante
Alle localStorage- und sessionStorage-Keys verwenden den Prefix phylax- (Bindestrich) oder phylax. (Punkt). Das Full-Data-Reset-Feature (src/features/reset/useResetAllData.ts) iteriert beide Stores anhand dieses Prefix-Musters und löscht alle passenden Keys; neue Keys, die nicht der Konvention folgen, überleben einen Reset und führen zu inkonsistentem App-Zustand. Beim Hinzufügen eines neuen Storage-Keys: Konvention einhalten, sonst Reset-Hook anpassen und dokumentieren.
- Jedes Crypto-Modul hat Unit-Tests
- Jedes Repository hat Unit-Tests mit Fake-IndexedDB
- E2E-Tests decken kritische Flows ab: Onboarding, Beobachtung erstellen, Auto-Lock, Backup/Restore
- Mindestens 80 Prozent Coverage im
crypto/- unddb/-Modul
- Task-IDs folgen dem Series-Prefix-Schema in
.claude/rules/task-series.md(single source of truth: F, O, IM, V, T, I, AI, D, X, B, P, M, DP, E, R, I18N, IMP, AIP, ONB, DOC, S, BUG, TD, DEPS). - Beispiel: F-01 Vite-Setup, F-02 PWA-Config, O-01 Domain-Types
- Ein Commit pro Task, Commit-Message enthält Task-ID in Klammern.
- Gitflow (ADR-0024): Jeder Task läuft auf einem eigenen Feature-Branch (
feature/<TASK>-desc,fix/<BUG-NN>-desc,chore/<I-NN>-desc,docs/<TASK>-desc); kein direkter Commit aufmain. Merge nachmainnur über einen Pull-Request mit grünem CI. Squash-Merge als Default (ein Commit pro Task), Merge-Commit nur, wenn ein PR mehrere eigenständige Task-Commits bündelt. Die frühere Direct-to-main-Konvention ist aufgehoben. - TDD-Reihenfolge auf dem Branch nach
.claude/rules/tdd.md(Test zuerst bei Verhaltensänderungen; reine Doku-/Konfig-Änderungen sind ausgenommen).
- Keine neuen Dependencies ohne explizite Zustimmung hinzufügen
- Keine Cloud-Services integrieren
- Kein Code, der Klartext-Daten ausserhalb des Crypto-Moduls in die DB schreibt
- Keine medizinischen Empfehlungen in UI-Texten oder Kommentaren
- Keine Telemetrie, keine Error-Reporting-Dienste wie Sentry
- Keine Em-Dashes in Code-Kommentaren oder UI-Strings
- Keine Zusammenfassungen oder Interpretationen von Gesundheitsdaten durch Heuristiken
- Bei Unklarheiten zur Architektur nachfragen, bevor geraten wird
- Security-relevante Entscheidungen explizit begründen
- Edge Cases auflisten, bevor implementiert wird
- Tests zuerst schreiben (Red-Green-Refactor, siehe
.claude/rules/tdd.md), nicht erst nach der Implementierung - Bei jedem neuen Profilbereich prüfen: wird Klartext jemals ohne Verschlüsselung persistiert
- Bei KI-Features prüfen: Chat-Nachrichten dürfen nicht persistiert werden, nur bestätigte Profil-Fragmente
- Bibliogon: github.com/astrapi69/bibliogon (Architektur-Patterns, Phasenstruktur)
- PluginForge: github.com/astrapi69/pluginforge (nicht genutzt in Phylax, aber bekannt)
Die Projekt-Dokumentation hat zwei primäre Leserschaften mit unterschiedlichen Sprachen. Die Regel folgt der primären Audience jedes Artefakts, nicht seinem Dateityp.
Englisch:
- Source-Code, Typen, Variablennamen, Dateinamen, Imports
- Code-Kommentare und TODOs
- Commit-Messages, Branch-Namen, Tags, PR-Titel
- ADRs (
docs/decisions/ADR-*.md) - CI-/Workflow-Dokumentation (
docs/ci-gates.md, Kommentare in.github/workflows/*.yml) - Contributor-Dokumentation (
docs/i18n-contributing.md) - i18n-Glossar-Schlüssel und -Struktur (
docs/i18n-glossary.md, bilingual wo nötig) - Claude-Code-Prompts (Default; Ausnahme: Translation-Review-Tasks, die explizit eine Ziel-Locale betreffen, dürfen in der Zielsprache sein)
Deutsch:
CLAUDE.md(primärer Leser: der Entwickler)docs/CONCEPT.md(Domänenkonzept; Phylax adressiert primär den DE-Markt wegen ePA/gematik)docs/backup-format.md(user-facing Dokumentation)docs/ROADMAP.md(interne Planung, Entwickler-Perspektive)
Locale-Strings (user-facing Text in src/locales/<lang>/*.json): in der jeweiligen Zielsprache, unter Beachtung der Umlaut-Regel unten.
Deutsche Strings in Locales und deutschen Docs verwenden die Unicode-Zeichen ä, ö, ü, ß, Ä, Ö, Ü. ASCII-Transliteration (ae, oe, ue, ss) ist nur zulässig, wenn sie orthografisch korrekt ist (neue Rechtschreibung wie dass, Eigennamen). Automatische Transliteration bei der Extraktion von Strings in Locale-Dateien oder Docs ist nicht erlaubt.
Änderungen, die shared Infrastructure berühren (i18n-Locales, shared Types, Cross-Component-Renames, Dependency-Upgrades, Build-Config), müssen alle deklarierten Test-Suites grün haben, bevor ein Gate als abgeschlossen gilt:
make test(Unit)make test-e2e(Dev-Playwright)make test-e2e-production(Production-Playwright)make typecheckmake lintmake build
Single-Feature-Änderungen mit begrenztem Blast-Radius dürfen einzelne Suites auslassen, wenn dies explizit begründet wird. Cross-Cutting-Änderungen dürfen das nicht. Lokaler Pass ist notwendig, aber nicht hinreichend; der CI-Run auf dem finalen Commit muss ebenfalls grün sein, bevor der Task geschlossen wird.
OpenAI Codex wird deine Ergebnisse überprüfen, sobald Sie fertig sind.