dashboard Project Overview
Current Work
PLAN_F08_offline-support.md— F08 offline supportPLAN_P01_personalization_foundation.md— P01 personalization foundation
Recent Completions
- Unreleased —
- v3.10.1 (22.04.2026) — 1 Bugfixes
- v3.10.0 (22.04.2026) — 6 Features, 9 Bugfixes
menu_book App-Dokumentation
Vollständige Anwenderdokumentation — wie PetWatch funktioniert und wie man es bedient.
Anmeldung & Registrierung
Account erstellen, einloggen, Gast-Modus, Google-Login.
Dashboard
Tagesübersicht, Schnellaktionen, Streak, nächste Fütterung.
Fütterung
Mahlzeiten erfassen, Kalorien tracken, Futterplan, Produktsuche.
Spaziergänge
GPS-Tracking, Live-Karte, Ereignisse, Walk-Historie, Heatmap.
Training
Trainingseinheiten, Übungen, Erfolgsbewertung.
Kalender
Tierarzttermine, Impfungen, Erinnerungen.
Dokumente
Impfpass, Gesundheitsakten, Fotos hochladen und verwalten.
Checklisten
To-Do-Listen pro Haustier erstellen und abhaken.
Gamification
Streaks, Achievements, Avatar, XP-System, Level.
Einstellungen
Sprache, Theme, Benachrichtigungen, Account-Verwaltung.
Gesundheit
Gewicht-Tracking, Kalorienübersicht, Impfpass, Spazierziel.
Anmeldung & Registrierung
Erstelle ein Konto, melde dich an oder probiere PetWatch im Gastmodus aus — ganz ohne Registrierung.
format_list_numbered So funktioniert's
- App öffnen und auf "Registrieren" tippen
- E-Mail-Adresse und Passwort eingeben
- Alternativ: "Mit Google anmelden" für einen schnellen Login
- Oder "Als Gast fortfahren" zum Ausprobieren ohne Konto
lightbulb Tipps & Hinweise
image Screenshots



link Verwandte Funktionen
Dashboard
Deine Tagesübersicht auf einen Blick — was heute ansteht, Schnellaktionen und dein aktueller Streak.
format_list_numbered So funktioniert's
- Nach dem Login landest du automatisch auf dem Dashboard
- Oben siehst du deinen Streak und XP-Fortschritt
- Die Quick-Actions ermöglichen schnelles Erfassen (Walk starten, Fütterung, Training)
- Darunter: heutige Termine und die letzte Fütterung
- Zwischen Tieren wechselst du über den Tier-Chip in der App-Leiste
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Fütterung
Erfasse Mahlzeiten, tracke Kalorien und finde das richtige Futter aus über 6.700 Produkten im Katalog.
format_list_numbered So funktioniert's
- Tierprofil öffnen und den Tab "Fütterung" auswählen
- Plus-Button antippen, um eine Mahlzeit zu erfassen
- Zeitpunkt, Futtermenge und optional ein Futter-Produkt auswählen
- Produkte über die Suche finden — der Katalog berechnet Kalorien automatisch
- Die Kalorienübersicht zeigt Tages- und Wochenziel
lightbulb Tipps & Hinweise
image Screenshots




link Verwandte Funktionen
Spaziergänge
Zeichne GPS-Routen auf, markiere Ereignisse unterwegs und sieh deine Walk-Historie als Heatmap.
format_list_numbered So funktioniert's
- Auf dem Dashboard den Walk-Button antippen
- Tier auswählen und "Walk starten"
- GPS-Aufzeichnung läuft — auch bei geschlossener App
- Unterwegs: Ereignisse markieren (Pinkelpause, Hundebegegnung, etc.)
- Walk beenden — Route, Dauer und Distanz werden gespeichert
- Im Verlauf-Tab findest du alle bisherigen Walks
- Die Heatmap-Ansicht zeigt alle Routen auf einer Karte
lightbulb Tipps & Hinweise
image Screenshots




link Verwandte Funktionen
Training
Dokumentiere Trainingseinheiten mit deinem Tier — Übungen, Dauer und Erfolgsbewertung.
format_list_numbered So funktioniert's
- Tierprofil öffnen und den Tab "Training" auswählen
- Plus-Button antippen, um eine neue Trainingseinheit zu erstellen
- Übungstyp auswählen und Dauer eingeben
- Erfolg bewerten (1–5 Sterne)
- Optional: Notizen hinzufügen für zusätzliche Details
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Kalender
Behalte alle Termine im Blick — Tierarztbesuche, Impfungen, Medikamente und eigene Erinnerungen.
format_list_numbered So funktioniert's
- Den Kalender-Tab in der Navigation öffnen
- Plus-Button antippen, um einen neuen Termin zu erstellen
- Titel, Datum, Uhrzeit und Typ auswählen (Tierarzt, Impfung, Medikament, etc.)
- Optional: Tier zuordnen und eine Beschreibung hinzufügen
- Termine werden in der Monats- und Tagesansicht angezeigt
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Dokumente
Speichere wichtige Unterlagen deines Tieres — Impfpass, Laborbefunde, Versicherungen und mehr.
format_list_numbered So funktioniert's
- Tierprofil öffnen und den Tab "Dokumente" auswählen
- Plus-Button antippen und eine Datei hochladen (PDF, JPG, PNG)
- Kategorie zuweisen (Impfpass, Versicherung, Laborbefund, etc.)
- Dokument antippen für die Vollbild-Ansicht
- Teilen-Button nutzen, um Dokumente per E-Mail oder Messenger weiterzuleiten
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Checklisten
Erstelle To-Do-Listen pro Haustier — für den Tierarztbesuch, Urlaub oder den Alltag.
format_list_numbered So funktioniert's
- Den Checklisten-Tab in der Navigation öffnen
- Plus-Button antippen und einen Namen für die Checkliste eingeben
- Einträge hinzufügen über das Textfeld oder den Plus-Button
- Einträge abhaken durch Antippen
- Erledigte Einträge werden durchgestrichen angezeigt
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Gamification
Sammle XP, halte deinen Streak aufrecht und schalte über 40 Achievements frei — mit deinem virtuellen Pet-Avatar.
format_list_numbered So funktioniert's
- Pflege dein Tier regelmäßig — jede Aktion gibt XP
- Tägliche Aktionen halten deinen Streak am Leben
- Achievements werden automatisch freigeschaltet (z. B. "Erster Walk", "7-Tage-Streak")
- Dein Avatar entwickelt sich mit deinem Level weiter
- Alle Achievements findest du in der Gamification-Übersicht
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Einstellungen
Passe PetWatch an deine Vorlieben an — Sprache, Design, Benachrichtigungen und Kontoverwaltung.
format_list_numbered So funktioniert's
- Den Profil-Tab öffnen und "Einstellungen" auswählen
- Sprache: Deutsch oder English
- Erscheinungsbild: Hell, Dunkel oder Systemstandard
- Benachrichtigungen: Push-Mitteilungen ein- oder ausschalten
- Konto: Passwort ändern oder Daten exportieren
- Danger Zone: Konto unwiderruflich löschen
lightbulb Tipps & Hinweise
image Screenshots


link Verwandte Funktionen
Gesundheit
Alle Gesundheitsdaten deines Tieres auf einen Blick — Gewicht-Tracking, Kalorienübersicht und kommende Erweiterungen wie Impfpass und Spazierziel.
format_list_numbered So funktioniert's
- Zum Tier-Tab wechseln und den Gesundheitsbereich antippen
- Auf der Übersicht siehst du drei Zusammenfassungskarten: aktuelles Gewicht, Kalorien heute und Gewichtstrend
- Im Gewichtsbereich: "Gewicht eintragen" antippen, Kilogramm eingeben und bestätigen
- "Alle anzeigen" öffnet die Gewicht-Detailseite mit Verlaufschart und Eintrags-Historie
- Im Chart kannst du den Zeitraum wählen: 1 Monat, 3 Monate, 6 Monate oder Alle
- "Details" bei Kalorien öffnet die Kalorienübersicht mit Tagesziel, aufgenommener Menge und Faktor-Aufschlüsselung
- Impfpass und Spazierziel werden als Vorschau-Karten angezeigt — diese Features folgen in einem zukünftigen Update
lightbulb Tipps & Hinweise
image Screenshots



