Development — Case Study
Ustaad
A full-stack service marketplace connecting skilled workers with customers — from first bid to job completion.
Designing for two users at once
Ustaad isn't one product, it's two — a worker trying to win jobs and a customer trying to trust a stranger in their home. I built a custom two-role authentication module from the ground up rather than bolting permissions onto a single user table, so each role gets its own dashboard, its own data shape, and its own set of actions.
That separation meant I could design the worker's bidding view and the customer's job-posting view as genuinely different products, sharing only the parts of the system that actually needed to be shared: the job record, the messaging, and the final rating.
The bidding and matching engine
At the core of the app is a four-stage job lifecycle: post, bid, book, complete. A customer posts a job, workers submit competing bids, the matching logic surfaces the most relevant workers for that job type, and a booking locks in the agreed terms before work starts.
I built this end-to-end in FastAPI with a PostgreSQL schema designed around that lifecycle, so every job carries a full, queryable history — who bid what, who was matched, and when the job closed. Nothing lives in a spreadsheet or a group chat.
Execution & outcome
Because I owned the React frontend, the FastAPI backend, and the PostgreSQL schema together, the bidding flow, the auth module, and the booking state machine were built as one coherent system instead of three handoffs. That let me iterate on the trickiest part — matching a job to the right worker — without waiting on a separate backend team.
The result is a marketplace where a customer can go from posting a job to a completed booking without leaving the platform once, and every step along the way is backed by a role that was designed for it specifically.
Have a project in mind?
Let's buildyour next one.
One person who designs and ships it — no handoff, no translation loss. Tell me what you're building and let's make it real.
Start a project↗

