From 40d117874b755d8f88d6a80805ea8205b17fe671 Mon Sep 17 00:00:00 2001 From: rene Date: Tue, 9 Jun 2026 18:21:49 +0200 Subject: [PATCH] =?UTF-8?q?Rechtsseiten=20crawlbar:=20/datenschutz=20/agb?= =?UTF-8?q?=20/impressum=20als=20eigenst=C3=A4ndige=20HTML-Seiten=20(einzi?= =?UTF-8?q?ge=20Quelle,=20indexierbar)=20statt=20302=E2=86=92Hash;=20SPA-M?= =?UTF-8?q?odule=20holen=20Inhalt=20per=20fetch+inject=20(kein=20Text-Dupl?= =?UTF-8?q?ikat);=20Kontaktformular=20in=20geteilte=20contact-form.js;=20S?= =?UTF-8?q?itemap+SW=20erg=C3=A4nzt,=20v1278?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION | 2 +- backend/main.py | 13 +- backend/static/agb.html | 264 +++++++++++++ backend/static/datenschutz.html | 507 +++++++++++++++++++++++++ backend/static/impressum.html | 142 +++++++ backend/static/index.html | 25 +- backend/static/js/app.js | 2 +- backend/static/js/contact-form.js | 58 +++ backend/static/js/pages/agb.js | 207 +--------- backend/static/js/pages/datenschutz.js | 418 +------------------- backend/static/js/pages/impressum.js | 184 +-------- backend/static/landing.html | 2 +- backend/static/sw.js | 5 +- 13 files changed, 1047 insertions(+), 782 deletions(-) create mode 100644 backend/static/agb.html create mode 100644 backend/static/datenschutz.html create mode 100644 backend/static/impressum.html create mode 100644 backend/static/js/contact-form.js diff --git a/VERSION b/VERSION index cc00901..d1e5ab4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1277 \ No newline at end of file +1278 \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 4f35a98..22fe399 100644 --- a/backend/main.py +++ b/backend/main.py @@ -670,6 +670,9 @@ async def sitemap(): ("https://banyaro.app/help", "monthly", "0.7"), ("https://banyaro.app/knigge", "monthly", "0.7"), ("https://banyaro.app/partner", "monthly", "0.6"), + ("https://banyaro.app/datenschutz", "yearly", "0.3"), + ("https://banyaro.app/agb", "yearly", "0.3"), + ("https://banyaro.app/impressum", "yearly", "0.3"), ] try: @@ -2685,15 +2688,17 @@ async def wurfboerse_page(): # Rechtsseiten: Pfad-URLs (SEO-Footer, App-Store-Metadaten, E-Mails) auf die -# SPA-Hash-Routen umleiten — die Inhalte leben als SPA-Seiten (#agb, …). +# Rechtsseiten als eigenständige, crawlbare HTML-Seiten ausliefern (einzige Inhaltsquelle). +# Die SPA-Module (#agb, #datenschutz, #impressum) holen denselben Inhalt per fetch und +# injizieren ihn — so bleibt die In-App-Ansicht erhalten, ohne Text-Duplikat. # Muss VOR dem SPA-Fallback registriert sein. @app.get("/agb") @app.get("/datenschutz") @app.get("/impressum") -async def legal_page_redirect(request: _Request): - from fastapi.responses import RedirectResponse +async def legal_page(request: _Request): page = request.url.path.strip("/") - return RedirectResponse(f"/#{page}", status_code=302) + return FileResponse(f"{STATIC_DIR}/{page}.html", + headers={"Cache-Control": "max-age=3600"}) # SPA Fallback — ALLE nicht-API-Routen gehen zur index.html diff --git a/backend/static/agb.html b/backend/static/agb.html new file mode 100644 index 0000000..cc1f15a --- /dev/null +++ b/backend/static/agb.html @@ -0,0 +1,264 @@ + + + + + + AGB — Ban Yaro + + + + + + + + + + + + +
+
+ +

Allgemeine Geschäftsbedingungen

+

Gültig ab Mai 2026

+ + +
+

1. Geltungsbereich

+ +

+ Diese AGB gelten für die Nutzung der Plattform Ban Yaro + (banyaro.app), betrieben von:

+ René Degelmann
+ Ringstr. 26, 85560 Ebersberg
+ E-Mail: hallo@banyaro.app +

+

+ Sie gelten ausschließlich für kostenpflichtige Abonnements. Die kostenlose Nutzung + der App setzt lediglich die Registrierung voraus. +

+
+ + +
+

2. Mindestalter

+ +

+ Die Nutzung von Ban Yaro, insbesondere die Registrierung und der Abschluss eines + Abonnements, ist nur Personen ab 18 Jahren gestattet. Mit Abschluss des Vertrags + bestätigt der Nutzer, volljährig zu sein. +

+
+ + +
+

3. Leistungen

+ +

Ban Yaro bietet folgende kostenpflichtige Abonnements an:

+
    +
  • + Ban Yaro Pro — 29 EUR/Jahr: Erweiterte App-Funktionen für mehrere + Hunde, KI-Features, zusätzliche Karten-Layer, Chat und Playdate-Funktion sowie + alle weiteren Pro-Funktionen laut aktuellem Funktionsumfang. +
  • +
  • + Ban Yaro Züchter — 49 EUR/Jahr: Alle Pro-Funktionen plus + Zuchtkartei, Stammbaum, Wurfverwaltung und Züchterprofil. +
  • +
+

+ Die native iOS-App „Ban Yaro Go" ist kostenlos und dient als + Begleit-App für unterwegs. Kostenpflichtige Abonnements werden + ausschließlich über banyaro.app abgeschlossen und per Überweisung + bezahlt — nicht über einen App-Store-Kauf (kein In-App-Kauf). + Pro- und Züchter-Funktionen werden mit deinem banyaro-Konto freigeschaltet und + stehen damit auch in der iOS-App zur Verfügung. +

+

+ Änderungen am Funktionsumfang werden vorab per E-Mail angekündigt. Wesentliche + Leistungsminderungen berechtigen zur außerordentlichen Kündigung. +

+
+ + +
+

4. Nutzungsregeln / Community

+ +

Die Nutzung der Plattform-Features (Forum, Chat, Fotos, Kommentare) unterliegt folgenden Regeln:

+
    +
  • Keine rechtswidrigen, beleidigenden, diskriminierenden oder irreführenden Inhalte
  • +
  • Kein Spam, keine Werbung ohne Genehmigung, keine Fake-Accounts
  • +
  • Respektvoller Umgang mit anderen Nutzern
  • +
  • Keine Verletzung von Urheberrechten Dritter bei hochgeladenen Inhalten
  • +
+

+ Bei Verstoß sind wir berechtigt, Inhalte zu entfernen und Accounts zu sperren oder + zu kündigen. Rechtswidrige Inhalte werden unverzüglich entfernt und ggf. Behörden + gemeldet. Meldungen können an + hallo@banyaro.app + gerichtet werden. +

+
+ + +
+

5. Nutzerinhalte und Lizenzen

+ +

+ Durch das Hochladen von Inhalten (Fotos, Texte, Beiträge) räumt der Nutzer Ban Yaro + eine nicht-exklusive, kostenlose, weltweite Lizenz ein, diese Inhalte im Rahmen der + Plattform zu speichern, anzuzeigen und technisch zu verarbeiten. Diese Lizenz erlischt + mit Löschung des Inhalts oder Löschung des Accounts. Urheberrechte und sonstige + Rechte der Nutzer an ihren Inhalten bleiben unberührt. +

+
+ + +
+

6. Preise und Zahlung

+ +

+ Der Jahresbeitrag ist bei Vertragsschluss für die gesamte Laufzeit im Voraus fällig. + Die Zahlung erfolgt per Überweisung — IBAN und Verwendungszweck stehen auf der + Rechnung, die per E-Mail zugestellt wird. Der Betrag ist innerhalb von + 14 Tagen nach Rechnungsstellung zu überweisen. +

+

+ Bei Zahlungsverzug erhalten Sie zunächst eine Zahlungserinnerung. Bleibt der Betrag + danach weiterhin ausstehend, behalten wir uns die fristlose Kündigung des Vertrags + gemäß § 314 BGB vor. +

+
+ + +
+

7. Vertragslaufzeit und Kündigung

+ +

+ Die Erstlaufzeit beträgt 12 Monate ab dem Tag der Freischaltung. + Nach Ablauf verlängert sich der Vertrag auf unbestimmte Zeit — kündbar jederzeit + mit einer Frist von einem Monat zum Monatsende (§ 309 Nr. 9 BGB). +

+

+ Die Kündigung ist jederzeit in den App-Einstellungen unter + Einstellungen → Abonnement → Kündigen möglich (§ 312k BGB). + Eine Kündigungsbestätigung wird per E-Mail zugesandt. + Der Zugang bleibt bis zum Ende der bereits bezahlten Laufzeit vollständig aktiv. +

+
+ + +
+

8. Kein Erstattungsanspruch

