Inspiration

Bloomington's transit apps show stale schedules. We wanted an app that shows live buses near you the moment you open it no searching, no setup.

What it does

Real-time bus map updated every 2 seconds, nearby arrivals within 600m, BFS trip planner with "Arrive by" mode, and push notifications at 15/10/5 minute milestones.

How we built it

GTFS static ZIP parsed into memory, live protobuf feeds polled every 2 seconds, buses snapped to route shapes, MVVM architecture with StateFlow, and an Android notification pipeline with three channels.

Challenges we ran into

GTFS-RT GPS is 15–30 seconds stale forward interpolation placed buses 2 stops ahead. NaN coordinates silently dropped markers. Animator and polling loop fought each other, causing visible bus oscillation.

Accomplishments that we're proud of

The trip planner works entirely offline from cached GTFS data, handles transfers, and solves "Arrive by" backwards from a deadline built from scratch with no routing library.

What we learned

Real-time feeds aren't actually real-time. Animators need explicit cancellation maps. BFS over GTFS requires aggressive pruning boarding key deduplication and per-stop best-arrival cutoffs made it fast enough

What's next for BtownTransit

Fare payment integration, trip history, service alerts, and a widget for the home screen showing your next bus at a glance.

Built With

  • android
  • android-room
  • coroutines.
  • google-maps-sdk
  • gtfs-rt-protobuf
  • jetpack-navigation
  • kotlin
  • material3
  • retrofit
  • stateflow
+ 15 more
Share this project:

Updates