ForgeCMS: content flows from a Git repository through a forge to many websites

A CMS without a database, a build step or a plugin jungle.

ForgeCMS is a single Go binary. Your pages are written in SML, your texts are Markdown in a Git repo on Codeberg. ForgeCMS fetches them at request time, caches them, and serves many domains from one process.

This page is built with ForgeCMS, too.

How it works

Browser β†’ Caddy (TLS) β†’ forgecms β†’ Codeberg (SML + Markdown)
                                   β†˜ local cache
One binary

Written in Go. Copy it to a server, start it, done. One process serves all your domains.

No database

Content lives in Git. Your history, backup and review workflow are just Git.

No build step

Commit a change on Codeberg and it is live within a few minutes. A typo never takes the site down; the last good version keeps running.

Few dependencies

Go standard library, goldmark for Markdown (with chroma for code highlighting) and sml-go for the page language.

Pages in SML, not JSON or YAML

SML is a small, readable markup: elements with properties and children. No HTML, CSS or JavaScript needed. It is easy for people to read and easy for an AI to write.

Page {
    title: "My Bakery"

    Heading { level: "1" text: "Fresh bread, every morning" }
    Markdown { src: "main.md" }

    Cards {
        Card { title: "Sourdough" text: "Baked daily from a 12-year-old starter." }
        Card { title: "Opening hours" text: "Tue–Sat, 7:00–13:00" }
    }

    ContactForm { }
}

Quickstart

You need Go 1.22 or newer and a public Git repo on Codeberg for your content.

# 1. Get and build ForgeCMS
git clone https://codeberg.org/CrowdWare/ForgeCMS.git
cd ForgeCMS
go build -o forgecms .

# 2. Point it at your content repo (edit the Site { } block)
cp app-demo.sml app.sml

# 3. Run it
./forgecms --port 8080

For several domains, put one config per domain in sites/<domain>/app.sml and ForgeCMS switches to multi-site mode on its own. Caddy in front takes care of HTTPS.

The CrowdWare sites repo is our production setup: content, per-domain config and deploy script for every site listed below. AI.md explains the whole system to Claude Code or any other coding agent, so you can simply let an AI build your site.

Modules, live

Each module is part of the same binary and is switched on with a block in app.sml.

ModuleWhat it doesTry it
Feature requestsVisitors propose features and vote, magic-link login without passwords/forgecms/features
EventsDates with flyer, event pages and ICS calendar export/events-demo
BlogPosts with photos, feed, share buttons without trackers, several languagesart.ubuntu-pirates.com
Contact form and newsletterForm fields defined in SML, spam timer, double opt-in, mailings in Markdown/contact
ShopSell for Ğ1 (June) and euros, with digital delivery/shop-demo

Built in: several languages per site, themes, per-page SEO descriptions, YouTube embeds and more. See what's included and what the modules cost.

Running in production

Angela MahrScreenshot of Angela Mahr

Built by the musician herself, with Claude Code

PotenzialentfaltungScreenshot of Potenzialentfaltung

Also by Angela Mahr, built with Claude Code

The page you are reading: forgecms-developers.sml

License

ForgeCMS is free to use under the GPLv3 for non-commercial purposes. If you earn money with it, for example by hosting sites for paying customers, you need a commercial license. Profits are not paid out to individuals; they go into UBUNTU land projects.

Try it, break it, tell us