Mobile-first Super Nails web app built as a progressive web app with a lightweight SQLite backend.
client/: React + TypeScript + Viteserver/: Express + SQLite viabetter-sqlite3- PWA assets:
client/public/manifest.webmanifest,client/public/sw.js
- Booking home flow inspired by the reference screenshots
- Salon selection with search, province chips, and filter pills
- Stylist, date, and time-slot selection
- Service selection with sticky total summary
- SQLite seed data for salons, stylists, services, and time slots
- Booking API that stores reservations and blocks booked slots
Install dependencies:
npm install
npm --prefix client install
npm --prefix server installStart the client and local Express API:
npm run devBy default the client uses the local API. When VITE_API_URL is unset, browser requests stay on /api and Vite proxies them to http://127.0.0.1:3001.
To opt into the hosted API for manual testing, copy client/.env.example to client/.env.local and set VITE_API_URL there.
- Web app: http://127.0.0.1:5173
- API: http://127.0.0.1:3001/api/health
npm run dev
npm run lint
npm run typecheck
npm run build
npm start
npm run test:e2eGET /api/healthGET /api/staticGET /api/slots?salonId=...&date=YYYY-MM-DDPOST /api/bookingsGET /api/bootstrapis still available as a legacy endpoint and static fallback source
Build both client and server:
npm run buildStart the Express server, which serves the built PWA:
npm startThen open http://127.0.0.1:3001.
This repo is set up for Node v20.19.3 via .nvmrc.
If native modules break because of an x64/arm64 mismatch on macOS, remove node_modules, client/node_modules, and server/node_modules, then reinstall under the pinned Node version.
The SQLite file is created automatically at:
server/data/super-nails.sqlite
It is seeded on startup with demo salons, stylists, services, and booking slots.