ULTIMATE MOD KIT

The whole modding pipeline: players subscribe and mods load, modders press Package and the mod ships.

Mod LoaderOne Click PackagingSteam WorkshopUE 5.8

Most modding solutions hand you one third of the problem. A Workshop wrapper uploads files but has no idea how to load them back. A mod browser lists mods but leaves packaging to a command line the modder has never seen. This covers the whole road.

Installation

1
Enable Ultimate Mod Kit in your project's plugin list and restart the editor.
2
Add one line to your .uproject, next to "Plugins".
3
Open Project Settings > Game > Ultimate Mod Kit and leave Mod API Version at 1.
"AdditionalPluginDirectories": [ "Mods" ],
This line is not optional and it is the easiest thing to get wrong. The cooker only looks for plugins in directories the project declares. Without it, a mod in Mods/ is invisible to the cook, which then reports success and produces an archive holding a manifest and no assets at all. Ultimate Mod Kit checks for this before packaging and refuses with an explanation rather than letting you ship an empty mod.

The loader is a Game Instance subsystem, so it is already alive. With Auto Discover On Startup on, it finds mods and mounts the ones the player enabled last session before your first level loads.

Building the mod browser

Everything is exposed to Blueprints. In a UMG widget:

1
Get Ultimate Mod Kit Subsystem, a world-context node, so any widget can call it.
2
Refresh Mods when the screen opens.
3
Get Mods returns an array of UMK Mod Info. Build one row per entry: Display Name, Author, Version Name, State and, when it is not empty, Status Message.
4
Wire a checkbox to Set Mod Enabled. Nothing loads yet: the choice is queued.
5
Wire an Apply button to Apply Pending Changes, and use Has Pending Changes to grey it out.
6
Bind On Mod List Changed to rebuild the list and On Mod State Changed to update one row.
Status Message is written for players, not for you. Show it verbatim when a mod fails; it already explains what a modder got wrong.

Closing the crash guard

The loader writes a breadcrumb before mounting and clears it on a clean shutdown. A breadcrumb found at start-up quarantines the mods it names, so a broken mod can never lock a player out of their own game.

Once your game reaches a point that proves it survived start-up, call Mark Session Healthy. The end of your first level load is the usual place.

Skip this and every session looks like a crash, so every mod is quarantined on the next launch.

Anatomy of a mod

A mod is a plugin folder in the game's Mods directory. Nothing else is required.

Mods/
  MyFirstMod/
    MyFirstMod.uplugin
    Content/
      BP_Something.uasset

The descriptor needs both flags below. Without them the folder is found, reported, and never loads, because its content is not reachable.

{
    "FileVersion": 3,
    "VersionName": "1.0.0",
    "FriendlyName": "My First Mod",
    "CreatedBy": "Your name",
    "ExplicitlyLoaded": true,
    "CanContainContent": true,
    "ModApiVersion": 1,
    "Modules": []
}
Tools > Ultimate Mod Kit > New Mod writes all of this for you, and validates the name before using it. A name that would produce an unmountable mod is refused up front.

Editing a mod

A mod is a plugin marked ExplicitlyLoaded, so nothing mounts it on its own, not the running game and not the editor. Until it is mounted, the Content Browser has nowhere to put its assets.

Tools > Ultimate Mod Kit > Open Mod For Editing takes care of that, and /<ModName>/ appears under plugin content. A mod made with New Mod is already mounted; reach for this after restarting the editor, or for a mod you got from somebody else.

Adding a level

A mod can carry its own levels. Create the map inside the mod's content root (/<ModName>/Maps/..., not /Game/...) and it is cooked and mounted with everything else.

Levels are worth one extra thought about what they reference, because nothing in the base game ever points at a mod's map, and what the map points at decides how big the mod becomes.

The map referencesWhat it costs the mod
Assets your game already shipsNothing. They are in the player's install, and the base game release tells the cooker so.
Engine content your game never uses, such as /Engine/BasicShapes/Not in the player's install either. Turn on Include Engine Content so the mod carries its own copy, or reference something your game does ship.
The sample mod is the shape to copy: its map uses the mod's own Blueprint plus shapes the demo game already contains, and the whole thing cooks down to two packages.

Load order and dependencies

"UMKLoadOrder": 50,
"UMKRequiredMods": [ "SomeLibraryMod" ],
"UMKTags": [ "Creature", "Hardcore" ]

Lower load order goes first. A mod whose required mods are not active is quarantined rather than loaded into a state it cannot handle.

Packaging a mod

Loose assets are for working. A mod other people can install has to be cooked, and this is the step most modding setups leave to the modder.

Tools > Ultimate Mod Kit > Package Mod > your mod cooks it as DLC on top of the game's base release and writes the result next to the mod, under Saved.

Nothing else is required of you. Two settings the cooker and the loader disagree about are switched around the cook and switched back afterwards, including when the cook fails.

