
Vintage Story Mod DB · Vintage Story mod
Integrated Mod Manager
⠀ What The Heck Is The Integrated Mod Manager? Integrated Modification Management is a term that’s been bandied about modding circles for years. Simply put, it means high-speed information configuration and conflict resolution. One of the most advanc
Quick answer
Which Integrated Mod Manager release should I use?
Integrated Mod Manager 1.1.3 targets 1.22.0-pre.1, 1.22.0-pre.2, 1.22.0-pre.3. It must be installed on the client. Installation on the dedicated server is optional. No extra mods listed for this file.
Where it goes
Is Integrated Mod Manager required on the client, server, or both?
It must be installed on the client. Installation on the dedicated server is optional.
This release supports both sides, but the source does not require it on the server.
What else does Integrated Mod Manager 1.1.3 need?
1.1.3. Change the file and its required mods may change too.
This file does not list any required mods. Do not add a library just because a different file uses it.
We only count dependency files that match this setup. A file for another loader does not fill the gap.
Before you install it
Add Integrated Mod Manager without breaking your instance.
Built for Integrated Mod Manager 1.1.3. Pick another file and the loader, install side or required mods may change.
- 01
Stick to this file
Use 1.1.3. It targets 1.22.0-pre.1, 1.22.0-pre.2, 1.22.0-pre.3; another release may have different loader, side or dependency requirements.
- 02
Bring the mods it needs
This file does not list any required mods. Do not add a library just because a different file uses it.
- 03
Put it on the correct side
It must be installed on the client. Installation on the dedicated server is optional.
- 04
Pick the file you checked
Use the “Get this file” button beside 1.1.3. It opens that exact file at the source.
About this project
What does Integrated Mod Manager add?
⠀
What The Heck Is The Integrated Mod Manager?

