Inspiration
Public transportation can be frustrating when you don't know where your bus is or when it'll arrive. We wanted to make catching the bus in Bloomington less stressful by giving riders real-time visibility into bus locations and accurate arrival predictions.
What it does
Remontada is a real-time bus tracking app for Bloomington Transit that shows live bus positions on an interactive map. Users can browse all routes, plan trips between stops, see schedules, and get arrival predictions based on actual vehicle locations. The app updates every 10 seconds with fresh data from official GTFS feeds, so you always know where your bus is.
How we built it
We built Remontada with a React Native frontend (using Expo) and a Node.js/Express backend. The backend fetches GTFS-Realtime protobuf feeds from Bloomington Transit's S3 bucket, decodes the binary data, and serves it as clean JSON via REST API. On the frontend, we used React Query for data fetching and caching, Google Maps for visualization, and Zustand for state management. The architecture follows MVVM principles with separate ViewModels handling data transformation logic.
Challenges we ran into
Decoding GTFS-Realtime protobuf feeds was tricky at first - we had to figure out the gtfs-realtime-bindings library and handle cases where feeds didn't match the spec perfectly. Managing real-time updates efficiently without draining battery was another challenge - we settled on 10-second polling intervals with React Query's smart caching. Getting Google Maps to perform smoothly with hundreds of bus markers and route polylines required optimization. We also had to handle the complexity of GTFS static data (12+ CSV files with different relationships) and make sense of trip IDs, route IDs, and stop sequences.
Accomplishments that we're proud of
We're proud of building a fully functional transit app that actually works with real data. The map performance is smooth even with lots of markers, and the real-time updates feel snappy. We successfully parsed and cached all the static GTFS data, built a clean API that serves everything the frontend needs, and created an intuitive UI with dark mode support. The trip planner actually works and helps users plan their journeys. Most importantly, the app is deployable - the backend runs on Google Cloud Run and we can build production APKs.
What we learned
We learned a ton about GTFS and transit data standards - they're more complex than they look but incredibly powerful once you understand them. Working with protobuf was new for us and taught us about efficient binary data formats. We got better at React Native development, especially around map performance and real-time data handling. On the backend side, we learned how to structure an Express API for mobile consumption and the importance of caching static data. We also learned that sometimes simple solutions (like polling every 10 seconds) work better than complex WebSocket setups.
What's next for Remontada
We'd like to implement offline support so users can at least see schedules when they don't have internet. Better trip planning with multi-leg journeys and walking directions would make the app more comprehensive. We're also thinking about adding historical data analysis to show bus reliability and typical delays. Eventually, we'd love to expand to other cities beyond Bloomington.
Built With
- android
- expo.io
- express.js
- google-cloud-run
- google-maps
- gtfs
- gtfs-realtime
- node.js
- protocol-buffers
- react-native
- tanstack-query-(react-query)
- typescript
- zustand
Log in or sign up for Devpost to join the conversation.