The extension model
One platform, whichever game you run
A module is the entire game-specific half of a deployment, packaged: its routes, its screens, its database tables, its navigation rows and its slice of the API documentation. The core site holds accounts, Teams, the wiki, posts, moderation and the admin panel, and knows nothing about any game at all.
That division is not an aspiration bolted on afterwards. The Ultima Online support was extracted out of the site into a module, and every URL it had before the move it still has — which is the only version of this claim worth making.
What you get
What installing one actually does
It brings its own everything
Server routes, React screens, tables, nav rows and an OpenAPI fragment the site merges into its own spec. Nothing about it is a patch to the core site, so upgrading either half does not involve reconciling the other.
You never build it
The client half ships prebuilt and the artifact is verified against a published checksum before anything is written to disk. Production runs an image you pulled; an operator who has to compile something has been handed a maintenance job.
It cannot take the site down
A module whose declared interface version does not match is marked failed and the site starts without it — loudly, rather than half-loading. Disabling one closes its connections and stops its routes answering.
Your data outlives it
Uninstalling removes the module and keeps its tables, so reinstalling picks up exactly where it was. Destroying the data is a separate, opt-in choice made in its own dialog, and it says what it is about to do.
Installing
Three ways in, and none of them is a build
Which one you use is a question about your host, not about the module. All three end the same way: a restart, and the module's screens appear in the navigation.
From the admin panel
Paste the URL of a release manifest into Admin → Modules and press restart when it asks. The site downloads the artifact, verifies the checksum the manifest declares, inspects the whole archive before writing a single file, and unpacks it.
The click path, for a host you have no shell on.
From your environment
Name the module and its version in one environment variable and the container resolves it at every start. Already at that version means no network call at all, so a restart with the internet down comes up unchanged.
A compose-managed host, where the running set should be a line you version-control.
By hand
Unpack the tarball into the modules directory and restart. The bundle is already assembled — the client half is prebuilt and its one runtime dependency ships inside.
Development, and any host where the other two do not fit.
The worked example
module-uo
v1.2.2The Ultima Online module, and the reference every module that follows is measured against. It is what turns a general-purpose community site into something that knows what a shard is — and it is the proof that the seam described onthe architecture page is real, because the code on the far side of it was moved there rather than designed there.
What it publishes
- Live server status
- Economy and activity
- Character sheets
- Points and loyalty boards
- Player-vendor marketplace
- Houses and IDOC decay
- Spawn atlas
- Champion boards
- Guilds
- City governors
The same list features expands, read from one file that is checked against the module's own manifest on every build.
It connects to a real server
The module talks to the sidecar beside your game server, not to the game. You deploy that side with the installer and paste four values into the admin panel; nothing here requires the game to exist, and with no server configured the site renders normally and shows it offline.
It owns its own tables
Its schema is applied by the site on every boot and its data is its own. The module declares which versions of the core interface it speaks — the site runs 1.10.0 — and refuses to load against one it does not.
It is a separate release
Versioned, tagged and published on its own cadence, independently of the site. Upgrading one does not mean upgrading the other, as long as the declared interface range still holds.
Writing your own
The Integration Kit
DraftA four-chapter book on putting a different game on this platform — the module, the sidecar beside your game server, the plugin inside it — plus a template module that continuous integration builds against a pinned version of the core site, so the instructions cannot quietly stop working.
Why it says draft
Because nobody outside this project has yet followed it to a working module, and that is the only test of a set of instructions that counts. The badge comes off when somebody does — that is the stated condition, not a mood, and it is written down so a future reader knows when to take it down.
Everything it teaches is real and in use. What is untested is whether it issufficient: whether someone with no access to this project's context can get from an empty repository to a running module using it alone.
Not built
What the module system does not do
Every one of these is a decision rather than a backlog item, so each says why. Where the reasoning was written down in the open, it is linked.
More than one game module at a time
One active module per deployment. The database columns that would scope data to a module exist and are populated, so the door is not nailed shut, but nothing exercises them and no interface offers it. A community running two games runs two deployments.
What would change itSomeone needing it. The schema was shaped to keep it possible, which is a different thing from planning it.
A second game module
There is exactly one, and it is Ultima Online. A paper dry-run for a Rust module exists and is deliberately unimplemented — it was written to test whether the module contract generalises, not to ship. Until a second one exists, "any game" is an argument about a shape rather than a demonstration.
What would change itThe first module built for a game that is not Ultima Online.
A finished Integration Kit
The kit that teaches you to put a different game on this platform describes itself as a draft, and it is right to. It has four chapters, a working template and a CI job that builds that template against a pinned core — but nobody outside this project has yet followed it to a working module, which is the only test of a set of instructions that counts.
What would change itSomeone outside this project building a working module for a new game by following it alone. That is the kit's own stated condition, not one invented here.