The Integrated Mod Manager is a utility mod for modders.
Allowing you to skip writing UI code and instead make a simple Json file which will be used to automatically generate a config UI for you!
The process is entirely non-invasive, you don't need to change a single line of your mod's code, or even mark IMM as a dependency. You can pull the plug at any time, no vendor lock-in like with other config mods.
But why stop there? On top of configuration, IMM lets you define a list of known incompatible mods and define an automatic fix for them, meaning that your end-users won't nag you about a bug caused by two incompatible mods ever again!
You have full granular control, whether you want to simply check against a modID, or check for a generic detail such as whether or not a recipe exists to craft a certain item. Your enthusiasm is the limit.
On-board with the idea? Great, let's get you started.
{
// assets/examplecodemod/config/imm.json
"Configuration":
[
{
"ConfigFile": "examplecodemod/myconfig.json", // Your config file in the ModConfig folder
// You can use sraw strings or "domain:key" localization entries for just about every text display.
// Description fields support VTML. Clickable links can use handbook://, handbooksearch://, https://, etc.
"ConfigLabel": "Server gameplay", // This'd be a raw string
"Description": "examplecodemod:imm-server-desc", // Here be a key lookup for localization
"ConfigSource": "ModConfig", // Optional. ConfigSource dictates if we're reading/writing to ConfigFile or IMM's own internal storage for patch settings. ModConfig is the default, see the patch example for the other value and how to use it.
"ConfigSide": "Server", // "Server" (default) or "Client", this dictates if the config file is being edited on the server or in the client. You can overwrite this on individual settings.
"ParseDescriptions": false, // Optional. If your mod has (Settingname)Description fields, set this to true.
"Settings":
[
{
"Type": "Boolean",
"Label": "Enable feature",
"Description": "Turns the feature on or off.",
"Map": "Gameplay.EnableFeature", // Newtonsoft JPath into the config Json.
},
{
"Type": "String",
"Label": "Some Text",
"Map": "Gameplay.ServerTitle",
},
{
"Type": "Integer", // Int32-range
"Label": "Maximum count",
"Map": "Gameplay.MaxCount",
},
{
"Type": "Decimal", // Double
"Label": "Damage multiplier",
"Map": "Gameplay.DamageMultiplier",
},
{
"Type": "Slider",
"Label": "Spawn chance",
"Map": "Gameplay.SpawnChance", // Integer targets need whole-number Min/Max/Step, decimals may use fractions.
"Min": 0,
"Max": 1,
"Step": 0.05, // Optional, defaults to 1.
},
{
"Type": "Dropdown",
"Label": "Difficulty preset",
"Map": "Gameplay.Difficulty",
"Options":
[
{ "Label": "Easy", "Value": "easy" }, // ModConfig dropdown values must be any non-null primitive.
{ "Label": "Normal", "Value": "normal" }, // This means that instead of a string for a value, you can use numbers too if you want.
{ "Label": "Hard", "Value": "hard" }, // Labels can use localization keys too of course.
],
},
{
"Type": "Array",
"Label": "Allowed dimensions",
"Map": "Gameplay.AllowedDimensions",
"ElementType": "String", // Boolean | Integer | Decimal | String.
},
{
"Type": "Boolean",
"Label": "Client preview",
"Map": "Ui.EnablePreview",
"ConfigSide": "Client", // Overrides the block side for this setting.
},
],
},
// You can have more than one config file in case you prefer having one for the server and one for the client. Optional of course, you can have it all one big beautiful file if you want.
{
"ConfigFile": "examplecodemod/myclientconfig.json",
"ConfigLabel": "Client interface",
"ConfigSource": "ModConfig",
"ConfigSide": "Client",
"ParseDescriptions": false,
"Settings":
[
{
"Type": "Boolean",
"Label": "Compact HUD",
"Map": "Hud.Compact",
},
{
"Type": "Slider",
"Label": "HUD scale",
"Map": "Hud.Scale",
"Min": 0.5,
"Max": 2.0,
"Step": 0.1,
},
],
},
],
"Dependencies":
[
{
"ModId": "examplecodemod", // Applicability gate, if this mod is present, then we check the criteria. The game domain, or your own domain, both mean it'll always check.
"Label": "Required library is missing!!!", // As before, this can be a loc entry instead of a literal string.
"Description": "This feature requires Required Library.",
"Severity": "Error", // Warning | Error.
"Criteria": // Criteria types: Setting | GridRecipeCount | HasModID | CollectibleBehavior | CollectibleAttribute.
[
{
"Type": "HasModID",
"Operator": "Equal", // HasModID only accepts Equal, the issue activates when Value is missing.
"Value": "requiredlibrary",
},
], // Multiple criteria use an AND gate, not an OR gate. An empty list makes the gate alone activate the issue.
"Resolution": // Optional. If you want to provide a fix. Otherwise this becomes just an information warning/error.
{
"Type": "InstallMod", // SetSetting | InstallMod | RunCommand.
"ModId": "requiredlibrary",
},
},
{
"ModId": "otheroverhaul",
"Label": "Overlapping gameplay systems",
"Description": "Both mods currently enable the same system.",
"Severity": "Warning",
"Criteria":
[
{
"Type": "Setting",
"Target":
{
"ConfigFile": "examplecodemod/myconfig.json",
"Map": "Gameplay.EnableFeature", // You can supply the ModId of another mod for a domain, omitted means this descriptor's mod. A Setting target may instead use { "ModId": "...", "PatchSetting": "Code" }.
},
"Operator": "Equal", // Equal | NotEqual | GreaterThan | LessThan.
"Value": true,
},
{
"Type": "Setting",
"Target":
{
"ModId": "otheroverhaul",
"ConfigFile": "otheroverhaul/otherconfig.json",
"Map": "Features.EnableSameSystem",
},
"Operator": "Equal",
"Value": true,
},
],
"Resolution": {
"Type": "SetSetting",
"Target":
{
"ConfigFile": "examplecodemod/myconfig.json",
"Map": "Gameplay.EnableFeature",
// SetSetting targets may also use ModId + PatchSetting.
},
"Value": false, // Must match the setting's primitive type.
},
},
{
"ModId": "game",
"Label": "Duplicate grid recipe output",
"Description": "More than one enabled grid recipe produces this item.",
"Severity": "Warning",
"Criteria":
[
{
"Type": "GridRecipeCount",
"Output": "game:stick", // Explicit asset domain required.
"Operator": "GreaterThan",
"Value": 1, // Can never be negative
},
],
"Resolution":
{
"Type": "RunCommand",
"Value": "/examplecodemod fixrecipes", // You can send both client and server commands
},
},
{
"ModId": "game",
"Label": "Stick lost its ground-storage behavior",
"Description": "Checks whether a runtime item/block has a registered collectible behavior.",
"Severity": "Warning",
"Criteria":
[
{
"Type": "CollectibleBehavior",
"Target":
{
"Class": "Item", // Item | Block.
"Code": "game:stick", // Exact collectible code, explicit asset domain required.
},
"Behavior": "GroundStorable",
"Operator": "NotExists", // CollectibleBehavior accepts Exists | NotExists and omits Value.
},
],
},
{
"ModId": "game",
"Label": "Unexpected stick ground-storage rotation",
"Description": "Checks values stored inside a collectible's Attributes tree.",
"Severity": "Warning",
"Criteria":
[
{
"Type": "CollectibleAttribute",
"Target":
{
"Class": "Item", // Item | Block.
"Code": "game:stick", // Exact collectible code, explicit asset domain required.
},
"Path": "groundStorageTransform/rotation/y", // Uses the same IMM content-path syntax as content patches.
"Operator": "NotEqual", // Equal | NotEqual | GreaterThan | LessThan | Exists | NotExists.
"Value": -13, // Omit Value for Exists / NotExists. Comparison paths must resolve exactly one value.
},
],
},
],
}
{
// assets/examplecontentmod/config/imm.json
"Constants": { // Non-null JSON values, names may not collide with PatchSetting Codes.
"GlobalScale": 1.25,
"MaximumValue": 100000,
"ExtraDrop": { "type": "item", "code": "game:stick", "quantity": 1 },
},
"Configuration": [
{
"ConfigLabel": "Server content settings",
"ConfigSource": "PatchSettings", // Content mods can't make config files due to not having code, so IMM provides its own file. Omitts ConfigFile and ParseDescriptions.
"ConfigSide": "Server", // Server | Client
"Settings": [
{
"Type": "Boolean",
"Label": "Enable custom behavior",
"Code": "Enabled",
"Default": true,
"Targets": [
{
"Asset": "examplecontentmod:config/content.json", // Exactly one of Asset / AssetPattern
"Path": "enabled", // Exactly one of Path / Paths
"Operation": "Replace", // Replace | Append
"Timing": "Auto", // Auto | Early | BeforePatches | AfterPatches
"ResultType": "Auto", // Auto | Boolean | Integer | Decimal | String | Json
"Side": "Auto", // Auto | Both | Server | Client
"Optional": false,
// No Expression/Value means "use this owning PatchSetting"
},
{
"Asset": "examplecontentmod:config/content.json",
"Path": "traits",
"Operation": "Append",
"ResultType": "String",
"Value": "example-trait",
"Condition": "Setting", // Optional. The target only runs when this evaluates to true, false means the target is skipped completely.
"Optional": true,
},
],
},
{
"Type": "Slider",
"Label": "Durability multiplier",
"Code": "DurabilityMultiplier",
"Default": 1.0,
"Min": 0.25,
"Max": 4.0,
"Step": 0.25,
"Targets": [
{
"AssetPattern": "game:itemtypes/tool/*.json", // * wildcard, leading @ makes the whole pattern a regex.
"Path": "durability",
"Operation": "Replace",
"Timing": "Auto", // Auto classifies compatibility -> Early, patches -> BeforePatches, everything else -> AfterPatches.
"ResultType": "Integer",
"Side": "Server",
"Expression": "clamp(round(Current * Setting * Constants.GlobalScale), 1, Constants.MaximumValue)",
"Optional": true,
},
],
},
{
"Type": "Dropdown",
"Label": "Extra drop preset",
"Code": "DropPreset",
"Default": { "type": "item", "code": "game:stick", "quantity": 1 },
"Options": [ // PatchSettings dropdown values may be arbitrary JSON, not only primitives.
{ "Label": "Stick", "Value": { "type": "item", "code": "game:stick", "quantity": 1 } },
{ "Label": "Stone", "Value": { "type": "item", "code": "game:stone-granite", "quantity": 1 } },
],
"Targets": [
{
"Asset": "examplecontentmod:config/content.json",
"Path": "dropPreset",
"ResultType": "Json", // Implicitly replaces with the selected object
},
],
},
{
"Type": "Array",
"Label": "Allowed variants",
"Code": "AllowedVariants",
"Default": [ "normal", "rare" ],
"ElementType": "String", // Boolean | Integer | Decimal | String
"Targets": [
{
"Asset": "examplecontentmod:config/content.json",
"Path": "allowedVariants",
"ResultType": "Json",
},
],
},
{
"Type": "Integer",
"Label": "Bonus amount",
"Code": "BonusAmount",
"Default": 2,
"Targets": [],
},
{
"Type": "Decimal",
"Label": "Secondary scale",
"Code": "SecondaryScale",
"Default": 0.75,
"Targets": [],
},
{
"Type": "String",
"Label": "Display suffix",
"Code": "DisplaySuffix",
"Default": "reinforced",
"Targets": [
{
"Asset": "examplecontentmod:config/content.json",
"Path": "displaySuffix",
"ResultType": "String",
},
],
},
],
},
{
"ConfigLabel": "Client visual settings",
"ConfigSource": "PatchSettings",
"ConfigSide": "Client",
"Settings": [
{
"Type": "Boolean",
"Label": "Enable client visuals",
"Code": "ClientVisuals",
"Default": true,
"Targets": [
{
"AssetPattern": "examplecontentmod:shapes/*.json",
"Path": "clientVisualsEnabled",
"Side": "Auto", // Auto on a Client PatchSetting is client-only. Server PatchSettings/standalone patches run on both.
"Optional": true,
},
],
},
],
},
],
"ContentPatches": [
{
"Asset": "examplecontentmod:config/content.json",
"Path": "staticFlag",
"Operation": "Replace",
"Timing": "AfterPatches",
"ResultType": "Boolean",
"Side": "Both",
"Value": true, // Standalone patches require exactly one of Expression / Value.
},
{
"Asset": "examplecontentmod:config/content.json",
"Path": "drops",
"Operation": "Append", // Target must resolve to a JSON array, appends one evaluated JSON value.
"ResultType": "Json",
"Expression": "Constants.ExtraDrop",
"Condition": "Settings.Enabled", // Conditions are also valid on standalone ContentPatches; Setting itself is only available inside an owning Targets entry.
},
{
"AssetPattern": "@^game:config/weather.*\\.json$", // Regex form. Still needs an explicit domain in the pattern text.
"Paths": [ // Each path becomes its own binding.
"patterns/[*]/weight",
"events/[0]/weight",
],
"Operation": "Replace",
"Timing": "Auto",
"ResultType": "Decimal",
"Side": "Both",
"Expression": "clamp(Current * Settings.SecondaryScale, 0, 1000)",
"Optional": true,
},
{
"Asset": "examplecontentmod:config/content.json",
"Path": "entries/[code=rare]/weight", // Path segments: property, ["quoted"], [N], [*], [A..B], [$key=glob], [property=value]; ~1=/ and ~0=~.
"Operation": "Replace",
"Expression": "Enabled && Current > 0 ? max(Current + BonusAmount, 1) : 0",
"ResultType": "Integer",
"Optional": true,
},
{
"Asset": "examplecontentmod:config/content.json",
"Path": "[\"property~1with~1slash\"]/value", // Quoted property name; ~1 decodes to "/" and ~0 to "~".
"Operation": "Replace",
"Value": { "nested": [ 1, 2, 3 ] },
"ResultType": "Json",
"Optional": true,
},
],
// Expressions:
// refs: Setting (only inside owning Targets), Current/value, Settings.Name or ["Name"], Constants.Name or ["Name"], or bare setting/constant names.
// ops/literals: ! + - * / % == != < <= > >= && || ?: ; true false null pi e.
// funcs: if, not, and, or, greater, lesser, equal, notequal, sin, cos, abs, sqrt, ceiling, floor, exp, log, round, sign, clamp, max, min.
// patch value precedence: Expression, then Value, then the owning Setting. Standalone ContentPatches therefore require Expression or Value.
// Condition uses the same expression language and setting/constant references, but Current/value is forbidden because conditions run before asset/path resolution.
// A false Condition skips the binding entirely, it does not append null/false/[] or otherwise modify the asset.
"Dependencies": [],
}
{
// Advanced entries are for advanced types, and most mods will not need them. Unless you're a hardcore programmer. Otherwise ignore this.
// Structural Advanced types: Object | Dictionary | Array | Tuple. / Primitive leaves: Boolean | String | Integer | Decimal | Slider | Dropdown.
"Configuration":
[
{
"ConfigFile": "exampleadvancedmod/myconfig.json",
"ConfigLabel": "Advanced ModConfig example",
"ConfigSource": "ModConfig",
"ConfigSide": "Server",
"Settings":
[
{
"Type": "Advanced",
"Label": "Advanced gameplay rule",
"Map": "Gameplay.AdvancedRule",
"Advanced":
{
"Type": "Object",
"Columns": 2, // Object fields are laid out in this many columns when space permits.
"Fields":
[
{
"Key": "Enabled", // Exact JSON property name. Label/Description are display-only.
"Type": "Boolean",
"Label": "Enabled",
},
{
"Key": "Threshold",
"Type": "Decimal",
"Label": "Threshold",
},
{
"Key": "OptionalNote",
"Type": "String",
"Label": "Optional note",
"Optional": true, // Optional is only valid for Object fields and allows the property to be absent.
"Nullable": true, // Nullable allows an explicit JSON null value.
"InitialValue": "", // Used when IMM has to construct a missing/null value.
"ColumnSpan": 2,
},
{
"Key": "Tags",
"Type": "Array", // Advanced Array may contain any explicitly-described Advanced element type.
"Label": "Tags",
"ColumnSpan": 2,
"Element": { "Type": "String" },
"MaxItems": 16, // MinItems/MaxItems are optional on Advanced Array and Dictionary.
},
{
"Key": "Overrides",
"Type": "Dictionary", // JSON object with dynamic string keys sharing one Value schema.
"Label": "Per-item overrides",
"ColumnSpan": 2,
"KeyLabel": "Asset code",
// "KeyPattern": "^[a-z0-9_-]+:[a-z0-9_./-]+$", // Optional regex validation for dictionary keys.
"Value": { "Type": "Decimal", "InitialValue": 1.0 },
},
{
"Key": "Position",
"Type": "Tuple", // Fixed-length heterogeneous JSON array, unlike Array it has no add/remove controls.
"Label": "Position",
"ColumnSpan": 2,
"Items":
[
{ "Type": "Decimal", "Label": "X" },
{ "Type": "Decimal", "Label": "Y" },
{ "Type": "Decimal", "Label": "Z" },
],
},
],
},
// Undeclared properties already present in an Object are preserved when IMM edits the declared fields.
},
],
},
// PatchSettings can also do advanced stuff
{
"ConfigLabel": "Advanced PatchSettings example",
"ConfigSource": "PatchSettings",
"ConfigSide": "Server",
"Settings":
[
{
"Type": "Advanced",
"Label": "Per-item rules",
"Code": "ItemRules",
"Default": {}, // Default must conform to the explicit Advanced schema.
"Advanced":
{
"Type": "Dictionary",
"KeyLabel": "Asset code",
"Value":
{
"Type": "Object",
"Columns": 2,
"Fields":
[
{ "Key": "Enabled", "Type": "Boolean", "Label": "Enabled" },
{ "Key": "Multiplier", "Type": "Decimal", "Label": "Multiplier", "InitialValue": 1.0 },
],
},
},
"Targets":
[
{
"Asset": "exampleadvancedmod:config/content.json",
"Path": "itemRules",
"ResultType": "Json", // The whole structured Advanced value can be written as JSON.
// Expressions can reference an Advanced PatchSetting as a whole value, nested property access is not part of the expression language.
},
],
},
],
},
],
}
A mod can only have one imm.json, but you can include both config changes as well as patches, the examples were just kept separate to make them easier to read.
For code mods, you can optionally subscribe to imm.<modid> in order to reload setting changes live. Eg. api.Event.RegisterEventBusListener(myfunctionforlivereload, filterByEventName: "imm.mymodid");.
This mod is brought to you by...

