Commit graph

47 commits

Author SHA1 Message Date
9394bab1fb Big Sweep: Security + Race-Conditions + Tests + DSGVO + A11y, SW by-v1095
SECURITY (auth.py, routes/auth.py, database.py, main.py)
- JWT bekommt jti; Logout trägt in neue jwt_blacklist-Tabelle ein,
  decode_token() prüft → server-side Invalidierung
- JWT-Expiry default 30 → 7 Tage (ENV JWT_EXPIRY_DAYS überschreibt)
- Sliding-Refresh-Middleware: erneuert Cookie wenn >50% verbraucht
  (Schwelle via JWT_REFRESH_FRACTION, Default 2)
- Login-Lockout in DB-Tabelle login_attempts (5 Versuche / 15 Min,
  überlebt Container-Restart) — alte In-Memory-Lockouts ersetzt
- SMTP-Versand: alle 'except: pass' durch logger.exception ersetzt;
  Fehlversuche landen in failed_emails-Tabelle für späteres Retry
- Referral-Counter Race gefixt: UPDATE partner_codes SET uses=uses+1
  ... WHERE uses<max_uses RETURNING — atomar statt SELECT+UPDATE

RACE CONDITIONS (routes/invoices.py, database.py)
- Neue invoice_counters-Tabelle für atomare Nummernvergabe
- _next_invoice_number nutzt BEGIN IMMEDIATE + atomares UPDATE
- Funktioniert für RG- und ST-Prefixe (Stornorechnungen)
- Race-Test verifiziert (5 Threads × 20 Calls = 100 eindeutige Nummern)

VERSION + TESTS + ERROR-DIGEST (VERSION, Makefile, tests/, scheduler.py)
- Neue VERSION-Datei (Single Source of Truth) — main.py liest beim
  Startup
- Makefile-Target 'make bump' propagiert in sw.js, app.js, index.html
- Makefile-Target 'make test' setzt venv auf, läuft pytest
- 19 Smoke-Tests in tests/ (health, auth, diary, invoice) — alle grün
- Scheduler: täglicher _job_error_digest um 06:30 → schickt Error-
  Zusammenfassung an ADMIN_EMAIL (still wenn keine Errors)

DSGVO + A11Y + ERSTE-HILFE
- landing.html: 'HTML und ODS' → 'JSON' (tatsächlich implementiert)
- datenschutz.js: Sektion Account-Löschung erweitert (sofort gelöscht /
  anonymisiert / 10 Jahre für Rechnungen)
- erste-hilfe.js: prominentes Warning-Banner oben (ersetzt keine
  Tierarzt-Beratung); Notfallnummern gruppiert nach Land, TODO-Platz-
  halter für AT-Uni-Klinik, CH Tox Info Suisse, CH Tierspital Zürich
- ui.js Modal: ESC schließt, Focus-Trap, Auto-Focus erstes Element,
  Restore Focus auf vorigen Caller
- impressum.js Kontaktformular: Labels mit for=cf-name etc.

NEUE DB-TABELLEN (idempotent via CREATE TABLE IF NOT EXISTS)
- jwt_blacklist, login_attempts, failed_emails, invoice_counters

