One question, answered
- product design
- decision systems
- data quality
Most transit apps answer twenty questions. I built one that answers one.
"What time is my train — and if I miss it, when's the next one?"
That's it. No account. No route map. No fare calculator. No trip history. You enter where you're going and when you need to be there, and you get the best train with the ones either side of it — so the answer to "what if I miss this" is already on screen before you think to ask.
The hard part wasn't the code
It was saying no.
Every feature I cut was defensible on its own. Saved trips are useful. A system map is useful. Service alerts are useful. But each one adds a decision for someone standing on a platform with ninety seconds and one hand free. Their question is singular. Anything that isn't the answer is in the way.
This is the same discipline that decides whether a dashboard gets used or quietly abandoned. Name the decision the thing supports, then refuse everything that doesn't serve it. Most dashboards I'm asked to fix don't have a data problem. They have a "we added everything anyone asked for" problem — and no amount of better data modelling rescues a page nobody can act on.
Two things the build taught me
Testing against the live API — not the documentation — turned up nine defects.
The worst was a timestamp parser reading minutes as the hour. It returned times that were wrong while parsing perfectly cleanly. Nothing crashed. No exception, no log line, no red test. It just quietly gave the wrong answer.
That's the failure mode that actually matters in reporting, and no amount of reading the spec would have caught it. A number that is wrong and looks fine is worse than a number that is missing, because the missing one gets noticed.
And where the API couldn't support a claim, the app says so.
There is no official "express" field anywhere in the Metrolinx data. So the Express label is inferred from how many stations a train calls at compared with the fullest pattern in the same search — and the interface tells you that, rather than presenting a guess as a fact.
That footnote costs nothing. What it buys is that every other label on the page can now be trusted, because you know I'd have flagged it if it couldn't be.
Try it
It's built on Metrolinx's public API, free, and needs no login: gotransit.nuvistaanalytics.ca (opens in a new tab)
All 42 station codes were matched against the official GTFS feed rather than guessed. If you find it giving a wrong answer, I'd genuinely like to know.