Inspiration

Every South Florida bus rider knows it: the app says "Due," and the bus never comes. That's a ghost bus. We're FIU students who deal with it weekly, so we built the fix.

What it does

Ghost Bus tracks buses across Miami-Dade, Broward, Palm Beach and Monroe and flags ghost buses, bunching (buses arriving together, followed by a long gap) and chronically late stops. Then it tells you exactly when to leave: "Leave in 4 min to catch the 8, arriving 11:57–12:01 (Likely)." It installs like an app, with no accounts and no tracking.

How we built it

Tiger Data is the core. Hypertables store a GPS ping from every bus every 15 seconds, compression shrinks old data by about [5×], and continuous aggregates power every dashboard ([X ms] vs [Y ms] on raw rows). Ghost detection is one SQL query joining the live feed to the schedule. The rest: Python ingestion (GTFS + GTFS-realtime), FastAPI, a Leaflet web app, and deployment on Render. We used AI coding assistants along the way.

Challenges we ran into

  • Continuous aggregates can't use window functions, so we compute the gap between buses as each arrival is recorded.
  • GTFS times past midnight and daylight saving made the delay math tricky.
  • A feed outage makes every bus look like a ghost, so we pause alerts when data goes stale.
  • Four agencies reuse the same IDs, so we namespaced every ID per agency.

Accomplishments that we're proud of

  • The app grades its own predictions and self-calibrates; in a backtest it caught about 90% of buses within its window.
  • Four counties, from Palm Beach to Key West, in one database.

What we learned

How to model real-time time-series data with hypertables, compression and continuous aggregates, and that an honest time window beats a precise-looking wrong answer.

What's next for GhostBus

Live GPS for every county, route reports for transit agencies, and push/spoken alerts for saved stops.

Built With

Share this project:

Updates

Submission history