(01)
The brief
Desk+ sells office furniture made by Moroccan workshops. Three kinds of people use it: customers who browse and buy, sellers who list pieces and ship orders, and admins who look after the catalogue, discounts and accounts.
It was our end-of-study project for the cloud-native module, so the constraints were clear: the database and file storage live on Supabase, the API is stateless behind tokens, and the front end is its own app. I set up the repo and wrote most of the API and most of the React side.
routes, three roles
React components & pages
migrations
commits, 25 of them mine
(02)
A shop that reads like print
We didn't want another grid of chairs. The home page borrows from magazines: an issue number, chapters ("From the atelier", "Pick a temperament"), a cover story and pull quotes. You can browse by category, by space — dev space, call centre, executive — or by "taste": four house styles called Kendo, Woody, Hacker and Coco.

(03)
Three roles, one API
The Laravel 11 API issues Sanctum tokens, and a role middleware gates the /seller and /admin groups. You can sign in with email or with Google through Socialite. New Google users land on a "choose your role" screen before anything else, so a seller never ends up with a customer account by accident. Password resets send a code by email.
- Catalogue & searchFilters by category, space, taste, price and stock; featured and new-arrival feeds.
- Cart & checkoutServer-side cart, coupon codes checked by the API, an order-tracking page.
- Seller back-officeSales, units sold, active listings, orders to fulfil, best-selling piece.
- Admin suiteProducts, orders, users, sellers, discounts, reports and settings.
- AccountsSanctum tokens, Google OAuth with a role picker, reset codes by mail.
- Reviews & wishlistPer-product reviews and saved pieces for signed-in customers.

(04)
The cloud-native part
Postgres and storage both live on Supabase. Product photos go straight from the seller's browser into a public bucket; the only key the browser ever sees is the public anon key. The API stores the resulting URL, not the file.
For the module we also built Desk+ Cloud: a separate seller console with no framework and no build step, talking to the same Supabase project and deployed on Vercel with clean rewrites and security headers.

(05)
Stack
(06)
What I'd do next
Real payments. Checkout records cash on delivery, card or bank transfer, but nothing charges a card yet — CMI or Stripe is the obvious next step.
Then two cleanup jobs I noticed while taking these screenshots: a couple of reporting queries use Postgres-only SQL, so the admin charts can't run against a local SQLite database; and the API still runs on a laptop in development — it belongs on a proper host next to the Vercel front.