No description
  • TypeScript 62.6%
  • JavaScript 26.3%
  • CSS 10.7%
  • Shell 0.3%
  • Dockerfile 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jake Swanson 2e02416950
Some checks failed
CI / check (push) Has been cancelled
Fly Deploy / deploy (push) Has been cancelled
Explore map: color a stop's routes in place without zooming (#99) (#104)
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>
2026-10-18 23:45:09 -04:00
.github/workflows Server-emit rail line colors + fix CI type errors (#91) 2026-06-06 02:21:28 -04:00
docs Remove stale cleanup audit docs (#80) 2026-06-01 02:08:14 -04:00
public Explore map: color a stop's routes in place without zooming (#99) (#104) 2026-10-18 23:45:09 -04:00
screenshots Keep hero in arrivals list, highlighted 2026-02-13 08:54:40 -05:00
src Explore map: tap a stop to show its routes, tap again to cancel (#99) (#102) 2026-10-16 14:38:59 -04:00
tests Fix broken map tiles (#98); show a stop's routes in color on the explore map (#99) (#100) 2026-10-16 14:07:03 -04:00
tools Checkpoint rail redesign: CSS island, heroes, compact rows, timeline 2026-06-14 18:53:21 -04:00
.dockerignore fix: cord status follows wrong stop's buses 2026-02-19 07:52:00 -05:00
.gitignore Repo hygiene: drop stray artifacts, add CLAUDE.md (#73) 2026-05-30 02:18:04 -04:00
.REDESIGN_PLAN.md Checkpoint rail redesign: CSS island, heroes, compact rows, timeline 2026-06-14 18:53:21 -04:00
bun.lock fix tests: update eta.test.ts for ETAResult return type, add about link to rail footer 2026-04-04 03:34:34 +00:00
CLAUDE.md Repo hygiene: drop stray artifacts, add CLAUDE.md (#73) 2026-05-30 02:18:04 -04:00
Dockerfile fix dockerfile: remove COPY data/marta.db build-time dependency 2026-04-04 03:50:57 +00:00
entrypoint.sh fix: cord status follows wrong stop's buses 2026-02-19 07:52:00 -05:00
fly.toml Serve rail view at marta.io root via RAIL_HOST (#87) 2026-06-02 09:54:48 -04:00
gtfs-realtime.proto rail: fix downtime UX + cache semantics, bump mobile fonts, delete dead views 2026-04-14 23:12:21 -04:00
package.json fix: quick wins — cord UUIDs, fetch logging, search cap, playwright dev, DB constructor 2026-03-01 06:40:39 -05:00
README.md Enhance live section with bus and train links 2026-10-16 16:09:27 -04:00
tsconfig.json pullcord: initial scaffold 2026-02-12 17:48:41 -05:00

Pullcord 🚌

Real-time MARTA bus tracker. Pull the cord. Catch your ride.

Live:

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 specification
  • docs/DEV_FLOW.md — development workflow patterns
  • docs/TIMESTAMP_ANALYSIS.md — MARTA data freshness analysis
  • docs/VEHICLE_VS_TRIPS_ANALYSIS.md — vehicle vs trip update feed analysis
  • docs/EXPERIMENTS_REVIEW.md — UI experiment comparison notes

License

MIT