All work

Hair salon — immersive site and booking

A site that feels like the salon, with online booking and an iPad agenda of its own.

Stack:
  • Astro
  • React
  • Three.js
  • GLSL
  • Cloudflare Workers
  • Cloudflare D1
  • Resend
  • Playwright
Launch video · 9:16
  • 100Lighthouse accessibility, best practices and SEO
  • 348 mslargest contentful paint
  • 6.9 → 1.7 s3D ready on a phone, after tuning

Mirror, chair and a booking engine of its own

Tap a block to see what it does.

  • Logic
  • People
  • Input
  • Infrastructure
  • Data
  • Output

The heart of the system

The salon's own system

A WebGL home with the feel of the place, a booking engine the salon owns instead of a rented tool, an iPad agenda for the staff and reminders that go out on their own, all on Cloudflare.

Connected to Booking engine, Staff agenda, Booking wizard, WebGL home, Reminder cron, Cloudflare D1, SMS and email

The problem

A hair salon lived on Instagram and WhatsApp, and the booking tool it relied on was being shut down. It needed a site with the feel of the place (black marble, gold, a neon sign) instead of a template, plus a booking system and a staff agenda it would own.

What I built

  1. I built the home as a WebGL scene: a black-marble wall, a neon sign traced from the real logo, and thousands of GPU-drawn hair strands that change with each service and follow the cursor.
  2. I extended the booking engine from an earlier client project: 30-minute slots, local time with daylight saving, signed links to move or cancel, email with a calendar invite, SMS.
  3. I built an iPad agenda for the staff: one column per stylist, long-press to drag, arrived, paid and no-show states, refreshed every 5 seconds.
  4. I added a cron worker that sends reminders every 15 minutes and anonymises old customer data.
  5. I threw away the first version after a scored critique and restarted from a stronger concept, threads of light.

The hard part

Making a shader-heavy home usable on cheap phones. I added device tiers, parallel shader compilation and a render loop that sleeps when nothing moves. With CPU throttling, 3D-ready time on a phone dropped from 6.9 s to 1.7 s and blocking time from 4.8 s to 0.7 s.

Result

The site scores Lighthouse 100 for accessibility, best practices and SEO, with LCP at 348 ms and CLS at 0. The booking flow passes end-to-end checks (new booking, taken slot, too late), after 19 documented QA rounds and with 11 versions that can be restored.

My role

Solo project, directed end to end: I wrote the brand DNA, the rules and the specs, judged every version with a scored critique and tested on real phones. Claude Code wrote most of the code, and I had Codex build a parallel version as a bake-off.