rayzenai / project-management-app
Laravel + Inertia + Svelte host app for the rayzenai/project-management workspace package.
Package info
github.com/rayzenai/project-management-app
Type:project
pkg:composer/rayzenai/project-management-app
Requires
- php: ^8.5
- inertiajs/inertia-laravel: ^3.0
- laravel/framework: ^13.17
- laravel/sanctum: ^4.3
- laravel/tinker: ^3.0
- laravel/wayfinder: ^0.1.14
- rayzenai/project-management: ^1.1
Requires (Dev)
- fakerphp/faker: ^1.24
- larastan/larastan: ^3.9
- laravel/pail: ^1.2.5
- laravel/pao: ^1.0.6
- laravel/pint: ^1.27
- laravel/sail: ^1.53
- mockery/mockery: ^1.6
- nunomaduro/collision: ^8.9.3
- pestphp/pest: ^4.7
- pestphp/pest-plugin-drift: ^4.1
- pestphp/pest-plugin-laravel: ^4.1
README
Project & task tracking workspace for PMOPM (Office of the Prime Minister and Council of Ministers) — projects → tasks → subtasks, assignments, notes, contacts, teams, members, activity log, and notifications, with a JSON API for a companion mobile client.
The workspace itself (models, services, controllers, authorization, the whole
/workspace/* + /api/v1/* surface) is shipped by the
rayzenai/project-management
Composer package. This repo is the host app: it wires the package into a
Laravel + Inertia + Svelte project and adds the app-specific bits (appearance
API, user preferences, theming).
Tech stack
- Backend: Laravel 13, PHP 8.5, Sanctum (API token auth for the mobile client)
- Frontend: Inertia.js + Svelte 5, Tailwind CSS v4, Vite
- Workspace engine:
rayzenai/project-management(Composer package) - Testing: Pest
- Formatting/linting: Laravel Pint (PHP), ESLint + Prettier +
svelte-check(JS/TS/Svelte)
Requirements
- PHP 8.5
- Composer 2
- Node 22 + npm
- PostgreSQL — the workspace package ships a
pg_trgmmigration for fuzzy task search, so Postgres is the supported database (the migration no-ops on other drivers, and you lose command-palette search) - Redis — cache, sessions, and the queue
- Docker (optional) — only to run the deployment image locally via
./dock.sh
Quick start
git clone git@github.com:nepal-government/pmopm.git
cd pmopm
composer setup
composer setup runs the full bootstrap in one shot: composer install, copies
.env.example to .env, generates the app key, runs migrations, and installs +
builds the frontend.
Manual setup
If you'd rather run the steps yourself (or something in composer setup fails):
composer install cp .env.example .env php artisan key:generate # Create the database, then set DB_* / REDIS_* in .env to match your setup: createdb pmopm php artisan migrate npm install npm run build # production build # or: npm run dev # Vite dev server with HMR
Then serve the app with php artisan serve, or use composer dev, which runs
php artisan dev (server + queue listener + Vite, concurrently).
Configuration
Beyond the standard Laravel .env values, the workspace package reads:
| Variable | Purpose |
|---|---|
PM_SUPER_ADMINS |
Comma-separated emails granted the manage-workspace gate (full super-admin access) |
PM_SUPER_ADMIN_PASSWORD |
Default password used by the super-admin seeder |
PM_TRASH_TTL_DAYS |
Days a soft-deleted workspace record survives before it's pruned (default 30) |
PM_REMINDERS_RUN_AT |
Time of day the deadline-reminder command runs (default 08:00) |
Package config can be published (optional) with:
php artisan vendor:publish --tag=project-management-config
Using the app
/redirects to/workspace.- Web (Inertia) —
/workspace/*, session auth, branded login at/workspace/login. - JSON API —
/api/v1/*, Sanctum bearer auth, built for the companion mobile client.
The project-management package
Everything workspace-shaped (routes, models, services, authorization rules) lives in the package, not this repo. Before making changes that touch projects/tasks/teams/etc., read:
vendor/rayzenai/project-management/README.md— full HTTP API reference (web + JSON)vendor/rayzenai/project-management/CLAUDE.md— architecture and conventions
Testing & quality
composer test # config:clear + php artisan test (Pest) composer lint # Pint (fixes) composer lint:check # Pint (check only) npm run lint # ESLint (fixes) npm run lint:check # ESLint (check only) npm run format # Prettier (fixes) npm run format:check # Prettier (check only) npm run types:check # svelte-check composer ci:check # everything CI runs: lint/format/types checks + tests
CI
GitHub Actions run on every push/PR:
.github/workflows/lint.yml— Pint + frontend lint/format.github/workflows/tests.yml— Pest, type checks, and asset build across the PHP matrix
Docker & deployment
Dockerfile is the real deployment artifact, built by Dokploy straight from a git
clone. Three stages: Composer vendor → asset build (PHP + Node 22, because the
wayfinder Vite plugin shells out to php artisan wayfinder:generate during
vite build) → serversideup/php:8.5-fpm-nginx serving on port 8080.
AUTORUN_ENABLED=true makes the container run migrate --force, storage:link,
and optimize at boot.
Run that exact image locally against your own Postgres and Redis:
./dock.sh build # build the image and start it on http://localhost:8101 ./dock.sh logs # follow container logs ./dock.sh artisan migrate:status ./dock.sh shell ./dock.sh down
dock.sh derives a container env from your .env, rewriting loopback hosts to
host.docker.internal. The image bakes the source in at build time, so code
changes need a rebuild — for day-to-day dev use composer dev.
Deployed as three Dokploy applications off this one image:
| Application | Command | Notes |
|---|---|---|
pmopm-api |
(image default) | The only app with a domain; runs migrations via AUTORUN |
pmopm-scheduler |
php artisan schedule:work |
workspace:prune-trashed daily + workspace:send-deadline-reminders at PM_REMINDERS_RUN_AT |
pmopm-queue |
php artisan queue:work redis --sleep=3 --tries=3 --max-time=3600 |
Both workers need AUTORUN_ENABLED=false (so they don't race the web app's
migrations) and a disabled Swarm healthcheck (they don't run nginx). See
~/rayzen/DOKPLOY.md §4 for the full playbook.