Skip to content

Install a game module

Core knows nothing about any game. Every game-specific screen — shard status, the map atlas, the player marketplace, character sheets — comes from a module, a directory on a mounted volume that the server loads at start.

Today there is one: uo, for ServUO shards, published as Module-uo (v1.2.2).

  1. Open Admin → Modules.

  2. Paste the URL of a release’s install manifest into Release install-manifest URL and press Install.

    For the current uo release that is the module-uo-<version>.json asset on its releases page. The site downloads the bundle, checks it against the sha256 the manifest declares, and unpacks it onto the modules volume.

    There is no catalog to browse, deliberately: a catalog would make core’s release cadence decide which modules are allowed to exist.

  3. Restart when it asks. A banner appears — Modules are read from disk when the server starts — with a Restart the server button. The row reads Restart to start until you do.

    The button exits the process and lets your supervisor bring it back; on the Compose deployment from Install the site, that is restart: unless-stopped doing its job. docker compose restart app is exactly equivalent.

  4. Confirm it started. The module’s row should read Started, and its screens should have appeared in the navigation.

Watch the log at the restart and you will see exactly what it mounted:

[uo] registered routes: public:/shard,/atlas admin:/shard,/uo-link player:/shard
[modules] schema ensured for module "uo"
[modules] module "uo" started

Its capabilities are shard, atlas, market, governors, guilds, houses, champs, cliloc — the shard console, the map atlas, the player-vendor marketplace, city governors, guilds, houses and IDOCs, champion boards, and the cliloc strings that make item names readable.

A module owns one path segment wherever it appears, so its pages live under /uo/…, /admin/uo/… and /player/uo/…. That boundary is visible in the URL on purpose.

A host whose Compose file is version-controlled can skip the panel entirely: set MODULES in .env, one entry per module, <id>@<version>=<install manifest URL>. The container resolves that set at every start.

A module already unpacked at the declared version is left alone without a single network call, so a restart with no route to the internet comes up unchanged. A failure is logged and shown in Admin → Modules, and never stops the site from starting.

The two surfaces agree on a rule worth knowing: the variable owns what is on the volume, the admin panel owns whether a module runs. A module you disable in the panel stays disabled even though its files are put back at the next start.

More on both in Managing modules.

Next: Connect a game server.