+ +

+ Bei vorzeitiger Kündigung durch den Nutzer erfolgt keine anteilige Rückerstattung + des Jahresbeitrags. Der Zugang bleibt bis zum Ende der Laufzeit vollständig nutzbar — + du verlierst also nichts, was du bereits bezahlt hast. + Gesetzliche Ansprüche bei vertragswidrigen Leistungen bleiben unberührt. +

+
+ + +
+

9. Widerrufsrecht

+ +

+ Da die Nutzung unmittelbar nach Freischaltung beginnt und du beim Kauf ausdrücklich + zustimmst, dass die Vertragserfüllung vor Ablauf der Widerrufsfrist beginnt, erlischt + dein 14-tägiges Widerrufsrecht mit Beginn der Nutzung (§ 356 Abs. 4 BGB). Dir ist + bekannt, dass du durch diese Zustimmung dein Widerrufsrecht verlierst. Die Zustimmung + wird beim Kauf aktiv protokolliert. +

+
+ + +
+

10. Fristlose Kündigung durch den Anbieter

+ +

+ Wir sind berechtigt, den Vertrag aus wichtigem Grund fristlos zu kündigen + (§ 314 BGB). Ein wichtiger Grund liegt insbesondere vor, wenn nach einer + Zahlungserinnerung der offene Betrag weiterhin nicht beglichen wird. + In diesem Fall endet der Zugang mit Wirkung der Kündigung. +

+
+ + +
+

11. KI-Funktionen / Haftung für KI-Inhalte

+ +

+ KI-generierte Inhalte (Trainer-Empfehlungen, Gesundheitshinweise, Züchter-Analysen) + können fehlerhaft oder unvollständig sein. Sie dienen ausschließlich der allgemeinen + Information und ersetzen keine tierärztliche, veterinärmedizinische oder fachliche + Beratung. Ban Yaro haftet nicht für Schäden, die aus der Nutzung KI-generierter + Inhalte entstehen. +

+
+ + +
+

12. Verfügbarkeit

+ +

+ Wir streben eine hohe Verfügbarkeit von Ban Yaro an und arbeiten kontinuierlich + daran, die App stabil zu halten. Eine Garantie für ununterbrochene Verfügbarkeit + können wir jedoch nicht übernehmen. Geplante Wartungsarbeiten werden nach + Möglichkeit vorab in der App angekündigt. +

+
+ + +
+

13. Änderungen dieser AGB

+ +

+ Änderungen der AGB werden per E-Mail und in der App angekündigt — + mindestens 4 Wochen vor Inkrafttreten. Widersprichst du den Änderungen nicht + innerhalb dieser Frist, gelten sie als angenommen. Dein Widerspruchsrecht und + das Recht zur außerordentlichen Kündigung bleiben unberührt. +

+
+ + +
+

14. Anwendbares Recht

+ +

+ Es gilt ausschließlich deutsches Recht. Als Verbraucher hast du + deinen allgemeinen Gerichtsstand. Die EU-Plattform zur Online-Streitbeilegung + (ec.europa.eu/consumers/odr) wurde eingestellt. Wir nehmen nicht an alternativen + Streitbeilegungsverfahren teil (§ 36 VSBG). +

+
+ + +
+

15. Kontakt

+ +

+ René Degelmann
+ Ringstr. 26, 85560 Ebersberg
+ E-Mail: hallo@banyaro.app +

+
+ +

+ Stand: Juni 2026 · Version 3 +

+ +
+
+ + + diff --git a/backend/static/datenschutz.html b/backend/static/datenschutz.html new file mode 100644 index 0000000..8d5a58c --- /dev/null +++ b/backend/static/datenschutz.html @@ -0,0 +1,507 @@ + + + + + + Datenschutzerklärung — Ban Yaro + + + + + + + + + + + + +
+
+ +

Datenschutzerklärung

+ + +
+

Verantwortlicher

+ +

+ René Degelmann, Ringstr. 26, 85560 Ebersberg
+ E-Mail: hallo@banyaro.app +

+
+ + +
+

Hosting & Infrastruktur

+ +

+ Die App wird auf einem eigenen Server (Synology DiskStation) in Deutschland betrieben. + Alle Daten werden ausschließlich auf diesem Server gespeichert und nicht an externe + Hoster übermittelt. +

+

+ Für den E-Mail-Versand (Kontobestätigung, Benachrichtigungen, Rechnungen) nutzen wir + Brevo (Sendinblue SAS, 55 rue d'Amsterdam, 75008 Paris, Frankreich). + Brevo ist nach EU-Standardvertragsklauseln zertifiziert. Dabei werden E-Mail-Adresse + und Name übermittelt. Datenschutzinformationen: + brevo.com/de/legal/privacypolicy/. +

+

+ Für anonymisierte Nutzungsstatistiken betreiben wir Umami Analytics + auf unserem eigenen Server. Es werden keine personenbezogenen Daten oder IP-Adressen + gespeichert. Kein Tracking über Sitzungen hinweg. +

+
+ + +
+

Deine Daten gehören dir

+ +

+ Ban Yaro ist eine private Community-App. Dein Tagebuch, deine + persönlichen Notizen, Gesundheitsdaten deines Hundes, + eigene Routen und dein Nutzerprofil sind + ausschließlich für dich sichtbar — sie werden weder an andere Nutzer noch an Dritte + weitergegeben. Öffentlich sichtbar sind nur Inhalte, die du bewusst veröffentlichst + (z. B. Forenbeiträge, Giftköder-Meldungen, öffentliche Gassi-Treffen). +

+
+ + +
+

Welche Daten wir verarbeiten

+ +

Bei der Registrierung und Nutzung von Ban Yaro werden folgende Daten verarbeitet:

+
    +
  • Accountdaten: Benutzername, E-Mail-Adresse, Passphrase (verschlüsselt gespeichert)
  • +
  • Hundeprofil: Name, Rasse, Alter, Foto (freiwillig)
  • +
  • Gesundheitsdaten deines Hundes: Gewicht, Impfungen, Tierarztbesuche, Medikamente (freiwillig, nur für dich sichtbar)
  • +
  • Tagebuch & Notizen: Texte, Fotos, Stimmungseinträge (privat, nur für dich)
  • +
  • Standortdaten: Nur nach expliziter Browser-Freigabe — für Karte, Gassi-Treffen, + Giftköder-Meldungen, Nearby-Alerts und Routenaufzeichnung. Standortdaten werden nicht dauerhaft + gespeichert, außer du speicherst selbst eine Route oder Meldung.
  • +
  • Routendaten: Aufgezeichnete Routen (GPS-Wegpunkte) werden nur gespeichert, + wenn du sie explizit speicherst; sie sind standardmäßig privat.
  • +
  • Fotos & EXIF-Daten: Beim Hochladen von Bildern können GPS-Koordinaten + in den EXIF-Metadaten enthalten sein. Diese werden serverseitig ausgelesen, um Fotos auf der + Karte zu verorten — sofern vorhanden. Die Rohdaten werden nicht separat gespeichert.
  • +
  • Inhalte: Forenbeiträge, Chatnachrichten, öffentliche Gassi-Treffen
  • +
  • Technische Daten: IP-Adresse (für Sicherheit und Rate-Limiting, max. 30 Tage), + Browser-Typ
  • +
+
+ + +
+

Rechtsgrundlage

+ +

+ Die Verarbeitung erfolgt auf Basis von Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) + für alle zur Bereitstellung des Dienstes notwendigen Daten, sowie Art. 6 Abs. 1 lit. a + DSGVO (Einwilligung) für optionale Funktionen wie Standortfreigabe und + Push-Benachrichtigungen. Einwilligungen können jederzeit mit Wirkung für die Zukunft + widerrufen werden (Art. 7 Abs. 3 DSGVO) — einfach die entsprechende Funktion in den + Einstellungen deaktivieren oder die Browser-Freigabe entziehen. +

+

+ Impressum und rechtliche Grundlage nach § 5 DDG (Digitale-Dienste-Gesetz). +

+
+ + +
+

Datenweitergabe

+ +

+ Deine Daten werden nicht an Dritte verkauft oder zu Werbezwecken weitergegeben. + Öffentliche Inhalte (Forum, Wiki, Giftköder-Karte) sind für alle Nutzer sichtbar. + Profile sind standardmäßig nur für registrierte Nutzer sichtbar. + Admins und Moderatoren können gemeldete Inhalte zur Qualitätssicherung einsehen + (Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO — berechtigtes Interesse an + Plattformsicherheit). +

+
+ + +
+

Direktnachrichten

+ +

+ Nachrichten zwischen Nutzern (z. B. zwischen Hundesitter und Hundeeigentümer oder + zwischen Interessenten und Züchtern) werden auf unserem Server gespeichert, bis du + das Gespräch oder deinen Account löschst. Admins können gemeldete Nachrichten zur + Missbrauchsprüfung einsehen (Art. 6 Abs. 1 lit. f DSGVO — berechtigtes Interesse + an Plattformsicherheit). Nachrichten werden nicht an Dritte weitergegeben. + Du kannst Gespräche jederzeit selbst löschen. +

