request /{station}
      β”‚
      β–Ό
 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   45s hold    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚  Edge cache  β”‚ ◀───────────▢ β”‚   Worker     β”‚
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚  src/index.jsβ”‚
      β–²                         β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
      β”‚ serves the crowd               β”‚ reads departures
      β”‚ during spikes                  β–Ό
   visitors                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                 β”‚ D1 SQLiteβ”‚
                                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

/                  station picker
/{station}         departure board (HTML, edge cache 45s)
/vlak/{number}     trip route β€” full itinerary, passed vs upcoming
/api/stations      station list (cache 24h)
/api/board?s=ID    departures (JSON)
/api/nearest?lat=&lon=   nearest station
/ops               operational dashboard (Basic Auth)
/healthz           health check