The fastest way to start a CMS in Python. Build production-grade sites with zero-config, modular themes, and a powerful content API.
The new unified CLI makes it easier than ever to get started:
pip install pythoncms
pythoncms start mysite --runThis single command will:
- Create your project directory.
- Generate a secure
.envfile. - Initialise the database.
- Seed the default admin user.
- Start the development server.
Open: http://localhost:5000/dashboard
Login: admin@domain.com / pass
Manage your entire project from one place:
pythoncms start <name>: Create a new project.pythoncms run: Start the dev server.pythoncms initialise: Set up database and assets.pythoncms seed: Reset default data.pythoncms deploy: Generate production files (Dockerfile, docker-compose.yml).pythoncms --version: Check your version.
Deploying your CMS with a production-grade Nginx reverse proxy is now a single command:
pythoncms deployThis generates:
- Dockerfile: Optimized for Gunicorn performance.
- nginx.conf: Configured for request buffering and fast static file serving.
- docker-compose.yml: Orchestrates the app and Nginx containers.
- Run
pythoncms deploy. - (Optional) Edit
nginx.confto add your domain. - Run
docker-compose up --build -d.
Your site will be live on port 80 with Nginx handling all incoming traffic.
Your content is automatically exposed via a JSON API.
Endpoint: /api/v1/<content_type_name>
?limit=10&offset=0?sort_by=created_at&order=desc
Set API_TOKEN in your .env to secure the API.
Requests must then include header: Authorization: Bearer <API_TOKEN>
Your project settings are managed via the .env file in your root directory.
By default, pythoncms uses SQLite. To use a different database, update the SQLALCHEMY_DATABASE_URI:
# SQLite (default)
SQLALCHEMY_DATABASE_URI = "sqlite:///mysite.db"
# PostgreSQL
SQLALCHEMY_DATABASE_URI = "postgresql://user:password@localhost/dbname"APP_NAME: Change the display name of your application.SECRET_KEY: Used for session encryption. Automatically generated onstart.ACTIVE_FRONT_THEME: Choose betweeneditorialorhyperspace.ACTIVE_BACK_THEME: Choose betweensneatorsbadmin.
- 🏗️ Content Types: Define custom schemas with JSON.
- 🎨 Theme Support: Switch between beautiful, responsive themes instantly.
- 🔐 Built-in Auth: Secure admin and user management out of the box.
- 🍱 Modular Architecture: Extend functionality with a robust plugin system.
- 🖼️ Media Management: Simple upload and resource handling.
- ⚡ Flask Powered: Minimal, fast, and easy to customize.
If you want to contribute to the core or customize the engine:
-
Clone and Install:
python -m pip install -e . -
Initialize:
cd pythoncms shopyo initialise flask --debug run -
Database Migrations:
flask db migrate flask db upgrade
Themes are located at /static/themes/.
Must include index.html, contact.html, and page.html.
Must include base.html, login.html, register.html, and unconfirmed.html.
- License: MIT
- Discord: Join our community
- Issues: Report a bug
Powered by the Shopyo engine.


