Hotel operations app built from years of real front-desk work, with a shift scheduler that solves the monthly roster with constraint programming.
It complements the hotel's commercial PMS (Opera): logbook, parking, maintenance, groups, cashier, blacklist, staff scheduling, shift checklists, F&B revenue and invoice backoffice.
| Staff scheduling (OR-Tools) | Parking |
|---|---|
![]() |
![]() |
- Frontend: Next.js 16 (App Router), React 19, Tailwind CSS, NextUI.
- Backend: Express 5 + TypeScript, MySQL 8, Cloudinary for files.
- Scheduling: Python + OR-Tools (CP-SAT) solver, run as a child process.
Full documentation lives in docs/:
- General — architecture, roles, stack, deployment, local setup.
- Logbook
- Parking
- Maintenance
- Groups
- Scheduling (solver)
- Checklist
- Cashier
- F&B
- Backoffice
- Blacklist
- Conciliation
- Public demo — how the demo account works and when it resets
A public demo runs on the project site: Try our live demo on the login page signs you in as an administrator, with fictitious data that resets every day. User management and settings are locked there. To see everything, run it locally.
You need Node ≥ 22.16, pnpm, Python 3.11+ (for the scheduling solver) and
MySQL 8, either installed or through Docker. frontend/ and backend/ are
independent pnpm projects, each with its own lockfile.
# 1. Settings: copy and fill in (LOCAL_DB_USER=root, a LOCAL_DB_PASSWORD of
# your choice, a long random SECRET_JWT_KEY)
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env.local
# 2. MySQL in Docker (skip it if you already run MySQL 8; if that one uses
# port 3306, set LOCAL_DB_PORT=3307 for Docker)
docker compose --env-file backend/.env up -d
# 3. Database: tables, the local admin and fictitious data in every module
# (scheduling included). It creates hotel_db and refuses to touch one that
# already has tables (add -- --force to replace it)
cd backend && pnpm install && pnpm setup:local
# 4. Scheduling solver (once)
cd scheduling-solver && python -m venv venv
venv/Scripts/pip install -r requirements.txt # Linux/macOS: venv/bin/pip
cd ..
# 5. Run, in two terminals
pnpm dev:local # backend/: API on :4000
cd frontend && pnpm install && pnpm dev # http://localhost:3000Sign in as admin / fourpoints-local: a full administrator,
users, roles and settings included. The password is public on purpose:
setup:local only runs against a local database, so this account never
exists anywhere else. Change it in Profile if you like.
Uploading photos and PDFs needs a Cloudinary account in backend/.env.
Without it everything else works, and an upload just says storage is not
configured.
This project is licensed under the MIT License — see the LICENSE file for details.


