01 / Route
From a route to an isochrone An abstract transit network. Search spreads from an origin, then one route to the destination is highlighted. The Reach scene shows nested areas reachable in 15, 30 and 45 minutes, stretching along transit lines. AOrigin BDestination
Conceptual network

Transit routing.
In milliseconds.

From a single journey to a city’s worth of possibilities. Open-source routing, powered by Rust.

01 — ROUTE

Find the earliest arrival. Then choose the journey with fewer boardings and less walking.

Next, see how far you can go.
02 — REACH

One origin.
Every possibility.

Where can you get in 15, 30, or 45 minutes?

Reach maps every place you can get to within a time budget. Its boundary is an isochrone.

Watch it stretch along transit lines. Faster connections bring distant places within reach.

Performance.

Six cities. Seven engines.

19.3×

faster at the median

VIGO latency
1.66ms

Boston · median

VIGO query memory
613MiB

Peak RSS

EngineSpeedupMemory MiB
Log scaleQuery peak RSS
VIGO
1.0×
613
ULTRA-OSM
10.7×
4,771
MOTIS
7.8×
253
R5
19.3×
3,378
Valhalla
60.4×
415
OTP
25.9×
3,330
GraphHopper
80.9×
3,888
RSS scope ↗

25 October 2026 2,125 matched pairsDownload data ↓
Full results
Caller time · median (P50) · ms
Engine / interfaceAnchorageDenverLas VegasBostonWashington, DCNew York
VIGO0.551.400.891.661.832.06
ULTRA-OSM0.6919.448.2317.7419.6789.31
MOTIS2.9813.0419.6512.9128.4820.64
R57.7833.0819.9531.9342.6074.81
Valhalla10.97141.6485.38100.00102.01225.17
OTP6.3822.7517.9042.8541.5077.82
GraphHopper6.7659.9849.58133.93217.79841.32
VIGO-py0.962.361.502.493.022.80
R5py12.7439.1725.6741.4951.8977.04
Matched pairs2,4751,6492,3842,1251,8332,571
Query peak RSS · MiB
Engine / interfaceAnchorageDenverLas VegasBostonWashington, DCNew York
VIGO93631300613771942
ULTRA-OSM7940002256477160386413
MOTIS57283173253478454
R575932571714337843207240
Valhalla120478321415531640
OTP88734473442333038324575
GraphHopper70023593034388869126807
VIGO-py85102858910396
R5py69132791687365243765963
Methodology

VIGO 1.0.0-rc.1 · build b901da90bb49 · Apple M2 · 8 cores · 16 GiB RAM. 5,000 pairs per city: 20% random, 40% near-stop and 40% stop-offset. Serial measurements with retained service dates.

Latency compares the same pairs accepted by all nine interfaces, excluding process-first responses from both batches. Caller time includes adapter, transport and decoding; City loading and rendering are separate. Speedup is the ratio of the selected latency quantiles, not the median of per-pair speedups. VIGO uses the Node CLI to the native engine; VIGO-py and R5py are Python interfaces.

Memory is the maximum RSS reported by macOS /usr/bin/time for each invocation. Routing takes the larger peak across the two query batches; building uses the original one-time preparation. These are measured process peaks, not minimum RAM requirements or summed process-tree totals. Child processes and external services may fall outside the reported scope, including VIGO-py’s native runtime.

Valhalla flags assumed schedules in all 16,558 eligible journeys. Three New York GraphHopper errors are excluded from the matched cohort. Eligibility is adapter acceptance; routes and interface semantics can differ. Blocked results include rejected candidates.

All 30,000 submitted pairs per interface
InterfaceEligibleBlocked / rejectedQuery errorsSetup failures
VIGO21,5848,41600
ULTRA-OSM22,7387,26200
MOTIS20,1569,84400
R522,3647,63600
Valhalla16,55813,44200
OTP22,4397,56100
GraphHopper19,13910,85830
VIGO-py21,5848,41600
R5py22,3647,63600

Benchmark code ↗ · Data & methodology ↗

03 — MATRIX

Ask more.
Repeat less.

A thousand destinations shouldn’t mean a thousand separate searches. Matrix shares the work across compatible requests, returning travel times or journeys for each pair.

VIGO 1.0.0-rc.3

Put VIGO
to work.

Explore interactively, connect a web application, or run an analysis in Python.

THE RESEARCH

Inside the engine.

Explore the ideas and methods behind VIGO.

Read the paper