Modulo is a free, open-source CMS for your own server. Publish pages and posts, manage translations, and add a shop through plugins. It runs on a VPS or dedicated server using Docker Engine and Docker Compose, with a browser-based administration dashboard.
The production stack includes the application, nginx, PostgreSQL, Redis, a queue worker, and a scheduler. PHP, Composer, Node.js, and database services do not need to be installed separately on the host.
Read the documentation — start with getting started, the editor guide, or the shop guide.
- Publish content — pages, blog posts, menus and an image library, with drafts and scheduled publishing.
- Multiple languages — translate any post, page or menu item (English and Spanish included in the demo).
- Users & permissions — admin, editor and reader roles out of the box; decide exactly who may publish.
- Online shop — install the shop plugin for products, cart, checkout and payments (Stripe, PayPal, Mollie).
- Contact forms — install the contact-form plugin, drop in a shortcode, get emails.
- Operations — scheduled backups, guarded updates, web health checks, and background-service diagnostics.
- Your design — switch themes, or keep the clean default.
No install needed — open the live demo, then log in with a public demo account:
| Role | Password | |
|---|---|---|
| Demo admin (editing) | admin@example.com |
admin123 |
| Editor (writes content) | editor@example.com |
editor123 |
| Reader | user@example.com |
user123 |
The demo restores clean content every four hours, including uploads and recovery drafts. Use your own installation for work you want to keep.
Demo accounts cannot administer backups, extensions, users, API tokens or server credentials. See security for the server-enforced restrictions.
Requirements:
- A Linux server with shell access.
- Docker Engine running, with the Docker Compose plugin (
docker compose). Podman with a working Compose provider is also supported. - Bash,
curl,tar, and OpenSSL for the installer. - For a public site, a domain pointing to the server and an HTTPS reverse proxy such as Caddy or nginx.
Run these commands on the server:
docker info
docker compose version
curl -fsSLO https://raw.githubusercontent.com/PhantomPixelDev/modulo-cms/main/install.sh
less install.sh
APP_URL=https://cms.example.com bash install.shReplace https://cms.example.com with your site's public URL. Configure your reverse proxy to forward to the web container's HTTP port, 8080 by default; use WEB_PORT=8081 with the installer if that port is occupied.
The installer downloads deployment files for a published release, generates application and database secrets, and starts the stack in a new modulo-cms/ directory. It creates a .env file there; keep it private and retain it for future updates.
Once HTTPS is configured and the containers are running, generate a one-time setup
token with docker compose exec app php artisan modulo:install-token from the
deployment directory. Open https://cms.example.com/install, paste the token into
the wizard, and create your administrator account. The localhost address printed
by the installer refers to the server itself.
Configure production SMTP for email delivery. Mailpit is included in the development stack only. See installation for manual Docker, Podman, and bare-metal setup, and configuration for environment settings.
For contributing or testing changes, use the development stack:
git clone https://github.com/PhantomPixelDev/modulo-cms.git
cd modulo-cms
cp .env.dev.example .env.dev
./modulo.sh up devThen open http://localhost:8000 (dashboard at /dashboard, test emails at http://localhost:8025). On Windows use Git Bash or WSL with a working container runtime. See Contributing for development commands and quality checks.
| Public site | Admin dashboard |
|---|---|
| Post editor with translations | Plugin management |
| First-run setup wizard | |
- Updates: open Settings → Updates for available versions and the upgrade commands for your installation. Core upgrades take a backup first; plugin updates are available from the dashboard on normal installations.
- Backups: the scheduler creates nightly database dumps and weekly full backups. Settings → Backups lists full backups for download and restore; see the backup guide.
- Plugins: Extensions → Plugins → Browse registry — the Shop, Contact Form and more install in one click. Every package is checksum-verified before installing.
Browse all documentation, including configuration, APIs, architecture, and release guides.
| Getting started | First login, navigation, and your first page |
| Installation | Detailed setup options |
| Editor guide | Writing posts, pages and translations |
| Draft recovery | Saving, scheduling, recovery, and previews |
| Shop guide | Products, checkout, payments, and orders |
| Troubleshooting | Common errors and service diagnostics |
| Upgrading | Versions, preflight checks, per-channel commands |
| Security and runtime upgrades | Supported versions, plugin builds and Redis rollback |
| Backups | What is saved, and how to test a restore |
| Security | Hardening checklist |
| Plugins | Installing plugins and writing your own |
| Themes | Changing the design |
| Theme settings | Colors, typography and layout in the admin |
| React content partials | Reusable React modules in pages and posts |
| Demo fixtures and testing | Compact examples, safe replacement and link checks |
| Contributing | Development setup and quality gates |
| Repository layout | Source folders and tooling configuration |
Built with PHP 8.5 (8.4 supported) · Laravel 13 · React 19 · Inertia 3 · PostgreSQL 16 · Redis 8. MIT licensed — see LICENSE.