The Unofficial Vintage Story Modding Co-op, click here to join.
As modders, we can help each other make even better stuff. Plus we have dedicated channels for better organization.
Project description from Vintage Story Mod DB.
Pick your setup
Integrated Mod Manager releases for each Vintage Story version.
Choose the version and loader you play, then open the matching release.
1.22.7
1 loader build1.22.6
1 loader build1.22.5
1 loader build1.22.4
1 loader build1.22.3
1 loader build1.22.2
1 loader build1.22.1
1 loader build1.22.0-rc.10
1 loader build1.22.0-rc.9
1 loader build1.22.0-rc.8
1 loader build1.22.0-rc.7
1 loader build1.22.0-rc.6
1 loader buildShowing the newest 12 of 23 game versions. Older files are in the list below.
Check the dependencies, then try the file in a copied instance before changing a world you care about.
Recent files
Integrated Mod Manager versions and loaders
1.1.3
integratedmodmanager.zip
10 Sept 2026
1.1.2
integratedmodmanager.zip
10 Sept 2026
1.1.1
integratedmodmanager.zip
8 Sept 2026
1.1.0
integratedmodmanager.zip
7 Sept 2026
1.0.5
integratedmodmanager.zip
6 Sept 2026
1.0.4
integratedmodmanager.zip
5 Sept 2026
1.0.3
integratedmodmanager.zip
4 Sept 2026
Looking for an older file? The official Vintage Story Mod DB project page is in Resources.