2 roles
customer and driver
OSRM
multi-stop driver routes
AR / EN
bilingual UI
GetX
state, DI, and routing
The brief
Ordering from several local shops in one checkout
SoldOut connects customers with local vendors and the drivers who deliver for them. One cart can hold products from several markets, and the app handles everything from browsing to the doorstep.
- Phone number and OTP sign-in, with separate flows for customers and drivers.
- Search across products and markets, with infinite-scroll pagination.
- Duplicate requests are dropped, so fast typing doesn’t flood the API.
- Favorites, saved addresses, payment cards, and product ratings.


How an order moves
Cart
Stock is checked before an item is added, so nothing unavailable reaches checkout.
Pending
Address and payment method are confirmed, and the order is split across its vendors.
In delivery
The driver gets every pickup and drop-off as one route on a live map.
Delivered
The customer follows each status change, and the order lands in their history.
The hard part
One sensible route instead of stops in random order
A driver carrying orders from several vendors shouldn’t visit them in whatever order they happened to be assigned. The driver dashboard sends every market waypoint to the OSRM Trip service, gets back the best visiting order, and draws that route on an OpenStreetMap layer.
- Waypoints sorted by OSRM, not by assignment order.
- The route decoded from a polyline and drawn with flutter_map.
- The driver’s location tracked live with geolocator.
The result: fewer wasted kilometres for the driver, and a more accurate arrival time for every customer waiting at the other end.


What I’d change next
SoldOut is an earlier project than the other four, and it shows in the networking layer. Before extending it, I’d rebuild that layer with typed failures and a proper retry policy — the pattern my later apps use. The multi-stop routing is the part worth a closer look.
Stack
