Multi-tenant SaaS for managing buildings, cameras and daily photo albums.
- Backend: Laravel 12 modular monolith (
laravel-vision/) with Passport OAuth, Spatie Permission (teams mode keyed oncompany_id), Reverb broadcasting. - Frontend: React 19 + TypeScript + Vite (
react-vision/), built on top of MineralUI Pro — every page composes Pro components (MAppShell,MCardGrid,MTreeView,MTabs,MModal, …). MineralUI Pro is a hard dependency; the project does not ship its own design system. - Realtime: Laravel Reverb (WebSocket).
- Storage: MySQL 8 + Redis 7 (cache, queues, sessions).
docker compose up --buildFirst boot takes ~2 min (Composer install, migrations, Passport keys, Vite first compile). Then open http://localhost:5173 — the app routes you to /install and the wizard provisions the first company, admin and root object.
| Path | Purpose |
|---|---|
laravel-vision/ |
Laravel 12 API. 10-folder domain contract, single-action controllers. |
react-vision/ |
React 19 SPA. Feature-first folders, MineralUI Pro components. |
docker/ |
Dockerfiles, supervisord config, laravel-init.sh bootstrap script. |
docker-compose.yml |
Five-service stack: mysql, redis, laravel-vision, reverb-vision, react-vision. |
Production deployment artifacts live in
prod/(gitignored) — generated byprod/build.shfor HestiaCP-based hosting (single domain, Apache+nginx hybrid, PHP-FPM 8.4, Supervisor for queue + Reverb).
docker compose down -vDrops volumes and lets laravel-init.sh rebuild the database from scratch on the next up. After the reset you also need to flip APP_INSTALLED=false in laravel-vision/.env so the installer reopens.
docker/README.md— container layout, ports, common exec commands.laravel-vision/README.md— domain contract, request flow, auth.react-vision/README.md— frontend structure, conventions, dev tips.