Overview
What Beauty Booth is, what ships in the box, and how the three apps fit together.
Beauty Booth is a production-grade beauty e-commerce platform — a curated skincare, makeup and fragrance apothecary: a customer storefront, an operations dashboard with a seller portal, and a REST API, in one Turborepo + pnpm workspace. It is sold as source code — $99.99, one time, on [Buy Me a Coffee](https://buymeacoffee.com/reactbd/e/579772) — and you own and host what you build with it.

| App | What it is | Stack | Port |
|---|---|---|---|
apps/web | Customer storefront | Next.js 16 · React 19 · Tailwind v4 · Zustand | 3000 |
apps/admin | Operations dashboard + seller portal | Next.js 16 · React 19 · Tailwind v4 | 3001 |
apps/api | REST API + background worker | Express 5 · Mongoose 9 · Stripe · ImageKit/Cloudinary · Swagger | 8000 |
How the pieces talk
Both frontends read from MongoDB through the API — no Next app touches the database directly. The storefront fetches through a single src/lib/api.ts; the dashboard through src/lib/api-client.ts. Authentication is live in all three apps: the API issues a JWT, each Next app stores it in an httpOnly cookie and forwards it server-side.
Images live on your own ImageKit or Cloudinary account under a bloom-booth/ folder tree; MongoDB stores the CDN URLs, never local paths. The package includes a demo beauty catalogue — 67 products across 8 aisles (skin care, makeup, hair care, bath & body, fragrance, men's care, personal care, combos & sets) and 31 sections, 41 brands, 6 journal posts, 3 hero slides, testimonials, sale promos and coupons. pnpm --filter api run assets:upload puts the photos on your CDN and pnpm --filter api run seed:bloom-booth (or pnpm run seed) loads the data into your database.
Design
Light theme only. A small set of semantic colour tokens in one globals.css per app drive every component; the palette (“Cherry Cream”) is a cream page under ivory cards, warm hairlines, cherry-black ink text and a single cherry accent, with a butter pill for the main call to action and a deep-cherry dark band. Type is Poppins 300–700 (primary) for everything people read, Urbanist for titles, and Playwrite GB S (secondary) for the accent words a title marks with _underscores_. Product photos are packshots on white, rendered on white plates with object-contain — never cropped. UI primitives follow the shadcn/ui pattern, restyled onto those tokens.
Engineering standards
- Strict TypeScript, zero `any` in every app — enforced by ESLint.
- Server Components by default;
"use client"only where there is state or events. - Every write endpoint chains
protect, a role gate, andpreventReadOnlyActions. - Money is computed in integer cents on the server; client prices are ignored.
- One
.envat the repo root for all apps, every key commented.