Case study 04Citizen reportingClient: Promet i prostorLive
Popravimo
A citizen issue-reporting app, rewritten from scratch in Flutter.


Citizens report potholes, broken lights and other problems with a photo and their GPS position. For Promet i prostor we rewrote Popravimo from scratch in Flutter and shipped it to both app stores, with a clustered live map.
App Store (opens in a new tab) Google Play (opens in a new tab)
The brief
One app for every city on the client's platform.
Popravimo lets citizens report what is broken in their city and follow it on a public map. The client, Promet i prostor, runs the platform behind it for several cities. We rebuilt the app from scratch in Flutter: camera-first reports, guest mode, Croatian and English, dark mode, and one build that serves every city.
System map
How it fits together
- 1Citizens on the streetCamera-first reports with a photo and the GPS position
- 2One build, the right cityA GPS geofence call loads the city, a native clustered map shows reports
- 3The client's platformReports go to the PiPGIS API, Promet i prostor's own platform
- 4Three hard partsMany cities, one app
Three hard parts
Many cities, one app
One build, every city
Each city has its own setup, but nobody should install a different app. A GPS geofence call picks the right city configuration, so a single build serves each city.
A map that stays quick
The map has to stay smooth with many reports. Native marker clustering; tapping a cluster zooms in and batch-loads up to 30 of its reports.
Shared reports open in the app
A link to a report should land on that report. app_links deep links open /reports/<id> and /auth/verify straight in the app.
On screen
The newest build


Stack
- Flutter
- Riverpod
- Retrofit
- Dio
- freezed
- Sentry
- app_links
Our role: rewritten from scratch, shipped to both stores.