Find the weak stop.
See accuracy by route, stop, and hour. A weak segment stays visible instead of disappearing into a system-wide average.
Turn your vehicle feed into arrival predictions riders can act on. Then measure every prediction against the arrival that actually happened.
Built by TransitOPS.
4min
Predicted from vehicle positions
Rider trust is the point
I don’t know when the bus is coming.
It said five minutes. Then it disappeared.
I know when to leave.
01 / From positions to predictions
Warbler connects your schedule to what buses are doing now, then updates arrival predictions as each position comes in.
Match a vehicle’s track to its scheduled block, even when the incoming position has no trip attached.
Combine each trip’s historical travel times with what vehicles on the same street are reporting now.
A Kalman filter weighs history against current observations. Real congestion moves the estimate; one stray GPS reading does not.
Fall back to the schedule with wider uncertainty. Cancel trips on untracked blocks more than ten minutes past their start.
A bus that disappears from the board costs riders trust. Schedule-based predictions carry wide uncertainty rather than false precision. If nothing runs a block more than ten minutes after its start, Warbler cancels its trips.
Rebuild predictions as positions arrive. Publish GTFS-Realtime TripUpdates and JSON for the channels riders already use.
Match the trip → estimate the arrival
GTFS-Realtime TripUpdates + JSON
Every prediction is recorded and compared with the observed arrival. The result is evidence you can inspect.
02 / Predictions with a record
A late bus and a wrong prediction are different problems. Warbler records both, so you can see what riders were told and what happened.
Prediction error
The bus ran 4 min 20 s late.
| Time until arrival when predicted | Allowed early | Allowed late |
|---|---|---|
| 0–3 minutes | 30 s | 90 s |
| 3–6 minutes | 60 s | 150 s |
| 6–10 minutes | 60 s | 210 s |
| 10–15 minutes | 90 s | 270 s |
Early tolerances are tighter on purpose: a bus that arrives sooner than predicted is the one a rider can miss.
Predictions made more than 15 minutes out are stored, but not scored.
See accuracy by route, stop, and hour. A weak segment stays visible instead of disappearing into a system-wide average.
Run past vehicle positions through the engine. Change something, replay the same traffic, and compare the results.
Score the feed you publish today against the same stops and hours. Check the difference before changing anything.
03 / Arrivals where riders need them
Publish to the channels riders and staff already use. Trip planners that read GTFS-Realtime can consume the feed; your other systems can use JSON.
TripUpdates are published as protobuf, JSON, or plain text. JSON supports station signs, on-board displays, phone systems, agency apps, and dashboards. Keys are scoped to an organization, route filters control publication, and endpoints include an OpenAPI description.
GET /api/real-time/{agency}/gtfs-rt-trip-updates
GET /api/real-time/{agency}/predictions
GET /api/real-time/{agency}/vehicles
GET /api/info/{agency}/routes
GET /api/openapiStart with your own routes
Run Warbler beside your current feed and compare the results on your own routes.
That’s the starting point. No platform to adopt, no system to replace, and nothing else to buy first.