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 @@
+
+
+
+
-
-
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:
-
- -
- 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.
-
`)}
-
- ${sec('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.
-
`)}
-
- ${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 `
-
-
-
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:
-
- - 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
-
`)}
-
- ${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:
-
-
- - 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.
-
`)}
-
- ${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:
-
-
- - 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.
-
`)}
-
- ${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 = `
- 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 @@