DEV Community

Art
Art

Posted on

Our Go CMS now speaks 5 languages, themes itself, and meditates on 404s

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-Language header detection on first visit
  • /lang switcher endpoint that sets a lang cookie
  • 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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{} and Footer{} - defined once in app.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)