Owner-local transport utility · Copenhagen · 2026
Afgang
Afgang answers two daily transport questions: when should I leave, and how far can Copenhagen's scheduled network take me in 15, 30, 45, or 60 minutes?

The commute view turns a saved origin, destination, and arrival target into a leave-time decision, refreshable journey legs, and owner-controlled browser alerts.
The reachability view computes schedule-based surfaces locally. A user chooses an origin and whole-minute departure, then compares nested 15, 30, 45, and 60-minute areas on a responsive map.
The browser talks only to Afgang. One FastAPI lifespan loads a long-lived R5 network, while a process-local lock serializes calculations and a bounded TTL cache handles repeated requests.
- 01Official Rejseplanen GTFS + Denmark OSM
- 02Hash-bound manifest v2
- 03r5py 1.1.7 / R5 7.5.1
- 04Conservative 250 m hex surface
- 05Leaflet + MapLibre interface
Replace an obsolete routing dependency
The verified baseline used OTP 2.5's sandbox TravelTime API. OTP 2.6 removed that API, so the production path moved to in-process R5 instead of preserving a dead compatibility layer or exposing another service port.
Prefer conservative geometry
R5 travel times are converted into 250 m hex cells, with 25 m stop anchors and a five-minute anchor margin. The map may understate a boundary, but the audited contours do not make optimistic station-level promises.
Make data identity a hard gate
GTFS, OSM, the serialized network, runtime JAR, engine versions, hashes, and real service dates define one bundle identity. Invalid or expired identity fails closed instead of silently extending timetable coverage.
Active reachability data is never rebuilt in place. Each feed update follows a recoverable transaction:
- 1Prepare an isolated candidate without interrupting the active app.
- 2Build the R5 network and audit service dates, warnings, hashes, and boundary evidence.
- 3Stop briefly and promote the complete bundle with atomic directory renames.
- 4Run health and smoke checks; automatically restore the prior bundle and freshness state on failure.
The release gate combined unit and failure-injection coverage with real engine and browser checks. Chromium and WebKit ran sequentially at desktop, tablet, mobile portrait, and mobile landscape sizes.
In 12 representative rail and bus checks, contour buckets were 10 exact, 2 conservative, and 0 optimistic. Point-to-point buckets agreed in 11 cases; one København H–Køge discrepancy remains documented rather than reclassified.
Both views share one quiet utility language: system typography, compact controls, visible status, responsive geometry, keyboard focus, reduced-motion handling, and a raster fallback when the vector basemap cannot initialize.


- Reachability is scheduled and timetable-based, not realtime.
- The current application is an owner-only service bound to 127.0.0.1, not a public production deployment.
- Contours are overview geometry; a concrete journey check remains necessary near a boundary.
- No commercial users, transport-operator adoption, or enterprise-scale operation is claimed.
Transit schedules come from Rejseplanen Labs static GTFS under CC BY 4.0. Routing streets come separately from OpenStreetMap; the displayed vector basemap uses OpenFreeMap and OpenMapTiles.


