diff --git a/backend/main.py b/backend/main.py
index db883dc..fb55815 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -1400,6 +1400,208 @@ async def knigge_page():
return HTMLResponse(content=html, headers={"Cache-Control": "max-age=7200"})
+# ------------------------------------------------------------------
+# /partner — Influencer-Landingpage
+# ------------------------------------------------------------------
+@app.get("/partner")
+async def partner_landing():
+ from fastapi.responses import HTMLResponse
+ from database import db as _db
+ with _db() as conn:
+ total_founders = conn.execute("SELECT COUNT(*) FROM users WHERE is_founder=1").fetchone()[0]
+ partners = conn.execute(
+ """SELECT label, uses FROM partner_codes WHERE grants_founder=1 ORDER BY uses DESC LIMIT 5"""
+ ).fetchall()
+ open_slots = max(0, 100 - total_founders)
+
+ partner_rows = ''.join([
+ f'
Noch keine Partner aktiv — sei der Erste.
'
+
+ html = f"""
+
+
+
+
+
+
+

+
Ban Yaro · Influencer-Programm
+
Gib deiner Community
etwas für immer.
+
100 Gründer-Plätze. Weltweit. Nie wieder erhältlich.
Als Partner bringst du deine Follower nach vorne — und steigst im Ranking auf.
+
Jetzt Partner werden
+
+
+
+
+
{open_slots}
+
Gründer-Plätze noch frei (von 100)
+
+
0{total_founders} vergeben100
+
+
+
+
+
Was du und deine Community bekommen
+
+
+
🏆
+
+
Gründer-Lizenz für deine Follower
+
Jeder der sich mit deinem Code registriert bekommt einen der 100 Gründer-Plätze — mit einer nummerierten Badge „Gründer #N" die dauerhaft im Profil und im Forum sichtbar ist. Nie wieder erhältlich.
+
+
+
+
+
🤝
+
+
Dein persönlicher Partner-Code
+
Du bekommst einen eigenen Code (z.B. HUNDEBLOG). Follower die sich damit registrieren werden automatisch Gründer — du siehst in Echtzeit wie viele du gebracht hast.
+
+
+
+
+
📊
+
+
Öffentliches Partner-Ranking
+
Auf der
Gründer-Seite siehen alle wer die meisten Gründer gebracht hat. Das Ranking motiviert deine Follower mitzumachen — und stärkt deine Position gegenüber anderen Influencern.
+
+
+
+
+
💜
+
+
Partner-Badge für dich
+
Du selbst bekommst ein „Partner"-Badge in deinem Profil — sichtbar für alle Nutzer der App.
+
+
+
+
+
🎁
+
+
Lebenslang kostenlos — für immer
+
Gründer zahlen nie für Premium-Features — egal was wir in Zukunft einführen. Das ist ein echtes Dankeschön für die Pioniere.
+
+
+
+
+
+
+
Wie es funktioniert
+
+
1
+
Kontakt aufnehmenSchreib uns kurz an partner@banyaro.app — wir richten deinen persönlichen Code ein.
+
+
+
2
+
Code teilenDu postest deinen Code in Story, Reel oder Post — deine Follower registrieren sich auf banyaro.app.
+
+
+
3
+
Gründer werdenJede Registrierung mit deinem Code sichert automatisch einen der 100 Gründer-Plätze. Du siehst deinen Fortschritt in Echtzeit.
+
+
+
4
+
Im Ranking aufsteigenJe mehr Gründer du bringst, desto höher dein Platz auf der öffentlichen Gründer-Seite.
+
+
+
+
+ {'
🏅 Aktuelles Partner-Ranking
' + partner_rows + '
' if partners else ''}
+
+
+
+
Was ist Ban Yaro?
+
Ban Yaro ist die Hunde-App für alles was Halter brauchen — Tagebuch, Gesundheit, Routen, Giftköder-Alarm, Community. Kostenlos, ohne App Store, direkt im Browser oder als PWA.
+
banyaro.app entdecken →
+
+
+
+
+
+
+
+
+
+
+"""
+ return HTMLResponse(content=html, headers={"Cache-Control": "no-cache"})
+
+
# SPA Fallback — ALLE nicht-API-Routen gehen zur index.html
@app.get("/{full_path:path}")
async def spa_fallback(full_path: str):
diff --git a/backend/routes/breeder.py b/backend/routes/breeder.py
index 061c9a7..bb5efc8 100644
--- a/backend/routes/breeder.py
+++ b/backend/routes/breeder.py
@@ -21,7 +21,7 @@ _TZ = ZoneInfo("Europe/Berlin")
BREEDER_DOCS_DIR = os.getenv("BREEDER_DOCS_DIR", "/data/breeder_docs")
os.makedirs(BREEDER_DOCS_DIR, exist_ok=True)
-ADMIN_EMAIL = os.getenv("ADMIN_EMAIL", "mail@motocamp.de")
+ADMIN_EMAIL = os.getenv("ADMIN_EMAIL", "admin@banyaro.app")
APP_URL = os.getenv("APP_URL", "https://banyaro.app")
diff --git a/backend/routes/litters.py b/backend/routes/litters.py
index f47c809..2bcf629 100644
--- a/backend/routes/litters.py
+++ b/backend/routes/litters.py
@@ -258,7 +258,7 @@ async def welfare_confirm(litter_id: int, user=Depends(_require_breeder)):
"FROM breeder_profiles bp JOIN users u ON u.id=bp.user_id "
"WHERE bp.user_id=?", (user["id"],)
).fetchone()
- admin_email = os.getenv("ADMIN_EMAIL", "mail@motocamp.de")
+ admin_email = os.getenv("ADMIN_EMAIL", "admin@banyaro.app")
app_url = os.getenv("APP_URL", "https://banyaro.app")
zuechter = profile["name"] if profile else user.get("name", "Unbekannt")
zwinger = profile["zwingername"] if profile else "—"
diff --git a/backend/routes/osm.py b/backend/routes/osm.py
index d75631b..e08742b 100644
--- a/backend/routes/osm.py
+++ b/backend/routes/osm.py
@@ -28,7 +28,7 @@ OVERPASS_URLS = [
_overpass_sem = asyncio.Semaphore(1)
_overpass_last_req = 0.0
_OVERPASS_MIN_DELAY = 2.0 # Sekunden zwischen Anfragen
-_OVERPASS_UA = 'BanYaro/1.0 (https://banyaro.app; dog-walking PWA; contact: mail@motocamp.de)'
+_OVERPASS_UA = 'BanYaro/1.0 (https://banyaro.app; dog-walking PWA; contact: admin@banyaro.app)'
_OVERPASS_HEADERS = {
'User-Agent': _OVERPASS_UA,
'Referer': 'https://banyaro.app/', # von overpass-api.de verlangt gegen 406
diff --git a/backend/static/index.html b/backend/static/index.html
index 1cd9cfa..5277ae8 100644
--- a/backend/static/index.html
+++ b/backend/static/index.html
@@ -230,7 +230,7 @@
border-top:1px solid var(--c-border,#e5e7eb);
font-size:var(--text-xs);color:var(--c-text-muted);
display:flex;flex-direction:column;gap:var(--space-2);padding-bottom:var(--space-2)">
-
+
Impressum
Datenschutz
diff --git a/backend/static/js/app.js b/backend/static/js/app.js
index cb4b4a9..692526b 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 = '539'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
+const APP_VER = '542'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.1.4'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app';
diff --git a/backend/static/js/pages/datenschutz.js b/backend/static/js/pages/datenschutz.js
index 838aaf4..73c2ba8 100644
--- a/backend/static/js/pages/datenschutz.js
+++ b/backend/static/js/pages/datenschutz.js
@@ -29,7 +29,7 @@ window.Page_datenschutz = (() => {
${sec('Verantwortlicher', `
René Degelmann, Ringstr. 26, 85560 Ebersberg
- E-Mail: mail@motocamp.de
+ E-Mail: hallo@banyaro.app
`)}
${sec('Deine Daten gehören dir', `
@@ -169,7 +169,7 @@ window.Page_datenschutz = (() => {
(Art. 18) sowie
Datenportabilität (Art. 20). Erteilte Einwilligungen
kannst du jederzeit mit Wirkung für die Zukunft widerrufen (Art. 7 Abs. 3 DSGVO).
Zur Ausübung deiner Rechte wende dich per E-Mail an
-
mail@motocamp.de.
+
hallo@banyaro.app.
Du hast außerdem das Recht, bei der zuständigen Datenschutz-Aufsichtsbehörde
Beschwerde einzulegen:
Bayerisches Landesamt für Datenschutzaufsicht (BayLDA)
diff --git a/backend/static/js/pages/impressum.js b/backend/static/js/pages/impressum.js
index ac8b3bf..ffccb44 100644
--- a/backend/static/js/pages/impressum.js
+++ b/backend/static/js/pages/impressum.js
@@ -25,9 +25,9 @@ window.Page_impressum = (() => {
Kontakt
- E-Mail: mail@motocamp.de
- Kontaktformular: hallo@banyaro.app
+ Kontaktformular: Nachricht senden
diff --git a/backend/static/sw.js b/backend/static/sw.js
index b443693..d493e2a 100644
--- a/backend/static/sw.js
+++ b/backend/static/sw.js
@@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
-const CACHE_VERSION = 'by-v562';
+const CACHE_VERSION = 'by-v565';
const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache