e0b4914e20
PROJEKT.md: Stand 2026-04-24, SW by-v333, Wetter/Badges/Anti-Cheat/Desktop-Tabs
2026-04-24 11:04:17 +02:00
9151c14306
Fix Karte-Legende Desktop: #page-map Spezifität (components.css Überschreibung), SW by-v333
2026-04-24 11:00:55 +02:00
c503737fb1
Desktop Tab-Grid: Gesundheit (5 Sp.), Admin (4 Sp.), Karte-Legende (8 Sp.), SW by-v332
2026-04-24 10:58:12 +02:00
7ac421fcf9
Routen-Validierung: >15 km/h Ø zählt nicht für Stats/Trophäen, SW by-v331
2026-04-24 09:46:15 +02:00
b5e4eab84d
Push geo-filter: Giftköder-Alert nur im 30km-Radius, Standort via Alerts-Check gespeichert
2026-04-24 09:35:55 +02:00
9213b58d3c
Fix App.checkNearbyAlerts Export, Karte refresh nach Meldung, Button 'Absenden', SW by-v330
2026-04-24 09:29:23 +02:00
5a755e4922
Burger-Badge via Alerts-Check, Alert-Linie stärker, Linie weg nach Erledigen, SW by-v329
2026-04-24 09:17:15 +02:00
fc7d743153
Badge-System: personal/general Split, Punkte ohne Zahl, SW by-v328
2026-04-24 08:39:41 +02:00
0a3ad2207e
Badges: Chat-Punkt am Avatar, Notif-Punkt am Burger, Aktuelles aus Sidebar, SW by-v327
2026-04-24 08:33:32 +02:00
546551a8db
Zecken-Icon neu: großer Körper, kurze Beine, display:inline fix, SW by-v326
2026-04-24 08:20:25 +02:00
acd93e83e6
Zecken-Icon ohne Dreieck, kein Text, Statusleiste einzeilig (nowrap), SW by-v325
2026-04-24 08:17:48 +02:00
78d0f4289a
Zecken-Icon: SVG Warndreieck mit Zecken-Silhouette (Phosphor-Stil), SW by-v324
2026-04-24 08:14:00 +02:00
544307e443
Wetter: Regenwahrscheinlichkeit im Chip, SW by-v323
2026-04-24 08:08:20 +02:00
d72ee6f89f
Fix Wetter-API-Pfad (/api/api/ → /api/), API.weather.get(), SW by-v322
2026-04-24 08:05:44 +02:00
d32b802649
Wetter in Statusleiste (war hinter Legende versteckt), SW by-v321
2026-04-24 08:03:13 +02:00
0461f936ce
Wetter-Chip auf Karte + Bugfix private Routen zählen für km-Stats
...
- GET /api/weather?lat=&lon= (Open-Meteo, 30-min TTL-Cache)
- Zecken-Warnung regelbasiert: März–Okt + Temp > 7°C
- Karte: Wetterchip oben rechts nach GPS-Fix
- stats.py + achievements.py: is_public-Filter entfernt —
private Routen zählen jetzt für eigene km/Achievements
- SW by-v320, APP_VER 308
2026-04-24 07:59:15 +02:00
43d33c0fd1
SSH-Port DS: 22 → 4711
2026-04-24 07:39:47 +02:00
d13a23d817
PROJEKT.md: Stand 2026-04-23 final, Security + SW by-v319
2026-04-23 19:21:31 +02:00
942924199e
Revert Dockerfile USER appuser (Synology DSM ACL inkompatibel)
...
Synology DSM verwendet ACLs (+) auf Docker-Volumes die Vorrang vor Linux-
Basisrechten haben. chown/gosu funktioniert nicht gegen DSM-ACLs.
Container läuft weiterhin als root im geschlossenen Docker-Netz.
2026-04-23 18:52:51 +02:00
71e588a240
Security Nice-to-Have: Dockerfile, Magic-Bytes, Path-Traversal, TABLE_MAP, Deps
...
- Dockerfile: non-root user appuser, chown /data + /app
- media_utils: validate_upload() Magic-Byte-Check (JPEG/PNG/GIF/WebP/MP4/WebM)
- media_utils: safe_media_path() Path-Traversal-Schutz beim Löschen
- diary/health/dogs: safe_media_path() statt os.path.join + lstrip
- diary: validate_upload() vor jedem Medien-Upload
- forum: _LIKE_TABLE dict statt dynamischer String-Interpolation
- requirements: uvicorn 0.34, PyJWT 2.10.1, pydantic 2.10.6, bcrypt 4.3, httpx 0.28.1, anthropic 0.49
- SW by-v319, APP_VER 307
2026-04-23 18:42:05 +02:00
15f854d96c
Session 2026-04-23: Security, Content-Schutz, Wiki-Temperament-Migration
...
Security (9 Fixes):
- JWT_SECRET Pflicht-Check beim Start (Production)
- Rate-Limit: Login (10/5min), Register (5/h), KI-Training (10/h), Giftköder (3/h)
- KI-Training-Endpoint: Auth-Pflicht hinzugefügt
- Private Profile aus Freunde-Suche gefiltert
- OG-Tags XSS mit html.escape() gesichert
- Globales File-Upload-Limit 20 MB (Middleware)
- E-Mail-Maskierung für Moderatoren im Admin-Panel
- IP-Blocklist in ratelimit.py
Content-Schutz (4 Schichten):
- robots.txt: /api/ komplett Disallow, SSR-Seiten Allow
- Rate-Limit auf /api/wiki/rassen (60/min) + Detail (30/min)
- Honeypot /api/wiki/trap + unsichtbarer Link in index.html
- Wasserzeichen in KI-Enricher-Prompt
Wiki Temperament-Migration:
- 60-Wort Übersetzungsmap EN→DE
- Datenmüll-Filter (hunderasse, dog breed etc.)
- translate_existing_temperaments() + Admin-Button
- SW by-v318, APP_VER 306
2026-04-23 18:34:05 +02:00
0f5f1c4c30
PROJEKT.md: Stand 2026-04-23, SW by-v312, Desktop-Layout dokumentiert
2026-04-23 17:53:34 +02:00
71a1371b44
Session 2026-04-23: Desktop Multi-Column, Forum, Fixes, Analytics
...
- Desktop ≥1024px: page-container 680→860px
- Walks: Liste+Karte nebeneinander, View-Toggle ausgeblendet
- Forum: Rubriken 2-zeilig via CSS Grid (ceil(n/2) Spalten, zentriert)
- Welcome: max-width 920px, Feature-Sections 2-spaltig
- Wissen: Toggle-Mechanismus entfernt, Items immer sichtbar
- Übungen Plan-Karten: vertikal statt horizontal gestapelt
- Admin Analytics: Umami v2 gibt plain numbers statt {value:X}
- CSS-Spezifität: #page-forum nötig wegen layout.css < components.css
- SW by-v312, APP_VER 300
2026-04-23 17:52:28 +02:00
44081a6b9d
Session 2026-04-22: Training, Fixes, KI-Cloud, Dark-Mode
...
Training-System:
- Einheit-Dialog Bugs behoben (UI.toast callable, _dogId via _appState, activeDog.id)
- Virtueller Trainer (rein statistisch): üben/festigen/entdecken/levelup
Empfehlungen auf Basis exercise_progress + sessions, Prognose bis 80%
- Stand erfassen Modal: alle Übungen auf einmal setzen (onboarding)
- Erfolgsindikatoren auf Karten: Ø-Quote + Trend-Pfeil + Anzahl Sessions
- exercise_progress → synthetische Stats im Trainer (ohne Sessions nutzbar)
- Levelup: Tricks empfehlen wenn ≥4 Grundkommandos sitzen
- Kommandos & Fähigkeiten im Hundeprofil + öffentlichem Profil
- 2 neue Problemverhalten-Übungen: Bellen/Kläffen, Enttriggern
Mobile/UI-Fixes:
- Übungskarten: Name + Difficulty oben, Buttons eigene Zeile (kein Umbruch)
- Trainingsgrundlagen: Padding in allen Karten, Hinweis-Boxen Dark-Mode-sicher
- Tab-Sichtbarkeit: Trainer/Suggestions nur auf Übungs-Tabs
- Tagebuch FAB (Neu-Eintrag Button) + Quick-Add Eintrag
- FAB Abstand fix (nav-bottom-height + safe-bottom)
- Suggestion-Karten rgba (Dark-Mode)
- routes.js + uebungen.js: alle Hellfarben → rgba (Dark-Mode-sicher)
- ui.js: UI.toast als callable Function-Object (war nur plain Object)
KI & Backend:
- KI_MODE=cloud + ANTHROPIC_API_KEY gesetzt
- ki.py: Cloud-Fallback wenn local nicht erreichbar + KI_MODE=cloud
- KI-Trainer Tageslimit 10 Anfragen/User + ki_daily_calls Tabelle
- Admin-Panel: KI-Nutzung (heute/Monat/User)
- Status-Report Fix (lost-Tabelle) → 06:00 + 18:00 täglich
- Wiki-Anreicherung läuft jetzt (50 Rassen Startup, 20/Nacht)
- landing.html: Trainings-Features in JSON-LD + Feature-Karten
2026-04-22 19:41:22 +02:00
2b442ebd98
Admin: Moderation-Tab für Züchter + Wiki-Fotos (SW by-v280)
2026-04-21 19:44:06 +02:00
180de32e57
Session 2026-04-21: SEO, Wiki-Anreicherung, Training, Lober
...
SEO & Crawler:
- robots.txt, llms.txt, sitemap.xml (508 Seiten bei Google)
- SSR-Seiten: /info, /wiki/rassen, /wiki/rasse/{slug}, /knigge
- Open Graph, JSON-LD, Breadcrumbs in index.html
Navigation:
- Training unter "Mein Hund", Wissen collapsible
- Welcome-Seite und Landing-Page auf 5-Gruppen-Struktur
Wiki:
- KI-Anreicherung (Claude API): beschreibung, vorkommen_de, Steckbrief
- "So einen hab ich" / Züchter-Verzeichnis
- Scheduler: 50 Rassen beim Start, 20/Nacht
Training:
- Session-Logging (Erfolgsquote, Stimmung, Zufriedenheit)
- Virtueller KI-Trainer (6h-Cache)
- Trainingskalender (Habit-Tracker)
- Top-Training → automatischer Tagebucheintrag
- Gamification ohne Druck: Badges, Streak, Stats
Fortschritts-Lober:
- Jeden Montag 09:00: Claude schreibt Lob-Text pro Hund
- Push + Karte im Tagebuch
Monitoring:
- 4× täglich Status-Mail mit Scheduler-Status + Wiki-Fortschritt
2026-04-21 19:38:20 +02:00
65d1cf6c7f
Navigation, Karten-FABs, Nearby-Alerts
...
- Bottom-Nav neu: Karte | Routen | + | Tagebuch | Forum
- + reduziert auf: Giftköder, Gassi-Treffen, Verlorener Hund
- Notification-Badge auf User-Avatar (Header)
- Nearby-Alerts: Nav-Leiste pulsiert rot/orange bei Giftköder/vermisstm Hund in 20km
- SW postMessage bei poison/lost_alert → sofortiger Alert-Check
- Karten-FABs: nur Marker setzen + Standort (Route aufzeichnen + Offline entfernt)
- SW by-v272, APP_VER 262
2026-04-20 19:46:34 +02:00
5141ba9969
Session 2026-04-20: Medien-Konvertierung, Umami Analytics, Username/Privacy
...
- HEIC→JPEG, MOV/AVI→MP4 Konvertierung bei allen Upload-Endpoints (media_utils.py)
- ffmpeg im Docker-Image, Video-Thumbnails (extract_video_thumb, poster-Attribut)
- Google Analytics entfernt, Umami self-hosted eingebunden (index.html, datenschutz.js)
- Admin-Panel Analytics-Tab: Stat-Cards, Sparkline 7 Tage, Top-Seiten (Umami-API-Proxy)
- Admin-Panel Tab-Icons korrigiert (aus vorhandenem Phosphor-Sprite)
- users.real_name Spalte: Username öffentlich, echter Name privat und optional
- Registrierung: Label "Benutzername", Leerzeichen verboten, Profanity-Blockliste
- Datenschutzerklärung: GA-Abschnitt durch Umami-Text ersetzt
2026-04-20 18:36:58 +02:00
9a78121a3e
Session 2026-04-19: Navigation, Kompass, Übungsfortschritt
...
Routen-Navigation:
- POI-Marker: farbige Kreise mit Phosphor-Icons (wie Hauptkarte)
- Screensaver: Navi-Pfeil dreht sich via DeviceOrientationEvent (iOS+Android)
- Pfeil-Dämpfung: EMA α=0.12 mit Wrap-Around
- GPS-Distanz-Bug: Fortschritt nur wenn <500m zur Route
- fitBounds: User-Position nur wenn <20km von Route
- Screensaver: "zur Route" vs "verbleibend" kontextabhängig
- Richtungspfeile entlang Route (blau, max 7 Stück)
- Umkehren ins Route-Detail verschoben, Detail-Map rebuildet sich
- rk-header z-index:10 (Leaflet-Tiles liefen drüber)
- 2-Sek. Screensaver-Entsperrung
km-Tracking:
- route_walks Tabelle
- POST /api/routes/{id}/walked (≥50%)
- total_km = erstellte Routes + gelaufene route_walks
- Toast bei neuem Badge
Übungsfortschritt:
- exercise_progress + training_plan_progress Tabellen
- GET/POST /api/training/progress, /plan-progress, /suggestions
- uebungen.js: API-first + localStorage-Fallback + Auto-Migration
- Empfehlungs-Banner (regelbasiert)
- Toast bei "sitzt"
2026-04-19 20:33:01 +02:00
390176383f
Fix: Routen-Header exakte Höhen — height:46px statt min-height, View-Toggle 44×44px quadratisch
2026-04-19 12:31:32 +02:00
385b4540b3
UX: Routen-Header alle Zeilen gleiche Höhe 46px, Inline-Styles durchgängig
2026-04-19 12:28:18 +02:00
4030da3776
Fix: Bottom-Nav z-index 300→700 (über Leaflet), Routen-Buttons auf refresh() aktualisiert
2026-04-19 12:25:33 +02:00
79e88b43ca
UX: Routen-Header Buttons größer (46px Höhe, mehr Padding)
2026-04-19 12:09:34 +02:00
d374b5af61
Fix: Routen-Header Buttons mit Inline-Styles (cache-unabhängig wie Pills)
2026-04-19 12:07:37 +02:00
98dd5d74ee
UX: Routen-Header aufgeräumt — 3 saubere Zeilen, einheitliche Buttons
2026-04-19 12:05:14 +02:00
26bcd07f84
UX: Routenübersicht-Cards nutzen gleiche Pill-Darstellung wie Detail
2026-04-19 12:00:39 +02:00
01a499b740
Fix: Pills mit Inline-Styles (CSS-Cache-unabhängig) + CSS-Version gebumpt
2026-04-19 11:56:47 +02:00
eabc88f0b8
Fix: Hunde-Tauglichkeit Labels vereinfacht (Leine/gut/sehr gut/premium)
2026-04-19 11:47:26 +02:00
54a6615ebb
UX: Route-Pills kompakter, kürzere Texte, Rahmen sichtbar
2026-04-19 11:44:31 +02:00
167c8018bb
UX: Route-Detail Pills text-only, keine Icons, Farben nach Bedeutung
2026-04-19 11:38:52 +02:00
f00084deb8
Fix: Nearby-Gruppen standardmäßig eingeklappt
2026-04-19 11:34:06 +02:00
9ba78f3b16
Fix: Mehrfachauswahl bei Routen-Fotos (multiple attribute + loop)
2026-04-19 11:31:38 +02:00
3144e100f3
UX: Nearby-POIs einklappbar + klickbar + nur relevante Typen
...
- NEARBY_TYPES: Bänke/Wasserstellen entfernt → nur Restaurant, Tierarzt, Zoobedarf
- Gruppen einklappbar (Chevron dreht sich)
- POI-Namen anklickbar → öffnet Apple Maps/Google Maps am POI-Standort
- CSS: Card-Stil für Gruppen, gute Touch-Targets
2026-04-19 11:29:46 +02:00
9a56978f81
UX: Sichtbarkeits-Pill im Route-Body anklickbar (grün/blau)
2026-04-19 11:23:36 +02:00
6f667b5c61
UX: Routen-Footer als einheitliches Icon+Label-Raster
2026-04-19 11:20:37 +02:00
a37b103dfe
Fix: Routen-Footer Icons korrekt
...
- globe → lock-open (globe fehlt im Sprite → leerer Button)
- chat-circle-dots → paper-plane-tilt für 'An Freund senden'
- Toggle-Handler nutzt jetzt lock-open/lock statt lock/globe
2026-04-19 11:17:02 +02:00
9115f55dac
Privacy: Tagebuch-Einträge aus Freunde-Aktivitäts-Feed entfernt
...
Tagebücher sind privat — auch Freunde sollen keine Einblicke bekommen
2026-04-19 11:12:54 +02:00
6d757b86c2
Feature: Referral-System — User wirbt User
...
- DB: referral_code (8-stellig, eindeutig) + referred_by zu users
Bestehende User erhalten automatisch einen Code
- GET /api/auth/referral: Code, Link und Anzahl geworbener User
- POST /api/auth/register: ref_code Parameter für Zuordnung
- Settings: 'App empfehlen'-Karte mit Link, Teilen-Button und Botschafter-Badges
(Botschafter ab 1, Super ab 5, Top ab 10 Einladungen)
- app.js: ?ref=CODE aus URL in sessionStorage speichern
- APP_VER 222, SW by-v244
2026-04-19 11:09:24 +02:00
82d9e26823
Feature: Forum-Beiträge von Freunden im Aktivitäts-Feed + Deep-Link
...
- friends.py: forum_threads im Activity-Feed (mit entry_id)
- Filter-Chip 'Forum' ergänzt
- Klick öffnet direkt den Forum-Thread via App.callModule('forum','openThread',id)
2026-04-19 11:04:26 +02:00
f9e2202ac7
Fix: Freunde-Aktivitäten öffnen direkt das Ziel-Item
...
- friends.py: entry_id für diary + walk Einträge zurückgeben
- diary.js: openDetail(id) öffentlich gemacht
- friends.js: App.callModule('diary','openDetail',id) bzw.
App.callModule('walks','openDetail',id) statt nur App.navigate(page)
2026-04-19 11:01:31 +02:00