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.
| Responsibility | Handled by |
|---|---|
| Subscribing to items, downloading, updates | Steam — the Workshop page, or your game's Steamworks / Online Subsystem Steam integration |
| Locating the downloaded items and mounting them | ModKit — 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.
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:
- Mods Directory (default
Mods) - Every Extra Mod Path
- 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).
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.