Overview
willarrive.in is a deliberately minimal NYC transit PWA, with a separate, branded app for each subway line. Open the one you saved and it shows the next trains in both directions at your closest station.
Problem
Transit apps usually involve a lot of navigation, ironic for tools whose whole job is to get you somewhere. Each extra tap is friction when you just want to know when the next train comes.
Constraints
- Minimize taps to surface the next train
- Cover both directions at the nearest station from one screen
- Lightweight enough to install as a PWA
Approach
The first launch asks for your location once; from then on, opening the saved line uses your geo position to find the closest station and show the next trains in both directions in real time, with nothing to navigate.
Key Decisions
Let the device pick the nearest station
| Reasoning | Alternatives |
|---|---|
| Asking for location once removes the selection step forever after, which is the difference between checking the time and operating an app. | Manual station selection |
Result & Impact
willarrive.in showed how far you can cut interaction cost when a tool is allowed to do one thing: location, live arrivals, and a saved line collapse into a screen with nothing to operate.
Learnings
- Aggressively cutting interaction cost can redefine a familiar experience
- The data you need is often already published somewhere; the constraint is usually access, not availability
- The flip side: anything a browser can read is effectively public, which is worth knowing from both sides of the request
The story behind it
The name was part of the spark: the domain willarrive.in was available, and a line subdomain reads as a sentence, e.willarrive.in, “E will arrive in.” Each line got its own branded page, the E rendered as a blue circle with a white E, just like the station signage.
Arrivals came from the MTA’s own real-time feed. There was no public key at the time, so I inspected the requests on the MTA’s site, found the API key they were using, and, since nothing checked which site was making the call, queried the same feed from mine. Remember to have your server check where the request is coming from, kids!
All projects