Skip to content

andreas0810/helferkette

Repository files navigation

Helferkette

Radfahrer helfen Radfahrern. Eine kostenlose, quelloffene Notfall- und Community-App für Rennradfahrer. Wer unterwegs liegen bleibt, teilt mit einem Tippen seinen Live-Standort und den Grund der Panne – Helfer in der Nähe werden automatisch benachrichtigt und können direkt kommen. Der Name: eine Kette aus Helfern (und ein Augenzwinkern zur Fahrradkette).

Hinweis: Dies ist ein Community-Projekt, kein Rettungsdienst. Bei einem medizinischen Notfall immer zuerst die 112 anrufen.

Was die App kann

  • SOS mit Live-Standort – Panne melden, Standort wird laufend aktualisiert und als teilbarer Link bereitgestellt (WhatsApp, Strava-Gruppe usw.).
  • Push-Benachrichtigung an Helfer im Umkreis – wer Benachrichtigungen aktiviert hat, wird bei einer neuen Panne im 50-km-Umkreis sofort informiert – inklusive Grund und Entfernung, auch wenn die App gerade nicht offen ist.
  • Helfer-Modus – aktive Pannen in der Nähe auf einer Karte sehen und sich als Helfer melden ("Ich komme", mit geschätzter Ankunftszeit).
  • Reparatur-Anleitungen – Schlauch, Kette, Bremse, Schaltung, Speiche, Tubeless; offline verfügbar (PWA).
  • Werkzeug-Checkliste und Notfallkontakte (per SMS/Anruf, mit Standort-Link).

So funktioniert die Hilfe

  1. Radfahrer A hat eine Panne und tippt auf Hilfe anfordern. Standort + Grund gehen an das Backend.
  2. Das Backend findet alle Helfer, die Benachrichtigungen aktiviert haben und sich im 50-km-Umkreis befinden, und schickt ihnen eine Web-Push-Nachricht.
  3. Helfer B bekommt die Meldung, öffnet die Helfer-Ansicht, sieht den Live-Standort und meldet sich als Helfer. A sieht, dass Hilfe unterwegs ist.

Architektur

Teil Technik
Frontend Statische PWA (HTML/CSS/Vanilla JS), Service Worker, Leaflet-Karte
Backend Cloudflare Worker (worker/src/index.js), REST-API unter /api/*
Datenbank Cloudflare D1 (SQLite): sos_events, helpers, push_subscriptions
Push Web Push (VAPID + aes128gcm), implementiert ohne externe Libs (worker/src/webpush.js)
Mobile Android via Capacitor (android/)

Der Worker liefert in einem Prozess sowohl die PWA-Assets als auch die API aus.

API-Endpunkte

GET    /api/health
GET    /api/vapid-public-key      öffentlicher VAPID-Schlüssel für die Push-Anmeldung
POST   /api/subscribe             Helfer-Abo (mit Standort) anlegen/aktualisieren
POST   /api/unsubscribe           Abo entfernen
POST   /api/sos                   SOS anlegen -> { id, token }; pusht an Helfer im 50-km-Umkreis
GET    /api/sos/:id               öffentliche SOS-Ansicht (inkl. Helfer)
PATCH  /api/sos/:id               Standort/Status aktualisieren (Token nötig)
POST   /api/sos/:id/help          als Helfer melden
GET    /api/nearby?lat=&lng=&km=  aktive Pannen in der Nähe

Lokale Entwicklung

Voraussetzungen: Node.js 20+, wrangler (Cloudflare CLI).

npm install

# 1. VAPID-Schlüssel für Web Push erzeugen (schreibt nach .dev.vars)
node scripts/gen-vapid.mjs

# 2. Lokale D1-Datenbank anlegen/migrieren
npm run db:migrate:local

# 3. Komplette App lokal starten (PWA + API + lokale D1, offline)
npx wrangler dev
# -> http://127.0.0.1:8787

Web Push lässt sich lokal nur über einen sicheren Kontext nutzen (http://localhost/127.0.0.1 gilt als sicher) – auf einem echten Smartphone braucht es HTTPS, also ein Deployment.

Smoke-Test der Push-Krypto (ohne echten Push-Dienst):

node scripts/test-push.mjs

Dauerhaft im Hintergrund auf dem Mac (optional)

Es gibt ein launchd-Setup, das die App lokal im Hintergrund laufen lässt:

./scripts/local-ctl.sh start    # installieren & starten
./scripts/local-ctl.sh status   # Status + HTTP-Check + Log
./scripts/local-ctl.sh stop     # stoppen

Deployment (Cloudflare)

wrangler d1 create rennrad-pannenhilfe     # database_id in wrangler.toml eintragen
npm run db:migrate:remote                  # Schema in die Remote-D1

# VAPID-Schlüssel als Secrets setzen (Werte aus gen-vapid.mjs):
echo "<VAPID_PUBLIC_KEY>"  | npx wrangler secret put VAPID_PUBLIC_KEY
echo "<VAPID_PRIVATE_KEY>" | npx wrangler secret put VAPID_PRIVATE_KEY
echo "mailto:du@example.com" | npx wrangler secret put VAPID_SUBJECT

npm run worker:deploy

Datenschutz & Sicherheit

  • Es werden Live-Standorte verarbeitet. Standorte gehören zu aktiven SOS-Events (gelten 6 h als aktiv) bzw. zu Helfer-Abos und sollten regelmäßig bereinigt werden.
  • SOS-IDs sind öffentlich teilbar; das geheime token bleibt nur beim Melder und erlaubt das Aktualisieren/Schließen.
  • Vor einem öffentlichen Betrieb: Datenschutzerklärung, Impressum, Lösch-/ Aufbewahrungsfristen und Missbrauchsschutz (Rate Limiting, ggf. verifizierte Mitglieder) ergänzen.

Mitmachen

Das Projekt ist als kostenloses Community-Projekt gedacht. Issues und Pull Requests sind willkommen – besonders zu Helfer-Vertrauen/Verifizierung, Missbrauchsschutz und Lokalisierung.

Lizenz

MIT – frei nutzbar, veränderbar und weitergebbar.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors