Skip to main content

Steam Workshop & External Sources

By default ModKit scans the local Mods folder. It can also load mods from additional locations — most importantly Steam Workshop — with zero configuration on the player's side.

Steam Workshop

How it works

You provide one value: your game's Steam Workshop App ID. At runtime ModKit resolves the Workshop content folder automatically from the game's own install location:

<SteamLibrary>/steamapps/workshop/content/<AppId>/

Because Workshop content always lives in the same Steam library as the game (<SteamLibrary>/steamapps/common/<Game>/), ModKit finds it by walking up from the running executable until it hits the steamapps folder. This is correct on every player's machine — no absolute paths, no per-user setup.

Setup

Project Settings → Plugins → ModKit Runtime → Steam Workshop App ID

Set it to your game's numeric App ID (the number in its store URL, e.g. 311210). Leave it empty to disable Workshop scanning.

[/Script/ModKitRuntime.ModKitRuntimeSettings]
SteamWorkshopAppId=311210

That's the only step. On the next StartLoadMods(), subscribed Workshop mods load alongside your local Mods folder.

What ModKit does — and does not — handle

ModKit is platform-agnostic and does not link the Steamworks SDK. It only reads the files Steam has already downloaded to disk.

ResponsibilityHandled by
Subscribing to items, downloading, updatesSteam — the Workshop page, or your game's Steamworks / Online Subsystem Steam integration
Locating the downloaded items and mounting themModKit — automatic, from the App ID

Players can subscribe from the Workshop web page and Steam auto-downloads in the background; ModKit picks the files up. If you want an in-game browse/subscribe UI, integrate the Steamworks UGC API (or OnlineSubsystemSteam) yourself — ModKit still handles the loading side.

Workshop folder layout

Steam stores each subscribed item in its own numeric folder. A mod item just needs to contain its packaged files (the .pak plus its ModDescriptor.json):

<SteamLibrary>/steamapps/
├── common/
│ └── MyGame/ ← your game installs here
└── workshop/content/311210/ ← ModKit auto-resolves this from the App ID
├── 1116742218/ ← one subscribed item (Steam's file id)
│ ├── CoolMod.pak
│ └── ModDescriptor.json
└── 987654321/
├── AnotherMod.pak
└── ModDescriptor.json

Because the scan is recursive, an item may even bundle several mods in sub-folders — every .pak with a ModDescriptor.json next to it is loaded.

Publishing a mod to the Workshop

When you (or a modder) publish a packaged mod, upload the contents of the mod's output folder (the .pak, ModDescriptor.json, thumbnail, …) as the item's content, using the Steamworks UGC API (CreateItem / SubmitItemUpdate) from your own tooling. This step is outside ModKit's scope — ModKit only consumes what Steam has downloaded.

Extra Mod Paths

For any other source (a custom launcher folder, a shared test directory, another store), add absolute or project-relative paths to Extra Mod Paths:

Project Settings → Plugins → ModKit Runtime → Extra Mod Paths

[/Script/ModKitRuntime.ModKitRuntimeSettings]
+ExtraModPaths=D:/SharedMods
+ExtraModPaths=SpecialMods

Each entry is scanned recursively, exactly like the Mods folder. Relative paths resolve against the game directory; absolute paths are used as-is.

Not for Steam

Do not hard-code a Steam Workshop path in Extra Mod Paths — it differs on every machine (drive letter, library location). Use the Steam Workshop App ID setting instead; it resolves the path per-machine.

All search locations

At load time ModKit scans, in order:

  1. Mods Directory (default Mods)
  2. Every Extra Mod Path
  3. The Steam Workshop content folder (when a Steam Workshop App ID is set and resolvable)

Duplicate directories are removed. Each location is scanned recursively for .pak files, and every .pak must have a ModDescriptor.json beside it. Thumbnails, enable/disable, and every other feature work identically regardless of where a mod was found.

Testing locally (Editor)

In the Editor there is no real Steam library above the project, so the App-ID resolver falls back to a dev folder under your project:

<Project>/Build/steamapps/workshop/content/<AppId>/

Recreate that structure under your project's Build/ folder, set the Steam Workshop App ID, and StartLoadMods() will load from it. This fallback is ignored in a shipped build (the folder does not exist there).

Check the logs

LogModKitLoader prints the resolved directories and the total found:

Steam Workshop dir resolved: .../steamapps/workshop/content/311210
StartLoadMods - 2 search dir(s) | Game version: 1.0.0
Mod search dir: .../MyGame/Mods
Mod search dir: .../steamapps/workshop/content/311210
Found 5 PAK(s) across 2 search dir(s)

If a directory you expect is missing from the list, the path is wrong or (for Steam) the App ID could not be resolved.