An isochrone map shows how far one can travel in a given time. This web app computes that reachable area across an entire road, foot, cycle, and public transport network, in the browser, from wherever you choose in a map. It is designed with performance in mind, so will recompute this in milliseconds even on a normal laptop.
Sixteen regions are available, across five continents. Routing is as exact as possible given the source data, not approximate, however this does mean that where the OpenStreetMap fails to join two roads or footpaths etc, this can look like an entire cul-de-sac is unable to reach anywhere else.
The app runs entirely client side: There is no account, no tracking, and no analytics.
Where it is available under an Open Source licence, public transit data has been included. At time of writing, this means just Berlin and Adelaide; as public transit is time-specific, it is possible to choose your date and time of departure.
The result may be exported as vector artwork, or printed as a poster, with the map, legend, scale bar and data attributions laid out for the page.
- Capabilities
- Using the map
- How it works
- Regions and data
- Development
- Repository structure
- Third-party licences
- Project licence
Transport modes. Walking, cycling, driving, ferry and public transport, selectable in combination. Walking and cycling speeds are adjustable. A ferry requires both the ferry mode and a mode in which its vessel may be boarded, so a foot-passenger service is available to a pedestrian and a vehicle service is not.
Public transport. Where a region carries a GTFS feed, the isochrone accounts for scheduled services from a chosen departure date and time, including changes of vehicle, subject to a configurable limit on how far the rider will walk on any one leg — to the first stop, between stops when changing, and away from the last one.
Presentation. Light and dark themes; metric and imperial units, defaulting to the reader's own locale rather than the region displayed; an adjustable colour period, the interval after which the isochrone's colour bands repeat.
Localisation. English, German and French.
Export. Vector SVG and print output, both laid out as a poster rather than as a screen capture: title, colour legend, scale bar and the required data attributions are composed for the page, and the map is drawn as vector geometry throughout.
| Action | Desktop | Touch |
|---|---|---|
| Choose an origin | Primary click | Single tap |
| Pan | Primary drag | Two-finger drag |
| Zoom | Mouse wheel | Two-finger pinch |
| Move the origin | Secondary drag | — |
Panning and zooming redraw the existing result; neither begins a new calculation.
The two mouse buttons may be exchanged, under Primary mouse button in the options, so that the primary button moves the origin and the secondary one pans. The setting governs mouse input alone; touch gestures are unaffected by it, and the control is therefore not offered on a device having no pointing device other than the screen.
The region, origin node, transport modes, speeds, departure time, colour
period and interface language are all held in the URL, so that any particular
view may be bookmarked or shared. For example,
?region=berlin&modes=walk,transit&cycle=60&lang=de.
The remaining controls are found under Options in the header, arranged in titled groups: transport modes, speed settings, theme, units and the mouse button assignment described above.
The application is built around the observation that an isochrone is a shortest-path problem over a graph (the travel network), not an image-processing problem over a grid. Travel times are therefore computed on the travel graph itself and rendered from it directly.
Preprocessing. A Python pipeline retrieves OpenStreetMap extracts through the Overpass API, projects them into an appropriate metric coordinate system, simplifies degree-two chains, and emits a compact binary graph to minimise what the user has to download. Where a region carries timetable data, GTFS stops and connections are folded into the same file. The binary format is documented in Graph Binary Schema v3.
Routing. A Rust kernel compiled to WebAssembly performs the search. For a region with public transport this runs in three stages: a pedestrian search from the origin, a Connection Scan over the timetable seeded from the stops that search reached within the walking budget, and a second multi-source search reseeded at every stop the timetable improved. The result is the quicker of that and walking the whole way. The kernel is required; there is no JavaScript fallback for routing.
A timetable names each platform and each direction of travel as a separate
stop, so the scan also needs to know which stops are walkable from one
another; without that a rider can never change vehicle, and the timetable
collapses to whichever single service happens to pass the origin. Those
connections are computed when the region is built, by routing over the
pedestrian network rather than by measuring straight-line distance between
stop coordinates — two stops facing each other across a river are metres apart
and a long walk from one another. Routing has the opposite failure, in that an
interchange OpenStreetMap has not joined up simply disappears, so the routed
connections are combined with the operator's own transfers.txt, which
declares which changes exist, how long they take, and which are impossible.
Rendering. Edges are drawn by the GPU, with each endpoint's travel time interpolated along the edge, so a road crossed midway is shaded accordingly. A 2D canvas path exists for browsers without WebGL.
Edge traversal costs are derived at query time from a single stored length per edge, which is why changing a walking speed or a transport mode re-renders without returning to the network.
Sixteen regions are configured: Adelaide, Athens, Berlin, Canton of Zurich, Cologne, Cyprus, London, Luxembourg, Mexico City, Nairobi, Ottawa, Paris, Portsmouth, Rhode Island, Rome and Singapore.
Berlin and Adelaide additionally carry public transport timetables. Further regions may be added; the procedure, and a survey of candidate timetable feeds together with their licensing, are set out in Setup and Region Onboarding and the Transit Feed Registry.
Installation, routine commands, the data pipeline, benchmarking, deployment and the procedure for adding a region are documented separately in Setup and Region Onboarding.
In brief:
make bootstrap
make check
python -m http.server 8000Further reading:
- Delivery plan and architecture roadmap
- Graph Binary Schema v3
- WASM Routing Kernel
- Region Data Pipeline
- Monochrome rendering plan
- Agentic Coding Guidelines
This repository is configured for autonomous-agent workflows: a single quality
gate (make check) covering Python, JavaScript and Rust; explicit agent rules
in AGENTS.md; continuous integration on pull requests; and pre-commit hooks
for local feedback.
| Path | Contents |
|---|---|
data_pipeline/ |
Preprocessing pipeline, region configuration, and generated artifacts |
wasm/routing-kernel/ |
Rust routing kernel |
web/ |
Browser application (vanilla JavaScript modules, no bundler) |
docs/ |
Design and process documentation |
PLAN.md |
Delivery plan and architecture roadmap |
THIRD_PARTY_NOTICES.md |
Licences for redistributed assets and data |
- Map data © OpenStreetMap contributors, available under the Open Database License (ODbL).
- Berlin public transport data © VBB (Verkehrsverbund Berlin-Brandenburg), available under CC BY 4.0.
- Adelaide public transport data © Adelaide Metro — Department for Infrastructure and Transport, South Australia, available under CC BY 4.0.
- Transport-mode icons from Google's Material Symbols, available under the Apache License 2.0, subset and self-hosted.
Full notices, including the obligations each licence imposes, are recorded in THIRD_PARTY_NOTICES.md. Attribution is carried in the application footer and in every exported and printed document, and is drawn from the region's own configuration rather than being fixed in the interface.
No licence has yet been declared for the source code in this repository. In the absence of one, default copyright applies and no permission to use, modify or redistribute the code is granted. This is distinct from the third-party data and assets above, which carry their own licences and obligations.