All work

Smart parking

Mawaqef

Flutter developer · freelance
2026
Mawaqef preview

2 roles

driver and owner shells

OSM

map discovery and live routes

409 → pay

checkout conflicts recover, not fail

Solo

architecture, DI, and navigation

The brief

One app for the driver looking for a spot and the owner renting it

Drivers need to find an open spot near where they’re going, hold it, and pay only for the time they use. Lot owners need to list their spaces and see how full they are — without running a second piece of software.

Mawaqef handles both. Drivers discover lots on an OpenStreetMap view with live availability, book and pay (including Sham Cash), extend a running session, manage their vehicles, and settle violations. New owner accounts stay locked out of the owner shell until they’re approved.

There was no shared platform underneath this one. The feature-first structure, BLoC over a hand-built Dio + get_it setup, and the go_router shell that swaps between driver and owner navigation at login are all my decisions.

Mawaqef map with a selected parking lot showing free spaces and booking action
Free spaces, hours, and booking right on the map.
Mawaqef active booking with a remaining-time countdown and extend option
An active session, with time left and one-tap extend.

The hard part

Recovering a checkout that already went through

If a driver’s connection drops just as they confirm, the retry can hit the API for a booking that already exists. Most apps show a generic error and leave the driver guessing whether they’ve paid.

Mawaqef treats an HTTP 409 on booking creation as a signal to resume. It reads the existing booking back from the response and takes the driver straight to that booking’s payment screen — no spinner, no duplicate, no dead end.

A small addition paid off constantly during device testing: the API host can be switched from a settings dialog, so the same build could be pointed at different backend environments without a rebuild.

Mawaqef live route to a booked spot with the remaining session time
Turn-by-turn to the booked spot.
Mawaqef owner dashboard with today's revenue and lot occupancy
Owner shell: revenue and live occupancy.

A limitation I chose on purpose

I started an offline queue in Hive that would store booking and payment actions with no signal and replay them later. I built the queue itself, then chose not to wire it in half-finished.

A queue that looks like it works in a demo and silently drops requests in a dead zone is worse than an app that’s honest about needing a connection. Finishing that wiring is the first item if the project continues.

Stack

FlutterBLoCget_itDiogo_routerflutter_osm_pluginHiveSharedPreferencesflutter_screenutil