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.
- 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).
- Radfahrer A hat eine Panne und tippt auf Hilfe anfordern. Standort + Grund gehen an das Backend.
- Das Backend findet alle Helfer, die Benachrichtigungen aktiviert haben und sich im 50-km-Umkreis befinden, und schickt ihnen eine Web-Push-Nachricht.
- Helfer B bekommt die Meldung, öffnet die Helfer-Ansicht, sieht den Live-Standort und meldet sich als Helfer. A sieht, dass Hilfe unterwegs ist.
| 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.
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
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:8787Web 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.mjsEs 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 # stoppenwrangler 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- 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
tokenbleibt 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.
Das Projekt ist als kostenloses Community-Projekt gedacht. Issues und Pull Requests sind willkommen – besonders zu Helfer-Vertrauen/Verifizierung, Missbrauchsschutz und Lokalisierung.
MIT – frei nutzbar, veränderbar und weitergebbar.