leafittome/docs/handoff.md
cschlaefke 778b3bd34d V2.2: Besitzer-Konzept, Haushalte umbenennen, Austreten/Entfernen, Checkliste über alle Haushalte
- ownerUid je Haushalt (Alt-Haushalte: erster memberUids-Eintrag = Ersteller);
  Besitzer-Anzeige in Mitglieder- und Haushaltsliste
- Haushalt umbenennen (Dialog im Haushalts-Screen); Rules erlauben Clients am
  Haushalts-Dokument nur noch das Namensfeld
- Cloud Functions leaveHousehold (selbst austreten, auch als Sitter) und
  removeMember (nur Besitzer); beide biegen den aktiven Zeiger des Betroffenen
  um und legen notfalls einen frischen eigenen Haushalt an
- Haushalts-Wechsler im Drawer (PopupMenu, ab zwei Haushalten)
- Tages-Checkliste und nächste Fälligkeit aggregieren über alle Haushalte,
  mit Zwischenüberschrift je Haushalt; Bestätigen schreibt in den
  Herkunfts-Haushalt der Aufgabe
- Widget-Tests: Gruppierung, Besitzer-Rechte, Umbenennen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 21:39:10 +02:00

4.9 KiB
Raw Blame History

Handoff: LeafItToMe (Pflanzenpflege-App)

Stand: 2026-07-19. Sprache mit dem Nutzer (Chris): Deutsch.

Projekt in einem Satz

Private Flutter-App (iOS+Android) zur Pflanzenpflege für Haushalt + Pflanzen-Sitter: Foto-Erkennung (PlantNet + Claude), Gieß-/Düngeplan mit Tages-Checkliste, tägliche Sammel-Push, Haushalt-Teilen per Einladungscode mit Rollen.

Wo alles liegt

  • Code: ~/Documents/Projekte/Planty (Ordner heißt noch Planty, Projekt heißt seit Umbenennung leafittome, App-Name „LeafItToMe", Bundle-ID-Platzhalter dev.leafittome.app)
  • Git-Remote: selbst gehostetes Forgejo https://git.cshomelabs.work/cschlaefke/leafittome.git (HTTPS + Token im macOS-Schlüsselbund, git push läuft ohne Abfrage)
  • Doku (im Repo, deutsch, aktuell halten!): README.md, docs/architektur.md, docs/firebase-einrichtung.md (Schritt-für-Schritt-Historie aller Backend-Einrichtungen), docs/git-forgejo.md
  • Claude-Memory: Projektplan, Nutzerprofil und Backlog liegen im persistenten Memory-Verzeichnis dieser Claude-Code-Installation (werden automatisch geladen)
  • Firebase-Projekt: leaf-it-to-me-app (Blaze aktiv, Budget-Alarm eingerichtet; Firebase CLI ist eingeloggt)
  • Functions: functions/ (TypeScript, Node 22, Region europe-west3): identifyPlant (PlantNet + Claude, Secrets PLANTNET_API_KEY/ANTHROPIC_API_KEY im Secret Manager), sendDailyReminders (alle 15 Min), joinHousehold (Einladungs-Einlösung)

Verifizierter Stand

  • V1 komplett und auf Android Ende-zu-Ende getestet: Foto → Erkennung → vorbefülltes Profil; Tages-Checkliste; Sammel-Push kam im regulären Scheduler-Lauf auf dem Sperrbildschirm an. iOS-App läuft ebenfalls (Login, Pflanzen, Fotos) — nur iOS-Push fehlt (braucht Apple Developer Account, Beantragung scheiterte bisher an Apples Webseite; Schritte stehen in docs/firebase-einrichtung.md Schritt 6).
  • V2 implementiert, deployt und vom Nutzer erfolgreich getestet (Einladungscodes member/sitter, joinHousehold-Function, Rules-Enforcement für Sitter, „bestätigt von"-Anzeige).
  • V2.1 Multi-Haushalt implementiert und getestet: Nutzer bleiben Mitglied aller Haushalte (memberUids ist Quelle der Wahrheit, users.householdId nur noch aktiver Zeiger), sendDailyReminders sammelt Aufgaben aus allen Haushalten.
  • V2.2 implementiert, noch nicht vom Nutzer getestet: Besitzer-Konzept (ownerUid, Alt-Haushalte: memberUids[0]), Besitzer-Anzeige, Haushalt umbenennen (Rules: Clients dürfen nur noch name ändern), Haushalts-Wechsler im Drawer, Tages-Checkliste gruppiert Aufgaben aus allen Haushalten, Functions leaveHousehold/removeMember (biegen den aktiven Zeiger des Betroffenen um, legen notfalls frischen Haushalt an).

Offen / Nächstes

  1. V2.2 vom Nutzer testen lassen (Umbenennen, Austreten, Entfernen, Drawer-Wechsler, gruppierte Checkliste); Functions- und Rules-Deploy nötig.
  2. iOS-Push, sobald Apple Developer Account existiert.
  3. V3: Krankheits-Diagnose per Foto, Stellplatz-Bewertung (Standort-Analyse pro Stellplatz + Eignungs-Sterne pro Pflanze — Zwei-Ebenen-Konzept siehe Memory), Umtopf-Erinnerungen.
  4. Backlog: Button „KI-Zweitmeinung" bei unbefriedigendem PlantNet-Ergebnis; Push-Anzeige auch bei App im Vordergrund; App Check vor App-Store-Release; Englisch (app_en.arb).

Stolperfallen (teuer erkauft, nicht erneut zahlen)

  • firebase functions:log hinkt 1520 Minuten hinterher — „keine Läufe" heißt meist nur Log-Verzögerung. Scheduler-Status im Cloud-Scheduler-Console prüfen lassen.
  • Android zeigt FCM-Pushes nur bei App im Hintergrund.
  • flutter_timezone ≥5 liefert TimezoneInfo-Objekt → .identifier verwenden (Objekt crasht Firestore-Writes still).
  • Storage-Rules mit firestore.get() brauchen die IAM-Rolle „Firebase Rules Firestore Service Agent" fürs Storage-Dienstkonto (wurde manuell erteilt).
  • Erster Functions-Deploy in frischem Projekt kann mit 403 iam.serviceaccounts.actAs scheitern → wenige Minuten warten, erneut deployen.
  • Analyzer: build/ und ios/build/ sind in analysis_options.yaml ausgeschlossen (SwiftPM legt dort Fremdcode ab).
  • Nutzer wünscht zu jedem Backend-Baustein begleitende deutsche Doku in docs/ (keine Firebase-Vorerfahrung).

Arbeitsabläufe

  • Prüfen: flutter analyze && flutter test (Tests mocken Firebase via firebase_auth_mocks/fake_cloud_firestore); Android-Verifikation: flutter build apk --debug
  • Texte: nur in lib/l10n/app_de.arb (typografische Anführungszeichen „…“ verwenden, gerade " brechen das JSON), dann flutter gen-l10n
  • Deploy: firebase deploy --only functions|firestore|storage --project leaf-it-to-me-app; nach jedem Arbeitsstand committen + git push

Suggested skills

  • /verify — nach nichttrivialen Änderungen den echten Flow treiben (Gerät/Simulator), nicht nur Tests
  • /code-review — vor größeren Merges über den Diff laufen lassen
  • /run — App starten/screenshotten, wenn Änderungen sichtbar geprüft werden sollen