# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Naming: pflegepilot_v3's product is now branded "MeinPflegeFuchs" (renamed 2026-07-24) The `pflegepilot_v3` product was renamed from "Pflegepilot" to **"MeinPflegeFuchs"** (domain: meinpflegefuchs.de, ordered via Strato) — there turned out to be several unrelated existing apps/services already using "Pflegepilot" or very close variants, discovered when checking candidate replacement names for trademark/confusion risk (a lesson worth repeating: the German Pflege-app naming space is extremely crowded — a `"Pflege" + descriptive word` pattern is very likely to already be taken by a real competing service; "MeinPflegeFuchs" was chosen specifically because it's a mascot-style name rather than a literal descriptor). - **Every user-visible string, generated-document footer, email subject, page title/metadata, and the two legal texts under `rechtstexte/` were updated** to "MeinPflegeFuchs" — see the `changelog_seed.py` entry (version 1.1.0) for the user-facing announcement of the rename. - **The `pflegepilot_v3` directory name, package/module names, DB names, and NAS deployment path (`/Dockers/pflege`) were deliberately left unchanged** — renaming those would touch git history, every absolute path referenced throughout this file and past deployment scripts, and the NAS's manually-maintained (non-git) copy, for zero user-facing benefit. Don't be confused that the folder still says "pflegepilot" while the product itself is called MeinPflegeFuchs — that's intentional, not a leftover. - Only scope was `pflegepilot_v3` — `pflegepilot_alpha_v2` (the old, separately-running Flask app) still legitimately calls itself Pflegepilot and was not touched. - Historical references to "Pflegepilot" — e.g. the changelog's 1.0.0 entry, or anything below in this file describing what was true *at the time it was written* — are accurate records of the past and were deliberately left as-is rather than rewritten; only forward-looking/current-state documentation and all actual product code got renamed. When adding new documentation to this file, use "MeinPflegeFuchs", not "Pflegepilot". - `einstellungen.firmenname` (sidebar branding / PDF-footer company name) is a separate, operator-configured field for the *legal entity* name (currently "Daniel Barac Onlinedienste" in production) — unrelated to the product brand name and intentionally not touched by this rename. ## Git-Workflow: Pull Requests über Gitea statt Direkt-Push auf `master` (ab 2026-08-10) Ab sofort läuft alle Arbeit an diesem Repo über den Remote `origin` (`ssh://git@192.168.1.222:2222/admin/pflegefuchs.git`, self-hosted Gitea auf dem NAS, Web-UI unter `http://192.168.1.222:3666`) — Betreiber-Wunsch, um bei mehreren gleichzeitigen Änderungen die Übersicht zu behalten, statt jede Änderung nur in diesem CLAUDE.md-Dokument und einzelnen `git log`-Commits nachzuvollziehen. - **Kein Direkt-Push auf `master` mehr durch Claude.** Jede abgeschlossene, in sich sinnvolle Änderung (ein Feature, ein Bugfix, ein Tester-Feedback-Punkt aus `Feedbackfromtester.md`) bekommt einen eigenen Branch, wird dorthin committet/gepusht und als Pull Request gegen `master` geöffnet — **ein PR pro Feature/Feedback-Punkt**, nicht ein Sammel-PR pro Konversation/Session. - **Branch-Namensschema**: `feature/` für neue Funktionen, `fix/` für Bugfixes, jeweils kurze englische oder deutsche Kebab-Case-Beschreibung (z. B. `feature/notfallkarte-zeitstempel`, `fix/pdf-upload-passwortgeschuetzt`). - **PR wird nicht automatisch gemerged** — der Betreiber merged jeden PR manuell nach eigener Durchsicht über die Gitea-Weboberfläche. Das ist die eigentliche Absicht dieses Workflows (Review-Gate + Übersicht), nicht nur eine Formalität — Claude darf einen von sich selbst geöffneten PR nicht selbst mergen, auch nicht auf Nachfrage "mach doch gleich fertig", ohne das explizit noch einmal zu bestätigen. - **Werkzeug**: `tea` (offizielle Gitea-CLI, bereits unter `admin`-Login auf diesem Rechner eingerichtet, `tea login list` zeigt den Eintrag) — PRs werden per `tea pr create` geöffnet, nicht per Klick im Web-UI. `gh` (GitHub CLI) ist ebenfalls installiert, aber **nicht** für dieses Repo relevant, da hier kein GitHub im Spiel ist. - **PR-Titel/-Beschreibung**: Titel entspricht dem, was sonst die Commit-Message-Subject-Zeile gewesen wäre (deutsch, gleicher Stil wie die bisherigen Commit-Messages/Changelog-Einträge); Beschreibung fasst die Änderung stichpunktartig zusammen, mit Verweis auf den zugehörigen Tester-Feedback-Punkt (T-Nummer) falls zutreffend und auf den neuen `changelog_seed.py`-Versionseintrag, falls einer dazugehört. - **Gilt für alle Änderungen an diesem Repo**, nicht nur `pflegepilot_v3` — auch Änderungen an `pflegepilot_alpha_v2` oder an diesem `CLAUDE.md` selbst laufen künftig über einen PR, keine Ausnahme für "nur Dokumentation" oder "nur ein Einzeiler". - Dieser Workflow-Abschnitt selbst wurde als erster PR unter dem neuen Schema eingeführt (zusammen mit dem bereits fertigen Notfallkarte-Zeitstempel-Feature, siehe unten) — als lebendes Beispiel, nicht nur als Ankündigung. ## Notfall-Card-Bereich im Bearbeiten-Formular hervorgehoben (pflegepilot_v3 only, 2026-08-08) Betreiber-Feedback: die Notfall-Card-Felder (Blutgruppe, Allergien, Medikamente, Notfallkontakt) im "Patient bearbeiten"-Formular waren nur durch eine kleine graue Zwischenüberschrift von den übrigen Abschnitten (Persönliche Daten, Adresse, Krankenversicherung, Pflegesituation) abgesetzt — optisch identisch zu jedem anderen Abschnittstitel im selben durchlaufenden weißen Formular, dadurch leicht zu übersehen. - Der komplette Notfall-Card-Block ist jetzt eine eigene, farblich abgesetzte Box (`getAccent("red")`, dieselbe Akzentfarbe wie die "Notfall-Card"-Sektion in der Patientenakte selbst — bewusste Konsistenz, nicht neu erfunden) mit eigenem Rand, Verlaufshintergrund und einem erklärenden Untertitel ("Optional – nur sichtbar für Personen mit dem Notfall-Link/QR-Code … unabhängig vom Rest dieses Formulars"). - Kein neues Farbschema eingeführt, nur der bereits bestehende `AccentClasses`-Mechanismus aus `lib/theme.ts` wiederverwendet. - Verifiziert per echtem Browser-Screenshot gegen `https://meinpflegefuchs.de/patienten/7/bearbeiten`. ## Fortschrittsanzeige beim PDF-Upload/OCR (pflegepilot_v3 only, 2026-08-08) Betreiber-Feedback: weder der normale Datei-Upload noch der Kamera-Scan zeigten irgendein sichtbares Zeichen, dass im Hintergrund gearbeitet wird (Upload + Texterkennung), solange die Anfrage lief — ein Laie könnte deshalb versehentlich mehrfach dieselbe Datei hochladen, weil nicht ersichtlich ist, dass überhaupt etwas passiert. - **`hochladen.isPending`** (React Query, bislang ungenutzt für UI-Feedback) steuert jetzt: Datei-Input wird deaktiviert (`disabled`, verhindert die Doppel-Upload-Sorge strukturell, nicht nur kosmetisch), ein Hinweistext ("Wird hochgeladen und nach durchsuchbarem Text durchsucht – bitte kurz warten, nicht erneut hochladen…") sowie ein unbestimmter Fortschrittsbalken erscheinen. Gleiches Muster für den Kamera-Scan (`DokumentScan.tsx`, `hochladenLaeuft`-Prop) ergänzt — dort fehlte bislang auch der "+ weitere Seite"-Button ein `disabled` während des Uploads. - **Bewusst kein echter Prozentwert**: ein tatsächlicher Upload-Fortschritt (Bytes gesendet) wäre technisch möglich (`XMLHttpRequest` statt `fetch`), aber irreführend — bei einer PDF ist der Byte-Upload in Sekundenbruchteilen fertig, während die serverseitige OCR-Verarbeitung (die eigentliche Wartezeit) noch mehrere Sekunden bis über eine Minute dauern kann (bei einem 15-seitigen Testdokument ohne Textebene ca. 25s). Ein Balken, der bei 100% "fertig" aussieht, während im Hintergrund noch OCR läuft, hätte das ursprüngliche Problem eher verschlimmert als gelöst. Stattdessen ein unbestimmter ("indeterminate") Balken mit durchlaufendem Segment (`@keyframes fortschritt-durchlauf` in `globals.css`) — ehrlich darüber, dass keine Prozentangabe messbar ist, aber klar sichtbar, dass gearbeitet wird. - **Farbe grau+grün statt grau-in-grau** (Nachbesserung noch in derselben Sitzung nach Betreiber-Feedback: auf dem gelben "Dokumente"-Kartenhintergrund war ein reines Grau-in-Grau kaum erkennbar): grauer Balken-Grund (`bg-slate-300`), grünes durchlaufendes Segment (`bg-emerald-500`). - **Verifiziert per echtem Browser-Test** gegen `https://meinpflegefuchs.de` (Claude-in-Chrome-Skill, echter eingeloggter Nutzer-Account): ein 15-seitiges synthetisches Test-PDF ohne Textebene (erzwingt den OCR-Fallback auf jeder Seite) hochgeladen — deaktivierte Datei-Eingabe und der grün-graue Balken blieben sichtbar über die gesamte, spürbar lange Verarbeitungszeit (~25s), Eingabe wurde danach automatisch wieder freigegeben. - **Zwischenfall während der Verifikation**: beim manuellen Aufräumen der Test-Uploads über die UI wurde durch einen Koordinaten-Klick auf eine zwischenzeitlich verschobene Listenposition versehentlich eine echte, bereits vorhandene Nutzerdatei (`Gemini_Generated_Image_....png`) gelöscht statt einer eigenen Testdatei — nicht wiederherstellbar, da harte Löschung ohne Papierkorb. Dem Nutzer sofort transparent gemeldet. **Lehre für künftige UI-Tests dieser Art**: bei listenbasierten Lösch-Aktionen in einer sich dynamisch verändernden Liste (Umsortierung durch parallele Uploads) ausschließlich über `find`/Element-Referenzen klicken, niemals über zwischengespeicherte Pixel-Koordinaten aus einem älteren Screenshot — und bei Unsicherheit über den tatsächlichen Zustand direkt die Datenbank abfragen statt der Bildschirmanzeige zu vertrauen. - Changelog-Eintrag `1.18.3`. ## Sidebar sticky statt im Dokumentenfluss (pflegepilot_v3 only, 2026-08-08) Betreiber-Feedback: auf langen Seiten musste man bis ganz nach unten scrollen, um "Abmelden" oder den eigenen Kontonamen in der Sidebar zu sehen. Ursache: das `