+
+ + +
+

Moderation & Community

+ +

+ Zur Sicherstellung der Plattformqualität und Einhaltung unserer Nutzungsregeln können + Moderatoren und automatische Systeme Inhalte prüfen. Rechtsgrundlage ist + Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an sicherer Plattform). +

+
+ + +
+

KI-Funktionen

+ +

+ Ban Yaro bietet KI-gestützte Funktionen (Trainingsempfehlungen, Terminvorschläge, + Rassen-Informationen). Diese laufen primär auf einer lokalen KI auf unserem + eigenen Server in Deutschland — deine Anfragen verlassen dabei nicht unsere + Infrastruktur. +

+

+ Als Ausweichlösung bei Nichtverfügbarkeit des lokalen Modells wird + Claude Sonnet 4.6 von Anthropic, PBC (San Francisco, USA) genutzt. + In diesem Fall wird der Inhalt deiner Anfrage übermittelt. Bei Gesundheits- und + Ernährungsberichten kann dies Hundedaten (Name, Rasse, Gewicht, Impfhistorie, + Medikamente, Allergien) als Teil des Anfragetextes umfassen. Die Übermittlung + in die USA erfolgt auf Basis der EU-Standardvertragsklauseln (Art. 46 Abs. 2 lit. c DSGVO). + Datenschutzerklärung von Anthropic: + anthropic.com/privacy. +

+

+ Die Rassenerkennung per Foto sendet das hochgeladene Bild direkt an + Claude von Anthropic (USA) zur Analyse — es gibt hierfür keinen lokalen Fallback. + Das Foto wird nicht dauerhaft bei Anthropic gespeichert. Rechtsgrundlage: Einwilligung + gem. Art. 6 Abs. 1 lit. a DSGVO durch aktive Nutzung der Funktion. +

+

+ Der KI-Trainer analysiert deinen bisherigen Trainingsfortschritt + (Übungshistorie, Erfolgsquoten, Streaks) und gibt personalisierte Empfehlungen. + Diese Analyse läuft auf unserem lokalen Server in Deutschland — deine Trainingsdaten + verlassen dabei nicht unsere Infrastruktur. Es findet kein Training oder Fine-Tuning + von KI-Modellen auf Basis deiner Nutzerdaten statt. +

+

+ KI-Empfehlungen sind Vorschläge und ersetzen keine tierärztliche Beratung. + Eine automatisierte Entscheidungsfindung mit rechtlicher Wirkung (Art. 22 DSGVO) + findet nicht statt. +

+

+ KI-Antworten können fehlerhaft oder unvollständig sein und dienen ausschließlich + allgemeinen Informationszwecken. Sie ersetzen keine tierärztliche oder fachliche + Beratung. Trotz EU-Standardvertragsklauseln besteht bei US-Anbietern ein Restrisiko, + dass US-Behörden auf übermittelte Daten zugreifen könnten. +

+
+ + +
+

Wetterdaten & Kartendienste

+ +

+ Die Wetter-Funktion übermittelt auf Wunsch deine GPS-Koordinaten serverseitig an + Open-Meteo (Österreich, DSGVO-konform) für die Wettervorhersage. + Für das Regenradar nutzen wir primär die offenen Radardaten des + Deutschen Wetterdienstes (DWD). Diese werden serverseitig von unserem + Server in Deutschland abgerufen und als Kartenkacheln bereitgestellt — dein Gerät + kontaktiert den DWD dabei nicht direkt. Steht das DWD-Radar nicht zur Verfügung, + werden ersatzweise Radarkacheln von RainViewer (USA) geladen; dabei + wird dein Browser direkt kontaktiert. Für weitere Wetter-Kartenlayer (z. B. Temperatur) + können Kacheln von OpenWeatherMap (OpenWeather Ltd., UK/USA) direkt im + Browser geladen werden. In allen Fällen werden keine Account-Daten übermittelt. + Rechtsgrundlage: Einwilligung gem. Art. 6 Abs. 1 lit. a DSGVO. +

+

+ Für die automatische Ortsnamens-Ermittlung (z. B. im Wetter-Detail) werden deine + GPS-Koordinaten serverseitig an Nominatim der OpenStreetMap Foundation + (UK) übermittelt. Es werden ausschließlich Koordinaten weitergegeben — keine + personenbezogenen Daten. +

+

+ Datenschutzerklärung Open-Meteo: + open-meteo.com/en/terms · + OpenWeatherMap: + openweathermap.org/privacy-policy · + OpenStreetMap/Nominatim: + osmfoundation.org · + DWD: + dwd.de · + RainViewer: + rainviewer.com +

+
+ + +
+

Kartenmaterial & Offline-Karten

+ +

+ Die Basiskarte besteht aus Vektordaten von OpenStreetMap, die wir auf + unserem eigenen Server in Deutschland aufbereiten und ausliefern (Vektor-Tiles im + PMTiles-Format). Für die Basiskarte werden daher keine externen + Kartenanbieter kontaktiert — die Kartenkacheln kommen von unserem Server. +

+

+ Optional kannst du Kartenausschnitte für die Offline-Nutzung + herunterladen. Diese werden ausschließlich lokal auf deinem Gerät + gespeichert und nicht an Dritte übermittelt. +

+
+ + +
+

Routenvorschläge (OpenRouteService)

+ +

+ Die Funktion „Routenvorschläge" berechnet auf Wunsch einen Rundweg + ausgehend von deinem aktuellen Standort. Dazu werden deine GPS-Koordinaten einmalig + an den Dienst OpenRouteService übermittelt, der von + HeiGIT am Karlsruher Institut für Technologie (KIT), Deutschland, + betrieben wird. Es werden ausschließlich die Koordinaten übertragen — + keine Account- oder Profildaten. OpenRouteService speichert keine + personenbezogenen Daten dauerhaft. +

+

+ Die Funktion wird nur aktiv, wenn du deinen Standort im Browser freigibst und + bewusst einen Routenvorschlag anforderst (Einwilligung gem. Art. 6 Abs. 1 lit. a DSGVO). + Der Tagesvorschlag auf der Startseite wird nur berechnet, wenn du eingeloggt bist und + Standortzugriff erteilt hast — das Ergebnis wird lokal zwischengespeichert und + maximal einmal täglich neu abgerufen. +

+

+ Datenschutzerklärung von OpenRouteService: + openrouteservice.org/privacy-policy +

+
+ + +
+

Ban Yaro Go — native iOS-App

+ +

+ Ban Yaro Go ist die optionale native iOS-Begleit-App zu banyaro.app. + Sie nutzt dasselbe banyaro-Konto und denselben Server in Deutschland — es gelten + daher zusätzlich zu den oben beschriebenen Verarbeitungen folgende iOS-spezifische + Punkte: +

+
    +
  • Hintergrund-Standort: Nur während einer von dir aktiv gestarteten + Gassi-Aufzeichnung erfasst die App deine GPS-Position auch bei gesperrtem Display, um + den Track fortzuführen. Außerhalb einer aktiven Aufzeichnung wird im Hintergrund kein + Standort erfasst. Der Track wird lokal auf dem Gerät gesichert und nur dann in dein + Konto übertragen, wenn du die Tour speicherst.
  • +
  • Apple WeatherKit: Die Wetterfunktion der App bezieht Vorhersagedaten + über Apple WeatherKit (Apple Inc., USA). Dazu werden Standortkoordinaten an Apple + übermittelt — keine Account-Daten.
  • +
  • Apple Health (HealthKit): Nur auf deinen ausdrücklichen Wunsch + schreibt die App abgeschlossene Touren als „Walking"-Workout inkl. Route in Apple + Health. Es werden keine Gesundheitsdaten aus Apple Health gelesen. + Diese Daten verbleiben auf deinem Gerät bzw. in deiner iCloud.
  • +
  • Apple Maps: Zur Navigation (z. B. zu Gassi-Treffen) kann auf deinen + Wunsch Apple Maps geöffnet werden.
  • +
  • GPX-Import: Aus anderen Apps geteilte GPX-Dateien werden lokal auf + dem Gerät verarbeitet; eine Übertragung erfolgt nur, wenn du die Tour speicherst.
  • +
  • Push (APNs): Benachrichtigungen werden wie im Abschnitt + „Push-Benachrichtigungen" beschrieben über den Apple Push Notification Service zugestellt.
  • +
+

+ Rechtsgrundlage ist jeweils deine Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) bzw. die + Vertragserfüllung (Art. 6 Abs. 1 lit. b DSGVO). Apple-Datenschutz: + apple.com/legal/privacy. +

+
+ + +
+

Technische Speicherung

+ +

