Status: in development, as of 8 Nov 2026. Not deployed for public use. There is no routing endpoint on geolith.app or api.geolith.app, no hosted API and no pricing. On Berlin, the router answers byte-identical to Valhalla 3.9.1 on tiles from geolith's own builder. Edge latency is the open problem.
Done
- Builder.
geolith --output-format routing --osm-pbf <pbf> --routing-output <file.glx>builds the graph: tag rules, parsing, edges, access, turn restrictions, enhancer, hierarchy and shortcuts.--routing-predicted-speeds <dir>adds historical speeds. - The routing part. Each graph tile is stored as fixed 64 KiB zstd blocks with a per-tile block directory, in the .glx specification v1, chapter 10. See The routing part.
- Router. The
geolith-routerlibrary answers/route,/isochrone,/sources-to-targets,/trace-route,/trace-attributesand/statuswith Valhalla-compatible bodies. Costingauto,pedestrianandbicycle. Spoken (verbal_*) instructions are included; English only. - Traffic.
date_timetypes0(current) and1(depart at) use historical speeds. Live speeds and closures are supplied by the caller. See Traffic and live data. - Worker app. A Cloudflare Worker serves all six endpoints from R2, block by block, as a test deployment on workers.dev.
Accuracy against Valhalla 3.9.1
Berlin, same requests, full JSON responses compared byte for byte:
| Set | Byte-identical |
|---|---|
/route on geolith-built tiles, auto | 100/100, 0 missed |
/route on geolith-built tiles, walking | 30/30 (pedestrian) |
/route on geolith-built tiles, bicycle | 30/30 |
/route suite on reference tiles | 200/200 |
/sources-to-targets | 60/60 |
/isochrone | 45/45, plus 12/12 errors |
Map matching (/trace-route, /trace-attributes) | 160/160 |
Historical speeds (date_time) | 50/50 |
| Live speeds | 30/30 |
| Closures | 5/5 |
"0 missed" means there is no route Valhalla finds that geolith does not.
Measured on the edge
A test Worker on workers.dev answers all 100 test routes without memory errors, but slowly from Mumbai. Two runs on 8 Nov 2026:
| Measure | Result |
|---|---|
| Latency, median | 7.6 s and 7.7 s |
| Latency, p95 | 27 s to 28 s |
| Fetch rounds per route, median | 26 to 27, each a 270 ms to 300 ms R2 read |
| Engine CPU per route, median | 445 ms and 480 ms |
/isochrone, 5-minute contour | Hits the Worker CPU limit |
See Self-hosting.
In progress
- Edge latency. A block store in KV and the Cache API, as geolith search uses, and spatial read-ahead. The target is a warm median of 400 ms or less.
Not supported yet: date_time types 2 (arrive by) and 3 (invariant) return error 199, and instructions are English only.
Next, before launch
- Administrative boundaries and time zones as builder inputs, for the driving side and local time.
- An out-of-core builder and a country build (India).
- api.geolith.app integration.
- A planet build.
Only then does routing run on geolith.app or api.geolith.app.
Later
Overture Maps transportation, elevation and GTFS transit; see How it works.