Two files.
One command.
Download docker-compose.yml and .env, run docker compose up, done.MIT-licensed. No usage limits. Your data stays on your network.
Requirements
Anything that can run Docker.
Docker
24+
Docker Compose
v2+
RAM
2 GB
Disk
5 GB
Quick Start
From zero to running in 4 steps.
Rename .env.example → .env
Start the stack
First run takes ~1–2 minutes while images download.
Open the web UI and log in
What's inside
Six services. One compose file.
Frontend
Next.js web UI
Backend
.NET API + render engine
PostgreSQL
Application database
MinIO
Template & report storage
Font Syncer
Mirrors fonts into the render volume
Gotenberg
DOCX/XLSX → PDF conversion
Going to production
Three things to handle before going live.
Change these secrets
The defaults work on localhost but must be rotated before you expose the instance.
| Variable | Purpose |
|---|---|
| ADMIN_EMAIL | Initial admin login |
| ADMIN_PASSWORD | Initial admin password |
| DB_PASSWORD | PostgreSQL password |
| MINIO_ACCESS_KEY | MinIO root/access key |
| MINIO_SECRET_KEY | MinIO root/secret key |
| JWT_KEY | JWT signing key — at least 32 characters |
| ENCRYPTION_KEY | AES key — exactly 32 characters |
| ENCRYPTION_IV | AES IV — exactly 16 characters |
Generate strong secrets
The admin user is re-applied on every restart — blank out ADMIN_PASSWORD after first login so the seeder skips on subsequent boots.
Reach it from another device
When opening the UI from another device, localhost points to that device, not the server. Update .env with browser-reachable URLs:
VPN / LAN
Domain + HTTPS
Use external PostgreSQL or S3
Already running your own database or object store? Point the stack at it and disable the bundled service.
Your own PostgreSQL
Then disable the postgres service in docker-compose.yml.
S3-compatible store
Then disable the minio service.
Activate Pro
Already have a license?
Drop your license file next to docker-compose.yml and restart the backend. (Feature comparison is at the bottom of this page.)
With a license file
- Place license.json next to docker-compose.yml.
- Uncomment Pro__LicenseFile env and the volumes: block under backend (see diff below).
- Run docker compose restart backend.
License is validated offline — no call to Qorstack.
Check active flags: curl http://localhost:8080/features
Day-2 ops
Update, stop, wipe.
Update
Stop (keep data)
Stop + wipe data
Troubleshooting
Something not working?
Check the logs
| Symptom | Check |
|---|---|
| Login fails on first run | ADMIN_EMAIL, ADMIN_PASSWORD, backend logs |
| Frontend cannot call API | API_URL, CORS_ORIGINS |
| Previews / downloads fail | MINIO_PUBLIC_ENDPOINT reachable from the browser |
| PDF conversion fails | gotenberg logs |
| Custom fonts missing | font-syncer logs |
Free vs Pro
Run the document API on your own infrastructure. Pro adds more template versions, PDF security controls, and team collaboration.