← Stories

Story 03 · 2 min read

Luterra

What I build when nobody's paying me

When
2022 – present
Stack
Laravel 12MariaDBMediaWikiSemantic MediaWikiREST APIMCP

Luterra is a fantasy world I've been building for years: its history, languages, geography and calendars. It started as notes and grew into the biggest software project I do for no one but myself. It's here because it shows how I work when there's no deadline: I keep going until the tool fits the problem.

luterra.sigmusdewn.com

The main app, with 78 commits so far. It started as a place for notes and turned into a small platform:

  • Notes with a wiki-link graph. [[Links]] between notes build a navigable graph of the world.
  • Timelines of historical events, and custom calendar systems. Luterra's main calendar has 17 months and its own weekday names, so dates are validated and formatted against the calendar definition, not the Gregorian one.
  • A drag-and-drop "Sheets" editor, per-user storage quotas, and a small store module.
  • A REST API with API keys and usage metering, so other tools can read and write the world.
  • An MCP gateway that lets AI assistants like Claude search and edit the notes and the wiki directly.

The code is private; the site is live.

The Luterra Wiki

The curated, canonical version of the world lives on MediaWiki with Semantic MediaWiki, which adds structured queries, plus custom namespaces for abilities, axioms and vocabulary.

It's also the longest-running stateful service I maintain. I've upgraded it through 1.35 → 1.39 → 1.41 → 1.43 → 1.44, taking a backup at each step. Major MediaWiki upgrades break extensions and skins, so each step was its own small migration.

The conlang framework

lit is a linguistics engine for building complete constructed languages: sound systems, word formation and grammar. It's the most-committed project I have (286 commits), and I built it with one git worktree per task.

Maps, games and smaller tools

  • TileSurgeon: a Python tool that slices large world maps into web map tiles, plus a viewer. Earlier map layers modelled tectonics, air currents and temperature bands.
  • Godot experiments: small games and prototypes set in the world.
  • A visual timeline editor (D3.js). It's now superseded by the timelines in the main app.

None of this is DevOps. But the same habits show up: versioned upgrades with backups, an API before a UI, and tools built because the existing ones didn't fit.