willarrive.in, Real-Time NYC Train Arrivals
Creator · 2016 · 2 min read
A minimal PWA for New York City transit: save a subway line to your device, grant location once, and see the next trains in both directions at your nearest station in real time, with almost no tapping.
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
Give each line its own branded subdomain, parsed at the edge Reasoning Alternatives Visiting a line's own subdomain is all that's needed; the line code is parsed at the edge to make the server requests and serve the page back as HTML, branded to match that line.
- A single app with in-app line selection
Use the native Geolocation API to pick the nearest station Reasoning Alternatives Automatically choosing the closest station removes a manual selection step.
- Manual station selection
Tech Stack
- Progressive Web App
- Geolocation API
- AWS
- Edge functions
- Real-time data
Result & Impact
willarrive.in showed how far you can cut interaction cost by combining geolocation, real-time data, and a per-line PWA into a single-purpose tool.
Learnings
- Aggressively cutting interaction cost can redefine a familiar experience
- The data you need is often already on the page; reading the network requests can be all it takes
- The flip side: APIs should restrict which origins can call them and never expose a key the client can read, since an unguarded key is effectively open to anyone
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.