BFT LLC BFT LLC

Our Products

TransitOracle

Website, with iPhone and Apple Watch apps coming soon

Arrival times for Boston's buses, subway, Commuter Rail and ferries that try to beat the MBTA's own predictions, and publish the score every eight hours.

Objective

Tell a rider standing at a stop when the vehicle will really come, more accurately than the times on the platform sign, and prove it: every claim of "more accurate" comes from a test on predictions the model never saw.

The Park Street stop page on transitoracle.com: Red and Green Line arrivals, each with TransitOracle's countdown, its range and the MBTA's prediction beneath it
A stop's page. The big number is TransitOracle's time with the range it lands in 8 times out of 10; the MBTA's own prediction sits under it.

What it does

  • Next arrivals for about 7,100 stops, refreshed every 20 seconds, with TransitOracle's time, an 80% range and the MBTA's prediction side by side.
  • Search by name or find stops near you, and save the ones you use. No account: saved stops stay in your browser or on your phone.
  • A live map of every line and every vehicle in service, with Follow to watch one trip all the way to your stop.
  • A trip planner that says how likely each way's changes are to work and when you will arrive 9 times in 10.
  • Service alerts, Commuter Rail tracks, how full each vehicle is, how a route usually runs at this hour, and a warning for buses that often never show.
  • A public track record: every retrain's score against the MBTA's, by mode, with the last 30 days charted.
  • iPhone and Apple Watch apps: widgets for saved stops, commutes as Live Activities on the lock screen and Dynamic Island, and watch complications.
The Park Street stop in the iPhone app, listing Green and Red Line trains with TransitOracle countdowns, ranges and the MBTA's times
The same stop on iPhone. Inside three minutes the countdown runs by the second.
The live map in the iPhone app showing Boston's subway, bus, Commuter Rail and ferry lines with every vehicle in service
Every vehicle in service, each gliding along its line between reports.
The trip planner in the iPhone app from South Station to Harvard, listing Red Line trips with when each gets there 9 times in 10
The planner plays each way out 400 times on how late the MBTA's predictions really run.

Design choices, and why

Only show our time where it has won

TransitOracle's prediction leads for a mode only if it beat the MBTA's on that mode's held-out test. Where it has not, the rider sees the MBTA's time. A prediction product that is sometimes worse than the free one has to say so, not hide it.

A range, and the MBTA's number beside it

A single minute hides how sure the model is. Every arrival carries the range it falls in 8 times out of 10, with the MBTA's own prediction under it, labelled, so a rider can see both and decide.

Retrain often, promote only on evidence

Every eight hours the model learns from the latest week, and every Sunday it is rebuilt from eight weeks of history. A new model replaces the serving one only if it is more accurate by more than noise on hours neither has seen, and every check goes on the track record either way.

No accounts, and your location stays with you

Saved stops and commutes live on the device. Near me is worked out on the phone; the planner sends only a position rounded to about 100 metres. The apps talk to one host, read-only, over pinned TLS 1.3.

The track record page: on 1.5 million unseen predictions, TransitOracle within the MBTA's accuracy windows 93% of the time against 88% for the MBTA, with subway, bus, Commuter Rail and ferry scores
The track record on November 3, 2026: on 1.5 million predictions it never saw, 93% within the MBTA's own accuracy windows, against 88% for the MBTA's.

Challenges and how we solved them

A gap in the data can never be filled

The MBTA's live feeds are gone a minute later, so an hour not recorded is an hour the model never learns from. Collection runs on Cloudflare rather than our own machines: a Durable Object polls the feeds every 15 to 60 seconds, buffers in its own storage so a deploy loses nothing, and writes five-minute batches to R2. A watchdog posts to Slack the moment anything stops moving.

Nobody publishes when the bus actually came

Scoring a prediction needs the true arrival, which the live feeds never state. The pipeline infers every arrival and departure from vehicle positions and checks them against the MBTA's published history, which is how we found, and fixed, first stops and two-stop ferry trips going unscored.

Hundreds of millions of predictions on a home runner

Each retrain reads about 400 million logged predictions. It runs on a self-hosted runner, reading a day an eighth at a time and building examples a group of routes at a time, so a run stays under about 7 GB of memory and costs nothing in cloud compute.

A Live Activity without push notifications

A commute's next departures belong on the lock screen at the right time, but the app has no server push. It schedules the activity to start on its own, sends a Time Sensitive notification as a fallback, and refreshes on open, on tap and in the background, with the countdown ticking on the device in between.

Where it stands

TransitOracle is live at transitoracle.com, collecting the MBTA's feeds around the clock and retraining three times a day, with monitoring through Sentry, Slack, Better Stack and PostHog. The iPhone and Apple Watch apps, on the same API, are coming soon to the App Store. TransitOracle is not affiliated with or endorsed by the MBTA or MassDOT; its data comes from MassDOT.

Want something like this built for you?

Tell us about your project and we will reply by email.

Inquire now