We've been building ForgeCMS - a Go-based CMS that pulls content from a Codeberg repo and serves it from a β¬1/month VPS. No database. No WordPress. No regrets.
Today we shipped a release that felt like crossing a threshold: the CMS stopped being a prototype and started feeling like a real product.
Here's what landed.
π Proper i18n - without a framework
We didn't reach for go-i18n or any translation library. Instead, we built language resolution directly into the SML page system:
-
Accept-Languageheader detection on first visit -
/langswitcher endpoint that sets alangcookie - Per-page language override via
Page{lang: "es"} - Fallback chain:
atesti/es/index.smlβatesti/index.sml
The result: a visitor from Barcelona lands on the Spanish page automatically. A visitor from CataluΓ±a sees CatalΓ . No JavaScript required.
lang-specific SML pages (atesti/es/index.sml fallback to index.sml)
Page{lang:} override for per-page content language
Markdown{src:} with lang injection and no-lang fallback
We also added a new Markdown{src:} syntax that injects the current language into the source path - so content.md becomes content-es.md when available, with silent fallback to the default.
π¨ Theme system via SML
Theming is now first-class. Two files control everything:
-
theme.sml- light mode CSS custom properties -
theme-dark.sml- dark mode overrides
The entire site color palette, spacing, and typography flow from these two files. No hardcoded hex values scattered across templates. It's the same philosophy as our SML declarative UI: declare the intent, let the system do the rest.
π OG meta tags + Image path resolution
Every page now emits proper OpenGraph tags:
og:title, og:description, og:url, og:image
And Image{src:} now resolves relative paths to full Codeberg raw URLs automatically - so content authors don't have to think about where images live on the CDN.
π Guru Meditation Error Pages
This is the one people will remember.
404 and 500 pages now render as Amiga-style Guru Meditation screens:
Software Failure. Press left mouse button to continue.
Guru Meditation
#00000404.DEADBEEF
β back to safety
It's a love letter to the Amiga. It's also completely on-brand for a CMS built by someone who learned to code from Toolbox magazine in the 80s.
ποΈ Under the hood
A few infrastructure improvements that matter:
- ETagFor() - proper cache fingerprinting for assets
- Stale cache fallback - if Codeberg is unreachable, serve the last known good content
- ErrNotFound sentinel - clean error type propagation instead of string matching
- Asset fingerprinting fix - the favicon (a sprouting seed π± SVG) now busts cache correctly
-
Site-wide
Menu{}andFooter{}- defined once inapp.sml, rendered everywhere
βοΈ Dual license
The project now ships under GPL v3 + commercial license, mirroring the Qt model.
Open source for open source. Commercial license for commercial use. Revenue funds land purchase for intentional community infrastructure - but that's a different post.
What's next
The live proof-of-concept is atesti.crowdware.info - the home of Atesti para Dana, a gift-first alternative currency built on the Minuto framework.
Next up: SMS/WASM search index with persistent IndexedDB, so the CMS can search its own content without a backend query.
If you're building something small, human-scale, and weird - we're on Codeberg.
Part of the Forge 4D ecosystem - declarative UI, native compilation, no cloud required.

Top comments (0)