+ Ban Yaro verwendet technisch notwendige Speichermechanismen für den Betrieb der App: + Session-Tokens und Authentifizierungsdaten werden im Local Storage des Browsers + gespeichert. Ein Service Worker speichert App-Inhalte lokal für die Offline-Nutzung + (Cache). Push-Benachrichtigungs-Token werden für die Zustellung von Hinweisen benötigt. + Diese Speicherung ist für die Kernfunktion der App erforderlich; eine Einwilligung ist + nach § 25 Abs. 2 TTDSG nicht erforderlich. Es werden keine Tracking-Cookies eingesetzt. +

+
+ + +
+

Push-Benachrichtigungen

+ +

+ Wenn du Push-Benachrichtigungen aktivierst, wird ein Abonnement-Token an den + Push-Dienst deines Browsers übermittelt: bei Android/Chrome an + Firebase Cloud Messaging (Google LLC, USA), bei iOS/Safari an + Apple Push Notification Service (Apple Inc., USA). Diese Dienste + erhalten lediglich den Token und die Benachrichtigung selbst — keine weiteren + Nutzerdaten. Die Übermittlung erfolgt auf Basis deiner Einwilligung + (Art. 6 Abs. 1 lit. a DSGVO), die du jederzeit in den Geräteeinstellungen widerrufen kannst. +

+
+ + +
+

Kalender-Abo (Webcal)

+ +

+ Das Kalender-Abo nutzt einen persönlichen Token-Link. Wenn deine Kalender-App + diesen Link regelmäßig abruft, wird dabei deine IP-Adresse an unseren Server + übermittelt. Es werden keine weiteren Daten an Dritte weitergegeben. +

+
+ + +
+

Einladungslinks (Referral)

+ +

+ Wenn du Freunde über deinen persönlichen Einladungslink einlädst, wird erfasst, + wie viele Personen sich darüber registriert haben — ohne personenbezogene Daten + der eingeladenen Personen zu speichern. Dir wird lediglich die Anzahl angezeigt. +

+
+ + +
+

Nutzungsanalyse (Umami)

+ +

+ Wir verwenden Umami, ein datenschutzfreundliches Analysetool, das ausschließlich auf + unserem eigenen Server betrieben wird. Es werden keine Cookies gesetzt, keine + personenbezogenen Daten erhoben und keine Daten an Dritte weitergegeben. + Erfasst werden lediglich anonyme Seitenaufrufe zur Verbesserung der App + (Art. 6 Abs. 1 lit. f DSGVO — berechtigtes Interesse). +

+
+ + +
+

Deine Rechte (DSGVO)

+ +

+ Du hast das Recht auf Auskunft (Art. 15), Berichtigung + (Art. 16), Löschung (Art. 17), Einschränkung der Verarbeitung + (Art. 18) sowie Datenportabilität (Art. 20). Erteilte Einwilligungen + kannst du jederzeit mit Wirkung für die Zukunft widerrufen (Art. 7 Abs. 3 DSGVO). +

+

+ Datenexport (Art. 20 DSGVO): Du kannst jederzeit unter + Einstellungen → „Meine Daten exportieren" eine vollständige Kopie deiner + gespeicherten Daten als JSON-Datei herunterladen. Der Export enthält Profildaten, + Hundedaten, Tagebuch (inkl. Medien-URLs), Gesundheitseinträge, Trainingsfortschritt, + Ausgaben, Verhaltensprotokoll, Versicherung, Ernährungsprofil und Futter-Reaktionen, + eigene Routen, Forum-Beiträge sowie Gassi-Teilnahmen und Gassi-Fotos. +

+

+ Das JSON-Format ist maschinenlesbar und kann z. B. mit jedem Texteditor geöffnet + oder in andere Anwendungen importiert werden. Der Export wird direkt im Browser + erzeugt und nicht dauerhaft auf dem Server gespeichert. +

+

+ Zur Ausübung weiterer Rechte wende dich per E-Mail an + hallo@banyaro.app.

+ Du hast außerdem das Recht, bei der zuständigen Datenschutz-Aufsichtsbehörde + Beschwerde einzulegen:
+ Bayerisches Landesamt für Datenschutzaufsicht (BayLDA)
+ Promenade 18, 91522 Ansbach
+ poststelle@lda.bayern.de · + www.lda.bayern.de +

+
+ + +
+

Zahlungsdaten

+ +

+ Wenn du ein kostenpflichtiges Abonnement abschließt, verarbeiten wir folgende Daten: + Name, E-Mail-Adresse, Rechnungsadresse und den Zahlungseingang. Rechtsgrundlage ist + Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung). Rechnungsdaten werden gemäß + § 147 AO 10 Jahre aufbewahrt. Rechnungen werden per E-Mail mit + TLS-Verschlüsselung zugestellt. +

+

+ Deine Zahlungsdaten (IBAN) werden nur für die Zuordnung des Zahlungseingangs intern + verwendet und nicht an Dritte weitergegeben. Die vertraglichen Bedingungen (Laufzeit, + Kündigung, Erstattung) findest du in unseren + AGB. +

+
+ + +
+

Speicherdauer

+ +

+ Server-Logs werden nach 30 Tagen rotiert. IP-Adressen werden ausschließlich + zur Sicherheit und für Rate-Limiting maximal 30 Tage gespeichert. +

+
+ + +
+

Account-Löschung

+ +

+ Wenn du deinen Account löschst, werden deine Daten nach folgendem Schema verarbeitet: +

+
    +
  • Sofort und unwiderruflich gelöscht: Account, Hundeprofile, Tagebuch + und Tagebuch-Medien, Gesundheitseinträge, Trainingsfortschritt, Ausgaben, + Verhaltensprotokoll, Versicherung, Ernährungsprofil, Futter-Einträge und -Reaktionen, + Forum-Beiträge, eigene Notizen, Direktnachrichten, Freundschaften, + Push-Benachrichtigungen, Einstellungen und Welten-Konfiguration.
  • +
  • Anonymisiert (Urheber-Bezug auf NULL gesetzt): Eigene Routen, + Forum-Threads sowie von dir angelegte Wiki-Inhalte bleiben zur Verfügbarkeit für + die Community erhalten, sind aber nicht mehr deinem Account zuordenbar.
  • +
  • 10 Jahre aufbewahrt (gesetzliche Pflicht): Rechnungen und + Rechnungspositionen aus kostenpflichtigen Abonnements gemäß § 147 AO. Diese + enthalten Name, E-Mail-Adresse und Rechnungsadresse zum Zeitpunkt der Rechnung + und können vor Ablauf der Frist nicht gelöscht werden.
  • +
+

+ Es findet keine anonymisierte Weiterverarbeitung deiner privaten Inhalte + (Tagebuch, Gesundheit, Notizen) zu Trainings- oder Statistikzwecken statt. +

+
+ + +
+

Mindestalter

+ +

+ Die Nutzung von Ban Yaro ist nur Personen ab 18 Jahren gestattet. Durch die + Registrierung bestätigt der Nutzer, das 18. Lebensjahr vollendet zu haben. +

+
+ +

+ Stand: Juni 2026 · Version 4 +

+ +
+
+ + + diff --git a/backend/static/impressum.html b/backend/static/impressum.html new file mode 100644 index 0000000..3128fcc --- /dev/null +++ b/backend/static/impressum.html @@ -0,0 +1,142 @@ + + + + + + Impressum — Ban Yaro + + + + + + + + + + + + +
+
+ +

Impressum

+ +
+

Angaben gemäß § 5 DDG

+

+ René Degelmann
+ Ringstr. 26
+ 85560 Ebersberg +

+
+ +
+

Kontakt

+

+ E-Mail: hallo@banyaro.app
+ Oder nutze das Formular — wir antworten in der Regel innerhalb von 24 Stunden. +

+ +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+ + +
+
+ +
+

Verantwortlich für den Inhalt + gemäß § 18 Abs. 2 MStV

+

+ René Degelmann
+ (Anschrift wie oben) +

+
+ +
+

Streitschlichtung

+

+ Wir sind nicht bereit und nicht verpflichtet, an einem Streitbeilegungsverfahren vor einer + Verbraucherschlichtungsstelle teilzunehmen (§ 36 VSBG). +

+
+ +
+

Haftungshinweis

+

+ Die Inhalte dieser App wurden mit größtmöglicher Sorgfalt erstellt. Für die Richtigkeit, + Vollständigkeit und Aktualität der Inhalte übernehmen wir keine Gewähr. Als + Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für eigene Inhalte verantwortlich. + Für nutzergenerierte Inhalte (Forenbeiträge, Fotos, Kommentare) sind ausschließlich + die jeweiligen Nutzer verantwortlich. Bei Bekanntwerden rechtswidriger Inhalte werden + diese im Rahmen der gesetzlichen Vorgaben (§§ 7 ff. DDG) geprüft und gegebenenfalls + unverzüglich entfernt. +

+
+ +

+ Stand: Mai 2026 +

