A Django CMS for small editorial teams. Write a draft, send it for review, and publish an approved version. Later edits stay private until they are approved.
Try the live demo · CI · API guide
Workflow recording · Test results
Each visitor gets a separate workspace with sample stories, revision history and author/editor switching. No signup is needed. The workspace expires after an hour.
- Workspace permissions with owner, editor, author and viewer roles.
- Draft, review, published, scheduled and archived states.
- Public pages read the approved revision; draft changes stay private.
- Revision restore, edit conflict detection and an activity log.
- REST API with session/token authentication and OpenAPI docs.
- Markdown rendering with HTML sanitization.
Review a draft, check earlier versions, and approve it for publication.
Readers see the approved version while the next draft stays private.
Python 3.12 or newer. SQLite works for a quick start; PostgreSQL is used in Docker and CI.
git clone https://github.com/Mohamedajab/pressroom.git
cd pressroom
python -m venv .venv
source .venv/bin/activate
pip install -r requirements-dev.txt
python manage.py migrate
DEMO_ENABLED=true python manage.py runserverOn Windows PowerShell, use .\.venv\Scripts\Activate.ps1 to activate the environment and $env:DEMO_ENABLED='true' before running python manage.py runserver.
Open localhost:8000/demo/. API docs are at /api/docs/ and database health is at /health/.
For a persistent local workspace, run python manage.py bootstrap_workspace my-studio --name "My Studio" --username owner. It prompts for a password when creating an account. The local-only seed_demo command is also available; see deployment notes.
pytest
python manage.py check
python manage.py makemigrations --check --dry-run
ruff check .
ruff format --check .SQLite skips the two PostgreSQL concurrency tests. CI tests with PostgreSQL on Python 3.12 and 3.13. Browser checks are in scripts/demo_smoke.py and scripts/browser_smoke.py.
The live demo uses Vercel and Neon PostgreSQL. Vercel runs python manage.py migrate --noinput during builds and serves collected static files. Configure DEBUG=false, DEMO_ENABLED=true, a random SECRET_KEY, DATABASE_URL, ALLOWED_HOSTS, CSRF_TRUSTED_ORIGINS, and TRUST_PROXY=true behind Vercel's proxy.
The live demo supports manual publishing. Scheduled publication needs a separate scheduler running python manage.py publish_due; it is not configured on the current Vercel deployment. Expired visitor workspaces are cleaned when a new demo starts.
For Docker/PostgreSQL and other hosts, see deployment and hosted demo setup.
Templates and the REST API call the same functions in publishing/services.py. Changes, revisions and audit events commit together. PostgreSQL row locks and version checks protect concurrent edits.
See architecture, API routes, and contributing.
Uploads, email invitations, SSO and billing are not included. API rate limits use a per-worker memory cache. Use a shared cache before scaling.
MIT licensed.





