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
- css
- docker
- fastapi
- github-actions
- gtfs
- gtfs-realtime
- html
- javascript
- leaflet.js
- openstreetmap
- postgresql
- protobuf
- psycopg
- pwa
- python
- render
- tiger-data
- timescaledb
- uvicorn

Log in or sign up for Devpost to join the conversation.