+ +
+
+ + + + diff --git a/backend/static/index.html b/backend/static/index.html index 68cef97..385e4ae 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -86,14 +86,14 @@ Ban Yaro - + - - - - - + + + + + @@ -620,11 +620,12 @@ - - - - - + + + + + + @@ -634,7 +635,7 @@ - + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index ae60aa6..9b7942e 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '1277'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1278'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator) window.APP_VERSION = APP_VERSION; diff --git a/backend/static/js/contact-form.js b/backend/static/js/contact-form.js new file mode 100644 index 0000000..4e95997 --- /dev/null +++ b/backend/static/js/contact-form.js @@ -0,0 +1,58 @@ +/* ============================================================ + BAN YARO — Kontaktformular (geteilt) + Einzige Quelle für die Formular-Logik. Genutzt von: + - der eigenständigen Seite /impressum (Auto-Init auf document) + - der SPA-Impressum-Seite (window.initContactForm(container)) + ============================================================ */ + +window.initContactForm = function (root) { + const form = root.querySelector('#contact-form'); + if (!form || form._bound) return; // einmal binden + form._bound = true; + + const statusEl = root.querySelector('#cf-status'); + const submitBtn = root.querySelector('#cf-submit'); + + form.addEventListener('submit', async e => { + e.preventDefault(); + const name = root.querySelector('#cf-name').value.trim(); + const email = root.querySelector('#cf-email').value.trim(); + const subject = root.querySelector('#cf-subject').value.trim(); + const message = root.querySelector('#cf-message').value.trim(); + + submitBtn.disabled = true; + submitBtn.textContent = 'Wird gesendet…'; + statusEl.style.display = 'none'; + + try { + const res = await fetch('/api/contact', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, email, subject, message }), + }); + if (!res.ok) { + const err = await res.json().catch(() => ({})); + throw new Error(err.detail || 'Fehler beim Senden.'); + } + statusEl.style.display = 'block'; + statusEl.style.background = 'var(--c-success-bg, #f0fdf4)'; + statusEl.style.color = 'var(--c-success, #16a34a)'; + statusEl.textContent = '✓ Nachricht gesendet — wir melden uns bald!'; + form.reset(); + } catch (err) { + statusEl.style.display = 'block'; + statusEl.style.background = '#fef2f2'; + statusEl.style.color = '#dc2626'; + statusEl.textContent = err.message || 'Fehler beim Senden. Bitte versuche es später erneut.'; + submitBtn.disabled = false; + submitBtn.textContent = 'Nachricht senden'; + } + }); +}; + +// Auto-Init für die eigenständige /impressum-Seite (kein Inline-Handler wegen CSP) +(function () { + function go() { try { window.initContactForm(document); } catch (e) {} } + if (document.readyState !== 'loading') go(); + else document.addEventListener('DOMContentLoaded', go); +})(); diff --git a/backend/static/js/pages/agb.js b/backend/static/js/pages/agb.js index 075ab0c..a9ba758 100644 --- a/backend/static/js/pages/agb.js +++ b/backend/static/js/pages/agb.js @@ -1,200 +1,23 @@ /* ============================================================ - BAN YARO — Allgemeine Geschäftsbedingungen + BAN YARO — Allgemeine Geschäftsbedingungen (SPA-Wrapper) + Einzige Inhaltsquelle: /agb.html (crawlbar). Diese Seite holt + den Inhalt per fetch und injiziert ihn — kein Text-Duplikat. ============================================================ */ window.Page_agb = (() => { - const S = { - h2: `font-size:var(--text-base);font-weight:var(--weight-semibold);color:var(--c-primary);margin:0 0 var(--space-2)`, - p: `font-size:var(--text-sm);color:var(--c-text-secondary);line-height:1.7;margin:0`, - ul: `font-size:var(--text-sm);color:var(--c-text-secondary);line-height:1.7;margin:var(--space-2) 0 0;padding-left:var(--space-5)`, - a: `color:var(--c-primary)`, - }; - - function sec(title, body) { - return ` -
-

${title}

- ${body} -
`; - } - - function init(container) { - container.innerHTML = ` -
- -

Allgemeine Geschäftsbedingungen

-

Gültig ab Mai 2026

- - ${sec('1. Geltungsbereich', ` -

- Diese AGB gelten für die Nutzung der Plattform Ban Yaro - (banyaro.app), betrieben von:

- René Degelmann
- Ringstr. 26, 85560 Ebersberg
- E-Mail: hallo@banyaro.app -

-

- Sie gelten ausschließlich für kostenpflichtige Abonnements. Die kostenlose Nutzung - der App setzt lediglich die Registrierung voraus. -

`)} - - ${sec('2. Mindestalter', ` -

- Die Nutzung von Ban Yaro, insbesondere die Registrierung und der Abschluss eines - Abonnements, ist nur Personen ab 18 Jahren gestattet. Mit Abschluss des Vertrags - bestätigt der Nutzer, volljährig zu sein. -

`)} - - ${sec('3. Leistungen', ` -

Ban Yaro bietet folgende kostenpflichtige Abonnements an:

- -

- Die native iOS-App „Ban Yaro Go" ist kostenlos und dient als - Begleit-App für unterwegs. Kostenpflichtige Abonnements werden - ausschließlich über banyaro.app abgeschlossen und per Überweisung - bezahlt — nicht über einen App-Store-Kauf (kein In-App-Kauf). - Pro- und Züchter-Funktionen werden mit deinem banyaro-Konto freigeschaltet und - stehen damit auch in der iOS-App zur Verfügung. -

-

- Änderungen am Funktionsumfang werden vorab per E-Mail angekündigt. Wesentliche - Leistungsminderungen berechtigen zur außerordentlichen Kündigung. -

`)} - - ${sec('4. Nutzungsregeln / Community', ` -

Die Nutzung der Plattform-Features (Forum, Chat, Fotos, Kommentare) unterliegt folgenden Regeln:

- -

- Bei Verstoß sind wir berechtigt, Inhalte zu entfernen und Accounts zu sperren oder - zu kündigen. Rechtswidrige Inhalte werden unverzüglich entfernt und ggf. Behörden - gemeldet. Meldungen können an - hallo@banyaro.app - gerichtet werden. -

`)} - - ${sec('5. Nutzerinhalte und Lizenzen', ` -

- Durch das Hochladen von Inhalten (Fotos, Texte, Beiträge) räumt der Nutzer Ban Yaro - eine nicht-exklusive, kostenlose, weltweite Lizenz ein, diese Inhalte im Rahmen der - Plattform zu speichern, anzuzeigen und technisch zu verarbeiten. Diese Lizenz erlischt - mit Löschung des Inhalts oder Löschung des Accounts. Urheberrechte und sonstige - Rechte der Nutzer an ihren Inhalten bleiben unberührt. -

`)} - - ${sec('6. Preise und Zahlung', ` -

- Der Jahresbeitrag ist bei Vertragsschluss für die gesamte Laufzeit im Voraus fällig. - Die Zahlung erfolgt per Überweisung — IBAN und Verwendungszweck stehen auf der - Rechnung, die per E-Mail zugestellt wird. Der Betrag ist innerhalb von - 14 Tagen nach Rechnungsstellung zu überweisen. -

-

- Bei Zahlungsverzug erhalten Sie zunächst eine Zahlungserinnerung. Bleibt der Betrag - danach weiterhin ausstehend, behalten wir uns die fristlose Kündigung des Vertrags - gemäß § 314 BGB vor. -

`)} - - ${sec('7. Vertragslaufzeit und Kündigung', ` -

- Die Erstlaufzeit beträgt 12 Monate ab dem Tag der Freischaltung. - Nach Ablauf verlängert sich der Vertrag auf unbestimmte Zeit — kündbar jederzeit - mit einer Frist von einem Monat zum Monatsende (§ 309 Nr. 9 BGB). -

-

- Die Kündigung ist jederzeit in den App-Einstellungen unter - Einstellungen → Abonnement → Kündigen möglich (§ 312k BGB). - Eine Kündigungsbestätigung wird per E-Mail zugesandt. - Der Zugang bleibt bis zum Ende der bereits bezahlten Laufzeit vollständig aktiv. -

`)} - - ${sec('8. Kein Erstattungsanspruch', ` -

- Bei vorzeitiger Kündigung durch den Nutzer erfolgt keine anteilige Rückerstattung - des Jahresbeitrags. Der Zugang bleibt bis zum Ende der Laufzeit vollständig nutzbar — - du verlierst also nichts, was du bereits bezahlt hast. - Gesetzliche Ansprüche bei vertragswidrigen Leistungen bleiben unberührt. -

`)} - - ${sec('9. Widerrufsrecht', ` -

- Da die Nutzung unmittelbar nach Freischaltung beginnt und du beim Kauf ausdrücklich - zustimmst, dass die Vertragserfüllung vor Ablauf der Widerrufsfrist beginnt, erlischt - dein 14-tägiges Widerrufsrecht mit Beginn der Nutzung (§ 356 Abs. 4 BGB). Dir ist - bekannt, dass du durch diese Zustimmung dein Widerrufsrecht verlierst. Die Zustimmung - wird beim Kauf aktiv protokolliert. -

`)} - - ${sec('10. Fristlose Kündigung durch den Anbieter', ` -

- Wir sind berechtigt, den Vertrag aus wichtigem Grund fristlos zu kündigen - (§ 314 BGB). Ein wichtiger Grund liegt insbesondere vor, wenn nach einer - Zahlungserinnerung der offene Betrag weiterhin nicht beglichen wird. - In diesem Fall endet der Zugang mit Wirkung der Kündigung. -

`)} - - ${sec('11. KI-Funktionen / Haftung für KI-Inhalte', ` -

- KI-generierte Inhalte (Trainer-Empfehlungen, Gesundheitshinweise, Züchter-Analysen) - können fehlerhaft oder unvollständig sein. Sie dienen ausschließlich der allgemeinen - Information und ersetzen keine tierärztliche, veterinärmedizinische oder fachliche - Beratung. Ban Yaro haftet nicht für Schäden, die aus der Nutzung KI-generierter - Inhalte entstehen. -

`)} - - ${sec('12. Verfügbarkeit', ` -

- Wir streben eine hohe Verfügbarkeit von Ban Yaro an und arbeiten kontinuierlich - daran, die App stabil zu halten. Eine Garantie für ununterbrochene Verfügbarkeit - können wir jedoch nicht übernehmen. Geplante Wartungsarbeiten werden nach - Möglichkeit vorab in der App angekündigt. -

`)} - - ${sec('13. Änderungen dieser AGB', ` -

- Änderungen der AGB werden per E-Mail und in der App angekündigt — - mindestens 4 Wochen vor Inkrafttreten. Widersprichst du den Änderungen nicht - innerhalb dieser Frist, gelten sie als angenommen. Dein Widerspruchsrecht und - das Recht zur außerordentlichen Kündigung bleiben unberührt. -

`)} - - ${sec('14. Anwendbares Recht', ` -

- Es gilt ausschließlich deutsches Recht. Als Verbraucher hast du - deinen allgemeinen Gerichtsstand. Die EU-Plattform zur Online-Streitbeilegung - (ec.europa.eu/consumers/odr) wurde eingestellt. Wir nehmen nicht an alternativen - Streitbeilegungsverfahren teil (§ 36 VSBG). -

`)} - - ${sec('15. Kontakt', ` -

- René Degelmann
- Ringstr. 26, 85560 Ebersberg
- E-Mail: hallo@banyaro.app -

`)} - -

