One tool. Every chair.

A booking, staff and point-of-sale system for a boutique salon. Built in about a month, in daily use with real payments.

  • ~1 monthone person with AI tools
  • 399automated tests
  • 1server
  • 0front-end frameworks
The staff schedule on a desktop: three stylist columns, color-coded appointments, one staff-added overlap and warning chips on clients with missed visits.
The same schedule on a phone, one stylist column wide.

Studio Aurelle is a pseudonym. Screens use a practice database with invented names. Built with Claude, with Antigravity also contributing, for a friend's salon; I am not the owner.

The staff app

Built for a stylist with one free hand.

Used all day on phones and desktops. It is live, so a broken release costs real appointments.

Studio Aurelle staff schedule on mobile 1 2 3 4

Interactive screen · Hover notes or scroll to inspect

Schedule

The day at a glance.

Designed for quick glancing between chairs with zero horizontal scrolling.

  • 1
    Category colors for Hair Cut, Color, Perm, Treatment and Styling.
  • 2
    Off-shift shading shows who is not working.
  • 3
    Overlap on purpose. Staff can double-book; clients cannot.
  • 4
    Attendance chips flag clients with missed visits.

Appointment panel

The whole visit, one tap from the chair.

The stylist taps an appointment and sees client history, attendance flags, and mixing records without retyping.

  • 1
    Attendance warning with the last missed visit.
  • 2
    Itemized ticket with a running total.
  • 3
    Formula notes entered at checkout resurface next visit.
  • 4
    Checkout opens without retyping anything.
Appointment panel with attendance warning, itemized ticket, formula notes and Checkout button 1 2 3 4

Practice data, invented client · In-device ticket scroll

Message Client dialog with Text, Email or Both and a live preview of the exact text that will be sent.
Practice data, invented client.

Messaging

See the exact text before it goes.

Text, email or both, with a live preview of exactly what will be sent.

Checkout dialog with line items, loyalty points, stylist records and payment buttons, with four numbered callouts.
Practice data. Payments run in simulator mode.

Checkout

A till that fits the way the studio is paid.

  1. Loyalty points, ready for the October launch.
  2. Private formula record saved with the ticket, never printed on the receipt.
  3. Cash, split or Other / external for companion tickets and comps.
  4. Square Terminal for card, tap or chip.

The public side

Booking that knows the studio.

Online booking page: choose a stylist or Any stylist, pick a service, then a day and time.
Booking, desktop.
Booking page on a phone: stylist picker, service list and available times.
Booking, phone.
Client self-service page on a phone with Add to calendar, Change the time and Cancel appointment.
Client self-service.

Pick a stylist or "Any stylist, soonest open". Build a visit. Ask to be fitted in when nothing fits. Clients cancel or reschedule from a private link, up to 24 hours ahead.

About 72 overlapping appointments in real history

Decision 1 of 4

Staff may double-book. Clients may not.

A quick cut inside a color's processing time. Staff can place an overlap on purpose. The public form cannot.

A color appointment with a short staff-added haircut overlapping inside it.
Practice data. The ~72 comes from a code comment; the engine was validated on about 936 real appointments.

Decision 2 of 4

The waitlist is triaged by a person.

A freed slot is not offered automatically. Staff see who wanted it and ring them.

  1. A slot opensSomeone cancels or moves.
  2. System prompts staff"Here is who wanted this."
  3. Staff calls the guestOnly if it works for the studio.
  4. Booked, or next nameThen the next guest on the list.

Rejected: automatic offers. They promise things the studio has not agreed to.

Decision 3 of 4

The schedule answers instantly.

A moved card used to snap back for 6 to 18 seconds. Now it moves at once and saves in the background.

Before
DropSnaps back to the old timeJumps
After
DropAlready at the new time

Illustrative timeline, not to scale.

Request time, test server

Before: 3 to 6 seconds
After: about 0.02 seconds
0.02 s
0 s3 s6 s

Test server with a deliberately slow mail server. Bars to scale; the second is too thin to see, so a marker is drawn.

Decision 4 of 4

The interface says only what is true.

A receipt used to say "Auto-sent" whether or not the email went out.

Before
After

Mock-ups with an invented address, redrawn from the real change.

Same rule everywhere: the badge says Offline, not Live, when the server cannot be reached.

Reports

Reports match how the salon thinks.

Earnings table per stylist: visits, services, products, tips, total collected, commission rate and payout.
Practice data, not real results.
Earnings on a phone, one card per stylist with labeled figures.
On a phone, one card per stylist.

Money counts on the day it was paid, per location. Yesterday is one tap.

Smaller decisions

Smaller decisions.

