ForgeCMS is a Flask-based blogging and CMS application backed by MariaDB. It includes authentication, an admin workflow for draft/scheduled/published content, Markdown authoring, and media upload support.
- User registration and login
- Admin content management experience
- Post workflow states (
draft,scheduled,published,archived) - Preview support for unpublished posts
- SEO-friendly slugs and Bootstrap-based responsive UI
- Image upload support for post media
app/– Flask application package (blueprints, models, app factory)templates/– Jinja2 HTML templatesstatic/– CSS and uploaded/static assetsmigrations/– Database migration artifacts (includingmigrations/manual/SQL files)wsgi.py– WSGI entrypoint for local/dev server startup
- Python 3.8+
- Flask
- SQLAlchemy + Flask-Migrate
- MariaDB 10.5+
- Bootstrap 5
git clone <repository-url>
cd forgecmspython -m venv venv
# Linux/macOS
source venv/bin/activate
# Windows (PowerShell)
# .\venv\Scripts\Activate.ps1pip install -r requirements.txtCREATE DATABASE forgecms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'forgecms'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON forgecms.* TO 'forgecms'@'localhost';
FLUSH PRIVILEGES;Copy .env.example to .env and update values as needed:
cp .env.example .envExample values:
FLASK_APP=app
FLASK_ENV=development
SECRET_KEY=change-this-to-a-secure-secret-key
DB_HOST=localhost
DB_USER=forgecms
DB_PASSWORD=your_password
DB_NAME=forgecms
UPLOAD_FOLDER=static/uploads
MAX_CONTENT_LENGTH=16777216Notes:
UPLOAD_FOLDERshould stay insidestatic/so uploaded media is web-accessible.MAX_CONTENT_LENGTHis in bytes (16777216= 16 MB).
flask db upgradeflask runBy default, Flask serves on http://127.0.0.1:5000.
flask shellfrom app import db
from app.models import User
admin = User(username='admin', email='admin@example.com', is_admin=True)
admin.set_password('your-secure-password')
db.session.add(admin)
db.session.commit()# Create a new migration after model changes
flask db migrate -m "describe change"
# Apply pending migrations
flask db upgrade
# Backup database
mysqldump -u your_user -p forgecms > backup.sqlFor production, run with a WSGI server (for example Gunicorn) behind NGINX, use HTTPS, and set a strong SECRET_KEY.