- Stand: Juni 2026 · Version 3 -

- -
- `; + async function init(container) { + try { + const res = await fetch('/agb'); + const html = await res.text(); + const doc = new DOMParser().parseFromString(html, 'text/html'); + const content = doc.querySelector('#legal-content'); + container.innerHTML = content + ? content.innerHTML + : '

Inhalt momentan nicht verfügbar.

'; + } catch (e) { + container.innerHTML = '

Die AGB sind offline nicht verfügbar — bitte einmal mit Internetverbindung öffnen.

'; + } } function refresh() {} diff --git a/backend/static/js/pages/datenschutz.js b/backend/static/js/pages/datenschutz.js index 64dff29..ac9cc43 100644 --- a/backend/static/js/pages/datenschutz.js +++ b/backend/static/js/pages/datenschutz.js @@ -1,411 +1,23 @@ /* ============================================================ - BAN YARO — Datenschutzerklärung + BAN YARO — Datenschutzerklärung (SPA-Wrapper) + Einzige Inhaltsquelle: /datenschutz.html (crawlbar). Diese Seite + holt den Inhalt per fetch und injiziert ihn — kein Text-Duplikat. ============================================================ */ window.Page_datenschutz = (() => { - const S = { - h2: `font-size:var(--text-base);font-weight:var(--weight-semibold);color:var(--c-text);margin:0 0 var(--space-2)`, - p: `font-size:var(--text-sm);color:var(--c-text-secondary);line-height:1.7;margin:0`, - ul: `font-size:var(--text-sm);color:var(--c-text-secondary);line-height:1.7;margin:var(--space-2) 0 0;padding-left:var(--space-5)`, - a: `color:var(--c-primary)`, - }; - - function sec(title, body) { - return ` -
-

${title}

- ${body} -
`; - } - - function init(container) { - container.innerHTML = ` -
- -

Datenschutzerklärung

