Valheim Worldkeeper: a self-deployable dashboard and guarded updater in the GameOps ecosystem.
  • Python 62.3%
  • JavaScript 27.6%
  • HTML 9.9%
  • CSS 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-17 20:03:08 +01:00
artwork Use the selected Carved Seal Yggdrasil hero logo 2026-09-14 21:14:46 +01:00
config Add Valheim Worldkeeper dashboard and guarded manual updates 2026-09-13 20:18:15 +01:00
docs Add dashboard screenshot preview to README 2026-09-15 16:56:41 +01:00
runtime Fix blocked update status and show controller progress 2026-09-17 19:16:54 +01:00
tests Fix blocked update status and show controller progress 2026-09-17 19:16:54 +01:00
vendor Keep generic GameOps update styling separate from Worldkeeper 2026-09-17 20:02:38 +01:00
web Fix blocked update status and show controller progress 2026-09-17 19:16:54 +01:00
.gitignore Add Valheim Worldkeeper dashboard and guarded manual updates 2026-09-13 20:18:15 +01:00
install.py Add matching Worldkeeper artwork for dashboard and Nexus 2026-09-13 20:30:50 +01:00
README.md Fix blocked update status and show controller progress 2026-09-17 19:16:54 +01:00
RELEASE_NOTES_0.1.1.md Fix blocked update status and show controller progress 2026-09-17 19:16:54 +01:00
VERSION Keep generic GameOps update styling separate from Worldkeeper 2026-09-17 20:02:38 +01:00

Valheim Dashboard — Worldkeeper

Update reliability and progress fixes: release notes.

Valheim Worldkeeper interface preview

Interface preview using example data. Appearance and available controls depend on your configuration. Click the image for full size.

A standalone Valheim operations dashboard in the GameOps ecosystem: world-tree artwork, deep blue and gold, live server state and population, world-save metadata, automatic-backup inventory, journal, and a guarded manual update workflow.

The dashboard runs on a Linux dashboard host and controls an existing systemd Valheim server over a dedicated, restricted SSH key. It can be used independently of Nexus. Nexus can add it with its existing Standard Nexus hooks profile. No Docker, Node runtime, Forgejo account, Proxmox API or original author's LAN is required. The game server must already exist; this package does not create worlds.

Ecosystem responsibilities

  • GameOps Blueprint Builder: describes the server and deployment topology.
  • GameOps Host Dashboard: supplies the general dashboard and reusable security/control contract.
  • Valheim Dashboard: owns the Valheim interface, world metadata and guarded updater.
  • Nexus Game Fleet: discovers status and calls the unchanged login/status/action APIs.

The shared GameOps core is included under vendor/gameops, pinned to commit 70a0298 from gameops-host-dashboard. Installation never downloads a moving branch. See vendor/README.md for provenance. Do not copy improvements into unrelated games: generic improvements belong upstream; Valheim-specific behavior stays here.

Requirements

Two systemd Linux environments (physical hosts, VMs or LXCs are all suitable), Python 3.11+, OpenSSH, an existing Valheim systemd service, a working SteamCMD installation owned by the game account, and a TLS reverse proxy. The supported first release uses Valheim's Steam backend and local A2S telemetry. It deliberately blocks updates when the player query cannot establish that the running server is empty. Crossplay needs a trustworthy alternate population adapter before updates can be enabled under this policy.

Use a copied start script outside the Steam-managed game directory. The game service must stop gracefully on SIGINT and allow enough time to save. Installation, saves and backup directories must be distinct; the install directory must not be a mount point because activation uses a directory rename. Chunked worlds and classic worlds are both backed up in full. Free space must cover backups, a staged installation and retained recovery files.

Deploy from this repository

  1. Copy config/valheim.example.json and edit all paths, instance ID, world name, query port and public address. List every startup/environment/unit configuration file needed to restore your server. No secrets belong in this JSON.
  2. Copy config/blueprint.example.json, or create a universal GameOps remote blueprint with the same project ID, systemd service and local A2S port. Use your own dashboard/game/ingress addresses and hostname. Keep the instance ID stable when replacing an existing generic board.
  3. Copy this complete repository and both reviewed JSON files to both Linux hosts.

On the dashboard host, prepare a dedicated key:

sudo python3 install.py --role dashboard --blueprint my.blueprint.json \
  --valheim-config my.valheim.json --prepare-key

Copy the public key to the game host. Obtain its SSH host key through a trusted console and prepare a known-hosts file; do not blindly accept an ssh-keyscan result. Then install the game-host endpoint:

sudo python3 install.py --role controller --blueprint my.blueprint.json \
  --valheim-config my.valheim.json --public-key-file /root/dashboard.pub

Install the web dashboard on the dashboard host:

sudo python3 install.py --role dashboard --blueprint my.blueprint.json \
  --valheim-config my.valheim.json --known-hosts-file /root/game.known_hosts

The first install prompts for a dashboard password, or accepts --password-file. Re-running preserves existing login credentials, sessions and instance identity. It restarts only the dashboard/controller units, not the game. Avoid reinstalling a controller while a game operation is active. Publish the blueprint listener through your existing HTTPS proxy and restrict its port to ingress and local Nexus connections. See docs/DEPLOYMENT.md for services and rollback.

To use the same Valheim updater with the general GameOps frontend, pass --generic to the dashboard installation. This is how both dashboards can share one update implementation while retaining different interfaces.

The game-host metadata service publishes a small read-only snapshot every ten seconds. The SSH account never needs membership of the game group or access to private world saves. Stale metadata is reported as unavailable.

What is real data?

Population comes from Steam A2S; uptime and state come from systemd. World metadata comes from the configured save directory, including current chunked saves. File modification times are not a claim that a consistent backup has completed while the server is running. The interface does not invent game days, boss kills, biomes, player positions, an RCON console, or a world map. A future optional mod adapter can add those with explicit capabilities and its own installation contract.

Tests

python3 -m unittest discover -s tests -v

The updater tests simulate game service/Steam outcomes using temporary worlds. They test occupied/unknown player rejection, stale review rejection, verified full backups, staging failure, changed target builds, retained originals and keeping a previously stopped server stopped. Running the tests never touches a real game.

Read the update policy before enabling maintenance. Review the staging branch before adopting a new release. No automatic scheduling or hidden game update is performed by installation.