AtEase is a multi-tenant brand platform for independent service professionals. It is not a marketplace. The main domain sells the product to brand owners. Each owner gets an isolated client site. Clients of Partner A cannot browse Partner B.
| Surface | Who sees it | Route |
|---|---|---|
| B2B marketing home | Prospective brand owners | / |
| Trial signup / login | Brand owners | /signup /login /onboarding |
| Owner dashboard | Authenticated brand owner only | /dashboard |
| Isolated client site | That studio's clients only | /p/[brandSlug] |
There is no public directory of studios. Booking flows stay under /p/[brandSlug]/….
Both brand owners and end-clients sign in with:
- Phone OTP (SMS)
Owners use /login and /signup. Clients sign in on the studio site before a booking is saved. Credentials live in Supabase auth.users. App roles live in public.profiles (brand_owner or client).
Postgres + Auth + Storage is the backend. The React app calls it with the anon key. Row Level Security enforces tenant isolation.
| Table | Purpose |
|---|---|
profiles |
Role + name/phone linked to auth.users.id |
brand_owners |
Studio profile, WhatsApp, theme, trial / subscription |
salons |
Business location(s) for an owner |
services |
Catalog (fixed / starting_at / dual prices, images, active flag) |
appointments |
Bookings (client, service, slot, status, source) |
clients |
Per-studio customer history + lifetime value (trigger on booking) |
business_analytics |
Monthly booking count / revenue (trigger on booking) |
| Schema | Role |
|---|---|
auth.users |
Google / phone / email identities. brand_owners.user_id and profiles.id point here. |
storage.objects |
Metadata for logos, covers, service photos in buckets brand-assets and service-images. |
SQL, RLS, triggers, and storage policies:
- Existing Supabase DB (you already created
bookings):supabase/migrations/002_upgrade_existing.sql - Empty project only:
supabase/migrations/001_init.sql— do not run this on top of the master query
Click-by-click dashboard setup: supabase/README.md
| Layer | Tool |
|---|---|
| App | React 19 + Vite + React Router v7 |
| State | Zustand |
| Style | Tailwind CSS + AtEase tokens |
| Backend | Supabase (Auth, Postgres, RLS, Storage) |
cd app
npm install
cp .env.example .env.local
# fill VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY
npm run devOn Windows PowerShell, if npm is blocked, use npm.cmd run dev.
Until env vars are set, the UI still runs with local demo data. Google and phone login need a live Supabase project.
Useful URLs
- Platform:
/ - Owner login:
/login - Dashboard (after auth):
/dashboard - Example tenant:
/p/rajkumari-beauty
AtEase/
├── app/ React + Vite client
│ ├── src/
│ │ ├── lib/supabase/ Supabase client split by domain
│ │ │ ├── client.js
│ │ │ ├── auth.js Google + phone OTP + email
│ │ │ ├── profiles.js
│ │ │ ├── brandOwners.js
│ │ │ ├── salons.js
│ │ │ ├── services.js
│ │ │ ├── appointments.js
│ │ │ ├── clients.js clients + analytics reads
│ │ │ └── index.js
│ │ ├── screens/ Landing, auth, dashboard, tenant site
│ │ ├── components/auth/ Guards + AuthMethods
│ │ └── store/useAppStore.js
│ └── .env.example
├── supabase/
│ ├── migrations/001_init.sql Schema + RLS + triggers + storage
│ └── README.md Dashboard checklist
├── PRD.md
└── README.md
MIT. Built for independent service professionals who need a branded site, not a marketplace listing.