- - ${sec('Verantwortlicher', ` -

- René Degelmann, Ringstr. 26, 85560 Ebersberg
- E-Mail: hallo@banyaro.app -

`)} - - ${sec('Hosting & Infrastruktur', ` -

- Die App wird auf einem eigenen Server (Synology DiskStation) in Deutschland betrieben. - Alle Daten werden ausschließlich auf diesem Server gespeichert und nicht an externe - Hoster übermittelt. -

-

- Für den E-Mail-Versand (Kontobestätigung, Benachrichtigungen, Rechnungen) nutzen wir - Brevo (Sendinblue SAS, 55 rue d'Amsterdam, 75008 Paris, Frankreich). - Brevo ist nach EU-Standardvertragsklauseln zertifiziert. Dabei werden E-Mail-Adresse - und Name übermittelt. Datenschutzinformationen: - brevo.com/de/legal/privacypolicy/. -

-

- Für anonymisierte Nutzungsstatistiken betreiben wir Umami Analytics - auf unserem eigenen Server. Es werden keine personenbezogenen Daten oder IP-Adressen - gespeichert. Kein Tracking über Sitzungen hinweg. -

`)} - - ${sec('Deine Daten gehören dir', ` -

- Ban Yaro ist eine private Community-App. Dein Tagebuch, deine - persönlichen Notizen, Gesundheitsdaten deines Hundes, - eigene Routen und dein Nutzerprofil sind - ausschließlich für dich sichtbar — sie werden weder an andere Nutzer noch an Dritte - weitergegeben. Öffentlich sichtbar sind nur Inhalte, die du bewusst veröffentlichst - (z. B. Forenbeiträge, Giftköder-Meldungen, öffentliche Gassi-Treffen). -

`)} - - ${sec('Welche Daten wir verarbeiten', ` -

Bei der Registrierung und Nutzung von Ban Yaro werden folgende Daten verarbeitet:

- `)} - - ${sec('Rechtsgrundlage', ` -

- Die Verarbeitung erfolgt auf Basis von Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) - für alle zur Bereitstellung des Dienstes notwendigen Daten, sowie Art. 6 Abs. 1 lit. a - DSGVO (Einwilligung) für optionale Funktionen wie Standortfreigabe und - Push-Benachrichtigungen. Einwilligungen können jederzeit mit Wirkung für die Zukunft - widerrufen werden (Art. 7 Abs. 3 DSGVO) — einfach die entsprechende Funktion in den - Einstellungen deaktivieren oder die Browser-Freigabe entziehen. -

-

- Impressum und rechtliche Grundlage nach § 5 DDG (Digitale-Dienste-Gesetz). -

`)} - - ${sec('Datenweitergabe', ` -

- Deine Daten werden nicht an Dritte verkauft oder zu Werbezwecken weitergegeben. - Öffentliche Inhalte (Forum, Wiki, Giftköder-Karte) sind für alle Nutzer sichtbar. - Profile sind standardmäßig nur für registrierte Nutzer sichtbar. - Admins und Moderatoren können gemeldete Inhalte zur Qualitätssicherung einsehen - (Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO — berechtigtes Interesse an - Plattformsicherheit). -

`)} - - ${sec('Direktnachrichten', ` -

- Nachrichten zwischen Nutzern (z. B. zwischen Hundesitter und Hundeeigentümer oder - zwischen Interessenten und Züchtern) werden auf unserem Server gespeichert, bis du - das Gespräch oder deinen Account löschst. Admins können gemeldete Nachrichten zur - Missbrauchsprüfung einsehen (Art. 6 Abs. 1 lit. f DSGVO — berechtigtes Interesse - an Plattformsicherheit). Nachrichten werden nicht an Dritte weitergegeben. - Du kannst Gespräche jederzeit selbst löschen. -

`)} - - ${sec('Moderation & Community', ` -

- Zur Sicherstellung der Plattformqualität und Einhaltung unserer Nutzungsregeln können - Moderatoren und automatische Systeme Inhalte prüfen. Rechtsgrundlage ist - Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an sicherer Plattform). -

`)} - - ${sec('KI-Funktionen', ` -

- Ban Yaro bietet KI-gestützte Funktionen (Trainingsempfehlungen, Terminvorschläge, - Rassen-Informationen). Diese laufen primär auf einer lokalen KI auf unserem - eigenen Server in Deutschland — deine Anfragen verlassen dabei nicht unsere - Infrastruktur. -

-

- Als Ausweichlösung bei Nichtverfügbarkeit des lokalen Modells wird - Claude Sonnet 4.6 von Anthropic, PBC (San Francisco, USA) genutzt. - In diesem Fall wird der Inhalt deiner Anfrage übermittelt. Bei Gesundheits- und - Ernährungsberichten kann dies Hundedaten (Name, Rasse, Gewicht, Impfhistorie, - Medikamente, Allergien) als Teil des Anfragetextes umfassen. Die Übermittlung - in die USA erfolgt auf Basis der EU-Standardvertragsklauseln (Art. 46 Abs. 2 lit. c DSGVO). - Datenschutzerklärung von Anthropic: - anthropic.com/privacy. -

-

- Die Rassenerkennung per Foto sendet das hochgeladene Bild direkt an - Claude von Anthropic (USA) zur Analyse — es gibt hierfür keinen lokalen Fallback. - Das Foto wird nicht dauerhaft bei Anthropic gespeichert. Rechtsgrundlage: Einwilligung - gem. Art. 6 Abs. 1 lit. a DSGVO durch aktive Nutzung der Funktion. -

-

- Der KI-Trainer analysiert deinen bisherigen Trainingsfortschritt - (Übungshistorie, Erfolgsquoten, Streaks) und gibt personalisierte Empfehlungen. - Diese Analyse läuft auf unserem lokalen Server in Deutschland — deine Trainingsdaten - verlassen dabei nicht unsere Infrastruktur. Es findet kein Training oder Fine-Tuning - von KI-Modellen auf Basis deiner Nutzerdaten statt. -

-

- KI-Empfehlungen sind Vorschläge und ersetzen keine tierärztliche Beratung. - Eine automatisierte Entscheidungsfindung mit rechtlicher Wirkung (Art. 22 DSGVO) - findet nicht statt. -

-

- KI-Antworten können fehlerhaft oder unvollständig sein und dienen ausschließlich - allgemeinen Informationszwecken. Sie ersetzen keine tierärztliche oder fachliche - Beratung. Trotz EU-Standardvertragsklauseln besteht bei US-Anbietern ein Restrisiko, - dass US-Behörden auf übermittelte Daten zugreifen könnten. -

`)} - - ${sec('Wetterdaten & Kartendienste', ` -

- Die Wetter-Funktion übermittelt auf Wunsch deine GPS-Koordinaten serverseitig an - Open-Meteo (Österreich, DSGVO-konform) für die Wettervorhersage. - Für das Regenradar nutzen wir primär die offenen Radardaten des - Deutschen Wetterdienstes (DWD). Diese werden serverseitig von unserem - Server in Deutschland abgerufen und als Kartenkacheln bereitgestellt — dein Gerät - kontaktiert den DWD dabei nicht direkt. Steht das DWD-Radar nicht zur Verfügung, - werden ersatzweise Radarkacheln von RainViewer (USA) geladen; dabei - wird dein Browser direkt kontaktiert. Für weitere Wetter-Kartenlayer (z. B. Temperatur) - können Kacheln von OpenWeatherMap (OpenWeather Ltd., UK/USA) direkt im - Browser geladen werden. In allen Fällen werden keine Account-Daten übermittelt. - Rechtsgrundlage: Einwilligung gem. Art. 6 Abs. 1 lit. a DSGVO. -

-

- Für die automatische Ortsnamens-Ermittlung (z. B. im Wetter-Detail) werden deine - GPS-Koordinaten serverseitig an Nominatim der OpenStreetMap Foundation - (UK) übermittelt. Es werden ausschließlich Koordinaten weitergegeben — keine - personenbezogenen Daten. -

-

- Datenschutzerklärung Open-Meteo: - open-meteo.com/en/terms · - OpenWeatherMap: - openweathermap.org/privacy-policy · - OpenStreetMap/Nominatim: - osmfoundation.org · - DWD: - dwd.de · - RainViewer: - rainviewer.com -

`)} - - ${sec('Kartenmaterial & Offline-Karten', ` -

- Die Basiskarte besteht aus Vektordaten von OpenStreetMap, die wir auf - unserem eigenen Server in Deutschland aufbereiten und ausliefern (Vektor-Tiles im - PMTiles-Format). Für die Basiskarte werden daher keine externen - Kartenanbieter kontaktiert — die Kartenkacheln kommen von unserem Server. -

-

- Optional kannst du Kartenausschnitte für die Offline-Nutzung - herunterladen. Diese werden ausschließlich lokal auf deinem Gerät - gespeichert und nicht an Dritte übermittelt. -

`)} - - ${sec('Routenvorschläge (OpenRouteService)', ` -

- Die Funktion „Routenvorschläge" berechnet auf Wunsch einen Rundweg - ausgehend von deinem aktuellen Standort. Dazu werden deine GPS-Koordinaten einmalig - an den Dienst OpenRouteService übermittelt, der von - HeiGIT am Karlsruher Institut für Technologie (KIT), Deutschland, - betrieben wird. Es werden ausschließlich die Koordinaten übertragen — - keine Account- oder Profildaten. OpenRouteService speichert keine - personenbezogenen Daten dauerhaft. -

-

- Die Funktion wird nur aktiv, wenn du deinen Standort im Browser freigibst und - bewusst einen Routenvorschlag anforderst (Einwilligung gem. Art. 6 Abs. 1 lit. a DSGVO). - Der Tagesvorschlag auf der Startseite wird nur berechnet, wenn du eingeloggt bist und - Standortzugriff erteilt hast — das Ergebnis wird lokal zwischengespeichert und - maximal einmal täglich neu abgerufen. -

-

- Datenschutzerklärung von OpenRouteService: - openrouteservice.org/privacy-policy -

`)} - - ${sec('Ban Yaro Go — native iOS-App', ` -

- Ban Yaro Go ist die optionale native iOS-Begleit-App zu banyaro.app. - Sie nutzt dasselbe banyaro-Konto und denselben Server in Deutschland — es gelten - daher zusätzlich zu den oben beschriebenen Verarbeitungen folgende iOS-spezifische - Punkte: -

- -

- Rechtsgrundlage ist jeweils deine Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) bzw. die - Vertragserfüllung (Art. 6 Abs. 1 lit. b DSGVO). Apple-Datenschutz: - apple.com/legal/privacy. -

`)} - - ${sec('Technische Speicherung', ` -

- Ban Yaro verwendet technisch notwendige Speichermechanismen für den Betrieb der App: - Session-Tokens und Authentifizierungsdaten werden im Local Storage des Browsers - gespeichert. Ein Service Worker speichert App-Inhalte lokal für die Offline-Nutzung - (Cache). Push-Benachrichtigungs-Token werden für die Zustellung von Hinweisen benötigt. - Diese Speicherung ist für die Kernfunktion der App erforderlich; eine Einwilligung ist - nach § 25 Abs. 2 TTDSG nicht erforderlich. Es werden keine Tracking-Cookies eingesetzt. -

`)} - - ${sec('Push-Benachrichtigungen', ` -

- Wenn du Push-Benachrichtigungen aktivierst, wird ein Abonnement-Token an den - Push-Dienst deines Browsers übermittelt: bei Android/Chrome an - Firebase Cloud Messaging (Google LLC, USA), bei iOS/Safari an - Apple Push Notification Service (Apple Inc., USA). Diese Dienste - erhalten lediglich den Token und die Benachrichtigung selbst — keine weiteren - Nutzerdaten. Die Übermittlung erfolgt auf Basis deiner Einwilligung - (Art. 6 Abs. 1 lit. a DSGVO), die du jederzeit in den Geräteeinstellungen widerrufen kannst. -

`)} - - ${sec('Kalender-Abo (Webcal)', ` -

- Das Kalender-Abo nutzt einen persönlichen Token-Link. Wenn deine Kalender-App - diesen Link regelmäßig abruft, wird dabei deine IP-Adresse an unseren Server - übermittelt. Es werden keine weiteren Daten an Dritte weitergegeben. -

`)} - - ${sec('Einladungslinks (Referral)', ` -

- Wenn du Freunde über deinen persönlichen Einladungslink einlädst, wird erfasst, - wie viele Personen sich darüber registriert haben — ohne personenbezogene Daten - der eingeladenen Personen zu speichern. Dir wird lediglich die Anzahl angezeigt. -

`)} - - ${sec('Nutzungsanalyse (Umami)', ` -

- Wir verwenden Umami, ein datenschutzfreundliches Analysetool, das ausschließlich auf - unserem eigenen Server betrieben wird. Es werden keine Cookies gesetzt, keine - personenbezogenen Daten erhoben und keine Daten an Dritte weitergegeben. - Erfasst werden lediglich anonyme Seitenaufrufe zur Verbesserung der App - (Art. 6 Abs. 1 lit. f DSGVO — berechtigtes Interesse). -

`)} - - ${sec('Deine Rechte (DSGVO)', ` -

- Du hast das Recht auf Auskunft (Art. 15), Berichtigung - (Art. 16), Löschung (Art. 17), Einschränkung der Verarbeitung - (Art. 18) sowie Datenportabilität (Art. 20). Erteilte Einwilligungen - kannst du jederzeit mit Wirkung für die Zukunft widerrufen (Art. 7 Abs. 3 DSGVO). -

-

- Datenexport (Art. 20 DSGVO): Du kannst jederzeit unter - Einstellungen → „Meine Daten exportieren" eine vollständige Kopie deiner - gespeicherten Daten als JSON-Datei herunterladen. Der Export enthält Profildaten, - Hundedaten, Tagebuch (inkl. Medien-URLs), Gesundheitseinträge, Trainingsfortschritt, - Ausgaben, Verhaltensprotokoll, Versicherung, Ernährungsprofil und Futter-Reaktionen, - eigene Routen, Forum-Beiträge sowie Gassi-Teilnahmen und Gassi-Fotos. -

-

- Das JSON-Format ist maschinenlesbar und kann z. B. mit jedem Texteditor geöffnet - oder in andere Anwendungen importiert werden. Der Export wird direkt im Browser - erzeugt und nicht dauerhaft auf dem Server gespeichert. -

-

- Zur Ausübung weiterer Rechte wende dich per E-Mail an - hallo@banyaro.app.

- Du hast außerdem das Recht, bei der zuständigen Datenschutz-Aufsichtsbehörde - Beschwerde einzulegen:
- Bayerisches Landesamt für Datenschutzaufsicht (BayLDA)
- Promenade 18, 91522 Ansbach
- poststelle@lda.bayern.de · - www.lda.bayern.de -

`)} - - ${sec('Zahlungsdaten', ` -

- Wenn du ein kostenpflichtiges Abonnement abschließt, verarbeiten wir folgende Daten: - Name, E-Mail-Adresse, Rechnungsadresse und den Zahlungseingang. Rechtsgrundlage ist - Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung). Rechnungsdaten werden gemäß - § 147 AO 10 Jahre aufbewahrt. Rechnungen werden per E-Mail mit - TLS-Verschlüsselung zugestellt. -

-

- Deine Zahlungsdaten (IBAN) werden nur für die Zuordnung des Zahlungseingangs intern - verwendet und nicht an Dritte weitergegeben. Die vertraglichen Bedingungen (Laufzeit, - Kündigung, Erstattung) findest du in unseren - AGB. -

`)} - - ${sec('Speicherdauer', ` -

- Server-Logs werden nach 30 Tagen rotiert. IP-Adressen werden ausschließlich - zur Sicherheit und für Rate-Limiting maximal 30 Tage gespeichert. -

`)} - - ${sec('Account-Löschung', ` -

- Wenn du deinen Account löschst, werden deine Daten nach folgendem Schema verarbeitet: -

- -

- Es findet keine anonymisierte Weiterverarbeitung deiner privaten Inhalte - (Tagebuch, Gesundheit, Notizen) zu Trainings- oder Statistikzwecken statt. -

`)} - - ${sec('Mindestalter', ` -

- Die Nutzung von Ban Yaro ist nur Personen ab 18 Jahren gestattet. Durch die - Registrierung bestätigt der Nutzer, das 18. Lebensjahr vollendet zu haben. -

`)} - -

