popertots 2e1ab9d745 feat: Square payment integration, booking flow redesign, and timezone/weekday fixes
- Add Square payment integration (mock + handlers + UI): terminal/online payments,
  refunds, tips, saved cards, webhooks. Build-tagged dev/prod clients.
- Redesign booking flow: Step 4 conditional (deposit only), Step 5 confirmation
  screen with booking ID, auto-submit on transition.
- Redesign schedule modal: 2x3 button grid with Pay Deposit/Pay Early logic.
- Add deposit warning banner at Step 1 for users with outstanding deposits.
- Fix weekday conversion bug: Go 0=Sunday vs DB 0=Monday mismatch in 6 locations.
- Fix timezone bug: UTC vs London time in closing hours validation.
- Fix frontend error parsing: plain text backend errors now displayed correctly.
- Fix crypto.randomUUID fallback for environments without Web Crypto.
- Add 7 new regression tests: closing hours, advance check, active booking limit,
  weekday conversion, UTC/London, deposit snapshot, exceptional hours.
- Fix 3 flaky tests: dynamic dates instead of fixed, no-show timing.
2026-05-23 11:29:34 +01:00
2026-05-17 11:03:05 +01:00
2025-10-31 23:11:33 +00:00

Crussell

Nail salon booking platform — Go 1.25 backend + SvelteKit 5 frontend + Docker. Built for a UK sole-trader nail artist.

Features

  • Three booking flows: self-service (customer), walk-in (admin), call-in (admin)
  • Slot reservations: temporary holds prevent double-booking (4 TTL types)
  • Guest accounts: disposable accounts for one-off bookings, GDPR-compliant anonymization
  • Service eligibility: age requirements + patch test validation
  • Deposit system: 3-strike rule for late cancellations, 24-hour threshold
  • Scheduling: default hours, holiday overrides, time blockers
  • Loyalty & discounts: stamp-based loyalty, time-based and milestone campaigns
  • Portfolio gallery: S3/R2 storage with tag/category filtering
  • CardDAV sync: profile photos synced to SabreDAV contacts
  • Admin notifications: priority-sorted queue with bell icon, /notifications page, acknowledge flow
  • User notification preferences: per-channel toggles (email, SMS, browser) in account settings

Project Structure

Crussell/
├─ backend/            # Go 1.25 + chi router API
├─ frontend/           # SvelteKit 5 SPA (static build)
├─ sabredav/           # PHP + Composer for DAV
├─ nginx/              # Nginx reverse-proxy for HTTP & HTTPS
├─ init-scripts/       # PostgreSQL init SQL
├─ compose.yml         # Docker-Compose definition
├─ local-dev-2.sh      # Dev helper using tmux (seeds DB with test data)
└─ README.md

Prerequisites

Tool Version
Docker & Docker Compose >= 20.10
Go >= 1.22
Node >= 18 (npm)
tmux >= 3.0

Getting Started

Docker Compose

cp .env.example .env
# Edit .env — set POSTGRES_*, JWT_SECRET_KEY
docker compose up --build -d
Service URL
Frontend http://localhost
API http://localhost/api
SabreDAV http://localhost/dav

Local Development

chmod +x local-dev-2.sh
./local-dev-2.sh

Launches a tmux session (crussell-dev) with 4 panes: psql console, Go dev server, Svelte dev server, and Rustfs logs. Seeds the database with 20 users, 12 services, 43 bookings, guest accounts, time blockers, and exceptional hours.

Default login (all password: password):

  • Admin: admin@example.com
  • User: user@example.com

Building & Testing

# Backend
cd backend && go build -o bin/backend ./main.go

# Frontend
cd frontend && npm ci && npm run build

# Tests (306/308 passing)
cd backend && go test -tags test ./...

Full Documentation

For detailed user journeys, admin workflows, architecture, API reference, and database schema, see obsidian/Crussell/.

S
Description
Nail salon website with booking system and portfolio
Readme
48 MiB
Languages
Go 64.6%
JavaScript 16.5%
Svelte 14.8%
TypeScript 1.9%
PLpgSQL 1.2%
Other 0.9%