SPB Git

Repository Public

README.md 2.4 KB 56 lines markdown

1# SP Calendar23Self-hosted appointment booking: a public booking site and a private admin area.4Production: **https://calendar.spboucher.ai** · French (Québec) first, English available.56- Visitors pick a real free slot, see it in their own time zone, and submit a **request**; the owner approves,7  declines or proposes another time. A pending request is never shown as a confirmed appointment.8- The owner manages weekly hours, exceptions, private events, appointment types, contacts and settings, and signs9  in with a passkey (Touch ID / Face ID / security key).10- No double booking: per-owner lock, re-check at approval, and a PostgreSQL exclusion constraint.11- Nothing is simulated: every control calls the API; what is not configured says so.1213## Stack1415Next.js 16 · React 19 · TypeScript · Tailwind 4 · PostgreSQL 17 · tsx worker · `@simplewebauthn` · Zod ·16Vitest · Playwright. No Redis (PostgreSQL outbox). Deployed with `mld` under PM2.1718## Local development1920```bash21pnpm install22createdb sp_calendar_dev && createdb sp_calendar_test && createdb sp_calendar_e2e23cp .env.example .env        # DATABASE_URL, APP_URL=http://localhost:8660, APP_SECRET, OWNER_EMAIL, OWNER_NAME24pnpm migrate && node_modules/.bin/tsx scripts/bootstrap.ts   # prints the one-time passkey enrolment link25pnpm build && pnpm start    # http://localhost:8660   (worker: pnpm worker)26```2728`pnpm dev` works for interface work; the end-to-end suite always runs against a production build.2930## Checks3132```bash33pnpm typecheck && pnpm lint && pnpm test && scripts/e2e.sh && pnpm secrets:scan34```3536## Documentation3738| File | Content |39|---|---|40| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | audit, components, availability engine, states, data model |41| [docs/PLAN.md](docs/PLAN.md) | phases, validation record, acceptance tests, **status table** |42| [docs/DECISIONS.md](docs/DECISIONS.md) | decision log |43| [docs/SECURITY.md](docs/SECURITY.md) | authentication, authorisation, privacy (Law 25), known limits |44| [docs/OPERATIONS.md](docs/OPERATIONS.md) | deployment, first sign-in, recovery, e-mail, backups, troubleshooting |4546## Routes4748| Path | Purpose |49|---|---|50| `/` | public profile and appointment types |51| `/book/[slug]` | booking flow |52| `/manage/[token]` | visitor's management link |53| `/privacy` | privacy policy |54| `/admin` … | dashboard, requests, agenda, availability, types, contacts, settings |55| `/api/v1/public/*`, `/api/v1/auth/*`, `/api/v1/admin/*`, `/api/health` | API |56
Files main
Menu

Theme