Strike & Restore
A booking system for a resort spa's own team — massage and boxing sessions on a weekly grid, with double-booking made impossible at the database rather than in the interface.

0
Guest details on the public surface
1
Postgres index preventing double-booking
2
Services on one scheduling engine
0
CSS frameworks used
What it needed to do
The spa's therapists and owner needed to put a session on the books in seconds and be certain the slot was genuinely free. Sessions run as one-hour slots across a seven-day grid: massage from three therapists sharing a single room — or delivered to the guest's own room when it is occupied — and boxing on its own schedule and its own hours.
What I built
A weekly grid where availability updates live over Supabase Realtime, so two people looking at the same screen see the same free slots without refreshing. The part worth pointing at is the safety net underneath it. Double-booking is not prevented by disabling buttons — it is a partial unique index in Postgres on the service, date and slot where the booking is still active. Two people confirming the same hour in the same instant means one insert fails at the database, whatever the interface happens to be doing. Most booking systems solve this in the UI and quietly break under concurrency; this one cannot. The public surface reads from a view that exposes only slot state — no names, no room numbers, no phone numbers — so it is structurally incapable of leaking a guest. Staff sign in for the rest: guest details, history, cancellations, and blocking out unavailability. Every booking sends a confirmation email and lands in the spa's Google Calendar automatically. Built in plain CSS modules throughout — no utility framework, no component library, every surface hand-written.
Stack used
- Next.js 14
- React 18
- Supabase
- PostgreSQL
- Google Calendar API
- Nodemailer
- CSS Modules
- Vercel
- Service tier
- Custom Build
- Industry
- Hospitality · Resort spa
- Year
- 2026
Next case study
AL Lending
A lending book that had outgrown Google Sheets, rebuilt as a transactional loan management system for the staff who use it every day.
Ready to build something that earns its keep?
Tell us about the project. You'll get a straight answer on scope, timeline, and price — usually within one business day, and always before you're asked for anything.
Prefer email? siteandriseweb@gmail.com