Publishing to the Steam Workshop

Tools > Ultimate Mod Kit > Upload Mod To Steam Workshop > your mod.

Title, description and tags are read from the mod's .uplugin, so a descriptor that is filled in correctly never has to be retyped into a web form. A preview.png or preview.jpg in the mod folder becomes the Workshop thumbnail. Steam refuses previews above 1 MB.

The first upload creates the Workshop item and records its id in workshop.json, next to the mod. Every upload afterwards updates that same item, and the menu shows (update) beside a mod that has one.

Keep workshop.json. It is the only link between your mod folder and your Workshop page. Lose it and the next upload creates a second item your subscribers know nothing about. If you work from two machines, keep it in version control with everything else.

What actually goes up is assembled for you: the descriptor and the cooked archives, in the same layout an installed mod has. Uploading the staged folder as it comes out of the cooker would give every subscriber a mod with no descriptor, which their game then refuses.

What you need

No Online Subsystem plugin is required. The kit talks to Steamworks directly and starts the Steam API itself when nothing else in the process has. If your game does run the Online Subsystem, the kit notices and leaves its connection alone, including at shutdown.

The base game release

A mod is cooked as DLC on top of a snapshot of your shipped game, so the cooker knows which assets already exist and leaves them out of the mod.

Run Tools > Ultimate Mod Kit > Create Base Game Release once per public build, and keep the version name stable.

Mods cooked against a snapshot your players do not have will reference assets that are missing on their machines.

Mod API version

Your game declares which mod API it serves. Each mod declares what it was built against.

Raise Mod API Version whenever you break the events or actions mods bind to. Leave it at 1 until you do.

Multiplayer

On the client, call Get Mod Set Fingerprint and send the result with your join request. On the server, compare it against its own. If they differ, refuse the connection and show Get Mod Set Details, so the player learns which mod they are missing instead of reading the word "incompatible".

The fingerprint covers load order too, because the same mods in a different order are not the same game.

Custom mod sources

Local folders and the Steam Workshop both sit behind one interface. To add your own, derive from UUMKModProvider, implement DiscoverMods, and register it from OnRegisterProviders(). That hook is how the Steam module contributes the Workshop without the core ever knowing that Steam exists.

Blueprint nodes worth knowing

📦
Loader
Everything the mod screen needs.
Refresh Modsrescans every source
Get Modsarray of Mod Info
Set Mod Enabledqueues the change
Apply Pending Changesmounts and unmounts
Mark Session Healthycloses the crash guard
Multiplayer
Get Mod Set Fingerprintone hash for the join handshake
Get Mod Set Detailsthe same, spelled out
🔧
Editor tools
Scriptable from Blueprints and from Python, not only from the menu.
Create Modfolder and a correct descriptor
Mount Mod For Editingputs it in the Content Browser
Package Modcooks it as DLC
Create Base Game Releaseonce per public build
Upload Modcreates or updates the Workshop item
Build Upload Payloadexactly what Steam is given

Settings

Project Settings > Game > Ultimate Mod Kit. Everything lives in DefaultGame.ini.

SettingWhat it does
Mod API VersionThe API your game serves. Raise it when you break what mods bind to.
Reject Older Api VersionsRefuse older mods instead of warning.
Local Mods Directory NameFolder scanned for local mods. Default Mods.
Enable Steam WorkshopTurn the Workshop source off for a local-only game.
Steam App ID OverrideNeeded to publish from the editor. Leave at 0 in a shipped build.
Quarantine After CrashHold back mods that were live when the game went down.
Base Game Release VersionName of the snapshot mods are cooked against. Keep it stable.
Include Engine ContentLet a mod carry engine assets your game does not ship.

Troubleshooting

SymptomCause
Mod is listed but its state is Failed with a mount messageExplicitlyLoaded or CanContainContent missing from the .uplugin, or the mod has no Content folder.
Mod does not appear at allNo .uplugin in the mod folder, or the folder sits next to Mods rather than inside it.
Packaged mod installs into nothingThe .uproject is missing AdditionalPluginDirectories, so the cooker never saw the mod.
Every mod is quarantined on launchThe game never calls Mark Session Healthy, so every session looks like a crash.
Mod refuses to turn offSomething in your game still holds an object from the mod. The failure says so; drop the reference before unmounting.
Upload says Steam is not running when it isNo Steam App ID Override is set, so Steam has nothing to publish under.
Uploaded mod is listed by Steam but the game ignores itThe item was uploaded without a descriptor beside its archives. Upload through the kit rather than by hand.
A second copy of your mod appeared on the Workshopworkshop.json was deleted or never written, so the upload created a new item instead of updating the old one.
Ultimate Mod Kit, made by Erak Dev / Adrenaline Games. Unreal Engine 5.8.