verspaetet (German for “delayed”) aggregates a dataset of Deutsche Bahn delays at train stations.
A scheduler spreads fetch jobs for all roughly 5,400 active stations evenly over 30-minute slots. Redis-backed asynq workers pull each station’s departure and arrival board from the DB Timetables API (IRIS), merge planned and real-time data and persist a snapshot to Postgres only when something observable changes, like delay, platform or cancellation. That way the dataset captures the evolution of each train’s delay instead of redundant duplicates. The station universe is imported from the DB StaDa API, and unknown station names discovered in route paths are resolved by the next import.
Everything runs via docker compose: Postgres for storage, Redis for the job queue, asynqmon as the job dashboard and a React + Vite UI for monitoring.
Source on GitHub: LinusRichter/verspaetet.

