No description
- TypeScript 62.6%
- JavaScript 26.3%
- CSS 10.7%
- Shell 0.3%
- Dockerfile 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Selecting a stop, switching to another stop's dot, isolating a route, and cancelling no longer move or zoom the map. The routes are drawn around wherever the user is already looking. Claude-Session: https://claude.ai/code/session_01BJ1CEXdcEJJJDcZcyTSyar Co-authored-by: Claude <noreply@anthropic.com> |
||
| .github/workflows | ||
| docs | ||
| public | ||
| screenshots | ||
| src | ||
| tests | ||
| tools | ||
| .dockerignore | ||
| .gitignore | ||
| .REDESIGN_PLAN.md | ||
| bun.lock | ||
| CLAUDE.md | ||
| Dockerfile | ||
| entrypoint.sh | ||
| fly.toml | ||
| gtfs-realtime.proto | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
Pullcord 🚌
Real-time MARTA bus tracker. Pull the cord. Catch your ride.
Live:
- buses: bus.marta.io
- trains: marta.io
Features
- Live GPS tracking — bus positions updated every 30s via MARTA GTFS-RT
- ETA predictions — three-tier system (active, next trip, scheduled)
- Hero countdown — biggest bus ticks every second
- Pull the Cord — web push notification when your bus is close (2/5/10/15 min threshold)
- Direction swap — tap any prediction to track the other way
- Favorites — save stops for quick access
- Light/dark mode — follows system preference
- Mobile-first — designed for standing at a bus stop in the sun
Stack
- Runtime: Bun
- Server: Hono (SSR JSX)
- Database: SQLite (bun:sqlite) — GTFS static data
- Map: Leaflet + CartoDB tiles
- CSS: Tailwind v4
- Fonts: Inter (body) + JetBrains Mono (data)
- Push: Web Push API + VAPID
Setup
# Install dependencies
bun install
# Download GTFS data and build database
./tools/refresh-gtfs.sh
# Copy env template
cp .env.example .env
# Edit .env with your MARTA API key and VAPID keys
# Build CSS
bun x @tailwindcss/cli -i src/styles/app.css -o public/styles.css
# Run
bun run src/index.ts
Environment Variables
MARTA_API_KEY= # MARTA GTFS-RT API key
PORT=4200 # Server port
VAPID_PUBLIC_KEY= # Web Push VAPID public key (generate with web-push)
VAPID_PRIVATE_KEY= # Web Push VAPID private key
VAPID_EMAIL= # Contact email for VAPID (mailto:you@example.com)
GTFS Refresh
MARTA publishes schedule updates periodically. Refresh with:
./tools/refresh-gtfs.sh
This downloads the latest GTFS feed, rebuilds the SQLite database, and restarts the service. Consider running weekly via cron.
Docs
docs/BUILD_SPEC.md— original build specificationdocs/DEV_FLOW.md— development workflow patternsdocs/TIMESTAMP_ANALYSIS.md— MARTA data freshness analysisdocs/VEHICLE_VS_TRIPS_ANALYSIS.md— vehicle vs trip update feed analysisdocs/EXPERIMENTS_REVIEW.md— UI experiment comparison notes
License
MIT