Hundetrainer verwalten Dutzende Hunde, müssen Impfstatus prüfen, Trainingseinheiten abrechnen und auf Rudeldynamiken achten. PfotenPass digitalisiert den gesamten Hundeplatz – als Universal-App für Web, iOS und Android.
Zwei Plattformen, eine App
PfotenPass hat eine ungewöhnliche Architektur: Zwei separate Codebases teilen sich ein Supabase-Backend.
- Web: Next.js 16 + Capacitor Wrapper (statischer Export nach
out/) - Mobile: Expo / React Native App (im
pfotenpass/Unterordner)
Die Web-App wird über Capacitor als native iOS/Android-App verpackt. Für mobile-spezifische Features (NFC, Push, Kamera) gibt es die dedizierte React Native App.
NFC Check-In: Ein Tap genügt
Jeder Hund bekommt einen NFC-Tag am Halsband. Beim Betreten des Platzes scannt die Trainerin das Tag – der Hund ist eingecheckt, eine Trainingseinheit automatisch abgebucht und der Besitzer per Push benachrichtigt.
services/nfcCheckIn.tsexport async function handleNfcScan(tagId: string) { const dog = await supabase .from('dogs') .select('*, owner:owners(*), vaccinations(*)') .eq('nfc_tag_id', tagId).single(); // 1. Impfstatus prüfen → Hard-Lock bei abgelaufen if (isVaccinationExpired(dog.vaccinations)) throw new Error('🚫 Impfung abgelaufen'); // 2. Rudel-Konflikt prüfen const activeGroup = await getActiveGroup(); if (hasConflict(dog, activeGroup)) return { warning: '⚠️ Dominanz-Konflikt möglich' }; // 3. Einheit abbuchen + Besitzer benachrichtigen await deductUnit(dog.owner.id); await sendPush(dog.owner.pushToken, `${dog.name} ist auf dem Platz 🐾`); }
Impf-OCR: Foto statt Abtippen
Der EU-Heimtierausweis ist Papier. Statt das Ablaufdatum manuell einzutippen, fotografiert die Trainerin die Impfseite – Google Vision API liest das Datum automatisch. Bei Unsicherheit wird manuell bestätigt. Ist eine Impfung abgelaufen, sperrt die App den Check-In (Hard-Lock).
Rudel-Konfliktwarnung
Jeder Hund hat Verhaltens-Tags: „dominant", „leinenaggressiv", „ängstlich", „sozialverträglich". Wenn zwei dominante Rüden gleichzeitig eingecheckt werden, warnt die App. Das ist aktive Unfallprävention.
Features im Überblick
- Hundeprofil: Name, Rasse, Alter, Gewicht, Foto, Verhaltens-Tags, Besitzer-Zuordnung
- NFC Check-In/Out: Automatsiche Trainingseinheit-Abrechnung
- Impfverwaltung: OCR-Import, manuelle Eingabe, Ablauferinnerung
- Trainingseinheiten: 10er-Karten, Abo-Modelle, automatische Abrechnung
- Gruppenplanung: Welche Hunde können zusammen trainieren?
- Besitzer-Portal: Push-Benachrichtigungen, Trainingsverlauf, Rechnung einsehen
- Offline-First: WatermelonDB für lokale Datenhaltung + automatischer Sync
Outdoor-UI: Matsch-Resistent
Eine Outdoor-App braucht ein anderes UI als eine Büro-App:
- Große Touch-Targets (min. 48×48px) für Handschuhe
- Hoher Kontrast für Sonnenlicht-Lesbarkeit
- Swipe-Gesten statt kleine Buttons
Tech Stack
- Web: Next.js 16 (App Router) + Capacitor
- Mobile: Expo / React Native
- Backend: Supabase (PostgreSQL + Auth + RLS)
- Offline: WatermelonDB (lokale SQLite + automatischer Sync)
- NFC: react-native-nfc-manager
- OCR: Google Vision API
→ Projekt ansehen: PfotenPass – Projektdetails
→ Live: pfotenpass.online
Vereins-Software: warum „einfach" das schwierigste Feature ist
Der typische Fehler bei Vereins-Apps ist Funktionsüberladung. Die Nutzerbasis ist heterogen (vom technikaffinen Vorstand bis zum gelegentlichen Mitglied), die Bereitschaft zur Einarbeitung gering. Erfolgskriterium ist daher nicht der Funktionsumfang, sondern wie wenig Erklärung die Kernabläufe brauchen — Mitglieder, Plätze/Termine, Kurse. Architektur folgt der Rolle: klare Rechte, wenige Wege zum Ziel, robuste Defaults.
Häufige Fragen
Lohnt sich eine eigene App für einen kleinen Verein?
Das hängt von Frequenz und Schmerzpunkt ab. Wenn Verwaltung heute über verstreute Listen/Chats läuft, ist der Nutzen meist hoch; sonst kann eine schlanke Standardlösung genügen — eine ehrliche Abwägung gehört vor das Projekt.
Wie wird mit Mitgliederdaten umgegangen?
Mitgliederdaten sind personenbezogen. Rollenbasierter Zugriff, EU-Hosting und Datensparsamkeit sollten von Anfang an Teil der Architektur sein, nicht nachträglich.