link Verwandte Funktionen
route Roadmap
Noch keine Items eingeplant
Noch keine Items eingeplant
Noch keine Items eingeplant
Noch keine Items eingeplant
history Changelog
Bugfixes
- GPS Walk Tracker: Spaziergang zeichnete nur ~2 Punkte in über einer Stunde auf. Ursache: drei interagierende Bugs — (1)
MAX_FIX_AGE_MS(8s) kleiner als Idle-Mode-Intervall (10s) → alle Idle-Fixes wurden als "zu alt" verworfen; (2) Motion-Timeout (5s Android / 8s iOS) feuerte beim Walk-Start-Screen bevor der erste Schritt gemacht wurde → sofortiger Idle-Mode; (3) Accuracy-Gate (20m) filterte kalte GPS-Starts und urbane Fixes heraus. Fix:MAX_FIX_AGE_MS8s→15s,ACCURACY_GATE_METERS20→35m,RECOVERY_ACCURACY_GATE_METERS10→20m, AndroidMOTION_TIMEOUT_MS5→30s, iOSmotionTimeoutSeconds8→30s.
Features
- NFC Tags: Rollenbasierte Schreibrechte — CoOwner und Caretaker können Tags für freigegebene Tiere anlegen. Bearbeiten/Löschen bleibt dem Tag-Ersteller vorbehalten.
- Tierarzt-Suche: Telefonnummer wird automatisch aus OpenStreetMap übernommen. Falls nicht vorhanden, kann sie optional manuell eingegeben werden. Der "Tierarzt anrufen"-Button in der Notfallkarte ist jetzt nutzbar.
- Pet Wizard: Hinweistext unter dem Rasse-Feld — "Rasse unbekannt oder Mischling? Tippe 'Mischling' ein." Nur in der Autocomplete-Ansicht sichtbar.
- Walk Tracker: Dialog wenn GPS nicht startet — "Ohne GPS weitermachen" oder "Walk beenden". Kein Zombie-Walk mehr mit 0.0 km.
- NFC Walk: Navigation direkt zur Walk-Karte nach erfolgreichem Walk-Start per NFC-Tag.
- Übungsbibliothek: "Eigene Übung hinzufügen"-Sheet wählt automatisch den aktiven Schwierigkeitsfilter vor — bei aktivem "Profi"-Filter öffnet das Sheet mit vorausgewähltem "Profi"-Chip.
Bugfixes
- Datums-Eingabe: Tipp "01.05.2025" wurde als "05.01.2025" interpretiert. Ursache:
NativeDateAdapter.parse()fiel aufnew Date()zurück, das Punkte als MM/DD/YYYY parst. Fix:GermanDateAdaptererkennt DD.MM.YYYY per Regex und nutzt den eindeutigen numerischen Date-Konstruktor. - Walk Start: Walk startete nach GPS-Priming-Dialog nicht. Ursache:
MatBottomSheetschließt die erste Sheet wenn eine zweite öffnet — Walk-Start-Sheet wurde mitundefinedgeschlossen, Home-Page brach ab. Fix: GPS-Priming läuft jetzt nach dem Walk-Start-Sheet, nicht darin. - Dokumente Lightbox: Bars blinkten kurz bei Tap. Ursache:
pointermovesetzte Bars sichtbar,clickblendete sie sofort wieder aus. Fix:resetHideTimer()zeigt Bars nicht mehr erzwungen — nur expliziter Tap. - Dokumente Lightbox: Bottom-Bar schimmerte durch Info-Panel (semi-transparenter Hintergrund). Fix: Bottom-Bar wird ausgeblendet wenn Info-Panel offen ist.
- E-Mail: Impressum und Datenschutz im Footer aller 5 E-Mail-Templates waren nicht klickbar (
statt). Fix: Links aufdotslash-labs.com/impressumunddotslash-labs.com/petwatch/privacy. - Fonts: Nunito und Material Symbols Rounded werden jetzt lokal über npm-Pakete geladen statt von Google Fonts CDN. CSP-Einträge für
fonts.googleapis.com/fonts.gstatic.comentfernt. - Auth Interceptor:
location.hostnamewar auf Capacitor immerlocalhost, unabhängig vom echten API-Host. Fix: Vergleich läuft jetzt gegennew URL(environment.apiBaseUrl).origin— externe APIs (Nominatim, Overpass) werden korrekt ohne Bearer-Token angesprochen, ohne den API-Host fälschlicherweise auszuschließen. Behebt sporadischen "Please Sign In"-Fehler beim App-Start. - NFC Tags: Eingeladene Nutzer (PetAccess) konnten keine NFC-Tags für ihre freigegebenen Tiere sehen und tappen. Fix: Tag-Sichtbarkeit und RecordUsage berücksichtigen jetzt aktive PetAccess-Einträge. Tags ohne Tier-Bindung (PetId == null) bleiben privat beim Ersteller. Schreib- und Löschzugriffe bleiben auf den Tag-Owner beschränkt (403 für geteilte Nutzer).
- i18n: Hardcodierte deutsche/englische Strings in Pet-Profil, Home, Activity, Plan und Kalender durch Übersetzungskeys ersetzt. Wochentags- und Monatsabkürzungen werden jetzt per
Intl.DateTimeFormatsprachabhängig generiert.
Features
- Dokumente: Foto-Galerie-Redesign im Google-Photos-Stil — erstes Foto als 2×2-Featured-Zelle, Shimmer-Skeleton beim Laden, Fade-in-Transition, Press-Scale-Animation. Monats-Header mit Jahr + Anzahl rechts. 4 fehlende i18n-Keys ergänzt (INFO, KATEGORIE/CATEGORY, DATUM/DATE, DATEIGRÖSSE/FILE_SIZE).
Bugfixes
- NFC-Tags-Seite: Inhalte wurden vom Bottom-Bar überdeckt (FAB + letzter Tag nicht sichtbar). Korrektes Padding-Bottom analog
exercise-library-Pattern. Redundantes Tier-Banner entfernt. - Android: Sporadischer Ghost-Space beim Kaltstart / Nach-Tastatur-Dismiss. Ursache: Konflikt zwischen
EdgeToEdge.enable()(deaktiviert ADJUST_RESIZE) und Capacitor Keyboard-Plugin (re-aktiviert ADJUST_RESIZE). Fix:SOFT_INPUT_ADJUST_NOTHINGinMainActivity+resize: 'none'incapacitor.config.ts. - Heatmap: Karte blieb schwarz (Kacheln luden nicht). Ursache: Stadia Maps verlangt registrierte Origins — Capacitor-Origin
capacitor://localhostist nicht registriert. Tile-Provider auf CartoDB gewechselt (keine Origin-Beschränkung). - GPS: Zick-Zack-Routen durch fehlende Ausreißer-Ablehnung. 5-Gate-Pipeline implementiert: Max-Age-Check (8s), Signal-Gap-Detection mit Kalman-Reset + Recovery-Frames, Accuracy-Gate (20m), Speed-Jump-Rejection (cosinus-korrigiert, max 25 m/s). Buffer-Replay geschützt durch Reentrancy-Counter.
- Dokumente Lightbox: Unterstrich-Artefakt neben Info-Icon auf dunklem Hintergrund (Samsung-Overflow-Hack). Fix: scoped
overflow: hidden !importantauf Lightbox-Icon-Buttons.
Features
- NFC Tags aus den Einstellungen ins Tierprofil verschoben. Sektion "DOKUMENTE" im Profil heißt jetzt "DATEIEN & NFC". Tags werden tierbezogen gefiltert — nur Tags des jeweils geöffneten Tieres sind sichtbar. Das Tier-Dropdown im Bearbeitungsformular entfällt; das Tier wird automatisch aus dem Profilkontext übernommen. Die "Geräte & Zubehör"-Sektion in den Einstellungen wurde entfernt.
Bugfixes
- QR-Code speichern funktionierte nicht auf Geräten ohne Web Share API Level 2 ("not supported on this device"). Fix: natives
@capacitor/filesystem+@capacitor/share— QR-PNG wird inDirectory.Cachegeschrieben und über das native Android/iOS Share-Sheet geteilt. Kein WRITE_EXTERNAL_STORAGE-Berechtigung nötig. - Android: Tab-Bar schwebte manchmal in der Mitte beim App-Start (halber Screen sichtbar). Ursache:
native-insets-updated-Listener war inngOnInitnach mehrerenawait-Calls registriert —MainActivity.onPageLoadedkonnte das Event als Macrotask feuern, bevor der Listener registriert war. Fix: Listener jetzt synchron inmain.tsvorbootstrapApplicationregistriert, sodass er voronPageFinishedexistiert. - Push-Notification "Erledigt"-Button zeigte "Bitte App öffnen" statt die Mahlzeit abzuhaken. Ursache:
PushActionAuthHelper.javalas Auth-Tokens noch ausCapacitorStorageSharedPreferences, obwohl SEC02 Phase 4.5 alle Token-Keys inWSSecureStorageSharedPreferences(AES/GCM-verschlüsselt, Android Keystore-gesichert) migriert hatte. Fix:PushActionAuthHelperliest jetzt ausWSSecureStorageSharedPreferencesmit dem Plugin-Prefixcapacitor-storage_und entschlüsselt Werte mit demselben AES/GCM-Schema. Write-back nach Token-Refresh ebenfalls angepasst.
Features
- B71: NFC Tags — Physische NFC-Tags (NTAG215) schreiben und automatisch Aktionen auslösen. Drei Aktionstypen: Walk-Toggle (Spaziergang starten/stoppen), Feeding-Plan (Fütterungsplan-Eintrag abhaken), Feeding-Free (freie Fütterung mit FoodType + Menge). Tag-Verwaltung unter Settings → NFC Tags (Liste, Erstellen, Bearbeiten, Löschen). NDEF-Writer als Bottom-Sheet. Deep-Link-Handler (
petwatch://action?...) mit 5-Sekunden-Debounce (persistent via Capacitor Preferences), Tap-Overlay-Animation, Haptic-Feedback. Android: NDEF_DISCOVERED Intent-Filter,launchMode=singleTask, sofortige System-Notification (Channelpetwatch_tag_events) bei Tap, Update-Notification mit finalem Aktions-Text nach 5s Auto-Dismiss. NFC funktioniert auch bei gesperrtem Bildschirm (showWhenLocked + turnScreenOn). Backend:NfcTag-Entity (EF Core, Soft-Delete), Rate-Limiting 20/min, atomischerUseCount-Counter viaExecuteUpdateAsync, 5 REST-Endpunkte. iOS ausgeblendet (L30 — NFC-Entitlement noch nicht aktiviert). 80 Frontend-Tests, 31 Backend-Tests. Android-only MVP.
Bugfixes
- NFC: Doppelter Dispatch (appUrlOpen + nfcTagDetected) führte zu "already checked off" bei erstem Tap. Foreground-Pfad nutzt jetzt ausschließlich nfcTagDetected-Event.
- NFC: Fütterungsplan-Tag zeigte "already checked off" obwohl Mahlzeit nicht abgehakt war (Physical Tag hatte alte Schedule-ID nach Edit ohne Rewrite). Wenn Mahlzeit im Edit geändert wird, öffnet sich jetzt automatisch der Writer-Dialog.
- NFC: ±2h-Fenster entfernt — Mahlzeiten können jederzeit abgehakt werden. Bei verspätetem Tap (>2h) erscheint Bestätigungs-Dialog.
- NFC: Doppelter Back-Button auf NFC-Seiten entfernt.
- NFC: Spurioser "Action type was changed"-Banner beim Öffnen des Tag-Editors behoben.
- Backend: DbSeeder crashte beim Start wenn Seed-File-Hash sich geändert hatte (NpgsqlRetryingExecutionStrategy + user-initiated Transaction). Fix: CreateExecutionStrategy().ExecuteAsync().
Bugfixes
- Viewport-Race beim Android App-Start (sporadisches „schwarzer Bereich unten / Tab-Bar schwebt mittig"):
MainActivity.injectInsetsIntoWebView()dispatched nach dem Setzen der--native-inset-*CSS-Variablen einCustomEvent('native-insets-updated')aufdocument.documentElement.app.tsregistriert auf Android einenrunOutsideAngular-Listener, der einen synchronen Reflow viadocument.documentElement.offsetHeighterzwingt — damit werdencalc(... + var(--safe-area-bottom))-Ausdrücke nach der asynchronen Inset-Injection neu ausgewertet. Behebt Race zwischen WebView-Evaluate und Angular-Shell-Layout ohne Watchdog/Polling/Keyboard-Hack (ersetzt den vorherigen Workaround-Pfad ausa0c41f0). iOS und Web unverändert. - GPS-Priming-Sheet: Datenschutz-Link führte auf nicht existierende Route
/privacy. Ersetzt durchBrowserService.openAsync(environment.privacyPolicyUrl)(Capacitor-aware External Open), spiegelt das Register-Seite-Pattern; Sheet dismissed weiterhin beim Tap, Spec umBrowserService-Mock erweitert. - Sofort-Lösch-Pfad (
DELETE /api/users/memitimmediate: true) warf 500 wegenEnableRetryOnFailure+ user-initiated Transaction. Fix:UserDeletionService.HardDeleteImmediatelyAsyncwrappt die Transaktion jetzt inDatabase.CreateExecutionStrategy().ExecuteAsync(...), wie von EF bei aktiver Retry-Strategie gefordert. - Register-Seite: Fehleranzeige von Inline-Banner auf Toast-Notification umgestellt (leichteres Feedback-Pattern, konsistent mit den restlichen Seiten). Neuer i18n-Fallback-Key
AUTH.REGISTER.GENERIC_ERROR(DE + EN). - Register-/Reset-Password-Seite: Frontend-Passwort-Validator spiegelt jetzt die Backend Identity-Policy (Länge ≥ 8, Groß-, Kleinbuchstabe, Ziffer) mit granularen i18n-Fehlermeldungen + Eingabehinweis; Fehler-Banner auf Register scrollt + fokussiert sich nach fehlgeschlagenem Submit automatisch in den sichtbaren Bereich (kein „Silent Fail" mehr).
- Register-Endpoint: Password-Policy-Verstöße (zu kurz, keine Großbuchstaben, keine Ziffer) werden jetzt als dedizierte Fehlermeldung
Auth_PasswordPolicyan den Client zurückgegeben statt als generischesAuth_RegistrationFailed; nicht-passwort-bezogene Identity-Fehler bleiben generisch (Email-Enumeration-Schutz). - Register-Seite: "Nutzungsbedingungen"-Link öffnete fälschlich die Datenschutzerklärung. Neue separate ToS-Seite
docs/website/petwatch/terms.html(Version 1.0, Stand 20.04.2026) mit Standard-B2C-Abschnitten (Geltungsbereich, Leistungsbeschreibung, Nutzerpflichten inkl. § 25 TDDDG Altersgrenze ≥ 16, Accounterstellung & -löschung, Verfügbarkeit/Gewährleistung, Haftung mit Vorsatz + grober Fahrlässigkeit, kein Ersatz für tierärztlichen Rat, geistiges Eigentum, Änderungen, deutsches Recht + Gerichtsstand NRW, Kontakt/Impressum-Verweis). Spiegelt Visual-Style + Footer vonprivacy-policy.html. NeuestermsOfServiceUrl: 'https://dotslash-labs.com/petwatch/terms'inenvironment.ts+environment.prod.ts. Footer-Navigation aller vier Public-HTML-Seiten (privacy, delete-account, licenses, impressum) um Cross-Link "Nutzungsbedingungen" ergänzt.RegisterPage.openTerms()+ zugehöriger Spec-Test aktualisiert.
Sonstiges
- SEC02 Phase 4: Code-Härtung + Compliance-Audit-Abschluss. 4.2 LocalFileStorage Path-Boundary:
ResolveAndValidateUploadPathblockt Traversal (absolute + relative Pfade),HashForLogging+ geschützteDeleteAsync/Exists, 9 neue Tests. 4.3 PII-Logging: NeuePiiMasker-Utility (MaskEmail→f@bar.de,HashShort→ SHA256-8-hex), 6 Log-Sites inAuthService+SmtpEmailServicebereinigt, 15 Tests. 4.4 Security-Audit-Log (T48): NeueSecurityAuditLog-Entity + 17-Type Enum (UserRegistered, LoginSuccess/Failure, PasswordChanged/Reset, EmailVerified, RefreshTokenRotated, Account-Soft/Restore/HardDeleted, PetAccess granted/revoked/accepted, Consent recorded/updated), MigrationAddSecurityAuditLog,AuditLogServicemit Never-Throw-Contract + 2000-Zeichen-Truncation, Hooks in AuthService/PetAccessService/UserDeletionService,GET /api/users/me/audit-logmit Pagination + 60/h Rate-Limit, 18 Tests. 4.5 Secure Storage (Android Keystore / iOS Keychain):@aparajita/capacitor-secure-storagePlugin,SECURE_KEYS-Routing inStorageService,SecureStorageMigrationServiceläuft vorAuthFacade.initializeAsync, Login-Banner bei Migrations-Fehler, L28 (limitations.md) für Web-localStorage-Fallback. 4.7 T54-Residuen + CVEs:ionic://localhost+http://localhost:8100aus CORS raus (prod + dev), unusedJwtService.ValidateToken()entfernt,PublicPetsControllermit[EnableRateLimiting("guest")], HSTS (Preload + IncludeSubDomains + 365d),lottie-web+jsqrauspackage.jsonraus,@capacitor/cli→devDependencies,console.warn/errorenv-guarded (15 Treffer in 7 Files), CSP für Pet Web Card ohnehttp:, L29 für CSP-Enforcement-via-Reverse-Proxy. 4.8 Facade-State-Reset: NeuerAppStateResetServicemit Set-basierter Registry + per-Facade try/catch, 19 Facades implementierenStateResettable+ self-register,AuthFacade.clearAndResetAsync()public für Reuse (Step 4.6), 14+12 neue Specs (inkl.EmergencyCardFacademedical-data reset). 4.6 DSGVO Sofort-Lösch-Pfad (Art. 17):** Delete-Dialog erweitert um Checkbox „Sofort & unwiderruflich löschen" (nur für reguläre Accounts, nicht für Guests). Button-Label wechselt dynamisch (aria-live="polite").ConfirmDialogComponentgenerisch um optionalecheckbox-Config erweitert (Backwards-compat — ohne Config weiterhinboolean-Result). Backend:DELETE /api/users/meakzeptiert jetzt optionalesDeleteAccountRequestDtomitImmediate-Flag, routet zu neuerUserDeletionService.HardDeleteImmediatelyAsyncdie Audit-Log + Cascade + Identity-Delete in EF-Transaction wrappt. ZusätzlicheExecuteDeleteAsyncfürExpense.LoggedByUserIdundPetEmergencyLink.CreatedByUserId(beide FKRestrict, hätten Hard-Delete gegen Postgres gecrasht bei shared-pet-Szenarien).AccountHardDeletedAudit-Event mitsource="user-requested-immediate". Guest-Flow unberührt. - SEC02 Phase 3: Consent-Flow (Register + Age-Gate + GPS-Priming + FCM-Opt-In). Backend:
ApplicationUserum 6 Consent-Felder erweitert (ConsentedAt,ConsentedPrivacyVersion,ConsentedTermsVersion,ConsentedAgeVerified,FcmConsentAt,FcmConsentVersion). MigrationAddUserConsentmit idempotentem Backfill (nur reale, nicht-deleted, non-guest Accounts). NeuesMustBeTrueAttribute+ApplyConsent-Helper imAuthService. Consent-Gate enforced bei Register, Google-Login (neu-User), beiden Guest-Upgrade-Pfaden. NeueFcmConsentRequestDto+POST/DELETE /api/users/me/fcm-consentmit Rate-Limit-Policyfcm-consent(10/h pro UserId).UserDeviceRepository.DeleteByUserIdAsyncnutztIgnoreQueryFilters()für vollständige Token-Purges inkl. soft-deleted. Version-Felder validieren^(\d{4}-\d{2}|legacy-pre-\d{4}-\d{2})$. 23 neue Backend-Tests. Frontend: Register + beide Guest-Upgrade-Sheets zeigen 3 separate Checkboxes (Privacy, Terms, Age≥16 gemäß § 25 TDDDG), alleValidators.requiredTrue; Submit disabled bis alle gecheckt. Version kommt ausenvironment.privacyPolicyVersion(2026-04). Consent-Payload im Google-OAuth-Context für Replay-Sicherheit durchgereicht. FCM-Opt-In: NeuerFcmConsentSheetComponent(Bottom-Sheet mit Opt-In/Decline),PushNotificationServiceruft Consent nur nach Accept ab; Settings-Toggle synchronisiert bidirektional, Web-Plattform bekommtPUSH.UNSUPPORTED_PLATFORM-Info-Toast statt Silent-Fail. Decline persistiert als Sentinel-State. GPS-Priming: NeuerGpsPrimingSheetComponentvor nativer Location-Permission, integriert inWalkStartSheetComponent. Dual-Modeinitial/denied— Denied-Mode zeigt „Zu den Einstellungen"-Button (NativeGps.openAppSettings()via AndroidACTION_APPLICATION_DETAILS_SETTINGS/ iOSUIApplication.openSettingsURLString). NativeNativeGps.checkPermissions()auf Android + iOS (nicht-blockend, side-effect-free). Android-Plugin returntgrantedwenn fine-location granted (Background-Permission optional → kein Priming-Loop mehr). Storage-Keypetwatch_walk_priming_shown_atals ISO-Timestamp. Manuelle Walks bypassen Priming. 40+ neue Frontend-Tests. i18n DE+EN komplett. - SEC02 Phase 2: Compliance-Pflichtdokumente + Privacy Policy Vollüberarbeitung. Neue Compliance-Doku in
docs/compliance/: VVT (Verzeichnis der Verarbeitungstätigkeiten nach Art. 30 DSGVO, 9 Tätigkeiten V1-V9), TOMs (technische + organisatorische Maßnahmen nach Art. 32, 4 Bereiche mit Code-Pfad-Referenzen), Breach-Response-Playbook (Art. 33/34 mit 72h-Checkliste + LDI-NRW-Meldeprozess), DSFA für GPS-Tracking + Walk-Fotos (Art. 35 mit CNIL-PIA-Methodik inkl. EXIF- und Passanten-Risiko), AVV-Ordner-Struktur (avv/README.mdmit Anleitung für Hetzner/Lima-City/Google/Stadia Maps Human-Check), Store-Privacy-Declarations für Google Play Data Safety + Apple App Privacy. Privacy Policy (privacy-policy.html) komplett überarbeitet: 13 DSGVO-Lücken geschlossen (LDI NRW Aufsichtsbehörde, FCM EU-US DPF + SCCs-Fallback, Pflicht zur Bereitstellung Art. 13 Abs. 2 lit. e, Art. 22 Negativ-Aussage, Widerrufsrecht Art. 7 Abs. 3, Reaktionsfrist 1 Monat Art. 12 Abs. 3, Speicherdauer-Tabelle pro Kategorie, ACTIVITY_RECOGNITION-Permission-Erklärung, Stadia Maps als USA-Empfänger deklariert, JWT/localStorage als § 25 Abs. 2 Nr. 2 TDDDG, PetAccess-Rollen-Tabelle Owner/Editor/Viewer, POST_NOTIFICATIONS separat von FCM-Token, Gesundheitsdaten-Hinweis für Dokumenten-Upload). Version-Tag2026-04als HTML-Kommentar + meta-Tag für In-App-Banner-Vergleich. Firmenname-Korrektur amanda.de GmbH (vorher falsch Bradler & Krantz). Stand-Datum 19.04.2026. In-App Privacy Banner: neuerPrivacyBannerService+PrivacyBannerComponentzeigt nach Login/App-Start dezenten Banner beiseenPrivacyVersion < privacyPolicyVersion. Lexikographischer ISO-YYYY-MM-Vergleich. „Verstanden"-Dismiss mit Downgrade-Schutz (read + write side). Keine Einwilligung, nur Information (Art. 12 Abs. 1). Banner hat Vorrang vorReviewPromptComponent(DSGVO-Relevanz). NutztStorageService(Capacitor Preferences auf Native, localStorage auf Web). 18 neue Frontend-Tests. - SEC02 Phase 1: Compliance-Sofort-Patches + Security-Hardening. Privacy Policy: Backup-Retention vereinheitlicht auf 30 Tage (vorher Widerspruch 14 vs 90 Tage), „Daten verlassen EU nie"-Aussage präzisiert (FCM-USA-Ausnahme explizit), Löschfrist-Timeline konsistent (7T Deaktivierung / 30T Löschung / 30T Backup). Delete-Account-Seite: Backup-Retention angepasst. Impressum: § 5 DDG Reaktionszeit-Zusage (24h Werktage) ergänzt, Umlaut-Entity-Konsistenz. FilesController IDOR-Fix (T54 R2 HIGH): Ownership-Check für alle File-Kategorien (Avatare, Dokumente, Walk-Fotos, Belege) über erweiterten
IFileAccessService. Pet-Avatare via PetAccess für Co-Owner/Caretaker zugänglich.NotFoundstattForbid(kein Existence-Leak). 6 neue xUnit-Tests (17 gesamt in FileAccessServiceTests). UsersController Validation: NeueUpdateUserProfileDtomit[MaxLength(100)]+ Unicode-Regex für Namen (Umlaute/Apostrophe/Hyphens erlaubt,abgelehnt) + strikte GUID-basierteAvatarUrl-Regex (javascript:,data:, Path-Traversal geblockt). NeueIUserProfileServicemit Defense-in-DepthIFileStorage.Exists-Check. Controller entkoppelt vonUserManager. 18 neue Service-Tests + Delegation-Controller-Test.
Features
- Walk-Notification Tap-to-Open: Tippen auf die "Walk wird aufgezeichnet"-Notification öffnet jetzt die App und navigiert direkt zum aktiven Walk-Tracker. Android Foreground Service PendingIntent + NativeGps Plugin Event + Frontend-Navigation.
- B72: Walk Heatmap Redesign — Heatmap-Ansicht komplett überarbeitet. Neuer Backend-Endpoint (
GET /api/walks/heatmap) mit Douglas-Peucker GPS-Vereinfachung. Empty State mit CTA. Layer-Toggle (Routen | Events | Beides). Routen-Visualisierung mit Frequenz-basierter Strichstärke/Opazität. Event-Clustering (Pixel-Proximity, zoom-abhängig). Event-Sub-Filter (Alle | Pipi | Kacke | Markierung). Erweiterte Statistiken (längster Spaziergang, Lieblingszeit, häufigster Wochentag, Durchschnittsdauer). Legende. Dark-Mode-Support. 27 neue i18n-Keys (DE+EN). 19 Frontend-Tests, 19 Backend-Tests. - B73: Futterhaus Scraper — Produktdaten von Futterhaus.de als zweite Quelle neben Fressnapf.
GlobalFoodProduct-Entity generalisiert:FressnapfId→ExternalId+Source(Multi-Source).DbSeederlädt alle Seed-Dateien mit per-Source Idempotenz. Neuer Scraper (scripts/scrape-futterhaus/) mit 3-Phasen-Pipeline (Playwright → Transform → Seed SQL). ~144 Food-Produkte von Futterhaus.de. EF-MigrationRenameExternalIdAddSource. - T56: Frontend
Accept-LanguageInterceptor — setztAccept-LanguageHeader auf jede API-Anfrage basierend auf App-Sprache (LanguageService.currentLang). Backend erhält jetzt korrekte Locale für i18n-Responses statt Browser-Default. - T55: Backend i18n —
.resxResource-Files für Deutsch + Englisch. 58 Resource-Keys (53 Error-Messages + 5 E-Mail-Subjects).RequestLocalizationMiddlewaremit Defaultde, unterstütztde+en. Alle 68BusinessRuleException-Messages und 3 Exception-Handler-Messages aufIStringLocalizermigriert. E-Mail-Subjects lokalisiert. ASP.NET Identity Errors generisch gewrappt (Details server-side geloggt). 39 neue i18n-Tests (Resource-Validierung, Resolution, E-Mail-Subjects). - B34: GPS Heading/Bearing-Validierung —
NativeGps-Plugin liefert jetztbearing+bearingAccuracy(AndroidLocation.getBearing()+getBearingAccuracyDegrees()API 26+; iOSCLLocation.course+courseAccuracyiOS 13.4+).PhoneGpsSourceberechnetbearingValid(Bedingung:bearing != nullAND speed ≥ 0.5 m/s AND bearingAccuracy ≤ 45°) und hängt das Feld an jedeGpsPosition. Filtert unzuverlässige Richtungsdaten bei Stillstand/Langsamgang heraus. Noch keine UI-Konsumenten, Daten fließen für zukünftige Indikatoren durchs Modell. - B35: GPS Satellite Count + Signal Quality —
NativeGps-Plugin emitted auf AndroidsatelliteCountviaGnssStatus.Callback(Satelliten mitusedInFix = true); auf iOS immernull(keine öffentliche API).PhoneGpsSourceleitetsignalQualityausaccuracyab: ≤5m excellent, ≤10m good, ≤20m fair, >20m poor, fehlend → unknown. Groundwork für GPS-Quality-Indikator im Walk-Tracker (B83). 18 neue Frontend-Tests (Bearing-Grenzen, Signal-Quality-Buckets) + 9 Android Unit-Tests (SatelliteCounterTest).
Bugfixes
- BUG26: QR-Code-Speichern auf nativem Gerät (Android/iOS) funktionierte nicht. Ursache: Browser-only
Pattern funktioniert nicht im Capacitor WebView. Fix: Web Share API Level 2 mitnavigator.share({ files })für native Plattformen (öffnet natives Share-Sheet, User wählt "In Fotos speichern" o.ä.),-Fallback bleibt für Browser. Bei älteren WebViews ohnecanShare({files})-Support wird expliziter Error-Toast angezeigt (SHARE_SHEET.SAVE_QR_UNSUPPORTED) statt Silent-Fail. Keine neuen Dependencies. 9 neue Frontend-Tests. - Walk-History "Manuell"-Bug behoben: Alle Walks wurden fälschlich als "Manuell" angezeigt, weil der List-Endpoint keine GPS-Daten mehr mitliefert (T54 Performance). Fix:
LocationCountundPreviewLocations(Douglas-Peucker ~30 Punkte) als neue DTO-Felder. Frontend nutztlocationCountfür Manuell-Erkennung undpreviewLocationsfür SVG-Routenvorschau in der Liste. - FeedType-Klassifikation verbessert: Verpackungsgrößen-Heuristik (50–800g=Nassfutter, 1kg+=Trockenfutter) und Nährwert-Heuristik (Protein<18%=Nassfutter) als Fallback für Fressnapf + Futterhaus Scraper. Katalog-Suchfeld zeigt jetzt saubere Produktnamen ohne Gewichtsangaben.
UI Polish
- B76: Profil — "Gefahrenbereich"-Label in rot über "Abmelden" + "Konto löschen" gruppiert. Beide Aktionen liegen jetzt in einem visuell abgesetzten Block mit rotem Gruppen-Header (
role="group"+aria-labelledbyfür Screen Reader). Neue i18n-Keysprofile.dangerZone.titlein DE + EN. 4 neue Frontend-Tests. - B77: Tier-Profil — "Tier löschen" Button-Redesign. Von vollfarbigem roten Pill-Button auf subtile Outlined-Variante mit Trash-Icon umgestellt, gemäß SLA Design System. Bleibt klar als destruktive Aktion erkennbar, dominiert aber nicht mehr visuell. 3 neue Frontend-Tests.
Bugfixes
- BUG25: Push-Notification Aktions-Buttons ("Erledigt", "Später") schlugen mit "Fehler — bitte App öffnen" fehl. Ursache: Native HTTP-Pfade (Android + iOS) enthielten
/api/-Prefix, aber der nginx Reverse Proxy fügt diesen automatisch hinzu → doppelter Prefix/api/api/...→ 404. Fix:/api/aus allen nativen Pfaden entfernt (QuickCompleteReceiver, SnoozeReceiver, PushActionAuthHelper auf Android; AppDelegate auf iOS). - BUG20: TrainingService.UpdateSessionAsync warf
DbUpdateConcurrencyExceptionbeim Bearbeiten von Trainingseinheiten mit Übungen. Ursache: identisch zu BUG19 —BaseEntity.Id = Guid.NewGuid()ließ EF neue Exercises alsModifiedstattAddederkennen. Fix:AddExercisesAsyncauf ITrainingRepository (explizitesAddRangevia DbSet), Contains-Guard gegen Duplikate. 6 neue Backend-Tests.
Sonstiges
- T54: Full Software Audit Runde 2 — 39 weitere Findings (6 High, 21 Medium, 12 Low). Behoben: FilesController IDOR (Ownership-Check via FileAccessService für Dokumente, Walk-Fotos, Belege), Facade State Leak bei Logout (resetState auf 19 Facades — Privacy-Fix), MailKit 4.16.0 (SMTP-CVE), Legacy Microsoft.AspNetCore.Identity 2.3.1 entfernt (2 HIGH CVEs), npm audit fix (14 dev toolchain CVEs), Rate-Limiting auf reset-password, Guest-Token-Fallback 180→30 Tage, SMTP-Passwort aus appsettings.Development.json entfernt. 15 neue Backend-Tests (FileAccessService + FilesController IDOR).
- T54: Full Software Audit — 46 Findings (1 Critical, 6 High, 24 Medium, 15 Low) identifiziert und 27 davon behoben. Security: Expense-Receipt File-Validierung (magic bytes + content type whitelist), Password-Policy 8 Zeichen + Uppercase, Hangfire Dashboard localhost-only, Rate-Limiting auf verify-email, JWT-Placeholder-Startup-Check, inline DTOs mit [Required] nach Application-Layer verschoben. Error Handling: generische Fehlermeldung bei Password-Reset (kein Email-Enumeration), InvalidOperationException nicht mehr als 400 gemappt, ExpenseDetail error vs. not-found Unterscheidung. Clean Code: GetCurrentUserId als Extension-Method (22 Controller), FileUploadValidator-Utility (5 Controller), Error-Interceptor i18n (8 Keys DE+EN), Mood-Texte i18n, getActiveLocale()-Utility statt hardcoded 'de-DE' (7 Dateien), long-press Directive Signal-Migration, console.error Cleanup. Performance: AsNoTracking auf 8 read-only Repository-Methoden, Walk-Liste ohne GPS-Locations-Eager-Loading, Npgsql EnableRetryOnFailure, Walk-Timer Cleanup-Optimierung. Architecture: IFormFile→Stream in Application-Layer, CancellationToken in RefreshTokenRepository, afterDismissed().subscribe→firstValueFrom (6 Pages). 11 neue Backend-Tests, 5 neue Frontend-Tests.
Features
- B47: Einheiten-übergreifende Kalorien — Stück-Produkte können jetzt Kalorien berechnen über neues Feld "Gewicht pro Stück (g)" am Produkt. Formel:
Stück × Gewicht × kcal/100g ÷ 100. Dynamisches Label "Kalorien pro 100g/100ml" passt sich der gewählten Einheit an. Backend:WeightPerPieceGramsauf FoodProduct (Migration),FeedTypeCalorieDefaults.ComputeProductCalories+BuildFeedingItemspiece-aware,FeedingScheduleProductDtomitCaloriesPer100g+WeightPerPieceGramsfür Frontend-Preview. Frontend:CalorieCalculatorService.getDefaultCaloriesPer100g(), dynamisches Calorie-Label, Weight-per-Piece Feld (nur bei Einheit=Stück), piece-awareestimatedCaloriesim Schedule-Formular, Schedule-Reload-Path mit neuen Feldern. 3 Backend-Tests + 20 Frontend-Tests. - B56: Onboarding-Achievements — 4 neue Badges im Achievement-System: "Erster Schritt" (erstes Pet erstellt, Bronze), "Entdecker" (App-Tour abgeschlossen, Bronze), "Gut vorbereitet" (geführtes Onboarding komplett, Bronze), "Schnellstarter" (erste Aktion innerhalb 5 Min. nach Tour, Silver). Backend: Seed-Migration, 3 neue
UserActivityStats-Felder,AchievementEvaluator-Logik, Quick-Win-Zeitvergleich (früheste Aktivität vs.OnboardingCompletedAt + 5min). Frontend: 12 i18n-Keys (DE+EN), Icon-Mapping,AchievementFacade.triggerCheckAsync()im Onboarding-Facade nach Completion. 8 Backend-Tests + 2 Frontend-Tests. - B75: In-App Review Prompt — dezente Card über der Tab-Bar, erscheint nach der 10. abgeschlossenen Fütterung. "Bewerten" öffnet nativen In-App Review (Play Store / App Store), "X" unterdrückt den Prompt permanent (serverseitig via
ReviewPromptDismissedAt— geräteübergreifend). Kein Prompt für Gäste. Backend: neuesUserMeDto(separiert private Felder von geteiltemUserDto),POST /api/users/me/dismiss-review-prompt,TotalCompletedFeedingCountin Fütterungs-Completion-Response. Frontend:ReviewPromptService+ReviewPromptComponentinlayout/, Animation slide-up, i18n DE+EN. Statischer "App bewerten"-Button aus Profil entfernt. - B31: PetAccess-Ablauf Push-Benachrichtigungen — wenn ein geteilter Zugang ein Ablaufdatum hat, werden automatisch zwei Push-Notifications geplant: 24h vor Ablauf ("Zugriff endet morgen") und zum Ablaufzeitpunkt ("Zugriff abgelaufen"). Benachrichtigt sowohl den betroffenen User als auch den Pet-Owner. Jobs werden bei Zugangs-Erstellung, -Änderung und -Löschung korrekt geplant/aktualisiert/storniert. Stale-Job-Guard verhindert veraltete Notifications bei nachträglicher Änderung. Frontend: Tap auf Notification navigiert jetzt zu
/tabs/pet/access, beide Typen inNATIVELY_DISPLAYED_TYPES(kein Doppel-Toast im Vordergrund). 25 Backend-Tests + 4 Frontend-Tests. - B36: Account-Löschung mit 14-Tage-Gnadenfrist — "Konto löschen" führt jetzt ein Soft-Delete durch statt sofortiger Datenlöschung. 14 Tage lang kann der Nutzer sich anmelden und sein Konto wiederherstellen (Passwort + Google OAuth). Nach Ablauf löscht der RetentionCleanupJob alle Daten inkl. hochgeladener Dateien (Avatare, Dokumente, Walk-Fotos) endgültig. Bestätigungs-E-Mail mit Löschdatum. Push-Notifications werden sofort gestoppt (UserDevice Soft-Delete + Guard in FeedingNotificationJob). PetAccess und Haustiere bleiben während der Gnadenfrist für Haushaltsmitglieder sichtbar. Backend:
SoftDeleteUserAsync,RestoreUserAsync,AccountPendingDeletionException,POST /api/auth/restore-account+/restore-account/google, RetentionCleanupJob File-Cleanup mit Try-Catch-Resilienz. Frontend: Restore-Dialog bei Login, aktualisierte Lösch-Bestätigung, dynamische Locale-Datumsformatierung. Help & FAQ aktualisiert (ke-4, ke-8, neuer ke-9 Eintrag). - B74: Shared Notification Sync — Fütterungs-Erinnerungen synchronisieren sich jetzt über alle Geräte im Haushalt. Tippt ein Mitglied auf "Erledigt", verschwindet die Benachrichtigung automatisch auf allen anderen Geräten (Silent Push). "Später" verschiebt die Erinnerung für alle gleichzeitig über das Backend (statt nur lokal). Neuer Endpoint
POST .../snooze,INotificationSyncServicemit Silent-Push-Infrastruktur,IFcmService.SendSilentToMultipleAsync. Android:notification_dismiss-Handler + SnoozeReceiver mit Network-First + Local-Fallback +goAsync(). iOS:didReceiveRemoteNotificationfür Silent Push, Snooze via Backend mit Local-Fallback, Pending+Delivered Notification Cleanup. Frontend:notification_dismissToast-Suppression. 22 neue Backend-Tests.
Bugfixes
- "Teilen"-Button im QR-Code-Dialog kopierte nur den Link statt natives Share-Sheet zu öffnen. Ursache:
navigator.share()nicht verfügbar in Capacitor WebView. Fix:@capacitor/sharePlugin eingebaut — natives Android/iOS Share-Sheet öffnet sich jetzt. Fallback auf Clipboard für Web. - B28: Guest Account Cleanup Job — Gastkonten werden nach 30 Tagen ab Erstellung automatisch und unwiderruflich gelöscht, inkl. aller verknüpften Daten (Tierprofile, Spaziergänge, Dokumente, Fotos, Checklisten, Kalendereinträge) und hochgeladener Dateien (Avatare, Walk-Fotos, Belege). Läuft im bestehenden
RetentionCleanupJob(täglich 3 Uhr UTC). Bereits upgraded Accounts (IsGuest=false) und soft-deleted Guests werden nicht doppelt verarbeitet. Datenschutzerklärung aktualisiert: explizite Löschungsankündigung, Datenkategorien, DSGVO-Rechtsgrundlage (Art. 17 Abs. 1 lit. e + Art. 5 Abs. 1 lit. e). Help & FAQ ergänzt (Gastmodus-Beschreibung korrigiert + neuer Eintrag zur 30-Tage-Löschung).definition.mdaktualisiert. 6 Backend-Tests.
Sonstiges
- SEC01: BusinessRuleException — Neue Custom Exception für Business-Regel-Verletzungen.
InvalidOperationException.Messagewurde bisher direkt an HTTP-Clients weitergegeben, was interne .NET-Fehlermeldungen leaken konnte. Jetzt: NurBusinessRuleException-Messages werden exponiert (HTTP 400), alle anderenInvalidOperationExceptionbekommen eine generische Meldung. 68 Throws migriert (9 Application Services + 2 Infrastructure Repositories), 28 Test-Assertions aktualisiert. Kein Breaking Change für API-Consumer.
Bugfixes
- BUG22: Active Walk bei geteiltem Pet zerstört Tracking — Wenn ein shared User einen Walk startete und ein anderer User die App öffnete, restaurierte
checkAndRestoreActiveWalkAsyncden fremden Walk und startete GPS lokal, was Walk-Daten korrumpierte. Fix: Zwei neue Backend-Endpoints (GET /active/mine+GET /active), Frontend unterscheidet überactiveWalkvs.foreignActiveWalkSignal. GPS startet nur für eigene Walks, fremde Walks zeigen read-only Banner ("{name} ist unterwegs mit {petName}"). Defense-in-depth Ownership-Guard im Walk-Tracker. 7 Backend-Tests + 10 Frontend-Tests. - BUG23: Manueller Walk Dauer-Eingabe kaputt —
inputmode="numeric"zeigte numerische Tastatur ohne Doppelpunkt, HH:MM-Format war nicht eingebbar. Außerdem wurden reine Minutenwerte wie "60" vom Regex-Validator abgelehnt. Fix: Freitext-Feld ersetzt durch Toggle zwischen Dauer-Modus (zwei separate Stunden/Minuten-Felder) und Endzeitpunkt-Modus (nativer Time-Picker). Next-Day-Handling wenn Endzeit vor Startzeit liegt. 9 Component-Tests + 5 Utility-Tests. - BUG25: Pet-Profil QR-Code zeigte falschen Titel "Notfallkarte teilen" und unnötige Ablaufzeit-Konfiguration. QR im Profil ist zum Ausdrucken/Halsband — Link ist jetzt permanent. Notfallkarte-Share behält Ablaufzeit-Optionen. Backend:
ExpiresAtnullable, null = permanent. Frontend:mode-Flag (pet-profilevsemergency) steuert UI. 3 Backend-Tests + 5 Frontend-Tests. - BUG24: Kalender-Events für shared User unsichtbar —
CalendarRepositoryfilterte nachCreatedByUserIdstatt nach Pet-Zugehörigkeit. Shared User sahen keine vom Owner angelegten Termine (Tierarzt, Erinnerungen). Fix: Pet-Access-Filter (Pet.OwnerId == userId || Pet.Accesses.Any(...)) inGetUpcomingEventsForUserAsyncundGetRecurringMastersForUserAsync. 4 neue Tests. - BUG21: Futter-Produkte bei Pet-Sharing nicht sichtbar — geshared User sah leere Produktliste im Meal-Logging, obwohl Produkte an Feedings des geteilten Pets hingen. Ursache:
GET /api/food-productsfilterte strikt nachCreatedByUserId. Fix: Optionaler?petId=Query-Param, liefert Union aus eigenen Produkten + Produkten an Feedings des Pets (singleSELECT ... WHERE ... IN (subquery)— kein UNION). Authorization:UserHasAccessToPetAsync-Check, kein Leak der Owner-Bibliothek. Frontend reichtpetIdim Meal-Logging-Flow durch (meal-form-sheet → product-picker → facade → service). Library-Aufrufer bleiben unverändert (user-scoped). 7 Integration-Tests (Shared Access, Authorization, Soft-Delete, Distinct, Library-Isolation) + 10 Frontend-Specs. - BUG19: Fütterung bearbeiten schlug mit "Failed to save" fehl, sobald eine bestehende Mahlzeit geändert wurde (z.B. Notiz nachtragen). Ursache:
MealService.UpdateMealAsynchängte neueFeeding-Objekte permeal.Items.Add(...)an den getracktenmeal-Graph an; weilBaseEntitydieIdim Konstruktor bereits mitGuid.NewGuid()belegt, klassifizierte EF Core die Zeilen alsModifiedstattAdded,SaveChangesAsyncwarfDbUpdateConcurrencyException→ 500. Fix: Neue Repository-MethodeIMealRepository.AddItemsAsync(DbSet.AddRangeohne SaveChanges) erzwingt denAdded-State, danach werden die Items mitContains-Guard anmeal.Itemsgehängt. Atomicity bleibt erhalten (einSaveChangesim abschließendenUpdateAsync). Neuer Integration-TestMealServiceUpdateIntegrationTestssperrt den Bug ab. - BUG17 Follow-up: Push "Eintragen"-Button zeigte weiterhin "Fehler — bitte App öffnen". Ursache:
PushActionAuthHelper.postAuthenticatedsetztesetDoOutput(false)ohne Content-Length, wodurch der POST auf Android mitProtocolException(-1) abstürzte und nie in den 401-Refresh-Pfad kam. Fix:setFixedLengthStreamingMode(0)+ leerer OutputStream-Flush erzwingt gültigen body-losen POST. Timeouts auf 15s erhöht, Fehler-Logs inkl. Exception-Class für zukünftige Diagnose.
Verbesserungen
- QR-Branding: Branded QR-Codes mit grünen Dot-Modulen, PetWatch-Paw-Logo im Zentrum und Standard-Finder-Patterns. Drei Bugs im Custom-QR-Generator (ISO 18004) behoben: Masking korrumpierte Funktionsmodule (fnMap-Tracking), falsche EC-Codewords pro Block für v4-6, Finder-Patterns als nicht-scannbare Kreise statt Standard-Quadrate. Download exportiert 400×400 PNG mit grünem Rahmen. Playwright-Validierungsscript (
scripts/e2e/validate-qr.mjs) bestätigt Scannbarkeit. - FAB-Positionssprung bei Seitenwechsel behoben —
position: fixedFABs sprangen kurz an falsche Position während Route-Animation, weiltransformauf dem Animations-Container einen neuen Containing Block erzeugte. Fix: Shell setzt.route-animatingKlasse via Animation-Callbacks, globale CSS-Regel versteckt.pw-fabwährend der Transition. - Fullscreen Walk-Map: Close-Button und Leaflet-Zoom-Controls überlappten Status-Bar und Bottom-Bar. Fix: Safe-Area-Insets (
--safe-area-top/bottom/right) für alle Controls.
Features
- B64/B65: Pet-Notfallkarte + QR-Tag — Notfallkarte mit Allergien, Medikamenten, Tierarzt-Info (Anruf direkt aus der App). Teilen per Link mit konfigurierbarer Sichtbarkeit (Basis/Erweitert) und Ablaufzeit (24h/7d/30d). QR-Code mit PetWatch-Branding. Öffentliche Web-Seite für geteilte Links. Rotes Notfall-Badge auf dem Dashboard. Vet/Allergie/Medikament-Verwaltung im Pet-Profil.
- B59: Training Übungsbibliothek — 20 vordefinierte Übungen (DE+EN) mit Schwierigkeitsgrad (Anfänger/Fortgeschritten/Profi). Eigene Übungen anlegen. Gelernt-Status pro Haustier. Übungsauswahl beim Erstellen von Trainings-Sessions (statt Freitext).
- B70: Manueller Walk — Spaziergänge ohne GPS nachträglich eintragen. Dritte Option "Manuell" im Walk-Start-Sheet. Formular mit Datum, Startzeit, Dauer, Notizen und Events. "Manuell"-Badge in der Walk-Historie.
- T51: Speicherfristen — Automatische Bereinigung: Soft-deleted Daten nach 30 Tagen endgültig gelöscht, Aktivitäts-Logs nach 12 Monaten, abgelaufene Tokens sofort. Hangfire-Job (täglich 3 Uhr UTC).
Bugfixes
- BUG17: Push "Erledigt"-Button — Fütterungs-Quick-Complete schlug fehl mit "Fehler — bitte App öffnen", sobald der Access-Token abgelaufen war (typisch, weil Reminder Stunden nach letztem App-Open kommen). Native Handler (Android + iOS) führen jetzt bei 401 einen Refresh-Flow durch (
POST /api/auth/refresh), persistieren den rotierten Refresh-Token in Capacitor Preferences und wiederholen den Quick-Complete-Call. Nur wenn auch der Refresh-Token abgelaufen ist, erscheint der Fallback "Bitte App öffnen". iOS zeigt Erfolg/Fehler jetzt ebenfalls via lokaler Notification (im Background-State kein Toast möglich). API-Base-URL auf Android überBuildConfig.API_BASE_URLkonfigurierbar. - BUG10: Notfallkarte öffentliche Web-Seite — Geteilte Links (
https://app.dotslash-labs.com/pet/{token}) landen jetzt auf einer vollständigen, gebrandeten Seite mit Tierdaten statt auf der App-Store-Landingpage. Backend rendert/pet/{token}server-seitig als HTML. Nginx fürapp.dotslash-labs.comleitet/pet/zum Backend weiter.PublicPetDto-Feldnamen korrigiert um mit dem Angular-Modell übereinzustimmen (ownerName,weight,height,chipNumber,expiresAt,includeExtendedInfo,allergiesals Objekte). Phone-Validierung gegen XSS intel:-Links. Rate-Limiting auf dem öffentlichen Endpunkt. - BUG09: v3.5.0 Quality Fixes — Notfallkarte: Section-Layout auf Standard-Pattern (
app-pet-section) umgestellt, Share-Button Focus-Ring entfernt, QR-Code mit echtem PetWatch App-Icon statt generischer Pfote, Share-Sheet um "Link kopieren" + "QR speichern" Buttons erweitert, öffentliche Pet-Seite auf Wireframe-Design angepasst (Chips für Allergien/Medikamente, Icon-Row Cards für Stammdaten/Tierarzt). - BUG09: Allergien- und Medikamenten-Verwaltung — Neue Listenseiten mit Add-Dialog und Swipe-to-Delete für
/tabs/pet/emergency/allergiesund/tabs/pet/emergency/medications. Vorher führten die Links ins Nichts. - BUG09: Training Übungsbibliothek — Stats als Pill-Badges, ganze Zeile klickbar zum Toggeln, FAB-Position an App-Standard angepasst, Scroll-Overlap behoben, doppelter Back-Button entfernt, Übungen in gruppierte Cards nach Schwierigkeitsgrad.
- BUG09: Emergency Card Facade — Infinite Loop durch
untracked()auf Signal-Read im Effect behoben. Pet-Seite (/tabs/pet) fror beim Navigieren komplett ein. - HOTFIX: GPS-Tracking zeichnete nur 1-3 Positionen pro Spaziergang auf. Motion Gate entfernt + iOS WebView-Buffering repariert (v3.4.1).
- GPS-Positionen gingen beim Batch-Upload verloren — Angular effect() coalesced schnelle Signal-Updates. Durch synchronen Callback ersetzt.
- Bilder-Upload: Verzeichnis-Ownership wurde beim Deploy überschrieben (deployer statt www-data). Deploy-Script + Sudoers gefixt.
- File-URLs in Produktion kaputt — doppeltes /api/ im Pfad durch Nginx-Proxy. URL-Builder erkennt jetzt das apiBaseUrl-Suffix.
- Dashboard Walk-Banner navigiert jetzt zum aktiven Tracker statt zur Walk-Liste.
- Skeleton-Loader Padding auf Walk-History und Documents-Seite angepasst (volle Breite → 16px Padding).
- Poop-Icon geändert (pets → compost).
- Swipe-to-Delete für Walks in der Activity-Ansicht aktiviert.
Sonstiges
- T42: Swipe-to-Delete Logik in gemeinsamen SwipeTracker extrahiert (3 Komponenten → 1 Utility).
- T51: Impact Checklist — Speicherfristen in Datenschutz dokumentiert (DSGVO Art. 17), Help & FAQ um 30-Tage-Wiederherstellungsfenster ergänzt, DataRetentionCleanupJob in architektur.md dokumentiert.
Bugfixes
- HOTFIX: GPS-Tracking zeichnete nur 1-3 Positionen pro Spaziergang auf statt hunderte. Ursache: Motion Gate in PhoneGpsSource verwarf alle GPS-Punkte wenn der Step Detector keine Schritte meldete (5s Timeout). Fix: Motion Gate komplett entfernt — native Idle-Mode (Android/iOS) übernimmt die Frequenzreduktion bei Stillstand. Zusätzlich: iOS WebView-Buffering repariert (
webViewActive-Flag statthasListeners-Check).
Features
- B61: Animationen — List-Stagger auf 5 Seiten (Activity, Walk History, Checklists, Achievements, Calendar), Bento-Grid Stagger auf Home, Completion-Pop auf Checkmarks (Kalender + Checklisten), Empty-State Einblendung. Respektiert
prefers-reduced-motion. - B62: Fullscreen Walk Map — Klick auf die Karte in der Walk-Detail-Ansicht öffnet eine Fullscreen-Kartenansicht mit kompletter Route, Events und Zoom-Steuerung (+/- Buttons). Schließen per X-Button oder Escape.
- F30: Push Notification Quick-Actions — Fütterungs-Erinnerungen zeigen zwei Action-Buttons: "Erledigt ✓" (loggt Fütterung im Hintergrund ohne App zu öffnen) und "Später" (Snooze 15 Min). Backend auf data-only FCM Messages umgestellt (Android baut Notifications nativ mit Buttons). iOS: UNNotificationCategory mit Actions. Kalender-Reminder: Tap öffnet Kalender-Seite.
- B63:
app.dotslash-labs.comals zentrale App-Domain — Nginx + SSL (Let's Encrypt), Android App Links (assetlinks.json), iOS Universal Links (apple-app-site-association), Web-Fallback-Seite mit Store-Links, Deep-Links für Invite/Verify/Reset/Forgot. Redirect von alter Domain. Email-Template Footer-Links aktualisiert. - B49: Guest Upgrade-Nudge — Banner auf dem Dashboard wenn der Gastzugang in ≤7 Tagen abläuft. Warm Rose Styling, eskaliert zu Error Red bei ≤3 Tagen. Per-Session dismissbar. "Jetzt registrieren" leitet zur Registrierung.
- T55: Push Notifications — Fütterungs-Erinnerungen gehen jetzt auch an Shared-Access User (nicht nur Owner). Notification-Zeiten werden im Timezone des jeweiligen Empfängers formatiert (Owner-TZ → UTC → Empfänger-TZ). Gilt auch für Kalender-Events.
- F31: Email-Infrastruktur — SMTP-Versand über Lima-City (MailKit), 4 gebrandete HTML-Templates (Verifizierung, Passwort-Reset, Einladung, Willkommen). Email-Verifizierung bei Registrierung (6-Digit Code + Link), Passwort vergessen/zurücksetzen, PetAccess-Einladungen per Mail. Brute-Force-Schutz (max 5 Versuche), Enumeration-Prevention, Rate-Limiting. Frontend: Verify-Email Page mit Auto-Advance Code-Eingabe, Forgot/Reset Password Pages.
Bugfixes
- F30: iOS Quick-Complete URL fehlte
/api/Prefix — API-Call schlug fehl. - F30: Android Unknown-Type Notifications zeigten nichts bei data-only Messages — Fallback baut jetzt generische Notification.
- B62: Walk-Detail-Karte repositionierte sich nach Mood/Notiz-Änderung —
panTo()wurde bei jedem Signal-Update aufgerufen, auch wenn sich die GPS-Daten nicht geändert hatten. Fix:autoFitBounds-Modus für Detail-Ansicht (einmalfitBounds, dann Benutzer-Kontrolle),panTonur bei echten neuen Punkten im Active-Walk-Modus. - Erster Spaziergang trackte keine Route — Android NativeGps Plugin startete den Foreground Service ohne Location-Permission zu prüfen. Fix: Permission-Check vor Service-Start (wie iOS), keine störenden Parallel-Permission-Dialoge, Service stoppt sich bei SecurityException.
- BUG18/19: GPS-Positionen gingen verloren wenn die App im Hintergrund war (WebView pausiert, Foreground Service lief weiter). Native Location-Buffer (max 10.000 Punkte) im Android + iOS Plugin, automatischer Flush beim WebView-Resume, explizite
getBufferedLocations()Methode,visibilitychange-Listener im WalkTracker.
Features
- App bewerten — nativer In-App Review Dialog (Android In-App Review API / iOS SKStoreReviewController) statt Play Store Redirect. Fallback auf Store-URL im Web.
- B60: Recurring Calendar Events — RFC 5545 RRULE-basierte Wiederholungen (täglich/wöchentlich/monatlich/jährlich) mit Interval, BYDAY (weekly), UNTIL/COUNT. Hybrid-Storage mit Master + Exception-Tabelle für "Nur dieser Termin" / "Diesen und folgende" / "Alle Termine" Edit/Delete-Scope. DST-korrekte Expansion via Ical.Net + Timezone-Anchoring. Hangfire-Recurrence-Planner plant Benachrichtigungen für jede Instanz. Frontend: Recurrence-Builder (Frequenz, Interval, Wochentage, Enddatum), Scope-Dialog beim Edit/Delete, Repeat-Badge auf Event-Cards. 68 neue Tests (718 gesamt).
Bugfixes
- Ticking off a single occurrence of a recurring event now creates an exception with OverrideIsCompleted instead of toggling the entire series
- Toast dismissal race condition fixed (HierarchyRequestError from rapid successive toasts)
- All-day events in "NÄCHSTES" no longer show incorrect time; correctly persist throughout the day
Sonstiges
- T54: Push Notifications von 5-Min-Polling auf Hangfire Event-basiertes Scheduling umgestellt. Kalender-Reminders als Delayed Jobs bei Event-Erstellung, Feeding-Reminders über 6h-Planner mit tagesgenauer Jobplanung. NotificationBackgroundService entfernt. 38 neue Tests, 656 gesamt.
Features
- B57: Kalender Month/Year-Picker — Klick auf Monatsname öffnet Bottom Sheet mit Jahres-Auswahl, 4×3 Monats-Grid und "Heute"-Button. Locale-aware Monatsnamen, SwipeToClose, a11y (listbox/option + aria-selected). Pfeil-Buttons durch Swipe-Navigation ersetzt.
- B58: Walk History FAB — directions_walk Button zum Spaziergang starten (gleiche Logik wie Dashboard "Starten →")
- Kalender-Events können jetzt wieder ent-abgehakt werden (Toggle statt nur Complete)
- Kalender: Swipe links/rechts navigiert ±1 Monat/Woche (ersetzt Pfeil-Buttons)
Bugfixes
- BUG11: Push Notifications zeigen jetzt "um HH:mm" statt "in X min" — Zeitzone-aware Formatierung für Kalender-Events und Fütterungs-Erinnerungen
- BUG13: Kalender FAB "+" nutzt jetzt das ausgewählte Datum statt immer heute
- BUG14: Dashboard → Klick auf Kalender-Termin springt jetzt zum richtigen Datum statt zu heute
- BUG15: Fehlender i18n-Key
BUDGET.NO_EXPENSES_FILTEREDergänzt (DE+EN) - BUG16: FAB-Button Position auf allen Seiten vereinheitlicht (
right: 16pxstandardisiert, per-Pagebottom-Formeln beibehalten) - BUG17: Activity Timeline — "HEUTE"-Gruppe mit Pending Schedules wird jetzt oben statt unten angezeigt
- Ganztägige Kalender-Events in "NÄCHSTES" zeigten "02:00" statt nur "Heute" — gefixt
- Ganztägige Events verschwanden nachmittags aus "NÄCHSTES" (Query filterte mit UtcNow statt Tagesbeginn) — gefixt
- Toter Code: DashboardPage (2767 Zeilen, kein Routing) entfernt
Features
- F29: Onboarding v2 (Dual-Path + Story Tour) — Vollständige Neugestaltung des Onboarding. Zwei gleichwertige Pfade: Guided (Welcome → Rolle → Pet Wizard → Notifications → Celebration → Story Tour → Quick-Win → Dashboard) und Explorer (Welcome → leeres Dashboard mit Feature-Discovery-Cards → erstes Haustier anlegen → verzögerter Tour-Flow). Neue Screens:
WelcomePage(Hero + zwei Pfad-Buttons),RolePage(6 Rollen-Karten mit Auto-Advance),CelebrationPage(CSS-Konfetti + Achievement-Badge "Erster Schritt"),StoryTourComponent(8-Slide Instagram-Stories-Format mit Progress-Bars, Tap-Navigation, Glasmorphism-Cards, Achievement "Entdecker"), Explorer Empty State (2×3 Feature-Discovery-Grid +FeatureInfoSheetComponent),PersonalizationSheetComponent(Goals + Source als 2-Step Bottom Sheet in Settings). Backend:OnboardingPath-Enum (Guided/Explorer) + Migration. Alte Systeme entfernt: Coachmark-Overlay (3 Spotlights) → Story Tour, Source/Goals Steps → Settings-Personalisierung, PetWizardIntro → direkte Navigation. ~60 neue i18n-Keys (DE+EN). - F28: Budget & Ausgaben-Tracking — vollständiges Budget- und Ausgaben-Modul. Backend:
Expense-Entity +MonthlyBudgetauf Pet, EF-Migration,ExpensesController(CRUD, Kassenbon-Upload/-Löschung, Budget-Update, Summary mit Kategorien-Aufschlüsselung, Soft Delete), 22 Tests. Frontend:ExpenseService,ExpenseFacade(Signals, Monats-Navigation mit Jahres-Grenze),BudgetOverviewPage(Ring-Chart, Kategorien-Balken, Ausgabenliste, FAB, Monats-Selektor),ExpenseDetailPage(Kassenbon-Anzeige, Edit/Delete),BudgetSettingsPage(Budget setzen/löschen),ExpenseSheetComponent(Bottom Sheet, Kamera-Kassenbon via Capacitor Camera),BudgetRingComponent(SVG Donut, farbcodiert nach Budget-Nutzung),CategoryBreakdownComponent(sortiert nach Betrag),BudgetDashboardCardComponent. Home-Dashboard: Budget-Card nach Achievement-Teaser (nur sichtbar wenn Budget gesetzt). Pet-Seite: Budget-Zeile zeigt echten Wert, Navigation zu Settings/Overview. Plan-Seite: Budget-Zusammenfassung im Überblick-Abschnitt. 34 i18n-Keys (DE+EN), 28 Frontend-Tests.
UI/UX
- Story Tour: SVG dog character scenes — alle 8 Slides erhalten charaktergetriebene Szenen mit einem flachen, niedlichen Hunde-SVG-Charakter (Duolingo-Stil). Jede Slide zeigt den Hund in einer passenden Pose (sittingLookingUp, walking, celebrating, proud, sitting) eingebettet in feature-spezifische Kompositionen: schwebende Feature-Bubbles (Dashboard), Zeitleiste mit Pfotenabdrücken (Aktivitäten), gewundener GPS-Pfad mit Bäumen (Spaziergänge), Kalender mit schwingender Glocke (Kalender), Ordner mit Pfotenabdruck-Stempel (Dokumente), animierte Herzpuls-Linie (Gesundheit), Stern-Medal mit Burst-Partikeln (Erfolge), Konfetti-Regen + Sprechblase (Finale). Architektur:
dogSvg(pose)-Hilfsfunktion +petSvg()-Wrapper (erweiterbar für Katzen, Kaninchen). SVG viaDomSanitizer.bypassSecurityTrustHtmlinjiziert. Schwanzwedeln via::ng-deep .dog-tailCSS-Animation.prefers-reduced-motiondeaktiviert alle dekorativen Animationen. - UI02-Activity: Activity Page Merge — Separate Feeding- und Training-Sub-Pages in die Activity-Seite integriert. Filter-Chips schalten kontextabhängig Features frei: Overdue-Banner (auf "Alle" + "Fütterung"), Pending Schedules in "Heute"-Gruppe mit "Eintragen"-Chip, Swipe-to-Delete auf Feeding + Training Items, kontext-abhängiger FAB (Feeding/Training), "Plan bearbeiten"-Link. Query-Param
?filter=für Deep-Linking. Alte Sub-Pages (/tabs/activity/feeding,/tabs/activity/training) entfernt, alle Navigation-Sources aktualisiert. 5 gelöschte Dateien, 3 neue i18n-Keys. - UI02: Meal Form Bottom Sheet Redesign (Compact Inline) — Tabellenlayout durch kompakte Zweizeilen-Reihen (Name + Menge·kcal) ersetzt. Spaltenköpfe (PRODUKT/MENGE/KCAL) entfernt. Schließen-Button von grauem Kreis zu kleinem "×"-Text geändert. Datum/Uhrzeit zu einer einzigen tappbaren Zeile (DD.MM.YYYY · HH:MM) zusammengefasst mit aufklappbaren Picker-Feldern. "Futter/Supplement hinzufügen" öffnet internen Mini-Sheet-Overlay mit Produktsuche, Zuletzt-Verwendet-Liste und Mengen-Editor. "Neues Produkt anlegen" zu 11px-Textlink zurückgestuft. Kalorienpfad (secondary-container) bestätigt. 5 neue i18n-Keys (DE+EN), A11y: cdkTrapFocus + Escape-Handler im Overlay.
- UI01: Feeding Page Redesign — Unified Timeline + Card Layout. Schedule-Tiles und History-Divider entfernt, Fütterungsplan und Mahlzeiten-Verlauf zu einer einzigen Timeline verschmolzen. Überfällige Mahlzeiten inline in der "Heute"-Card mit warmem Rose-Akzent statt rotem Error-Border. Großer "Mahlzeit hinzufügen"-Button durch kleinen FAB ersetzt (öffnet 2-Optionen-Sheet: "Mahlzeit loggen" + "Fütterungsplan bearbeiten"). Kompakter Info-Bar oben ("Heute · 0/1 erledigt") mit grünem Checkmark wenn alles erledigt. 5 neue i18n-Keys (DE+EN).
Bugfixes
- Pet Page: Gesundheits-Sektion vereinfacht — drei Einzelreihen (Gewicht, Kalorien, Impfungen) durch eine "Übersicht"-Zeile ersetzt, die zur Health Page verlinkt
- Feeding & Food Product Lists: Grouped Card Layout — Einzelkarten mit eigenen Schatten durch gemeinsamen Container mit Dividers ersetzt, Focus-Style auf Inset-Border geändert
Sonstiges
- SEC01: Security Hardening für Production Readiness — Secrets aus Codebase entfernt (Firebase Key, DB-Passwörter, JWT-Secret, Google Client ID), Deploy-Script und CI-Workflows nutzen jetzt GitHub Secrets/Env-Vars statt Hardcoding. Backend: Rate Limiting (per-IP) auf Auth-Endpoints, Security Headers (CSP, X-Frame-Options, HSTS, X-Content-Type-Options), Passwort-Policy verschärft (min. 8 Zeichen + Ziffer), File-Upload Magic-Byte-Validierung, PageSize-Clamping auf allen paginierten Endpoints, Dockerfile non-root User, AllowedHosts eingeschränkt, Error Messages sanitized. Frontend: Open-Redirect-Validierung in AuthFacade, environment-aware Console-Logging, Android allowBackup=false + networkSecurityConfig, CSP Meta-Tag, StorageService für Streak. User-Uploads aus Git-Tracking entfernt. Refresh Tokens werden als SHA-256 Hash gespeichert (nicht mehr Klartext). Uploads nur noch über authentifizierten FilesController erreichbar (Token via Query-Parameter für img-Tags). DB-Backups GPG-verschlüsselt. Git-History bereinigt.
- T42: Google Auth Migration —
@codetrix-studio/capacitor-google-auth(Capacitor 6, abandoned) ersetzt durch@capawesome/capacitor-google-sign-in(Capacitor 8, modern). Android nutzt Credential Manager API, iOS Google Sign-In SDK v8+, Web OAuth2 Redirect statt deprecated GIS Popup. Neuer/google-callbackRoute für Web-Redirect-Flow mit sessionStorage-basiertem State (Login vs. Guest-Upgrade). - Backlog: Neue Items (B51–B55), Sektion "Nächste Iteration" reorganisiert
- Limitation L02 (ModalController statt MatDialog) entfernt — nach Ionic-Removal nicht mehr relevant
Features
- F25: Pet Health Page — Gesundheits-Dashboard unter
/tabs/pet/healthmit drei Ebenen: Health Overview (Summary Cards für Gewicht/Kalorien/Trend, Mini-Gewichtschart mit SVG-Linie, Kalorien-Ring mit Mahlzeiten-Zusammenfassung, Vaccination + Walk Goal Teaser), Weight Detail (vollständiger SVG-Chart mit Range-Chips 1M/3M/6M/All, Gewichtsverlauf mit Delta-Badges, Log-Sheet), Calorie Detail (120px SVG-Ring, Consumed/Remaining/Target Stats, Berechnungsfaktoren RER/MER, Tages-Mahlzeiten-Liste). 72 i18n-Keys (DE+EN), 7 neue Komponenten, ~100 Tests.
Bugfixes
- Nächste-Fütterung-Badge: Lesbare Zeitanzeige statt roher Minuten ("in 11 Std. 31 Min.")
- F25: Rasse-Anzeige in der Kalorien-Detailansicht nutzt jetzt
getBreedDisplayName - Landing Page: Responsive Layout für mobile Geräte — Tap-Targets, Typografie, Tablet-Layout
Features
- B12v2: Komplettes UX-Redesign (Konzept 18) — neue 4-Tab-Navigation (Home/Activity/Plan/Pet), Bento-Dashboard mit Pet Hero Card + Metric Cards (Walk/Feed/Train/Streak), Activity Timeline, Plan-Übersicht (Kalender+Checklisten+Mahlzeiten), Pet-Profil (Fressnapf-Style). Neues Branding: Vivid Green #15803D, Warm Orange #F97316, Soft Violet #8B5CF6, Nunito Font, Claymorphism-Light Cards, mint-getönter Background. 26 Wireframe-Screens, ~30 neue Komponenten, alle alten Routes mit Redirects erhalten.
- T20: Swipe-to-Delete für Fütterungs- und Trainingslisten — gleiches Pointer-Events-Pattern wie Checklisten (Schwelle -80px reveal, -120px direktes Löschen). 22 neue Tests.
- T32: GPS Location Batching — Standortdaten werden 10s gepuffert und als Batch gesendet statt pro Update. Neuer Backend-Endpoint
POST /locations/batch. Reduziert HTTP-Overhead bei Spaziergängen deutlich.
Bugfixes
- BUG08: E-Mail-Validierung bei Registrierung/Login/Gast-Upgrade verschärft — Angulars
Validators.emailund C#s[EmailAddress]akzeptierten Adressen wiee@f(kein TLD). Neuer gemeinsamerstrictEmailValidator(Frontend) und[RegularExpression](Backend) verlangen jetzt eine Domain mit Punkt und TLD (min. 2 Zeichen). - BUG07: Milestone-Feier-Overlay (Streak/Achievement) konnte nicht geschlossen werden —
OnPushChange Detection wurde imsetTimeoutnicht getriggert, Dismiss-Button wurde nie gerendert. Fix:ChangeDetectorRef.markForCheck()+ 10s Auto-Dismiss-Sicherheitsnetz. 3 neue Tests. - BUG03: Frontend-Formulare spiegeln jetzt Backend-DTO-Validierung exakt wider — Pet Wizard (maxLength, min/max für Gewicht/Höhe/Kalorien, canProceed-Guards), Field-Edit-Sheet (dynamische Validators per Feld), Checklist-Item Label (maxLength 200→500). 32 neue Tests.
- T34: Kalender-Wochenlabel nutzte lokale Datumsmethoden auf UTC-Daten — in UTC-negativen Zeitzonen wurde das Label um einen Tag verschoben. Behoben durch durchgängige UTC-Methoden. 5 neue Tests.
- T40: StreakService CI-Test-Flakiness —
AddHours(-2)kreuzte bei CI-Läufen vor 2 Uhr UTC die Tagesgrenze. Fix: explizite UTC-Mittag-Konstruktion.
Sonstiges
- T41: Fachliche Dokumentation — alle 10 Feature-Seiten im Status-Dashboard mit Inhalten befüllt (Anmeldung, Dashboard, Fütterung, Spaziergänge, Training, Kalender, Dokumente, Checklisten, Gamification, Einstellungen). Jede Seite mit Beschreibung, Schritt-für-Schritt-Anleitung, Tipps, verwandten Funktionen und Screenshot-Platzhaltern.
- Wireframe-Migration: Alle 21 Wireframes auf
wireframe-base.jsToolkit migriert — 27.091 → 15.656 LOC (42% Reduktion), ~11.400 Zeilen dupliziertes CSS eliminiert. Toolkit erweitert um grouped screens, customCSS, afterRender, variable Phone-Größen und 11 neue Template-Funktionen. - Test-Infrastruktur: Migration auf
@angular/build:unit-test(partial AOT), 9 Capacitor DI-Tokens, alle 140/140 Testdateien grün und deterministisch.vi.mock-Flakiness durch DI-basierte Mocks eliminiert. - Git LFS: 60MB Seed-Datei (
global_food_products_seed.sql) auf Git LFS migriert — schnellere Clones. - Frontend-Tests repariert: 128 von 140 fehlgeschlagenen Testdateien behoben, Vitest-Konfiguration mit Path-Aliase und jsdom eingerichtet
- CI/CD-Pipeline: GitHub Actions für Backend (.NET 10) und Frontend (Angular 21) mit striktem Test-Modus
- GitHub-Repository initialisiert, Renovate für automatische Dependency-Updates konfiguriert
- Workflow-Dokumentation überarbeitet mit 6 Slash-Commands und Impact-Checkliste für jeden Plan
- Wireframe-Toolkit: Gemeinsame Basis-Library eliminiert ~500 Zeilen Duplikation pro Wireframe
- Status-Dashboard: Professionelle Projektübersicht unter status.dotslash-labs.com mit SSL
- Automatisierung: 3 wöchentliche Remote-Trigger (Montag 8 Uhr) — Drift Detection, Doc Freshness, Backlog Grooming
Features
- Gamification: Tägliche Streaks mit 48h-Pause-Regel, 41 Achievements in 6 Kategorien (4 Seltenheitsstufen), virtueller Pet-Avatar mit 7 Emotionszuständen, XP-System mit Level-Aufstieg
- Kalorien-Tracking: Vollständige RER/MER-Berechnung nach Rasse, Alter und Aktivitätslevel; Kalorien-Anzeige im Dashboard, in Mahlzeiten und Fütterungsplänen
- Fütterungspläne: Automatische Mahlzeiten-Erstellung bei Plan-Abschluss mit Kalorien-Berechnung (3-stufiger Fallback)
- Produktkatalog: 14.576 Tiernahrungsprodukte (9 Tierarten, 250 Marken) mit Volltextsuche und Autovervollständigung
- Walk Tracker mit Live-GPS: Vollbild-Karte, Echtzeit-Statistiken, 7 Event-Typen, Walk-Historie mit Monatsgruppierung, Heatmap-Ansicht
- Natives GPS-Plugin: Eigenes Capacitor-Plugin für Android (FusedLocationProvider + Foreground Service) und iOS (CLLocationManager), Kalman-Filter, Bewegungserkennung, adaptive Intervalle
- Onboarding: Mehrstufiger Willkommens-Flow mit Coachmark-Tour (3 Schritte), Quick-Win-Dialog und Betreuer-Einladung
- Google Login: Vollständige Integration auf Login, Registrierung und Gast-Upgrade (Web + Native)
- Pet Wizard: 5-Schritt-Assistent mit Rasse-Auswahl (283 Rassen), Kalorien-Vorschau und Avatar-Upload
- Geteilter Zugriff: 5 Rollen (Owner bis Viewer), Einladungs-Links mit Ablaufdatum, Deep Links für Android
- Kalender: Monats-, Wochen- und Listenansicht, 8 Event-Typen, Erinnerungen, Wiederkehrende Termine
- Dokumente: Foto-Galerie mit Vollbild-Lightbox (Zoom, Wisch-Navigation) und Datei-Manager mit 5 Kategorien
- Checklisten: To-Do-Listen pro Haustier mit Fortschrittsanzeige und Kategorien
- Gewichtsverlauf: SVG-Liniendiagramm mit Zeitraum-Filter, Delta-Badges für Trends
- Dashboard: Tagesübersicht mit Begrüßung, Schnellaktionen, Aktivitäts-Streak, nächste Fütterung, Zusammenfassung
- Gast-Modus: Spielerischer Gastname-Generator, In-App-Upgrade auf vollwertigen Account
- Profil & Einstellungen: Avatar-Upload, Sprache (DE/EN), Theme (System/Hell/Dunkel), Benachrichtigungen
- Dark Mode: Neutrale Oberflächen ohne Grünstich, klare Elevation-Hierarchie
- Hilfe & FAQ: 9 interaktive Kategorien mit Echtzeit-Suche und Accordion-Navigation
- In-App Updates: Natives Plugin für Android (Play In-App Updates) und iOS (iTunes Lookup)
- Danger Zone: Haustier löschen mit Bestätigungsdialog (nur für Besitzer)
- Internationalisierung: Vollständige DE/EN-Übersetzung aller Features
Bugfixes
- Session-Stabilität: Token-Refresh nur bei 401/403 (nicht bei Netzwerkfehlern), Race-Condition zwischen Facade und Interceptor behoben, 30s Clock-Skew-Toleranz
- Safe-Area-Insets: Native CSS-Variablen-Injektion auf Android für Geräte mit On-Screen-Navigation
- GPS-Datenverlust beim Beenden: Signal-Feedback-Loop in der Walk-Tracker-Seite behoben
- Kalender UTC-Bugs: Tages-Zuordnung und Navigation auf Date.UTC umgestellt
- Rasse-Anzeige: Race-Condition bei lazy-loaded Übersetzungen mit reaktivem Trigger behoben
- Nächste-Fütterung-Badge: Lesbare Zeitanzeige statt roher Minuten ("in 11 Std. 31 Min.")
- Foto/Datei-Upload auf Mobilgeräten: Blob-zu-File-Konvertierung für Android WebView
- Pet Wizard: Datums-Validierung, Locale-Format und optionales Geburtsdatum
- Fütterungsplan: Produkt-Erstellung schließt nicht mehr den übergeordneten Dialog
- Formular-Validierung: Doppelklick-Schutz in allen Formularen, Locale-abhängige Datumsformate
Sonstiges
- Swipe-to-Close für alle 16 Bottom Sheets mit Scroll-Erkennung und Pointer-Handling
- 5 generische Formular-Komponenten (Input, Date, Time, Select, ChipSelect) — 33 Felder migriert
- Gemeinsame Action-Sheet-Komponente ersetzt individuelle Implementierungen
- Button-CSS-Tokens und globale Utility-Klassen (.pw-btn-primary, .pw-btn-secondary, etc.)
- Kompakte Tabellen-Darstellung im Mahlzeiten-Formular mit Spaltenüberschriften
- Einheiten-Anzeige pro Produkt im Mahlzeiten-Formular (g/ml/Stk)
- Pet-Avatar-URL-Auflösung mit Backend-Origin
- StatusBar-Anpassung an Hell/Dunkel-Theme
- Wireframes für alle neuen Features erstellt
- Hardware-Zurück-Taste: Prioritätsbasiertes Handler-System für Android
Bugfixes
- Übersetzungen laden jetzt korrekt, ohne vom Auth-Interceptor blockiert zu werden
- Tastatur-Viewport-Reset beim Fortsetzen der App aus dem Hintergrund (Android)
Features
- Anmeldung und Registrierung mit JWT-Authentifizierung
- Haustier-Verwaltung mit Profil, Avatar und Stammdaten
- Fütterungsverwaltung mit Mahlzeiten-Erfassung
- Spaziergang-Übersicht und -Aufzeichnung
- Training mit Übungen und Erfolgsbewertung
- Kalender für Tierarzttermine und Erinnerungen
- Dokumenten-Verwaltung mit Foto-Upload
- Checklisten pro Haustier
- Dashboard mit Tagesübersicht
- Internationalisierung (Deutsch/Englisch)
- Google OAuth auf der Login-Seite
- Einstellungen: Sprache, Theme, Benachrichtigungen
- Profil-Seite mit Avatar und Account-Verwaltung
Sonstiges
- Angular 21 + Ionic 8 + Capacitor 8 Frontend
- .NET 10 Backend mit Clean Architecture
- PostgreSQL mit Entity Framework Core
- Docker-Setup für Backend
- Projektdokumentation: Definition, Architektur, Limitierungen, UI-Struktur, Backlog
bug_report Open Bugs
Resolved
devices Wireframes
Interaktive Wireframes aller App-Screens. Klicke auf einen Eintrag um das Wireframe zu öffnen.
monitoring Cron-Reports
Cron-Jobs werden in Phase D eingerichtet.
Reports erscheinen hier automatisch.