mPM (Mark's Project Management) is an open-source, self-hosted project management app for small teams who want a focused alternative to heavyweight issue trackers.
Active development. Usable for local testing and early self-hosting, but the feature set, schema, UI, and deployment story are still moving. Breaking changes are possible until the first stable release.
- Organizations & Projects - workspaces with member management, roles, and admin tooling
- Tasks & Epics - assignment, comments, tags, attachments, and blockers
- Kanban & Sprints - board view, sprint creation, sprint defaults, and dashboards
- Sprint Planning - realtime attendance, story-point voting, tie resolution, and automatic
split-uptagging for estimates of 13 or 21 points - Notifications - activity alerts for relevant task events
- YAML Scaffolding - import/export projects, tasks, sprints, tags, assignees, and blockers
- OAuth Login - Discord and Steam via Laravel Socialite
| Layer | Technology |
|---|---|
| Language | PHP 8.5 |
| Framework | Laravel 13 |
| UI | Livewire 4 · Flux UI 2 · Filament 5 · Mary UI 2 · Tailwind CSS 4 |
| Realtime | Laravel Reverb |
| Database | PostgreSQL |
| Cache / Queue | Redis |
| Media | Spatie Media Library |
| Auth | Spatie Permission · Laravel Socialite |
| Testing | Pest 4 · PHPUnit 12 |
| Local Dev | Laravel Sail |
cp .env.example .env
vendor/bin/sail up -d
vendor/bin/sail artisan key:generate
vendor/bin/sail artisan migrate --seed
vendor/bin/sail npm install
vendor/bin/sail npm run devThe queue worker and Reverb websocket server run as dedicated Sail services:
vendor/bin/sail up -d queue reverb| Task | Command |
|---|---|
| Run tests | vendor/bin/sail artisan test --compact |
| Format PHP | vendor/bin/sail bin pint --dirty --format agent |
| Build assets | vendor/bin/sail npm run build |
| Tinker | vendor/bin/sail artisan tinker |
| View logs | vendor/bin/sail artisan pail |
mPM ships with a production Dockerfile and CapRover configuration for single-server self-hosting.
- Create a new app in CapRover.
- Mount two persistent volumes:
/config- place your production.envhere as.env/app/storage- persists uploads, logs, and framework cache across deploys
- Push to
mainand trigger a deploy via CapRover's webhook.
On first boot the entrypoint will:
- Copy
/config/.envinto the app - Wait for PostgreSQL to be ready
- Seed the storage directory structure if the volume is empty
- Run
php artisan migrate --force - Cache config, routes, and views
- Start PHP, queue workers, the scheduler, and Reverb via Supervisor
See production/.env.example for a production environment template. Key values to set:
APP_URL=https://yourdomain.com
DB_HOST=srv-captain--mpm-db
REDIS_HOST=srv-captain--mpm-redis
REVERB_HOST=yourdomain.com
| Variable | Default | Purpose |
|---|---|---|
QUEUE_WORKERS |
4 |
Number of queue worker processes |
QUEUE_NAME |
default |
Queue name to consume |
Contributions are welcome while the project is active. Keep changes small, tested, and aligned with the self-hosted direction.
Before opening a PR:
- Run the affected Pest tests:
vendor/bin/sail artisan test --compact --filter=YourTest - Run Pint on PHP changes:
vendor/bin/sail bin pint --dirty --format agent - Avoid introducing paid-service or hosted-SaaS assumptions
- Keep setup and deployment paths friendly to self-hosters
mPM is intended to be a copyleft, self-hosted open-source project.
You may not use this code to create, operate, resell, or host a paid project-management service or SaaS offering. A commercial hosted version may exist in the future, but it is not implemented in this repository.
Until a complete LICENSE file is present, do not assume any commercial rights beyond the restriction above. If package metadata conflicts with this README, treat the README as the source of truth.