Compare commits

..

5 commits

7 changed files with 164 additions and 84 deletions

View file

@ -169,6 +169,9 @@
<div class="sidebar-item" data-page="events">
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#calendar-dots"></use></svg> Events
</div>
<div class="sidebar-item" data-page="jobs">
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#sparkle"></use></svg> Jobs
</div>
<span class="sidebar-section-label">Soziales</span>
<div class="sidebar-item" data-page="friends">
@ -452,6 +455,10 @@
<div class="page-body page-container"></div>
</section>
<section class="page" id="page-jobs">
<div class="page-body page-container"></div>
</section>
</main>
<!-- MOBILE BOTTOM NAVIGATION -->

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
const APP_VER = '554'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '583'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.2.1'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app';

View file

@ -2388,7 +2388,11 @@ window.Page_admin = (() => {
<div style="display:flex;gap:var(--space-2);margin-bottom:var(--space-4);flex-wrap:wrap;align-items:center">
${['pending','reviewing','accepted','rejected','alle'].map(s => `
<button class="btn btn-sm ${s===_statusFilter?'btn-primary':'btn-ghost'} adm-bew-filter" data-s="${s}">
${s==='pending'?'⏳ Neu':s==='reviewing'?'🔍 In Prüfung':s==='accepted'?'✅ Angenommen':s==='rejected'?'❌ Abgelehnt':'Alle'}
${s==='pending' ? `${UI.icon('clock')} Neu`
: s==='reviewing' ? `${UI.icon('magnifying-glass')} In Prüfung`
: s==='accepted' ? `${UI.icon('check-circle')} Angenommen`
: s==='rejected' ? `${UI.icon('x')} Abgelehnt`
: 'Alle'}
</button>`).join('')}
</div>
<div id="adm-bew-list">${UI.skeleton(3)}</div>`;

View file

@ -7,6 +7,10 @@ window.Page_jobs = (() => {
let _container = null;
let _appState = null;
const _esc = s => UI.escape(s ?? '');
const _ph = (name, size = 22) =>
`<svg class="ph-icon" aria-hidden="true" style="width:${size}px;height:${size}px;flex-shrink:0;color:var(--c-primary)"><use href="/icons/phosphor.svg#${name}"></use></svg>`;
async function init(container, appState) {
_container = container;
_appState = appState;
@ -44,11 +48,11 @@ window.Page_jobs = (() => {
<div style="padding:var(--space-5)">
<h2 style="font-size:var(--text-lg);font-weight:700;margin:0 0 var(--space-4);color:var(--c-primary)">Die Stelle</h2>
<div style="display:grid;gap:var(--space-3)">
${_infoRow('📍', 'Remote', '100 % flexibel — du arbeitest wann und wie du willst')}
${_infoRow('📅', 'Umfang', '12 Posts pro Woche auf Instagram &amp; TikTok')}
${_infoRow('💶', 'Vergütung', '50 € / Monat — wächst mit der Community')}
${_infoRow('🤖', 'Luna an deiner Seite', 'Unser KI-Assistent schreibt Captions, generiert Post-Ideen und Hashtags — du wählst aus und postest')}
${_infoRow('⭐', 'Gründer-Status', 'Du wirst Teil der ersten 100 Gründer — für immer')}
${_infoRow(_ph('map-pin'), 'Remote', '100 % flexibel — du arbeitest wann und wie du willst')}
${_infoRow(_ph('calendar-dots'), 'Umfang', '12 Posts pro Woche auf Instagram &amp; TikTok')}
${_infoRow(_ph('tag'), 'Vergütung', '50 € / Monat — wächst mit der Community')}
${_infoRow(_ph('robot'), 'Luna an deiner Seite', 'Unser KI-Assistent schreibt Captions, generiert Post-Ideen und Hashtags — du wählst aus und postest')}
${_infoRow(_ph('star'), 'Gründer-Status', 'Du wirst Teil der ersten 100 Gründer — für immer')}
</div>
</div>
</div>
@ -56,8 +60,9 @@ window.Page_jobs = (() => {
<!-- Luna-Probezugang Teaser -->
<div style="background:linear-gradient(135deg,var(--c-primary),#e8a857);border-radius:var(--radius-lg);
padding:var(--space-5);margin-bottom:var(--space-4);color:#fff">
<div style="font-size:var(--text-lg);font-weight:800;margin-bottom:var(--space-2)">
🤖 Luna 14 Tage kostenlos testen
<div style="font-size:var(--text-lg);font-weight:800;margin-bottom:var(--space-2);display:flex;align-items:center;gap:var(--space-2)">
<svg class="ph-icon" aria-hidden="true" style="width:24px;height:24px"><use href="/icons/phosphor.svg#robot"></use></svg>
Luna 14 Tage kostenlos testen
</div>
<p style="margin:0;opacity:.9;font-size:var(--text-sm)">
Mit deiner Bewerbung schalten wir dir sofort den vollen Zugang zu Luna frei
@ -66,7 +71,8 @@ window.Page_jobs = (() => {
</p>
${trialStatus?.active ? `<div style="margin-top:var(--space-3);background:rgba(255,255,255,.2);
border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);font-weight:700;font-size:var(--text-sm)">
Dein Probezugang läuft noch ${trialStatus.remaining_days} Tage</div>` : ''}
<svg class="ph-icon" aria-hidden="true" style="width:16px;height:16px;vertical-align:middle"><use href="/icons/phosphor.svg#check-circle"></use></svg>
Dein Probezugang läuft noch ${trialStatus.remaining_days} Tage</div>` : ''}
</div>
<!-- Wen wir suchen -->
@ -97,7 +103,7 @@ window.Page_jobs = (() => {
function _infoRow(icon, label, text) {
return `
<div style="display:flex;gap:var(--space-3);align-items:flex-start">
<span style="font-size:20px;line-height:1.4">${icon}</span>
<div style="margin-top:1px">${icon}</div>
<div>
<div style="font-weight:700;font-size:var(--text-sm)">${label}</div>
<div style="color:var(--c-text-secondary);font-size:var(--text-sm)">${text}</div>
@ -107,22 +113,24 @@ window.Page_jobs = (() => {
function _renderStatus(app) {
const statusMap = {
pending: { icon: '⏳', text: 'Deine Bewerbung ist eingegangen — wir melden uns bald!', color: 'var(--c-text-secondary)' },
reviewing: { icon: '🔍', text: 'Wir schauen uns deine Bewerbung gerade genauer an.', color: '#0284c7' },
accepted: { icon: '🎉', text: 'Herzlichen Glückwunsch — du bist dabei!', color: 'var(--c-success)' },
rejected: { icon: '😔', text: 'Es hat diesmal leider nicht geklappt.', color: 'var(--c-danger)' },
pending: { icon: 'clock', text: 'Deine Bewerbung ist eingegangen — wir melden uns bald!', color: 'var(--c-text-secondary)' },
reviewing: { icon: 'magnifying-glass', text: 'Wir schauen uns deine Bewerbung gerade genauer an.', color: '#0284c7' },
accepted: { icon: 'check-circle', text: 'Herzlichen Glückwunsch — du bist dabei!', color: 'var(--c-success)' },
rejected: { icon: 'x', text: 'Es hat diesmal leider nicht geklappt.', color: 'var(--c-danger)' },
};
const s = statusMap[app.status] || statusMap.pending;
return `
<div class="card" style="padding:var(--space-5);text-align:center">
<div style="font-size:40px;margin-bottom:var(--space-3)">${s.icon}</div>
<div style="margin-bottom:var(--space-3)">
<svg class="ph-icon" aria-hidden="true" style="width:48px;height:48px;color:${s.color}"><use href="/icons/phosphor.svg#${s.icon}"></use></svg>
</div>
<div style="font-weight:700;color:${s.color};font-size:var(--text-lg);margin-bottom:var(--space-2)">${s.text}</div>
<div style="color:var(--c-text-muted);font-size:var(--text-xs)">
Bewerbung eingereicht: ${app.created_at?.slice(0,10)}
</div>
${app.admin_note ? `<div style="margin-top:var(--space-3);background:var(--c-surface-2);
border-radius:var(--radius-md);padding:var(--space-3);font-size:var(--text-sm);
color:var(--c-text-secondary);text-align:left">${UI.esc(app.admin_note)}</div>` : ''}
color:var(--c-text-secondary);text-align:left">${_esc(app.admin_note)}</div>` : ''}
</div>`;
}
@ -139,13 +147,13 @@ window.Page_jobs = (() => {
<div class="form-group">
<label class="form-label">Dein Name *</label>
<input class="form-control" type="text" name="name"
value="${u ? UI.esc(u.name) : ''}" placeholder="Vorname oder Nickname" required>
value="${u ? _esc(u.name) : ''}" placeholder="Vorname oder Nickname" required>
</div>
<div class="form-group">
<label class="form-label">E-Mail *</label>
<input class="form-control" type="email" name="email"
value="${u ? UI.esc(u.email || '') : ''}" placeholder="deine@email.de" required>
value="${u ? _esc(u.email || '') : ''}" placeholder="deine@email.de" required>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)">
@ -201,8 +209,9 @@ window.Page_jobs = (() => {
bekommst du sofort den 14-tägigen Luna-Probezugang.
</div>` : ''}
<button type="submit" class="btn btn-primary w-full" style="margin-top:var(--space-2)">
Bewerbung absenden + Luna freischalten 🚀
<button type="submit" class="btn btn-primary w-full" style="margin-top:var(--space-2);display:flex;align-items:center;justify-content:center;gap:var(--space-2)">
<svg class="ph-icon" aria-hidden="true" style="width:18px;height:18px"><use href="/icons/phosphor.svg#sparkle"></use></svg>
Bewerbung absenden + Luna freischalten
</button>
</form>

View file

@ -93,13 +93,13 @@ window.Page_movies = (() => {
<button class="movies-filter-btn${_filter === 'top' ? ' movies-filter-btn--active' : ''}" data-filter="top"><svg class="ph-icon" aria-hidden="true" style="width:14px;height:14px"><use href="/icons/phosphor.svg#star"></use></svg> Top</button>
</div>
<div class="movies-filter-row" style="margin-top:var(--space-2)">
<button class="movies-type-btn${_typ === 'alle' ? ' movies-filter-btn--active' : ''}" data-typ="alle">Alle Typen</button>
<button class="movies-type-btn${_typ === 'film' ? ' movies-filter-btn--active' : ''}" data-typ="film">🎬 Filme</button>
<button class="movies-type-btn${_typ === 'serie' ? ' movies-filter-btn--active' : ''}" data-typ="serie">📺 Serien</button>
<button class="movies-type-btn${_typ === 'doku' ? ' movies-filter-btn--active' : ''}" data-typ="doku">🎥 Dokus</button>
<button class="movies-filter-btn movies-type-btn${_typ === 'alle' ? ' movies-filter-btn--active' : ''}" data-typ="alle">Alle</button>
<button class="movies-filter-btn movies-type-btn${_typ === 'film' ? ' movies-filter-btn--active' : ''}" data-typ="film"><svg class="ph-icon" aria-hidden="true" style="width:15px;height:15px"><use href="/icons/phosphor.svg#film-slate"></use></svg> Filme</button>
<button class="movies-filter-btn movies-type-btn${_typ === 'serie' ? ' movies-filter-btn--active' : ''}" data-typ="serie"><svg class="ph-icon" aria-hidden="true" style="width:15px;height:15px"><use href="/icons/phosphor.svg#list"></use></svg> Serien</button>
<button class="movies-filter-btn movies-type-btn${_typ === 'doku' ? ' movies-filter-btn--active' : ''}" data-typ="doku"><svg class="ph-icon" aria-hidden="true" style="width:15px;height:15px"><use href="/icons/phosphor.svg#camera"></use></svg> Dokus</button>
</div>
<div style="display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-2)">
<svg class="ph-icon" aria-hidden="true" style="width:16px;height:16px;color:var(--c-text-muted)"><use href="/icons/phosphor.svg#sort-ascending"></use></svg>
<svg class="ph-icon" aria-hidden="true" style="width:16px;height:16px;color:var(--c-text-muted)"><use href="/icons/phosphor.svg#list"></use></svg>
<select id="movies-sort" class="form-control" style="flex:1;font-size:var(--text-sm);padding:var(--space-2) var(--space-3)">
<option value="default" ${_sort==='default' ?'selected':''}>Empfohlen</option>
<option value="bewertung" ${_sort==='bewertung' ?'selected':''}>Community-Bewertung</option>
@ -182,7 +182,8 @@ window.Page_movies = (() => {
? `<div class="movie-tag-stirbt"><svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#warning"></use></svg> Hund stirbt</div>`
: `<div class="movie-tag-ueberlebt"><svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#check-circle"></use></svg> Hund überlebt</div>`;
const stars = _starsHtml(film.bewertung_avg, film.id, film.user_rating, false);
const typLabel = film.typ === 'serie' ? '📺 Serie' : film.typ === 'doku' ? '🎥 Doku' : '';
const _ico = name => `<svg class="ph-icon" aria-hidden="true" style="width:12px;height:12px;vertical-align:middle"><use href="/icons/phosphor.svg#${name}"></use></svg>`;
const typLabel = film.typ === 'serie' ? `${_ico('list')} Serie` : film.typ === 'doku' ? `${_ico('camera')} Doku` : '';
const imdb = film.imdb_rating ? `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">IMDb ${film.imdb_rating}</span>` : '';
const streaming = film.streaming ? `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">${_esc(film.streaming)}</span>` : '';

View file

@ -3,16 +3,16 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ban Yaro — Hunde-App für Besitzer, Züchter & Welpen-Käufer</title>
<meta name="description" content="Ban Yaro: Die kostenlose All-in-One Hunde-App für Deutschland, Österreich und die Schweiz. Tagebuch, Impfpass, Wurfbörse, Stammbaum, Inzucht-Check, Giftköder-Alarm — DSGVO-konform, ohne App Store.">
<meta name="keywords" content="Hunde App, Wurfbörse, Züchter, Welpen kaufen, Stammbaum Hund, Inzuchtkoeffizient, Hundezucht, Impfpass Hund, Giftköder Alarm, Gassi Community">
<title>Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz</title>
<meta name="description" content="Ban Yaro: Die kostenlose All-in-One Hunde-App für DACH. Tagebuch, Giftköder-Alarm, Training mit KI, Forum, Wurfbörse, Stammbaum, Inzucht-Check — DSGVO-konform, offline-fähig, ohne App Store.">
<meta name="keywords" content="Hunde App, Hunde Community, Wurfbörse, Züchter, Welpen kaufen, Stammbaum Hund, Inzuchtkoeffizient, Hundezucht, Impfpass Hund, Giftköder Alarm, Gassi Community, Hundetraining App, Hunde Forum, Hunde KI, Hundefilm Datenbank, Welpen Marktplatz">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://banyaro.app/info">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:title" content="Ban Yaro — Hunde-App für Besitzer, Züchter & Welpen-Käufer">
<meta property="og:description" content="Tagebuch, Impfpass, Wurfbörse, Stammbaum, Inzucht-Koeffizient, Giftköder-Alarm, Gassi-Community — alles in einer DSGVO-konformen App ohne App Store.">
<meta property="og:title" content="Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz">
<meta property="og:description" content="Tagebuch, Giftköder-Alarm, KI-Training, Forum, Wurfbörse, Stammbaum, Inzucht-Check — alles in einer DSGVO-konformen App ohne App Store. Kostenlos.">
<meta property="og:url" content="https://banyaro.app/info">
<meta property="og:image" content="https://banyaro.app/icons/icon-512.png">
<meta property="og:locale" content="de_DE">
@ -20,8 +20,8 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Ban Yaro — Hunde-App für Besitzer, Züchter & Welpen-Käufer">
<meta name="twitter:description" content="Wurfbörse, Stammbaum, Inzucht-Koeffizient, Tierschutz-Check — und alles rund um deinen Hund. Kostenlos, DSGVO-konform.">
<meta name="twitter:title" content="Ban Yaro — Die Hunde-App für DACH">
<meta name="twitter:description" content="Giftköder-Alarm, KI-Training, Forum, Wurfbörse, Stammbaum, Inzucht-Check — kostenlos, DSGVO-konform, ohne App Store.">
<meta name="twitter:image" content="https://banyaro.app/icons/icon-512.png">
<!-- Structured Data -->
@ -50,42 +50,53 @@
"url": "https://banyaro.app"
},
"featureList": [
"Digitales Hunde-Tagebuch mit Fotos und GPS",
"Digitales Hunde-Tagebuch mit Fotos, Videos und GPS",
"Kalender-, Karten- und Medien-Ansicht im Tagebuch",
"Digitaler Impfpass und Gesundheitsakte",
"Pflege-System mit 43 rassenspezifischen Tipps in 10 Kategorien",
"Giftköder-Alarm mit Push-Benachrichtigungen",
"Zecken-Warnung regelbasiert (Saison + Temperatur)",
"Giftköder-Alarm mit GPS und Push-Benachrichtigungen",
"Zecken-Warnung regelbasiert (Saison und Temperatur)",
"Wetter-Chip in der App (Open-Meteo, ohne API-Key)",
"Gassi-Community und GPS-Routen",
"Hundesitting-Vermittlung",
"NFC-Halsband-Tags",
"Gassi-Community und GPS-Routen aufzeichnen",
"Täglicher Routenvorschlag (2, 4 oder 6 km via OpenRouteService)",
"Hundesitting-Vermittlung (nur 8% Provision)",
"NFC-Halsband-Tags mit öffentlichem Hunde-Profil",
"Forum öffentlich lesbar, schreiben nach E-Mail-Verifikation",
"1003 Hunderassen Wikipedia-grounded und KI-angereichert",
"Community-Fotos im Rassen-Wiki mit Bildrechte-Bestätigung und Moderation",
"Rassen-Quiz Passt diese Rasse zu mir?",
"Verlorener Hund Alarm",
"Forum für Hundebesitzer",
"Offline-Modus via Service Worker",
"Rassen-Wiki mit Community-Fotos und Moderation",
"Verlorener Hund Alarm mit GPS-Position",
"Offline-Modus via Service Worker (3 Stufen)",
"Symptom-Checker (KI, kostenlos)",
"Trainings-Tagebuch mit Einheiten-Logging (Wiederholungen, Erfolgsquote, Stimmung)",
"Virtueller KI-Trainer mit täglichen Übungsempfehlungen und Fortschrittsprognose",
"Wöchentlicher KI-Lober — jeden Montag 2-3 Sätze Lob für die Vorwoche",
"Trainings-Gamification: Streaks, Abzeichen, Trainingskalender",
"Kommandos & Fähigkeiten im Hundeprofil — praktisch für Hundesitter",
"Wurfbörse — öffentliche Wurfankündigungen mit Filtersuche nach Rasse und Status",
"104 Trainingsübungen in Datenbank mit Schwierigkeitsgraden",
"Trainings-Logging: Wiederholungen, Erfolgsquote, Stimmung",
"Virtueller KI-Trainer mit täglichen Übungsempfehlungen",
"Wöchentlicher KI-Lober jeden Montag",
"Trainings-Streaks und Trainingskalender",
"Kommandos und Fähigkeiten im Hundeprofil",
"Events-Kalender (Agility, Ausstellungen, lokale Veranstaltungen)",
"Wurfbörse mit Filtersuche nach Rasse und Status",
"Züchter-Profile mit verifizierten Gesundheitstests und Gentests",
"Stammbaum-Visualisierung bis 4 Generationen",
"Inzucht-Koeffizient nach Wright's Formel mit Ampel-Bewertung",
"Probeverpaarung mit IK-Simulation und genetischer Risikoanalyse",
"Tierschutz-Check automatisch bei jeder Verpaarung — nicht abschaltbar",
"KI-Züchter-Assistenz: Wurfankündigungen, Genetik-Erklärung, Paarungsanalyse",
"Datenexport als HTML und ODS — keine Datenfalle",
"Personalisierte Tagesroute via OpenRouteService — täglich neue Gassirunde mit 2/4/6 km Wahl",
"Übung des Tages — personalisiert aus dem persönlichen Trainingsfortschritt",
"Dashboard-Startseite mit Hundebild-Hero, Statistik-Chips und Feature-Karten"
"Tierschutz-Check automatisch bei jeder Verpaarung",
"KI-Züchter-Assistenz: Wurfankündigungen, Genetik, Paarungsanalyse",
"Datenexport als HTML und ODS",
"Hunde-Filmdatenbank: 68 Filme, Serien und Dokumentationen sortier- und filterbar",
"Filmdatenbank-Feature: Stirbt der Hund? — Taschentuch-Warnung",
"Berühmte Hunde der Geschichte",
"Hund des Monats Community-Abstimmung",
"Push-Benachrichtigungen (VAPID, ohne Drittanbieter)",
"Freundschaften und Direktnachrichten",
"Social-Media-Manager Luna (KI-generierte Posts für Instagram und TikTok)",
"Notizblock mit KI-Analyse-Funktion",
"Erste-Hilfe-Ratgeber für häufige Notfälle",
"Hunde-Knigge (Begegnungen, ÖPNV, Leinenpflicht, Haftpflicht)",
"Admin-Panel mit Moderation, Outreach-Mailing und Statistiken"
],
"screenshot": "https://banyaro.app/icons/icon-512.png",
"softwareVersion": "2.2",
"datePublished": "2026-04-29",
"softwareVersion": "1.2.1",
"datePublished": "2026-05-01",
"areaServed": ["DE", "AT", "CH"],
"audience": {
"@type": "Audience",
@ -510,7 +521,7 @@
</div>
<div class="feature-card">
<span class="feature-icon">💬</span>
<div><h3>Forum</h3><p>Rassen-basierte Foren, KI-Zusammenfassungen langer Threads, Experten-Badge für Tierärzte und Trainer.</p><span class="feature-tag">Kostenlos</span></div>
<div><h3>Forum</h3><p>Öffentlich lesbar ohne Anmeldung. Kategorien nach Rasse, Region, Gesundheit und Erziehung. Schreiben nach E-Mail-Verifikation — für Qualität statt Spam.</p><span class="feature-tag">Kostenlos</span></div>
</div>
</div>
</div>
@ -528,7 +539,7 @@
</div>
<div class="feature-card">
<span class="feature-icon">🎬</span>
<div><h3>Hundefilme</h3><p>Filmdatenbank mit der wichtigsten Frage: "Stirbt der Hund?" Nie wieder unvorbereitet in einen Film stolpern.</p><span class="feature-tag">Kostenlos</span></div>
<div><h3>Hunde-Filmdatenbank</h3><p>68 Filme, Serien und Dokumentationen — sortierbar nach Jahr, IMDb-Bewertung oder Community-Rating. Mit der wichtigsten Frage: "Stirbt der Hund?" Nie wieder unvorbereitet stolpern.</p><span class="feature-tag">Kostenlos</span></div>
</div>
<div class="feature-card">
<span class="feature-icon">🩹</span>
@ -604,13 +615,14 @@
<section id="vergleich">
<div class="container">
<h2>Ban Yaro vs. Konkurrenz</h2>
<p class="section-intro">Andere Apps decken einzelne Bereiche ab — Ban Yaro vereint alles in einer DSGVO-konformen Plattform ohne US-Datenweitergabe.</p>
<p class="section-intro">Andere Apps decken einzelne Bereiche ab — Ban Yaro vereint alles in einer DSGVO-konformen Plattform. Kein anderer Anbieter kombiniert Community, Training, Zucht und KI auf Deutsch.</p>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Funktion</th>
<th>Ban Yaro</th>
<th>Hundeo (DE)</th>
<th>Dogorama</th>
<th>Tractive</th>
<th>PetDesk</th>
@ -621,12 +633,14 @@
<td>Kostenlos nutzbar</td>
<td class="check">✓ Ja</td>
<td>Begrenzt</td>
<td>Begrenzt</td>
<td class="cross">✗ Abo</td>
<td class="cross">✗ Nein</td>
</tr>
<tr>
<td>DSGVO / EU-Hosting</td>
<td class="check">✓ Ja</td>
<td class="check">✓ DE</td>
<td class="check">✓ DE</td>
<td class="cross">✗ Nein</td>
<td>Teilweise</td>
<td class="cross">✗ USA</td>
@ -637,6 +651,15 @@
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>KI-Hundetrainer</td>
<td class="check"></td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Giftköder-Alarm</td>
@ -644,54 +667,70 @@
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Digitaler Impfpass</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="check"></td>
</tr>
<tr>
<td>Gassi-Community</td>
<td>Forum & Community</td>
<td class="check"></td>
<td class="cross"></td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Gassi-Treffen & Community</td>
<td class="check"></td>
<td class="cross"></td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Wurfbörse & Zucht-Management</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Stammbaum & Inzucht-Check</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Hundesitting</td>
<td class="check">✓ (8%)</td>
<td class="check">✓ 8%</td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>NFC-Halsband-Tag</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Verlorener Hund Alarm</td>
<td class="check"></td>
<td class="cross"></td>
<td class="check"></td>
<td class="check">✓ (GPS)</td>
<td class="check">✓ GPS</td>
<td class="cross"></td>
</tr>
<tr>
<td>Rassen-Wiki (1003 Rassen, KI-angereichert)</td>
<td>Rassen-Wiki (1003 Rassen, KI)</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Pflege-Tipps rassenspezifisch</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
@ -700,13 +739,15 @@
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
<tr>
<td>Täglicher Routenvorschlag (Gassirunde)</td>
<td>Täglicher Routenvorschlag</td>
<td class="check"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
<td class="cross"></td>
</tr>
</tbody>
</table>
@ -809,6 +850,20 @@
<p>Karten von OpenStreetMap statt Google — keine Tracking-Cookies, kein API-Lock-in, günstiger für alle.</p>
</div>
</div>
<div class="usp-item">
<span class="usp-icon">🔐</span>
<div>
<h3>Aktive Sicherheit</h3>
<p>HSTS, Content-Security-Policy, Rate Limiting auf allen Endpunkten, Account-Lockout nach Fehlversuchen, E-Mail-Verifikation. Sicherheit by Default, nicht als Nachgedanke.</p>
</div>
</div>
<div class="usp-item">
<span class="usp-icon">🤖</span>
<div>
<h3>KI Made in Europe</h3>
<p>Alle KI-Funktionen laufen über Claude (Anthropic) — kein Training mit deinen Daten, kein Opt-out nötig, volle DSGVO-Konformität.</p>
</div>
</div>
</div>
</div>
</section>
@ -824,12 +879,16 @@
<footer>
<div class="container">
<p><strong style="color:white">Ban Yaro</strong> — Die deutschsprachige Hunde-Plattform</p>
<p style="margin-top:0.5rem">banyaro.app · banyaro.de · DSGVO-konform · Hosting in Deutschland</p>
<p style="margin-top:0.5rem">banyaro.app · DSGVO-konform · Hosting in Deutschland · Made with 🐾</p>
<div class="footer-links">
<a href="/">App öffnen</a>
<a href="/info">Über Ban Yaro</a>
<a href="/api/wiki/rassen">Hunde-Rassen</a>
<a href="/api/events">Events</a>
<a href="/wiki/rassen">Hunde-Rassen</a>
<a href="/knigge">Hunde-Knigge</a>
<a href="https://instagram.com/banyaro.app" rel="noopener" target="_blank">Instagram</a>
<a href="https://tiktok.com/@banyaro.app" rel="noopener" target="_blank">TikTok</a>
<a href="/#impressum">Impressum</a>
<a href="/#datenschutz">Datenschutz</a>
</div>
</div>
</footer>

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
const CACHE_VERSION = 'by-v577';
const CACHE_VERSION = 'by-v583';
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