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.


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.


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
