Felix AnderssonSenior Fullstack Engineer, home

Montevideo

Résumé
All work

05 / 07

BondiUY

A bus companion for Montevideo: it plans the trip, follows the bus you are waiting for, and walks you through each step until you get off.

Role
Solo: product, trip logic, map rendering and app
Year
2026
Interface
English and Spanish, light and dark

The demo replays five trips recorded from the trip planner, so it needs no GPS and no server. Time can be sped up to 30x.

The story

The story

In Montevideo the bus is called a bondi, and a trip on one is several steps: walk to a stop, wait, ride, get off at the right corner, walk again. The city publishes where every bus is. BondiUY plans the trip with OpenTripPlanner over the city’s schedules and streets, then follows it as it happens, one step on screen at a time.

Most of the work is in the handover between steps. Your GPS and the bus reports arrive at their own pace, sometimes late or not at all, and from those samples the app has to decide when you reached the stop, when you boarded and when to get off. The trip logic lives in plain Dart with no Flutter imports, and the interface reads it through one state contract, so the same logic runs on a phone, in the tests and in this demo.

In the screenshot
BondiUY on a phone, in English: the step Wait for the D1, with the bus arriving in 1 minute, its distance to the stop, the bus approaching along its route on the map, and a banner asking you to get ready to board.BondiUY on a phone, in English: the step Wait for the D1, with the bus arriving in 1 minute, its distance to the stop, the bus approaching along its route on the map, and a banner asking you to get ready to board.
  1. The wait counts down from the bus’s live position and its distance to your stop.
  2. Between reports the bus keeps moving along its route, but never past your stop.
  3. When the bus is close, the app tells you to get ready to board.

Engineering

Three things worth a closer look

  1. 01

    A map drawn by the app

    The map is rendered by the app itself from OpenFreeMap vector tiles, with its own decoder and painter. The camera frames what the current step needs: you and the stop while you walk, the stop and the coming bus while you wait.

  2. 02

    A bus that stops at your stop

    Between position reports the bus keeps moving along its route by prediction. The prediction is never allowed past your stop: only a real position can say the bus went by.

  3. 03

    A demo with no server

    Five trips were planned against the real network and recorded. The demo replays them with a simulated walker and simulated buses, at 1x, 5x, 15x or 30x, and returns you home after each trip.

  • Flutter
  • Dart
  • Riverpod
  • OpenTripPlanner
  • Montevideo bus API
  • OpenFreeMap vector tiles

More screens from BondiUY

Select a screen to enlarge it

Choosing a trip
On the bus
Home, with the demo trips

Build sheet

Stack
Flutter, Dart, Riverpod, OpenTripPlanner, Montevideo bus API, OpenFreeMap vector tiles
Scale
  • 33 commits
  • 53 tests
  • Android and web
  • Spanish and English
Typefaces
  • Roboto
Palette
#FFFFFF#111318#E0412F#2563EB#1E2128