First Chair
Snow, drive time and chain controls for up to five ski resorts, on one screen.
On the App Store
What it does
Is it worth the drive today? First Chair puts the answer for up to five ski resorts on one screen. For each one you see:
- the 14-day snow forecast, new snow in the last 24 and 48 hours, and base depth
- live drive time against usual traffic, with one-tap directions
- chain controls and highway closures on your route, and live road cams
- wind and gusts, with a heads-up when lifts may hold
- the National Weather Service forecast
Sort your mountains by most snow coming, easiest drive, freshest snow, deepest base or snow per hour of driving. It covers 87 US resorts across the Epic, Ikon, Powdr, Indy and Mountain Collective passes, plus smaller mountains, with road data from state transportation departments in 15 states. It works with CarPlay, works offline with what it has already loaded, and has no account, tracking or ads.
First Chair is free on the US App Store for iPhone.
How I built it
The problem
On a ski morning the answer is spread across a weather app, a traffic app, a state road site and each resort’s own page. I wanted one screen that answers “where, and is it worth it” before I leave the house.
Key decisions
- One routing call per trip. A single Mapbox Directions call gives live drive time, usual time and the highways on the route. Those highway numbers pick which road reports to show.
- One adapter per road feed. Every state publishes road data in its own shape, so each feed has its own small adapter. States without one still show snow and drive time.
- A cache in front of every feed. A Cloudflare Worker refreshes roads every 10 minutes and snow every hour into KV, so feed calls stay the same however many people use the app. If a feed fails, the app shows the last good value, marked as stale.
- Private by design. There are no accounts. Your home address stays in the phone’s secure storage and is rounded to about 1 km before it goes to the routing provider. It never reaches my server.
- Free, with no ads or purchases. That keeps it simple, and it keeps the app within the free terms of the weather data it uses.
What was hard
- Road feeds. Ten different transportation feeds, ten different formats, and at least one that blocks cloud servers while working from home.
- Failing safely. A review found that if a closures feed failed, a road could show as open. When data is missing, “unknown” is the honest answer, never “open”.
- App Review. Two rejections, one for a button shown before the location prompt and one for a tip link, before the first approval.
- Knowing what can ship over the air. JavaScript changes go out as instant updates; anything native needs a new build and a new review.
What I learned
- The whole iOS release cycle: TestFlight, privacy labels, rejections and resubmission.
- How far a small backend on Cloudflare Workers, KV and scheduled jobs can go.
- Adding a native Swift module, for CarPlay, to an Expo app.
Tech stack
- Expo and React Native (TypeScript)
- Swift (CarPlay module)
- Cloudflare Workers, KV and Cron Triggers
- Mapbox Directions
- Open-Meteo and the National Weather Service
- State DOT road feeds
- Jest and Vitest


