Your next BART train — in seconds.
Live countdown, platform, and where the train actually is.
Save your commute. Open the app. See if you should run.
- Second-precision countdown — not “3 min”, 3m 29s
- Your train, not a headsign — “Civic Center · 3 stops away”
- Platform, cars, fare, arrival — glance and go
- Reverse trip — check the other direction without retyping stations
- Installable PWA — home screen on iPhone, Android, and desktop
No account. No App Store. Free.
| Platform | Steps |
|---|---|
| iPhone (Safari) | Open the live app → Share → Add to Home Screen |
| Android (Chrome) | Open the live app → menu → Install app |
| Desktop (Chrome/Edge) | Open the live app → install icon in the address bar |
If the home-screen icon does not update
- Remove the old icon.
- Open the site in the browser and refresh once.
- Install again from the share sheet or browser menu.
Developers
npm install
npm run devOpen http://localhost:5173.
npm run dev— local dev servernpm run build— production build todist/npm run test— fixture-based validation (CI-safe)npm run test:live— live BART audit for one origin (defaults toDUBL)npm run test:live:all— one-time live sweep across all originsnpm run lint— TypeScript/React lintnpm run icons— regenerate favicon + PWA icon pack
ORIGIN=<ABBR> npm run test:live— e.g.ORIGIN=12THLIMIT=<N> npm run test:live— fewer destination checksLIMIT_ORIGINS=<N> LIMIT_DEST=<N> npm run test:live:all— sampled sweep- Use live audits as manual pre-release checks (not required CI)
- React 19 + TypeScript + Vite
- PWA via
vite-plugin-pwa - BART API + GTFS-Realtime
- Same-origin
/api/bartproxy (Vite locally, Cloudflare Worker in prod) so GTFS-RT works in the browser
Use npx wrangler deploy (not Pages). Build: npm run build · output: dist/ (wrangler.toml).
npm run deploy
# or: npm run build && npx wrangler deployworker.js proxies /api/bart/* → api.bart.gov. The SPA is served from dist via Workers Static Assets.
Not affiliated with BART.
MIT