- Stand: Juni 2026 · Version 4 -

- -
- `; + async function init(container) { + try { + const res = await fetch('/datenschutz'); + const html = await res.text(); + const doc = new DOMParser().parseFromString(html, 'text/html'); + const content = doc.querySelector('#legal-content'); + container.innerHTML = content + ? content.innerHTML + : '

Inhalt momentan nicht verfügbar.

'; + } catch (e) { + container.innerHTML = '

Die Datenschutzerklärung ist offline nicht verfügbar — bitte einmal mit Internetverbindung öffnen.

'; + } } function refresh() {} diff --git a/backend/static/js/pages/impressum.js b/backend/static/js/pages/impressum.js index 0f2c22e..28c34aa 100644 --- a/backend/static/js/pages/impressum.js +++ b/backend/static/js/pages/impressum.js @@ -1,176 +1,28 @@ /* ============================================================ - BAN YARO — Impressum + BAN YARO — Impressum (SPA-Wrapper) + Einzige Inhaltsquelle: /impressum.html (crawlbar). Diese Seite + holt den Inhalt per fetch und injiziert ihn — kein Text-Duplikat. + Das Kontaktformular wird über die geteilte contact-form.js gebunden. ============================================================ */ window.Page_impressum = (() => { - function init(container) { - container.innerHTML = ` -
- -

Impressum

- -
-

Angaben gemäß § 5 DDG

-

- René Degelmann
- Ringstr. 26
- 85560 Ebersberg -

-
- -
-

Kontakt

-

- E-Mail: hallo@banyaro.app
- Oder nutze das Formular — wir antworten in der Regel innerhalb von 24 Stunden. -

- -
-
-
- - -
-
- - -
-
-
- - -
-
- - -
- - -
-
- -
-

Verantwortlich für den Inhalt - gemäß § 18 Abs. 2 MStV

-

- René Degelmann
- (Anschrift wie oben) -

-
- -
-

Streitschlichtung

-

- Wir sind nicht bereit und nicht verpflichtet, an einem Streitbeilegungsverfahren vor einer - Verbraucherschlichtungsstelle teilzunehmen (§ 36 VSBG). -

-
- -
-

Haftungshinweis

-

- Die Inhalte dieser App wurden mit größtmöglicher Sorgfalt erstellt. Für die Richtigkeit, - Vollständigkeit und Aktualität der Inhalte übernehmen wir keine Gewähr. Als - Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für eigene Inhalte verantwortlich. - Für nutzergenerierte Inhalte (Forenbeiträge, Fotos, Kommentare) sind ausschließlich - die jeweiligen Nutzer verantwortlich. Bei Bekanntwerden rechtswidriger Inhalte werden - diese im Rahmen der gesetzlichen Vorgaben (§§ 7 ff. DDG) geprüft und gegebenenfalls - unverzüglich entfernt. -

-
- -

- Stand: Mai 2026 -

- -
- `; + async function init(container) { + try { + const res = await fetch('/impressum'); + const html = await res.text(); + const doc = new DOMParser().parseFromString(html, 'text/html'); + const content = doc.querySelector('#legal-content'); + container.innerHTML = content + ? content.innerHTML + : '

Inhalt momentan nicht verfügbar.

'; + window.initContactForm?.(container); + } catch (e) { + container.innerHTML = '

Das Impressum ist offline nicht verfügbar — bitte einmal mit Internetverbindung öffnen.

'; + } } - function _initContactForm(container) { - const form = container.querySelector('#contact-form'); - const statusEl = container.querySelector('#cf-status'); - const submitBtn = container.querySelector('#cf-submit'); - if (!form) return; - - form.addEventListener('submit', async e => { - e.preventDefault(); - const name = container.querySelector('#cf-name').value.trim(); - const email = container.querySelector('#cf-email').value.trim(); - const subject = container.querySelector('#cf-subject').value.trim(); - const message = container.querySelector('#cf-message').value.trim(); - - submitBtn.disabled = true; - submitBtn.textContent = 'Wird gesendet…'; - statusEl.style.display = 'none'; - - try { - const res = await fetch('/api/contact', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ name, email, subject, message }), - }); - if (!res.ok) { - const err = await res.json().catch(() => ({})); - throw new Error(err.detail || 'Fehler beim Senden.'); - } - statusEl.style.display = 'block'; - statusEl.style.background = 'var(--c-success-bg, #f0fdf4)'; - statusEl.style.color = 'var(--c-success, #16a34a)'; - statusEl.textContent = '✓ Nachricht gesendet — wir melden uns bald!'; - form.reset(); - } catch (err) { - statusEl.style.display = 'block'; - statusEl.style.background = '#fef2f2'; - statusEl.style.color = '#dc2626'; - statusEl.textContent = err.message || 'Fehler beim Senden. Bitte versuche es später erneut.'; - submitBtn.disabled = false; - submitBtn.textContent = 'Nachricht senden'; - } - }); - } - - const _origInit = init; - function refresh() {} - return { - init(container) { - _origInit(container); - _initContactForm(container); - }, - refresh - }; + return { init, refresh }; })(); diff --git a/backend/static/landing.html b/backend/static/landing.html index 95713a6..272122c 100644 --- a/backend/static/landing.html +++ b/backend/static/landing.html @@ -4,7 +4,7 @@ - + Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz diff --git a/backend/static/sw.js b/backend/static/sw.js index 5b04310..119cc71 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -4,7 +4,7 @@ ============================================================ */ // ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab -const VER = '1277'; +const VER = '1278'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten @@ -412,7 +412,8 @@ self.addEventListener('fetch', event => { // zieht der Update-Mechanismus (x-app-version + controllerchange) ohnehin separat. if (url.pathname.startsWith('/css/') || url.pathname.startsWith('/js/pages/') || url.pathname.startsWith('/js/app.js') || url.pathname.startsWith('/js/ui.js') - || url.pathname.startsWith('/js/api.js') || url.pathname.startsWith('/js/worlds.js')) { + || url.pathname.startsWith('/js/api.js') || url.pathname.startsWith('/js/worlds.js') + || url.pathname === '/datenschutz' || url.pathname === '/agb' || url.pathname === '/impressum') { event.respondWith((async () => { const network = fetch(event.request).then(response => { if (response.ok) {