Leading a 5-person team to 53 screens in 24 days
How our DEPI team built Osta, a two-sided car-services marketplace, in 24 days: foundation first, clear team rules, and the bugs that slipped past green tests.



The project
Osta was our DEPI graduation project: a car-services marketplace for Egypt. Customers find a service center on a map, book a time slot and follow the repair as it happens. Service centers manage their bookings, services, offers and team from the same app. I led a team of five. I built the Laravel backend on my own, starting in mid-June, and laid the Flutter foundation the rest of the app grew on.
Foundation before screens
Five people cannot build screens in parallel on top of nothing. So the first days went to the skeleton: feature folders for customer, business and shared code, BLoC for state, get_it for dependencies, and one Dio client that understands the API’s response format and its login tokens.
Routing is one function. It looks at the session and decides where the user belongs: splash, language, role, onboarding, sign-in, then the customer or business app. We wrote eight short decision records so nobody had to re-argue those choices mid-sprint, and every pull request ran the same checks: translations, formatting, analysis and tests.
Five people, one codebase
The rules were simple and written down. Work happened on feature branches named after their GitHub issue, merged into a develop branch; main only took tagged releases. Commits followed Conventional Commits, pull requests were described in Arabic and English, and updating the docs was part of done.
Between 1 and 25 July the app repository took 336 commits, 79 merged pull requests and eight releases, from v0.1.0 to v0.8.0.
The bugs green tests missed
Mid-July, both test suites were green and five bugs still shipped, all at the border between app and API. The refresh token went out in the wrong format, so users were signed out whenever their session expired. Updating a center’s logo silently threw away the rest of the profile, because the server only reads file uploads on POST requests. A car’s plate and mileage were dropped on the way to the server.
Each unit worked on its own; the contract between them was wrong. The fix was tests that pin the exact request and response shapes, plus an audit that wired up about 30 API helpers nobody was calling yet.
Where it landed
In 24 days the team delivered 53 screens across the customer and business apps, in Arabic and English with light and dark themes. Underneath is the backend I built: a Laravel 12 API with 78 routes, PostGIS for nearby search, Reverb for live booking updates, push notifications, a Filament admin console, and 414 automated tests. Online payment through Paymob was the one milestone still open at hand-in, so bookings are paid at the center.
What I would keep for any team project: build the foundation before the screens, write decisions down, and test the contract between app and server, not only each side alone.
Read the case study: Osta (أُسطى) — Car Services Marketplace →