Welcome to the Blog CMS
A hybrid headless CMS -- edit in a browser, content lives in Markdown, output is a static site.
How it works
The CMS stores posts two ways at once. Every save writes a row to SQLite and a
matching .md file to content/posts/. The Markdown files are the source of
truth. SQLite is just a working copy that makes the admin fast.
Delete the database and it rebuilds from the Markdown files on the next sync. That is the whole point. No content gets locked inside a database.
What you get in the admin
A browser editor with live Markdown preview on the right. You write on the left, the rendered HTML updates as you type. Front matter fields sit above the editor: title, slug, description, category, author, image URL, tags, publish date.
The admin also handles categories. Create, rename, or remove them from a table. Seven default categories ship with the CMS: community, advocacy, programs, technology, people, events, and updates.
The build step
cli.py build reads all Markdown files, syncs them into SQLite, renders each
post body through Python-Markdown, and writes plain HTML into site/. The
output includes:
- A home page with recent posts
- A full archive at
/en/blog/ - One page per category
- One page per post at
/en/{category}/{slug}/ - RSS, sitemap, and robots.txt
The theme uses Jinja2 templates under app/site_templates/. Swap them out to
change the look without touching the CMS logic.
Why not just a database
The old Payload blog kept everything in MongoDB. When the instance went away, the writing went with it. Keeping content in plain Markdown files means git can track every change. You can grep them, diff them, move them to another system. No export scripts, no migration headaches.