Consent that means somethingRecorded on the server. New clients are texted only if they ticked.
Reminders at 10:00, all yearExactly one run a day for 731 days, across both clock changes.
Refund arithmeticA $30 refund on a $100 ticket capped the next at $40, not $70. Fixed and tested.
Short links in textsA short link replaces a 78-character private one.
No marketing textsNewsletter lists export as CSV. Nothing is sent from the app.
Neighboring screens matchReport tabs share one card, so nothing jumps.

Design system

Quiet luxury, kept quiet.

One stylesheet for the staff app and the public pages.

Product type and components

Playfair Display DayWeekMonth Checkout 1 no-show

Jost for body. Hairline borders, uppercase labels, solid ink buttons.

How it was built

Never deploy by hand.

Two early mistakes led to one rule. Every release now follows the same path.

  1. Check health25 read-only checks on the live site.
  2. Add new filesBy exact name, nothing overwritten.
  3. Swap pages lastOnly after every file is confirmed.
  4. Check againIn a real browser.
  5. Roll back by itselfIf any check fails. A one-line undo is kept.
25 of 25health checks green
Nightlybackups, copied off-site
6AI reviewers per audit round
~2 dozenaudit fixes in two days

Cost

What it cost me. What it could have cost.

This project, 5 years$1,400 to $3,200Two AI tools (assumed about $20 each) and running costs. My own time is not counted.
Subscriptions, 5 years$12,000 to $88,0003 to 5 locations, 10 people each.
Agency build$60,000 to $110,000One time, before running costs.

Estimates from public list prices, not quotes. The comparisons assume 3 to 5 locations; this studio runs one. A quote pays a team for its labor, so it does not compare directly.

Full numbers, calculator and sources
Estimates from public sources, not project data

3 to 5 locations, 10 people each, 5 years. List prices, October 2026. Square, Fresha and Boulevard are subscriptions; the agency and project rows are builds.

Total over 5 years, 10 people per location
Route3 locations4 locations5 locations
Square Appointments Premium
$69 per location per month
$12,420$16,560$20,700
Fresha Team
$14.95 per person per month
$26,910$35,880$44,850
Boulevard Premier
$293 per location per month
$52,740$70,320$87,900
Custom, built by an agency
Build, paid once
$60,000 to $110,000 (quoted for a full platform)
Custom, built by a freelancer$85 to $135 an hour for a mid-level US developer. At the agency's scope that implies roughly 450 to 1,300 hours. No separate total.
Custom, this project
One person, about one month
About $1,400 to $3,200: roughly $40 of AI subscriptions for the build month (assumed Pro-tier prices of about $20 each), plus $275 to $633 a year to run it (table below).

Time: subscriptions need no build; agencies quote 12 to 14 weeks for a first version and 16 to 20 for a full platform; this project took about one month. The agency row is the build alone; the calculator adds running costs. A full-time in-house developer is left out, since nobody would hire one just to run one salon system.

What this project costs to run, per year (estimated from public list prices)
ItemPer yearBasis
Server (VPS)$108 to $294A mid-size VPS plan at $8.99 to $24.49 a month, Hostinger-class pricing.
Domain$10 to $23.com at wholesale to typical renewal price.
Business email$7 to $19One mailbox at $0.59 to $1.59 a month.
Text number and campaign$32 to $134Number $1.15 a month; campaign $1.50 to $10 a month. One-time registration of about $20 to $60 is not included.
Texts sent$120 to $140Assumes about 30 a day (one launch day, extrapolated), at $0.0079 plus $0.003 to $0.005 carrier fees a segment.
Backup storage$0 to $24Google Drive 100 GB at $1.99 a month, if the free tier is not enough.
Total$275 to $633About $23 to $53 a month. Square card-processing fees are excluded, as every route pays them.

Try your own numbers

RouteTotal over the years chosenPer month, averaged

Boulevard uses $176 for 5 people or fewer per location and $293 above that. The two custom rows are the one-time build or AI cost plus the yearly running costs from the table above, so they grow with years. My own time is not counted.

Not like for like. These are list prices as found in October 2026 and they change. They leave out payment processing, add-ons, taxes and any upkeep after launch. The subscriptions include hosting; a custom build does not. The vendor estimates cover a generic salon platform; this project also has carrier-approved texting, an audit trail, per-location reports and a deploy safety system, which the vendor pages do not itemize.

Sources

Results

Results so far.

In daily useReal bookings and card payments every day.
Reminders landedFirst full day: about 30 texts at 10:00, all delivered.
Compliance clearedRejected several times, then approved once the consent page was fixed.
Not measuredConversion, revenue impact and time saved per day. No claim is made.

Next: a loyalty program launches with the grand opening.