Routing docs

Routing: status and roadmap

geolith Routing is in development and not deployed for public use. What is done (builder, block-stored routing part, six Valhalla-compatible endpoints, byte-identical to Valhalla 3.9.1 on Berlin), what is in progress (edge latency) and what is next before launch. As of 8 Nov 2026.

By · Updated

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-router library answers /route, /isochrone, /sources-to-targets, /trace-route, /trace-attributes and /status with Valhalla-compatible bodies. Costing auto, pedestrian and bicycle. Spoken (verbal_*) instructions are included; English only.
  • Traffic. date_time types 0 (current) and 1 (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:

SetByte-identical
/route on geolith-built tiles, auto100/100, 0 missed
/route on geolith-built tiles, walking30/30 (pedestrian)
/route on geolith-built tiles, bicycle30/30
/route suite on reference tiles200/200
/sources-to-targets60/60
/isochrone45/45, plus 12/12 errors
Map matching (/trace-route, /trace-attributes)160/160
Historical speeds (date_time)50/50
Live speeds30/30
Closures5/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:

MeasureResult
Latency, median7.6 s and 7.7 s
Latency, p9527 s to 28 s
Fetch rounds per route, median26 to 27, each a 270 ms to 300 ms R2 read
Engine CPU per route, median445 ms and 480 ms
/isochrone, 5-minute contourHits 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

  1. Administrative boundaries and time zones as builder inputs, for the driving side and local time.
  2. An out-of-core builder and a country build (India).
  3. api.geolith.app integration.
  4. 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.