LibreNexus is a free, MIT-licensed, multi-tenant appointment scheduling system for small offices (clinics, salons, studios, advisors). Each tenant has staff, services, availability, a public booking page, and appointments booked by customers, with email confirmations, reminders, and customer self-service.
This repository is also a verified-app experiment: the application was built
against the predefined, measurable quality benchmark in specs/. The
claim is not "this repo is perfect" but "this repo passed a predefined, public,
reproducible quality benchmark." Every badge above links to a public run.
- Tenant isolation by construction: a fail-closed global scope guards every tenant-owned model, enforced by an architecture test and a named regression suite (ADR-0002).
- Double-booking is impossible: a partial PostgreSQL GiST exclusion constraint on the buffered time range, proven by a concurrency suite that races two live database connections (ADR-0003).
- A pure, mutation-hardened slot engine handling timezones, DST in both directions, buffers, lead times, and booking horizons.
- Queued, branded confirmation, cancellation, reschedule, and reminder emails; tokened customer self-service without accounts.
Requirements: PHP 8.4, Composer, Node 22, PostgreSQL (databases librenexus
and librenexus_test), plus the security toolchain (gitleaks, semgrep,
osv-scanner, syft) for the full pipeline.
make setup # install deps, env, migrate, seed demo data, build assets, install browsersSeeding (idempotent, also run by make setup via php artisan db:seed)
creates an explorable demo tenant at /demo-clinic with staff, services,
availability, and sample appointments, plus a demo owner login
(demo@librenexus.test / password). The seeder refuses to run in production.
make setup && make verifymake verify chains every gate: format, complexity/dead code, static analysis
(PHPStan level 7), duplication, unused/implicit dependencies, tests, coverage
(>= 80%), mutation (>= 70%), browser E2E, secrets, SAST, dependency audits,
accessibility (WCAG 2.1 AA), performance (Lighthouse budgets), and the SBOM.
make help lists each target. CI (ci.yml) runs the
same targets on every push; the badge above links to the public runs.
The accessibility and performance gates run against APP_URL. CI serves the
app on 127.0.0.1; locally run php artisan serve and pass
APP_URL=http://127.0.0.1:8000, since Lighthouse requires a secure context
(localhost qualifies, a plain-HTTP custom domain does not).
- Quality report and scorecard:
docs/quality-report.md - Per-epic structured reviews (six roles each):
docs/reviews/ - Architecture decisions:
docs/adr/ - Assumptions and deferred findings:
docs/assumptions.md - Security scan outputs and SBOM (
reports/sbom.cdx.json): generated bymake security sbom, uploaded as CI artifacts on every run - Gate definitions and thresholds:
specs/quality-gates.md