01 / Challenge
Intercity sharing, on-demand taxi and cargo were treated as separate products. Passengers and drivers needed one app that could switch roles, verify identity, match a trip, take payment, and stay live while the vehicle moved.
Case study
Mobility — shared rides, on-demand taxi and cargo
A single Flutter client for iOS and Android: scheduled shared trips, on-demand taxi, and Suzuki cargo — with driver and passenger flows, identity verification, maps, chat, voice calls, and a live operations path against the backend.
01 / Challenge
Intercity sharing, on-demand taxi and cargo were treated as separate products. Passengers and drivers needed one app that could switch roles, verify identity, match a trip, take payment, and stay live while the vehicle moved.
02 / Discovery
Two actors, one product. Booking, matching, cargo details, scheduled lead times, and what must stay on-device versus what the API owns. Dual-role users had to switch without a second install.
03 / Strategy
One codebase, clean-architecture features, shared contracts with the API. Scheduled matching and on-demand dispatch as distinct flows. Realtime (chat, presence, calls) as a layer beside REST — not a second app.
04 / Architecture
Presentation (Cubit), domain use-cases, and remote/local data sources. REST for bookings and identity; SignalR/Reverb for live events; WebRTC via Janus for voice; Firebase for push; Hive for session and cache. Encryption and token refresh sit on the network interceptors.
05 / Design
Arabic-first, RTL-aware screens for language, role, OTP, documents, trip list, new trip, cargo, and live status. Light and dark themes. The interface follows the booking state — searching, confirmed, in trip — not a generic dashboard.
06 / Development
Feature slices for splash, login, registration, identity, trips, and on-demand. Code generation for models and DI. Maps, camera, notifications, deep links, and background location wired to the operating model rather than dropped in as plugins.
07 / Deployment
Android and iOS with development, staging and production flavours. Deep links for store and in-app return. Push, permissions and background location treated as release constraints, not afterthoughts.
08 / Outcome
A live mobility client: passengers and drivers share one product for scheduled rides, taxi and cargo, with identity, matching, chat and calls on the same operating path. No invented ridership figures.
Related services