projects · commute-tracker
A hybrid schedule turns "how bad is traffic" into a decision you make ten times a week. commute-tracker collects real corridor timings around the clock, learns the shape of each day, and answers the only two questions that matter: which office days cost the least, and when to leave. Verdict it settled: the new office runs ~1.8–1.9× the old commute — so the answer is a plan, not a feeling.
The product
The layout is a three-tier answer machine: the verdict now, the trends that justify it, and the exploration layer underneath.
A SwiftUI app (plus home-screen widget and watch app) ships through TestFlight — and it's not just a viewer. The phone is the platform's ground truth: it records actual drives in the background (battery-friendly coarse GPS) and uploads them, so predictions are continuously checked against real trips rather than trusted on faith. It talks to the server over a bearer-token API — the one part of the system published to the internet — so the phone works from anywhere while the dashboard stays private.
The dashboard answers when you open it; notifications answer when you don't. A morning brief at 07:15, a push when a drive finishes telling you how it went against what was anticipated, a Saturday summary of the week just ended, and an alert when the commute goes unusually bad inside the windows you actually care about. Every type is switchable per channel — and each offers only the channels that suit it: a finished trip is a push, never an email; the poller-failure notice is email only, because a push saying the server is down depends on the server.
Lessons
The map is the page's least important widget and most fragile dependency, so when WebGL isn't available it fails to a single honest sentence while every number keeps working.
The corridor map carries traffic in a single hue — darker means slower. That rule, made here, became house law on the styleguide.
The dashboard has no login, so it stays on the private network; the phone has to work from anywhere, so its bearer-token API is the one public surface. Naming each surface's trust model separately — rather than assuming one policy covers both — became the platform's trust-surfaces pattern.
The poller-failure notice is email only, because a push saying the server is down depends on the server. Announce a failure on a path that doesn't run through the thing that failed.