youbahyt@gmail.com Casablanca --:--

Home/Work/01

Desk+

A furniture marketplace that reads like a magazine — and runs like a back office.

RoleFull-stack lead — 25 of 38 commits
Team404 Not Found, OFPPT
ContextEnd-of-study project, module M206 — Cloud Native
WhenMay — June 2026
Desk+ home page: 'The desk, considered.' in a large serif on a dark background, with issue number, cover story and catalogue button

(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.

API70

routes, three roles

Front43

React components & pages

Schema19

migrations

Repo38

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.

Desk+ pull quote section: a customer quote set large in a serif, between chapters of the home page
Pull quote between two chapters of the home pageRunning locally, seeded data

(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.
Desk+ seller dashboard: greeting, all-time sales of 16,590 MAD, units sold, active listings and an orders-to-fulfil table
Seller dashboard/seller

(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.

Desk+ Cloud login screen: 'Premium office command.' in condensed type with a red sign-in button
Desk+ Cloud — seller consoleVanilla JS · supabase-js · Vercel

(05)

Stack

FrontReact 19, TypeScript, Vite, React Router 7, Zustand, TanStack Query, React Hook Form + Zod, Tailwind, Recharts
APILaravel 11, Sanctum, Socialite, Mailables
DataSupabase Postgres, Supabase Storage
ToolingDocker Compose for a local database, GitHub, GPL-3.0 licence

(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.

Next case study — 02 Locandwork →

Want this on your team?