
Overview
Clients pick a service, a professional and a time slot, and pay by card, PIX or in person, without creating an account. Managers run the day, the calendar and the books. Each salon gets a site of its own; a salon is the base case used to build and validate it.
Clients can also book over WhatsApp, with an AI attendant that books, answers and hands the conversation to a person when it should.
What I built
- 01Postgres-first on Supabase, with no backend service: every write goes through a SECURITY DEFINER function, behind row-level security, and a test fails if the anonymous access surface changes.
- 02Reserve-first booking: the slot is held before the client is identified, with a TTL, immediate release and a cron sweep, while Realtime shows other people's reservations as they happen.
- 03Slots are derived at query time, never pre-generated; money is stored in integer cents; multi-employee staffing is built in.
- 04AI attendant on the official WhatsApp Cloud API, built on Claude, with voice notes transcribed by Whisper.
- 0513 scripted evals: a simulated client (another LLM) talks to the real attendant against a local database; code checks the bookings and tool calls, and an LLM judge grades the tone.
- 06Electronic service invoices (NFS-e) issued from the client's record by a service running in a Cloudflare Container.
- 07Every user flow tested end to end with Playwright on desktop, Android and iPhone viewports.
Stack
- Next.js
- React 19
- TypeScript
- Tailwind CSS
- Supabase
- PostgreSQL 17
- WhatsApp Cloud API
- Claude
- Whisper
- Cloudflare Containers
- Vitest
- Playwright