NEUE ENV-VARS
- JWT_REFRESH_FRACTION (Default 2)
- JWT_EXPIRY_DAYS Default geändert (30 → 7)
2026-05-26 20:12:01 +02:00
9a60c160a1 Feature: Läufigkeit-Spotlight in Züchter-Sektion (landing.html)
Zeigt ein realistisches Beispiel (Luna vom Bergwald) mit Deckdaten,
Trächtigkeits-Meilensteinen und Progesteronkurve — im bestehenden
Züchter-Abschnitt, kein neuer Section-Break.
SW by-v1017, APP_VER 1017
2026-05-16 10:23:46 +02:00
2caab31797 Feature: Hero-Stats dynamisch aufsteigend sortiert
Statt fixer Reihenfolge werden alle 5 Werte nach dem API-Fetch
per .sort() aufsteigend geordnet und der Streifen neu aufgebaut.
Damit steht immer die kleinste Zahl links, die größte rechts —
unabhängig davon wie die Zahlen wachsen.
SW by-v1000, APP_VER 1000
2026-05-15 18:40:25 +02:00
64127bf395 Fix: Tagebuch-Einträge im Hero-Stats-Streifen (stat-diary)
Statt in der Stats-Band weiter unten erscheint die Zahl jetzt im
Hero-Streifen direkt unter den CTAs — sichtbar ohne Scrollen.
SW by-v999, APP_VER 999
2026-05-15 18:38:59 +02:00
be9f263e0d Feature: Stats-Band + Tagebuch-Einträge, km alle Routen (public+privat)
- landing.html: neues Stats-Band-Element 'Tagebuch-Einträge' (#big-diary)
  mit Wert aus diary_entries (war bereits im API-Response vorhanden)
- stats.py km-Query: explizit WHERE is_valid=1 (kein is_public-Filter —
  private Routen werden mitgezählt, nur ungültige Aufzeichnungen ausgeschlossen)
- SW by-v998, APP_VER 998
2026-05-15 18:34:03 +02:00
d7f7a7e454 Neu: AGB-Seite + Impressum/Datenschutz aktualisiert (SW by-v985)
- Neue Seite agb.js mit 11 Abschnitten (Laufzeit, Zahlung, Widerruf etc.)
- Datenschutz: 'Abonnement & Kündigung' → 'Zahlungsdaten' (DSGVO-Fokus), DDG-Hinweis ergänzt
- Impressum: ODR-Link entfernt (EU-Plattform eingestellt 2025), Telefon-Pflichthinweis nach §5 DDG, Stand Mai 2026
- AGB-Link in alle Footer (index.html, landing.html, zuechter.html, welcome.js)
- page-section #page-agb in index.html, Route 'agb' in app.js ROUTES
2026-05-15 16:21:04 +02:00
129badf010 Fix: Hero-Stats zeigt vollständigen Text 'Mülleimer für Kotbeutel' (SW by-v965) 2026-05-14 22:37:29 +02:00
cf6e5920ae Fix: APP_VER-Mismatch (Dauer-Aktualisieren-Bug), Mülleimer-Zahl im Hero (SW by-v964) 2026-05-14 22:15:17 +02:00
58046ce0c7 Fix: Kotbeutel-Stationen → Mülleimer für Kotbeutel in Stats-Band (SW by-v963) 2026-05-14 22:07:17 +02:00
07db68aea2 Fix: Geburtstag aller Hunde + Kotbeutel-Stationen in Stats (SW by-v962)
- worlds.js: bdayDog = _dogs.find(...) — Geburtstag gilt für alle Hunde, nicht nur den aktiven
- Banner, KI-Call, "Was hat sich X gewünscht?" nutzen bdayDog.name
- stats.py: kotbeutel-Count aus user_map_pois WHERE type='kotbeutel'
- landing: Stats-Band 5. Kachel "Kotbeutel-Stationen"
2026-05-14 22:00:52 +02:00
be87930e5b Fix: Foto-Strip + Ban-Yaro-Bild mit Inline-Styles (SW by-v961) 2026-05-14 19:55:34 +02:00
6f8644c70f Landing: Ban Yaro persönlich — Foto + Geschichte als Split-Section (SW by-v960) 2026-05-14 19:50:12 +02:00
59ddf047ba Perf: Fotos JPG→WebP, 18 MB → 373 KB (SW by-v959)
cwebp: eric-ward 1200px, chewy 1400px, baptist-standaert 1600px,
foto-strip 700x700px — alle q80-82
2026-05-14 19:42:41 +02:00
2a59b775e2 Fix: Eric-Ward-Split mit Inline-Styles und auto-fit Grid (SW by-v958) 2026-05-14 19:33:21 +02:00
7867507e7d Landing: 7 Unsplash-Fotos mit Fotografen-Credits eingebaut (SW by-v957)
- Eric Ward: emotionaler 50/50-Split nach Stats-Band
- Baptist Standaert: subtiles Hintergrundbild Demo-Section
- Alvan Nee / Nicholas Brownlow / Wade Austin Ellis / Tamas Pap: 4er-Foto-Strip vor Testimonials
- Chewy: Header-Bild Welpenkäufer-Section
- Alle Fotos mit © Name · Unsplash Credit-Overlay
2026-05-14 19:25:14 +02:00
e610613b58 Fix: Dark-Mode CSS-Syntax korrigiert — html.dark + @media getrennt (SW by-v956)
Ungültige Syntax (@media..., html.dark kombiniert) aufgelöst.
Zwei separate valide Blöcke: html.dark{} für JS-Klasse, @media{} als Fallback.
2026-05-14 19:15:46 +02:00
10964c6509 Fix: Dark-Mode JS-Fallback via matchMedia + html.dark Klasse (SW by-v955)
matchMedia-Listener setzt html.dark als Fallback für macOS 26 / Brave
die prefers-color-scheme Media Query nicht korrekt weiterleiten
2026-05-14 19:07:36 +02:00
e548c43010 Fix: Dark-Mode Landing mit color-scheme Meta-Tag und !important-Overrides (SW by-v954)
- <meta name="color-scheme" content="light dark"> ergänzt
- color-scheme: light dark / dark in :root
- Alle Dark-Mode-Regeln auf !important umgestellt um Inline-Styles zu schlagen
- #funktionen, #warum, #vergleich, #preise, #ueber ergänzt
2026-05-14 19:01:37 +02:00
996ee9c97e Fix: Landing Dark-Mode, OS-Icons→Phosphor, force-update-Loop (SW by-v953)
- main.py APP_VER 951→953 behebt Update-Loop auf Desktop
- Dark-Mode: vollständige @media (prefers-color-scheme: dark) Regeln für alle Sections
- Emojis im Verbindung-Block (🏡🔍🐶) durch Phosphor SVG ersetzt
- 🐾 in Testimonials und Footer durch paw-print SVG ersetzt
2026-05-14 18:34:02 +02:00
f9160307bc Landing: emotionaler Hero, Social-Proof-Stats, Testimonial-Slots, Scroll-Animationen (SW by-v952)
- Hero-Headline: "Weil jeder Moment mit ihm zählt." (warm/emotional statt Feature-Liste)
- CTA umbenannt: "Kostenlos starten" statt "Ich bin Hundebesitzer"
- Hero-Stats-Zeile: live Nutzer/Hunde/km-Zähler (nur wenn >0)
- Stats-Band: orangener Balken mit 4 Live-Kennzahlen nach der Zwei-Welten-Section
- Testimonial-Section: 3 Platzhalter-Karten zwischen Features und Züchter-Bereich
- Scroll-Animationen: IntersectionObserver auf alle Cards (fade-up)
- API: /api/stats/public — öffentlicher Endpoint, 5-Min-Cache
2026-05-14 18:23:23 +02:00
7e939cf854 SEO: landing.html canonical /info → / (primäre URL ist die Root) 2026-05-14 17:19:05 +02:00
eaa2e02e88 SEO: llms.txt v1.5.1 + sitemap /zuechter + JSON-LD Pricing (Pro 29€/Züchter 49€)
- llms.txt: Dual-Audience-Positionierung, echte Preise, neue Züchter-Features
  (Warteliste, Läufigkeit, Wurf-Buchstabe/-Name, Privater Header, Profilfotos),
  neue URL /zuechter, SW by-v918, Datum 2026-05-14
- landing.html JSON-LD: 3 Offers (kostenlos/Pro 29€/Züchter 49€), 7 neue featureList-Einträge,
  dateModified 2026-05-14, Beschreibung mit Preisen
- zuechter.html JSON-LD: 2 Offers (49€/39€ Gründer), 5 neue Features, dateModified + softwareVersion
- sitemap.xml: neue statische Datei (Backup-Referenz, dynamic route in main.py)
- main.py sitemap: /zuechter mit priority 0.9 hinzugefügt
2026-05-14 09:43:21 +02:00
c5d4e730d9 Feature: Preise live — Pro 29€/Jahr, Züchter 49€/Jahr (Gründer 39€) auf Landing + Züchter-Seite 2026-05-14 09:31:49 +02:00
3da4a1b6d7 Fix: Züchter Icon — volles Orange #C4843A + weißes Icon für maximalen Kontrast 2026-05-14 09:19:05 +02:00
5f5f3e9271 UX: Züchter-Karte Icon heller — rgba .35 + #f5c07a für besseren Kontrast 2026-05-14 09:09:59 +02:00
0a7bb931b3 UX: Landing-Page für Hundebesitzer + Züchter — Split-Hero, Zwei-Welten-Section, Verzahnungs-Section 2026-05-14 08:36:58 +02:00
c25580ec8e SEO: landing.html v1.5.1 + llms.txt auf Stand Mai 2026 (neue Features, Datenschutz, Versionen) 2026-05-12 18:25:42 +02:00
b31116abf6 Fix: Landing-Page Footer/Nav bereinigt — Wiki+Social raus, kaputte CTAs entfernt (SW by-v754) 2026-05-07 17:09:02 +02:00
1fe878924a Fix: Landing-Page — Sitting kostenlos, Phosphor-Icons, KI-Datenschutz korrekt, Pro-Features ausgeblendet (SW by-v753) 2026-05-07 17:05:56 +02:00
cb46f08f2a Fix: Vergleichstabelle landing.html — nur Hundeo+Dogorama, korrekte Daten aus echtem Research (SW by-v749) 2026-05-07 06:24:00 +02:00
bcc7c27556 Landing: Phosphor Icons statt Emoji, SW by-v733 2026-05-06 18:36:23 +02:00
87a655e32f Preise: Tier-Modell Stufe1/Pro/Züchter auf Landing Page, Sitting 0% Provision, Memory gespeichert 2026-05-06 18:27:02 +02:00
e14f972c5e Landing: 8 emotionale Feature-Cards, DSGVO→'Daten in Deutschland', Preise bereinigt (SW by-v732) 2026-05-06 18:04:35 +02:00
6426d9c577 Feature: Browser-Besucher ohne Login → /info Redirect, PWA-Nutzer bleiben in App (SW by-v731) 2026-05-06 17:49:52 +02:00
7441d4627e Fix: landing.html wieder unter /info (PWA start_url=/ braucht index.html), Demo-Video, Canonical fix 2026-05-06 17:41:02 +02:00
94abe79acc Feature: Demo-Video auf Landing Page — 2:48min echte App, 8.3MB H.264 2026-05-06 17:32:57 +02:00
8b87f29f5b Feature: Persistentes Update-Banner mit iOS-Anleitung, Version-Poll alle 30min (SW by-v730) 2026-05-06 17:20:19 +02:00
e4da75f246 UX/SEO: Landing 3-Zielgruppen-Redesign, PWA-Wording ohne 'installieren' (SW by-v729) 2026-05-06 17:11:26 +02:00
b675fbcd32 SEO: canonical / statt /info, /info → 301-Redirect, Sitemap bereinigt 2026-05-06 10:35:41 +02:00
4cd178a86a SEO/AI: llms.txt Namens-Disambiguierung + Vertrauenssignale, landing.html Über-Section, Sitemap /presse 2026-05-06 06:28:38 +02:00
bc4fd8f6e0 Content: landing.html — Gassi-Score, Ernährung, Persönlichkeitstest, Reise, Hilfe/FAQ ergänzt 2026-05-06 06:15:45 +02:00
062794c61a landing.html: SEO-Update, 68 Filme, Hundeo-Vergleich, Sicherheits-USP, Social-Links, featureList aktualisiert 2026-05-01 09:59:57 +02:00
175984e80f Fix: Tagesübung nur JS-kompatible exercise_ids, Scroll per exercise_id; Landing+llms.txt Sprint-20 — SW by-v492, APP_VER 469 2026-04-29 11:34:28 +02:00
c8ae514c01 Feature: Tierschutz-Check, KI-Züchter-Features, Export, SEO-Update
Tierschutz-System (immer aktiv, nicht abschaltbar):
- welfare_check.py: regelbasierte Prüfung IK, Alter, Deckpause, Wurfanzahl, Genetik
- Grün/Gelb/Rot-Modal bei Wurf anlegen + Probeverpaarung
- Bei kritischem Befund + "Trotzdem fortfahren" → automatische Admin-Mail
- Tierschutz-Check nie durch Nutzer deaktivierbar

KI-Züchter-Features (pro User an/abschaltbar außer Tierschutz):
- routes/zucht_ki.py: 5 Endpunkte — Wurfankündigung, Genetik-Erklärung,
  Paarungsanalyse, Hund-Beschreibung, Jahresbericht
- Toggles in Einstellungen (ki_zucht_* Felder)
- KI-Buttons in litters.js + zuchthunde.js

KI-Routing: Privilegierte Rollen (Admin, Züchter, Moderator, Manager)
nutzen Claude Sonnet primär, lokales LLM als Fallback

Datenexport: routes/breeder_export.py — ZIP mit HTML-Dossier + ODS
(odfpy hinzugefügt in requirements.txt)

Admin-Profil: POST /admin/breeder/create-profile für Schnellprofil ohne
Antragsprozess; Admin-Rolle bleibt erhalten

Wurfformular: Dropdown aus Zuchtkartei für Vater/Mutter mit Auto-Fill;
litters.vater_id + mutter_id als FK auf zucht_hunde

Probeverpaarung: heart-fill Icon + Welfare-Block im Ergebnis

Landing Page: Züchter-Section + Feature-Gruppe, Meta-Tags, JSON-LD,
keywords, softwareVersion 2.1

SEO: llms.txt vollständig überarbeitet, robots.txt Züchter-Pfade,
sitemap.xml um Wurfbörse + Züchter-Profile erweitert

SW by-v474, APP_VER 451
2026-04-28 19:49:54 +02:00
f168961c44 Landing-Page + llms.txt: Featurestand 2026-04-25
- Neue Feature-Karten: Pflege-System (43 Tipps), Wöchentlicher Lober, Wetter & Zecken-Alarm
- Symptom-Checker: Tag von Plus → Kostenlos korrigiert
- Hunde-Wiki: 1003 Rassen, Community-Fotos, Wikipedia-grounded
- Pricing: nicht implementierte Features entfernt (Barcode, EU-Reisepass, Smart Collar, Jahresrückblick, PDF-Export); Plus als "In Entwicklung" markiert
- Vergleichstabelle: neue Zeile "Pflege-Tipps rassenspezifisch"
- JSON-LD featureList + datePublished (2026-04-25) aktualisiert
- llms.txt vollständig überarbeitet: KI-Integration (LM Studio + claude-sonnet-4-6), Breed-Enricher 97,6%, Community-Features, korrekte Monetarisierung
2026-04-25 10:34:18 +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
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