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
Log in or sign up for Devpost to join the conversation.