Commit graph

40 commits

Author SHA1 Message Date
cschlaefke
9aa49c641d iOS/TestFlight: App-Check-Release-Provider, App-Icon, Datenschutz-Hosting
- main.dart: App-Check-Provider per kReleaseMode umgeschaltet (Release =
  PlayIntegrity/AppAttest, Debug = Debug-Provider). Nötig, da die Functions
  App Check erzwingen — ein Release-Build mit Debug-Provider würde auf
  fremden Geräten bei jedem Function-Aufruf scheitern.
- App-Icon aus assets/icon/icon.png via flutter_launcher_icons generiert
  (iOS-Set + Android-Mipmaps).
- docs/legal/datenschutz.html: Platzhalter ausgefüllt, interner Hinweis raus.
- firebase.json: hosting-Block (public: docs/legal, Redirect / -> /datenschutz).
  URL: https://leaf-it-to-me-app.web.app/datenschutz
- Doku: firebase-einrichtung.md Schritt 9/10 + Hosting fortgeschrieben,
  handoff.md aktualisiert (iOS/TestFlight abgeschlossen, nur noch Android offen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMRhL16hB14xcfef1qez7N
2026-09-08 20:37:49 +02:00
cschlaefke
8d2b10b9ee Doku: App Check abgeschlossen, Hosting-Anleitung auf Cloudflare/Hetzner zugeschnitten
App Check ist jetzt vollständig live und gerätegetestet (Deploy 49b7f44,
Bestätigung durch Chris). Die Datenschutz-Hosting-Anleitung ersetzt den
vagen Platzhalter-Vorschlag durch Chris' konkretes Setup: eigene Domain
über Cloudflare vor dem Hetzner-VPS, inkl. Origin-Certificate und
nginx-Vorlage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 19:27:19 +02:00
cschlaefke
d4b72637ba Doku: erwartete App-Check-DeviceCheck-Warnung beim iOS-Kaltstart erklärt
Chris meldete die Fehlermeldung trotz hinterlegtem Debug-Token — Ursache
ist eine bekannte Race im firebase_app_check-Plugin (nativer Standard-
Provider "deviceCheck" vor dem Dart-seitigen activate()-Aufruf), nicht
ein Konfigurationsfehler. Einmalig, ohne Funktionsauswirkung.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 12:23:50 +02:00
cschlaefke
7d9754282f App-Store-Vorbereitung: App Check, Release-Signing, Datenschutz, Doku
Ziel fürs Erste: TestFlight + Play-Internal-Testing (kein öffentlicher
Store-Eintrag). Code-seitig vorbereitet, alle Konsolen-Schritte für
Chris in firebase-einrichtung.md (Schritt 9-11) dokumentiert:

- App Check Client-Integration (Debug-Provider), Functions erzwingen
  es noch nicht (zweistufiger Rollout, siehe Doku)
- iOS: ITSAppUsesNonExemptEncryption gesetzt
- Android: Release-Signing über key.properties vorbereitet (Upload-Key
  fehlt noch bewusst, Erzeugung ist Chris' Schritt)
- flutter_launcher_icons vorbereitet für künftiges echtes App-Icon
- Datenschutzerklärung entworfen (docs/legal/datenschutz.html)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 00:09:39 +02:00
cschlaefke
d120c4fc60 Doku: V3-Roadmap komplett gerätegetestet und bestätigt
Umtopf-Flow (inkl. Nächstes-Fälligkeitsdatum-Nachbesserung) und
Stellplatz-Bewertung vom Nutzer bestätigt — damit ist Diagnose,
Umtopf-Erinnerungen und Stellplatz-Bewertung vollständig abgeschlossen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 16:03:04 +02:00
cschlaefke
e81ce48543 V3: Nächstes Fälligkeitsdatum bei Gießen/Düngen/Umtopfen in Pflanzen-Detail
Nutzer vermisste beim Umtopf-Test eine Info, wann das nächste Umtopfen
ansteht (Formular/Checkliste zeigten nur "alle X Monate"/"zuletzt am").
Berechnung aus due_tasks_provider public gemacht statt dupliziert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 15:13:04 +02:00
cschlaefke
5e39ec8118 Doku: Historie-Seite und Google-Login vom Nutzer auf Gerät bestätigt
Stellplatz-Bewertung ist deployt; verbleibende Gerätetests (Stellplatz-
Bewertung, Umtopf-Flow) folgen morgen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:24:59 +02:00
cschlaefke
f0b420b656 V3: Stellplatz-Bewertung (Standort-Analyse per Foto + Eignungs-Sterne auf Abruf)
Letzter Roadmap-Punkt von V3. Foto-basierte Lichtverhältnis-Analyse pro
Stellplatz (Cloud Function analyzeLocation) und darauf aufbauende, rein
textbasierte Eignungs-Bewertung einer Pflanze (assessPlantFit) — beides
ausschließlich auf Abruf, nicht automatisch (Kostenkontrolle, eigener
Anthropic-Key). Neue Stellplatz-Detailseite, Verlinkung im Pflanzen-Detail,
Erkennung veralteter Bewertungen bei Umzug/Neuanalyse.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:17:18 +02:00
cschlaefke
a02509c384 Doku: Handoff konsolidiert — Session-Stand 2026-07-23
Erledigte 🟡-Blöcke in den verifizierten Stand überführt (Auth komplett,
V3 Bausteine 1+2), offene Fäden gebündelt (Gerätetests, Stellplatz-
Bewertung mit Konzeptfragen), Session-Erkenntnisse zu den Stolperfallen
(Berechtigungsfilter/Deploys via Nutzer, Riverpod-3-Pausierung,
users-Doc vs. householdId, Anführungszeichen, Bash-cwd).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 23:49:19 +02:00
cschlaefke
81d990dd7e V3: Umtopf-Erinnerungen (opt-in, Intervall in Monaten)
Dritter Aufgabentyp repotting im Intervall-Modell: optionales
repottingIntervalMonths + lastRepotted/By am Pflanzenprofil, Formular
mit Intervall-Feld und Datums-Auswahl, Umtopf-Zeile im Detail,
Aufgaben in Checkliste und Sammel-Push (reminders.ts gespiegelt),
Sitter dürfen bestätigen (Rules-Allowlist). Monats-Arithmetik kürzt
den 31. auf den Monatsletzten. Ende-zu-Ende-Widget-Test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 23:40:21 +02:00
cschlaefke
23560768e2 V3: Untersuchungshistorie auf eigene Seite ausgelagert
Neue Route /plants/:id/diagnoses mit PlantDiagnosesScreen; im Detail
ersetzt der Button „Frühere Untersuchungen" (deaktiviert bei leerer
Historie) die Inline-Liste. Ergebnis-Sheet nach diagnosis_sheet.dart
ausgelagert und von beiden Screens genutzt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 23:21:21 +02:00
cschlaefke
9caaa2ef79 V3: Untersuchungshistorie je Pflanze
Jede Diagnose landet automatisch in households/{id}/plants/{id}/diagnoses;
das Pflanzen-Detail zeigt die Liste (Ampel-Icon, Kurzbefund, Datum),
Antippen öffnet das Ergebnis-Sheet mit Untersuchungsdatum, volle
Mitglieder können Einträge löschen. Rules: read/create für alle im
Haushalt (auch Sitter), delete nur member, update nie. Widget-Test
navigiert bis ins Sheet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 22:55:07 +02:00
cschlaefke
2d2be4e774 Doku: Handoff auf Diagnose-Feinschliff-Stand (Re-Deploy offen)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 22:40:09 +02:00
cschlaefke
18b060413b V3: Krankheits-Diagnose per Foto (Function + Detail-Screen)
Neue Cloud Function diagnosePlant: Foto + optionale Art an Claude,
deutsches JSON-Ergebnis (Befund/Ursache/Behandlung/Vorbeugung).
App: PlantDiagnosisService + Untersuchen-Sektion im Pflanzen-Detail
mit Ergebnis-Bottom-Sheet und KI-Disclaimer. askClaude max_tokens
1024→2048 (adaptives Denken zählt mit ins Limit). Deploy steht aus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 22:20:48 +02:00
cschlaefke
36c2d5d19e Doku: SHA-Hinweis beim Google-Aktivieren erklärt; Debug-Fingerprints im Projekt hinterlegt
Der Konsolen-Hinweis betrifft nur den nativen google_sign_in-Flow; unser
Browser-Flow braucht kein SHA-1. Debug-SHA-1/SHA-256 trotzdem per
firebase apps:android:sha:create registriert (für später, z. B. App Check).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:59:21 +02:00
cschlaefke
bc0588f358 V2.x: Anmelden mit Google (iOS + Android)
Wie Apple über den eingebauten GoogleAuthProvider (Browser-Flow über den
Firebase-Auth-Handler, kein Zusatz-Paket). Gemeinsamer Provider-Handler
im Login-Screen, l10n-Strings, iOS-URL-Scheme (Encoded App ID) für den
Rückweg aus dem Browser, Doku Schritt 8. Der reaktive Haushalts-Bootstrap
deckt den ersten Google-Login automatisch ab. Offen: Google-Provider in
der Firebase-Konsole aktivieren + Gerätetest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:54:32 +02:00
cschlaefke
51a304e986 Fix: BootstrapGate als Overlay statt Baum-Austausch (markNeedsBuild during build)
Das Umschalten vom Warte-Bildschirm auf die App remountete den ganzen
App-Baum, während Riverpod noch Provider-Abhängigkeiten nachzog — das
löste die 'setState() or markNeedsBuild() called during build'-Warnung
aus. Der Splash liegt jetzt als deckende Stack-Ebene über der durchgehend
gemounteten App. Handoff: Bug vom Nutzer als behoben bestätigt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:50:29 +02:00
cschlaefke
0cc39f69b1 Fix: Bootstrap-Maßstab ist householdId, nicht users-Doc-Existenz
Die Push-Registrierung legt users/{uid} per merge selbst an (fcmTokens,
timezone) — beim kaputten Apple-Account existierte das Dokument daher
ohne householdId, und Gate + Bootstrap hielten den Account für fertig.
Jetzt prüfen beide auf householdId; der Bootstrap schreibt das
users-Dokument mit merge, damit die Push-Felder erhalten bleiben.
Neuer Test bildet exakt diesen Zustand ab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:43:23 +02:00
cschlaefke
5ed3a68e45 Fix: Reaktiver Haushalts-Bootstrap + BootstrapGate (Apple-Login legte keinen Haushalt an)
Der Bootstrap hing an signInWithApple und lief erst, nachdem der Router
den Nutzer schon in die App geleitet hatte — Fehler blieben unsichtbar,
der Account blieb ohne users-Doc/Haushalt und alle Writes scheiterten an
den Rules. Jetzt beobachtet householdBootstrapProvider das users-Dokument
und legt Profil + Haushalt reaktiv an (alle Login-Wege); das BootstrapGate
hält die App so lange zurück und macht Fehler mit „Erneut versuchen"
sichtbar. Bestehende kaputte Accounts heilen beim nächsten Start selbst.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 17:49:49 +02:00
cschlaefke
3673256105 Doku: Handoff aktualisiert – Apple-Login implementiert, offener Bug (kein Haushalt-Bootstrap) in Diagnose
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 17:12:30 +02:00
cschlaefke
798912cb03 V2.x: Anmelden mit Apple (iOS + Android)
- AuthRepository.signInWithApple() via eingebautem AppleAuthProvider
  (nativ auf iOS, Web-Flow über Firebase-Handler auf Android, ohne Zusatzpaket)
- Haushalts-Bootstrap in gemeinsamen Helper _bootstrapHouseholdIfNeeded
  ausgelagert; beim ersten Apple-Login wird Profil + Haushalt idempotent angelegt
- LoginScreen: "oder"-Trenner + "Mit Apple anmelden"-Button, Abbruch ohne Fehlermeldung
- l10n: signInWithApple, orDivider, authErrorAppleFailed
- iOS: Entitlement com.apple.developer.applesignin ergänzt
- Doku: firebase-einrichtung.md Schritt 7 (Apple-Login) mit Portal-/Console-Anleitung

Noch offen: Apple-Portal (Services-ID, Sign-in-Key), Firebase-Console-Provider,
Xcode-Capability — danach Ende-zu-Ende auf iOS+Android testen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:52:49 +02:00
cschlaefke
da12e3e5ab iOS-Push aktiviert: APNs/Entitlements + Doku
- Push Notifications & Background Mode (remote-notification) als iOS-Capability
  ergänzt (Runner.entitlements, Info.plist, project.pbxproj)
- Apple Developer Account freigeschaltet, APNs-Schlüssel in Firebase hinterlegt
- Doku: firebase-einrichtung.md Schritt 6 auf "erledigt" + Stolperfalle
  "Personal Team versteckt Push-Capability" festgehalten
- Handoff: V1 nun auch iOS vollständig, iOS-Push aus Offen-Liste entfernt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:47:05 +02:00
cschlaefke
1986a920fa Doku: Handoff auf Session-Stand gebracht (V2.2 bestätigt, offener Faden)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 11:34:47 +02:00
cschlaefke
125a692449 Doku: V2.2 vollständig getestet und bestätigt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 11:00:54 +02:00
cschlaefke
edc4ecf405 Fix: Besitzer-Anzeige in Alt-Haushalten – eigene E-Mail wird nachgetragen
Haushalte aus der V1-Zeit haben keinen members-Eintrag für ihren Ersteller,
die Besitzer-Anzeige blieb dadurch leer. Die App trägt die eigene E-Mail
jetzt beim Start in allen eigenen Haushalten nach; die Rules erlauben dafür
nur den eigenen members-Eintrag ohne Rollenwechsel. Bis dahin zeigt die UI
„?" statt einer leeren Stelle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 00:50:22 +02:00
cschlaefke
ab0e47ff61 Doku: Stolperfalle SwiftPM-Deployment-Target (iOS 15) im Handoff
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 21:47:26 +02:00
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
cschlaefke
1ca02f224b V2.1: Mehrere Haushalte je Nutzer – Mitgliedschaft bleibt beim Beitritt erhalten
- memberUids ist Quelle der Wahrheit, users.householdId nur noch aktiver Zeiger
- Haushalts-Screen: Liste „Meine Haushalte" mit Rolle, Aktiv-Markierung und Wechsel per Tipp
- Beitritts-Dialog warnt nicht mehr vor Datenverlust, sondern erklärt das Zurückwechseln
- sendDailyReminders sammelt fällige Aufgaben aus allen Haushalten des Nutzers
- FirebaseFunctions im HouseholdRepository lazy erzeugt (Widget-Tests ohne Firebase-Init)
- Drawer-Titel mit Ellipsis gegen Overflow auf schmalen Breiten
- Widget-Test für den Haushaltswechsel

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 21:18:25 +02:00
cschlaefke
8b74a5b3df Doku: Handoff-Dokument für Session-Übergaben
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 19:24:00 +02:00
cschlaefke
1b2c880c89 V2: Haushalt teilen – Einladungscodes, Mitglieder- und Sitter-Rolle, sichtbare Bestätigungen
- Einladen per einmaligem 6-stelligem Code (7 Tage gültig), wahlweise als Mitglied oder Pflanzen-Sitter
- Beitritt über Cloud Function joinHousehold (Transaktion, Admin-Rechte)
- Security Rules: Sitter dürfen an Pflanzen nur Bestätigungs-Felder ändern; invites nur erstellen, nie lesen
- Haushalts-Screen: Mitgliederliste mit Rollen, Einladen, Beitreten mit Wechsel-Warnung
- UI-Gating: Sitter sehen keine Anlegen-/Bearbeiten-/Löschen-Aktionen
- Bestätigungen speichern den Namen (lastWateredBy/lastFertilizedBy), Anzeige im Profil
- Tests: Members-Map im Seed, neuer Sitter-Test

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 19:14:34 +02:00
cschlaefke
7d45724ef2 Doku: App-Check-Warnung erklärt, als spätere Härtung notiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 14:45:31 +02:00
cschlaefke
52e72c25b1 Push-Erinnerungen: FCM-Registrierung in der App, geplante Function sendDailyReminders
- Function läuft alle 15 Min (europe-west3): prüft Erinnerungszeit pro Nutzer (Zeitzonen-korrekt), berechnet fällige Aufgaben, schickt eine Sammel-Push pro Tag, räumt ungültige Tokens auf
- App registriert Gerät nach Login (Berechtigung, Token, Zeitzone), Erinnerungszeit wird ins Nutzer-Dokument synchronisiert
- Doku Schritt 6 inkl. APNs-Anleitung für iOS (sobald Developer Account da ist)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 13:06:02 +02:00
cschlaefke
41e31bed88 Foto-Flow mit KI-Erkennung: Kamera, Cloud Function identifyPlant, Storage für Fotos
- Cloud Function (europe-west3): PlantNet-Erkennung mit Claude-Fallback, deutsches Pflegeprofil von Claude, Keys als Secrets
- Pflanzen-Formular: Foto aufnehmen/wählen, Felder werden automatisch vorbefüllt
- Fotos in Storage unter households/{id}/plant-photos, Anzeige in Liste und Profil
- storage.rules mit Haushalts-Prinzip, iOS-Berechtigungstexte für Kamera/Fotos
- Doku Schritt 5: Storage aktivieren, PlantNet-Key, Secrets setzen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 00:05:46 +02:00
cschlaefke
53ee30c598 Firestore und Auth: echte Daten statt Demo, Login mit E-Mail+Passwort, Security Rules
- Datenmodell: users/{uid}, households/{id} mit memberUids, plants/locations als Subcollections
- StreamProvider liefern Live-Daten, Repositories kapseln Schreibzugriffe
- Login-Screen mit Registrierung (legt Haushalt automatisch an), Logout in Einstellungen
- Router-Redirect bei Login/Logout, firestore.rules mit Haushalts-Prinzip
- Tests auf firebase_auth_mocks + fake_cloud_firestore umgestellt
- Verifiziert: analyze/test grün, Android-Debug-Build erfolgreich

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:53:09 +02:00
cschlaefke
4390949c7e Firebase angebunden: Projekt leaf-it-to-me-app, App-Registrierung iOS/Android, Initialisierung beim Start
- flutterfire configure: firebase_options.dart, google-services.json, GoogleService-Info.plist
- firebase_core eingebunden, Firebase.initializeApp in main.dart
- Doku firebase-einrichtung.md auf aktuellen Stand gebracht
- Verifiziert: flutter analyze/test grün, Android-Debug-Build erfolgreich

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:44:24 +02:00
cschlaefke
a5b79193dd Projekt in leafittome umbenannt (App-Name LeafItToMe, Bundle-ID dev.leafittome.app)
- pubspec, Paket-Imports, App-Klasse, ARB-Titel, iOS/Android-Konfiguration
- README und Doku auf neuen Namen und Repo leafittome umgestellt

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:25:41 +02:00
cschlaefke
c7b22a6f86 Doku: SQLite-Pfad /data/gitea/gitea.db in Forgejo-Ersteinrichtung ergänzt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:18:29 +02:00
cschlaefke
d1df0cd2ec Doku: Git-Push per HTTPS+Token als Standardweg, SSH-Port-Mapping via Compose-Edit als Variante B
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:13:00 +02:00
cschlaefke
7b791c5977 Doku: Forgejo-Setup auf Coolify umgestellt, Server-Absicherung ergänzt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 21:46:18 +02:00
cschlaefke
6e22d9c3aa Projekt-Gerüst: Flutter-App mit Heute-Checkliste, Pflanzenverwaltung, Stellplätzen und Einstellungen
- Flutter/Dart (iOS + Android), Riverpod, go_router, i18n via ARB (deutsch)
- Feature-Struktur: today, plants, locations, household (V2-Platzhalter), settings
- Intervall-Modell: Aufgaben werden aus lastWatered/lastFertilized + Intervall berechnet
- In-Memory-Demo-Daten, Firebase-Anbindung folgt im nächsten Block
- Doku: Architektur, Firebase-Einrichtung, Forgejo-Git-Hosting

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