Methodik
Wie wir messen
Baan.fail erhebt Crowd-Daten zur Bahn-Realität und ergänzt sie um öffentlich verfügbare Echtzeitdaten. Diese Seite legt offen, wie aus einzelnen Meldungen aggregierte Aussagen werden — und welche bewussten Tradeoffs wir treffen.
1. Sekundengenaue Verspätungsmessung
Die DB definiert "pünktlich" als maximal 5:59 Min Verspätung am Zielbahnhof (siehe DB-Pressemitteilungen). Wir definieren "wirklich pünktlich" als maximal 60 Sekunden. Die offizielle Statistik blendet damit eine ganze Klasse Realität aus — fünf Minuten Verspätung sind aus DB-Sicht ein Erfolg, aus Pendler-Sicht ein verpasster Anschluss.
User melden in groben Stops (0 / 5 / 15 / 30 / 60 / 120 Min). Diese Stufung entspricht der subjektiven Wahrnehmung "wie schlimm war's": 5 Min sind grenzwertig, 15 Min sind "Anschluss vermutlich weg", 60 Min sind "ich denk mir was aus". Sekundengenauigkeit liefert das DB-Echtzeitsystem dazu, wenn die Meldung DB-bestätigt wird.
2. Dreistufiges Vertrauensmodell
Nicht jede Meldung wiegt gleich schwer. Wir gewichten Reports nach Verifikationsgrad des Melders, damit Coordinated-Bot-Spam keinen Effekt auf das Aggregat hat:
- Gewicht 1 — anonym. Cloudflare Turnstile (Bot-Schutz) plus Rate-Limit plus Geo-Plausibilitätscheck. Niedrigschwellig: jeder Pendler kann unter 15 Sekunden eine Verspätung melden.
- Gewicht 3 — Pseudonym mit verifizierter E-Mail. Magic-Link-Login, kein Passwort. Pendler können sich ein Profil mit Reisebilanz aufbauen und ihre Stammzüge tracken.
- Gewicht 5 — Vielfahrer mit SMS-Verifikation. Stufe für besonders engagierte Berufspendler (Phase 2, derzeit noch nicht aktiv).
Die Gewichte fließen in die Aggregation der Verspätungs-Minuten und in die Bestätigungs-Counter ("X Mitreisende bestätigt, davon Y verifiziert").
3. DB-Bestätigt-Siegel
Wenn eine Crowd-Meldung mit den DB-Echtzeitdaten zum gleichen Zug übereinstimmt — also unsere Plausibilitätsprüfung den Trip findet, die Verspätung ähnlich hoch ist und der Geo-Standort zur Strecke passt — bekommt der Report ein DB-Bestätigt-Siegel. Im Frontend ist das die rote "DB-bestätigt"-Markierung neben dem Eintrag.
Das ist Doppel-Validierung: die Crowd sagt was los ist, die DB bestätigt es passiv. Solche Reports sind besonders glaubwürdig — und besonders peinlich für die DB-PR- Abteilung, weil sie ihrer eigenen Statistik widersprechen.
4. baan.fail-Kasse-Berechnung
Kein realer Anspruch — politische Forderung. Die Kasse visualisiert, was die DB theoretisch zurückzahlen müsste, wenn faire Erstattungsregeln gälten: Verspätung größer als Fahrzeit ⇒ 100 % Ticketpreis-Erstattung. Aktuell zahlt die DB ab 60 Min 25 % und ab 120 Min 50 %, was unter dem real entstandenen Schaden liegt.
Pro Meldung addieren wir 30 € zur Kasse, wenn:
- der Zug komplett ausgefallen ist, oder
- die Verspätung größer-gleich der geplanten Fahrzeit ist, oder
- der Anschluss verpasst wurde (Mängel-Tag
no_connection).
Die 30 € sind eine MVP-Pauschale, weil wir den tatsächlichen Ticketpreis pro Reise nicht kennen. Ein durchschnittliches Sparpreis-ICE-Ticket ist eher 50–80 €, eine BahnCard-50- Vollpreis-Reise oft > 100 € — wir bleiben absichtlich konservativ. Phase 2 könnte echte Strecken-Preise einrechnen, wenn die DB endlich eine Tarif-Schnittstelle öffnet.
5. Bot-Schutz und Spam-Abwehr
Crowd-Daten sind nur so verlässlich wie der Schutz vor manipuliertem Input. Vier Schichten:
- Cloudflare Turnstile für anonyme Submits. EU-konform, kein klassisches Captcha-mit-Bilder-anklicken — die meisten User sehen nichts davon.
- Per-IP-Rate-Limit auf der Schreibe-API: 30 Reports und 10 Flag- Aktionen pro Stunde, Sliding-Window via Upstash. Blockt Doppel-Klick-Races und kategorischen Spam.
- Geo-Plausibilitätscheck: Browser-Standort des Melders muss zur Trip- Strecke passen. Wer aus Hamburg eine Verspätung in München meldet, bekommt Gewicht halbiert.
- Wortfilter gegen Klarnamen von DB-Personal. Niemand soll auf unserer Plattform persönlich angegriffen werden — Kritik gilt dem System, nicht den Menschen, die es betreiben.
6. Offene Datenquellen
Alle nicht-versteckten Crowd-Meldungen sind öffentlich abrufbar — als JSON oder CSV, ohne API-Key, ohne Anmeldung. Lizenz: Creative Commons CC BY-SA 4.0. Du darfst die Daten teilen, weiterverarbeiten und veröffentlichen, sofern du Baan.fail als Quelle nennst und Weiterverarbeitungen unter derselben Lizenz stehen.
Endpoints und Beispiele: /api. Der Wochenreport unter /wochenreport aggregiert die letzten sieben Tage als shareable Snapshot.
Unsere Echtzeit-Bahn-Daten kommen vom Open-Data-Endpoint v6.db.transport.rest (gemeinwohl-orientierter Wrapper um die DB-Hafas-API, von Jannis "derhuerst" Redmann betrieben).
Bewusste Limitierungen
- Selection-Bias: Wer eine pünktliche Reise hat, meldet meistens nichts. Unsere Daten zeigen die Realität der nicht-pünktlichen Reisen scharf, sind aber keine repräsentative Stichprobe aller Reisen.
- MVP-Fokus auf Fernverkehr: ICE und IC. Nahverkehr (RE, S-Bahn, U-Bahn) kommt in Phase 2.
- Volatile DB-Trip-IDs: Die DB-API vergibt Trip-IDs täglich neu, was historische Reports auf längere Sicht erschwert. Wir cachen Trip-Metadaten lokal, damit alte Meldungen weiter aufrufbar bleiben.
- Beta-Phase: Funktionalität, UI und Datenmodell können sich bis zum Public Launch noch ändern.