Skip to content
Calagopus ExtensionsBrowse

CalaWorkshop

Steam Workshop installer extension for Calagopus — search and explore the Workshop or paste a URL/ID to download and install mods onto your game server via SteamCMD and Wings. Includes install tracking, uninstall support, and Steam account linking. Ships with L4D2 and Garry's Mod presets, extendable via JSON.

by WasianMan Updated Aug 16, 2026
Get it · Free

Description

calaworkshop

ci release license: MIT + Commons Clause

Steam Workshop installs for Calagopus, shipped as:

  • a Calagopus panel extension: dev.wasian.calaworkshop
  • a small SteamCMD helper container: ghcr.io/wasianman/calaworkshop-helper

It adds a per-server Workshop tab where you paste a Workshop URL/ID, download through SteamCMD, and install the selected files onto the game server through Wings. Built-in presets currently cover Left 4 Dead 2 and Garry's Mod; other Steam games can be added through JSON presets.

Status: early release. CalaWorkshop is functional end-to-end and used on a live server, but it is still young. Expect rough edges and occasional changes while the project settles. No warranty; see LICENSE.

What Works

  • Paste Workshop URL/ID and install through Wings files/pull
  • Search/explore Workshop items with previews, sort modes, discovered tag filters, and collection preview from the server Workshop tab
  • Persistent download history and installed-item tracking
  • Managed/imported/unmanaged installed-content list
  • Precise uninstall of files tracked by this extension
  • Built-in game presets:
    • Left 4 Dead 2: installs SteamCMD legacy payloads as loadable <workshop_id>.vpk files with paired preview images.
    • Garry's Mod: extracts GMAD payloads into addon folders and generates per-item resource.AddWorkshop Lua for client delivery.
  • Data-driven, multi-game install rules: per-game presets can glob, rename, extract GMAD archives, generate files, and scan installed content. Unconfigured games mirror every downloaded file.
  • Best-effort game auto-detection from the server's egg, preselecting the preset
  • Per-user Steam account linking: password login with proper Steam Guard mobile-approval waiting and guided code entry, plus an experimental QR-code method (no password; most SteamCMD builds currently reject the token handoff, in which case it fails cleanly and password login is the fallback)
  • Helper and SteamCMD diagnostics in the admin config page

Richer update/reinstall workflows are still on the roadmap.

How It Works

Workshop tab  -> extension backend -> helper container -> SteamCMD download
     |                  |                    |
     |                  |                    v
     |                  +---- Wings files/pull from helper /files/<job>
     v
server volume receives the selected Workshop files

The panel extension does not run SteamCMD and does not mount game-server volumes. The helper downloads items and serves a temporary artifact. Wings pulls that helper URL into the server volume, so the same path works for AIO and remote nodes.

Full design: docs/ARCHITECTURE.md Helper contract: CONTRACT.md

Custom Game Presets

Admins can add or edit games from the extension settings page. Each preset has a structured App ID, name, and install path, plus an Advanced (JSON) block for the game-specific behavior:

  • auth: default, anonymous, or account
  • match: select downloaded files with globs and optionally rename them
  • extractFiles: extract supported archive-like payloads; currently format: "gma" for Garry's Mod addons
  • generatedFiles: create small companion files such as server config or Lua
  • scan: tell the Installed Content page where to find unmanaged files/folders
  • postInstall: none or extract for nested archives after placement

Start with the game preset guide, then use docs/games.example.json for the tested built-in presets or docs/advanced-rule.example.json for the exact camelCase JSON shape used by the Advanced editor. Most SteamCMD games that need "copy these files here" or "rename/extract this payload here" can be described without code; games that require startup-argument or config-file management may still need a purpose-built preset pattern.

Install

Use the public release artifacts:

  • ghcr.io/wasianman/calaworkshop-helper:<version> or :latest
  • CalaWorkshop-v<version>.c7s.zip from the latest GitHub Release

Short version:

  1. Switch the Calagopus panel to ghcr.io/calagopus/panel:heavy-aio.
  2. Add the heavy-image build mounts.
  3. Add the calagopus-workshop-helper service from compose.aio.example.yml.
  4. Allow Wings to pull from the helper's private Docker subnet.
  5. Install CalaWorkshop-v<version>.c7s.zip from the Calagopus Extensions page, or place it in /app/extensions.
  6. If the panel does not rebuild extensions automatically after upload, click Rebuild Extensions on the Extensions page, or restart/redeploy web.
  7. Configure the helper URL/token in the admin panel.

Detailed AIO/Coolify steps: docs/DEPLOY.md

Steam Notes

  • SteamCMD handles downloads.
  • A Steam Web API key is optional for direct installs and required for Workshop search/explore. It is used for titles, previews, search, and collection metadata.
  • Anonymous downloads work only for games Steam allows. Left 4 Dead 2 generally requires a linked Steam account that owns the game.
  • Linked accounts are per panel user. The helper stores only SteamCMD session files and the username metadata needed to reuse the session; it does not store the password.
  • Steam Guard tip: even after you approve a sign-in in the Steam Mobile app, Steam may still ask for a code — the app does not prompt for it. Open the app's Steam Guard tab (shield icon) to find the rotating 5-character code.
  • The QR code method is experimental: the helper starts a Steam auth session, you scan and approve in the app, and no password ever reaches the panel or helper. However, the final handoff of the Steam-issued token to SteamCMD is rejected by most SteamCMD builds — the link then fails with a clear qr_unsupported message (nothing is harmed) and password login is the fallback.
  • After linking, the helper runs a passwordless cached-session check before marking the account verified.

Repository Layout

calaworkshop/
├── extension/              # packaged into CalaWorkshop-v<version>.c7s.zip
│   ├── backend/            # Rust extension routes/settings/helper client
│   ├── frontend/           # React Workshop, Steam Link, and admin pages
│   └── migrations/         # extension DB migrations
├── helper/                 # Rust SteamCMD helper service + Dockerfile
├── packaging/              # .c7s archive builders
├── docs/                   # deploy and architecture docs
├── compose.aio.example.yml # reference AIO stack with helper wired in
└── CONTRACT.md             # extension <-> helper HTTP contract

Permissions

Scope Permission Allows
server workshop.read View Workshop tab and installed content
server workshop.install Download, install, and track Workshop items
server workshop.remove Remove tracked installed content
user calaworkshop.link-steam Link and manage personal Steam accounts
admin calaworkshop.configure Configure helper, API key, presets, diagnostics

Development

  • Helper: cd helper && cargo build
  • Helper locally: WORKSHOP_HELPER_TOKEN=dev cargo run
  • Extension archive:
    • Windows: packaging/build-c7s.ps1
    • Linux/CI: packaging/build-c7s.sh

The extension backend inherits the Calagopus panel workspace and does not compile standalone from this repository. It is compiled by the panel heavy image during install. See CONTRIBUTING.md for more detail.

Version

Current release: v0.2.8-alpha.2 (prerelease; requires Calagopus panel ≥ 1.1.0) Changelog: CHANGELOG.md

Screenshots

Server Workshop Steam Link Admin Settings
Server Workshop page showing install controls, recent downloads, and installed content Steam Link page showing account linking and verified linked account status Admin extension settings showing helper connection, Steam metadata key, diagnostics, and game presets

License

MIT + Commons Clause. Free for personal and internal use; you may not sell it or offer a hosted/commercial service based on it without a commercial license. See LICENSE. Commercial inquiries: adam@wasian.dev.

Source-available, not OSI open source, because commercial selling is restricted.

All extensions