A comprehensive R&D project management platform for multi-site organizations.
- Gantt chart visualization — Interactive timeline with drag & drop, resize phases
- Resource management — Staff allocation with percentage-based assignments
- Equipment scheduling — Book equipment across projects and phases
- Multi-tenant architecture — Separate databases per organization
- Organization-level SSO — Microsoft Entra ID with group-based access control
- Cross-site visibility — View resources across locations while maintaining confidentiality
- What-If planning — Scenario planning without affecting production data
- Real-time collaboration — WebSocket-powered live updates
- Import/Export — Microsoft Project (CSV, XML, MPP) support
- Mobile responsive — Touch-optimized for tablets
- Backend: Python 3.11+ / FastAPI / SQLAlchemy 2.0 (async) / PostgreSQL 15+
- Frontend: React 18 / TypeScript / Zustand / Vite / TanStack Query
- Deployment: Docker / Docker Compose
- Documentation: MkDocs Material / Cloudflare Pages
Click the badge above to launch a fully configured environment with PostgreSQL, Python, Node.js, and a pre-seeded demo tenant.
After the Codespace starts, run:
# Start the backend
uvicorn app.main:app --host 0.0.0.0 --port 8485 --reload
# In another terminal, start the frontend dev server
cd frontend && npm run dev -- --host 0.0.0.0 --port 3333The Codespace automatically creates a demo tenant with sample data:
| Access | URL | Password | |
|---|---|---|---|
| Admin Portal | /admin/ |
admin@demo.local |
demo1234 |
| Demo Tenant | /t/demo/ |
admin@demo.local |
demo1234 |
The demo tenant includes 2 sites (Winterthur, Frankfurt), 4 projects with phases and assignments, 8 staff members with skills, and 8 equipment items. All staff accounts use password demo1234.
git clone https://github.com/vincentmakes/milestone-planner.git
cd milestone-planner
cp .env.example .env
docker compose -f docker-compose.fresh.yml up -dThis starts PostgreSQL + the app with auto-initialization. Check docker logs milestone-fresh for the admin password. Access at http://localhost:8486/.
cp .env.example .env
# Edit .env with your database credentials and secrets
# Set up the database
psql -U postgres -f setup_databases.sql
# Start the application
docker compose up -dAccess at http://localhost:8485/.
Full documentation is published at docs-milestone.verdet.me.
| Resource | Description |
|---|---|
| User Guide | Day-to-day usage: Gantt charts, staff, equipment, vacations |
| Admin Guide | Installation, multi-tenant management, SSO configuration |
| Developer Guide | Architecture, local development, API reference |
| Development Guide | Quick reference for making changes |
| API Documentation | Swagger UI (when running) |
milestone-planner/
├── app/ # FastAPI backend
│ ├── main.py # Application entry point
│ ├── config.py # Pydantic settings
│ ├── database.py # Tenant DB engine/session
│ ├── routers/ # API endpoints (20 modules)
│ ├── models/ # SQLAlchemy models (14 modules)
│ ├── schemas/ # Pydantic schemas
│ ├── services/ # Business logic (encryption, SSO, tenant management)
│ └── middleware/ # Auth and tenant middleware
├── frontend/ # React frontend source
│ └── src/ # Components, stores, API clients, types
├── docs/ # MkDocs documentation source
│ ├── user-guide/ # End-user documentation
│ ├── admin-guide/ # Admin & multi-tenant docs
│ └── developer-guide/ # Architecture & API reference
├── .devcontainer/ # GitHub Codespaces configuration
├── .github/workflows/ # CI/CD (lint, test, build, docs deploy)
├── migrations/ # Raw SQL migration files
├── scripts/ # Utility scripts
├── public/ # Served frontend (built from frontend/dist/)
├── docker-compose.yml # Production deployment
├── docker-compose.fresh.yml # Self-contained fresh install
├── docker-compose.dev.yml # Development with hot reload
├── Dockerfile # Multi-stage container build
├── mkdocs.yml # Documentation site config
├── setup_databases.sql # Complete database schema
└── .env.example # Environment template
For SaaS deployment with multiple organizations:
- Set
MULTI_TENANT=truein.env - Configure master DB settings (
MASTER_DB_HOST,MASTER_DB_NAME, etc.) - Set
TENANT_ENCRYPTION_KEY(64-char hex, required) - Set
PG_ADMIN_USER/PG_ADMIN_PASSWORDfor auto-provisioning - Access admin panel at
/admin/
Each tenant gets an isolated PostgreSQL database. Credentials are encrypted with AES-256-GCM. See the Multi-Tenant Management Guide for details.
| URL | Description |
|---|---|
/ |
Main application |
/t/{slug}/ |
Tenant-specific access |
/admin/ |
Multi-tenant admin panel |
/api/docs |
API documentation (Swagger) |
/health |
Health check endpoint |
Key variables (see .env.example for full list):
| Variable | Description |
|---|---|
DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD |
PostgreSQL connection |
SESSION_SECRET |
Secret for session signing |
MULTI_TENANT |
Enable multi-tenant mode (true/false) |
MASTER_DB_HOST, MASTER_DB_NAME, etc. |
Master DB (multi-tenant only) |
TENANT_ENCRYPTION_KEY |
64-char hex for credential encryption |
PG_ADMIN_USER, PG_ADMIN_PASSWORD |
For auto-provisioning tenant DBs |
Proprietary - All rights reserved