Mods / configkit

Tags:
Author:
dizzyd
Side:
Both
Created:
Sep 3rd at 2:00 AM
Last modified:
2 days ago
Downloads:
3214
Recommended download (for Vintage Story 1.22.7):
configkit_1.4.2.zip  1-click install

ConfigKit gives Vintage Story mods an in-game settings screen, drawn with the game's own interface. No Dear ImGui, and nothing extra to install alongside it.

It reads the same configlib-patches.json files mods already ship and writes a plain ModConfig/<mod>.yaml you can edit by hand, so a content mod needs no changes at all, and no dependency on this library either. If ConfigKit isn't installed, a mod simply falls back to the default values in its own assets.

Tested in-game across singleplayer, real two-process multiplayer, and a run alongside another config mod. Verified against a 95-mod pack: every asset it patches resolves identically to configlib's output.

For players

  • Press P, or use the Mod settings button in the pause menu.
  • Settings the server controls are shown read-only unless you have controlserver.
  • Edit a file in ModConfig/ while the game is running and it reloads on the spot.
  • Type in the filter box beside the mod dropdown to find a setting by name, wherever it lives.
  • Don't install ConfigKit and configlib together. If ConfigKit sees configlib or autoconfiglib it stands down and says so in the log, so nothing breaks, but only one of them can manage your configs. Config managers that only handle some mods are a different matter: name a mod under UnmanagedDomains in ModConfig/configkit.json and ConfigKit leaves that one alone without switching itself off.
  • You can join a server that doesn't have it, and you keep your own settings screen for client-side mods.
  • A server running it needs its players to have it too. Anyone without it is turned away on the connect screen and offered the download, the same as any other server-side mod.

For server admins

Settings can rewrite values inside other mods' JSON assets (block behaviour, recipes, item stats) from one config file, without repacking anything. That is often the quickest way to retune a pack for a server, and the server's values are synced to every client on join.

For mod authors

Most mods need no changes. The migration guide covers four cases:

  • Ships a configlib-patches.json and no C#? Nothing to do.
  • Checks whether a config mod is installed? One line.
  • Calls into the library? Swap a reference and rebuild.
  • Draws its own ImGui settings screen? Describe the settings instead, usually less code than you had.

A settings class needs only stock .NET attributes ([Description], [Range], [Category]), so it keeps no reference to ConfigKit and still compiles and runs without it. Nested classes, dictionaries and lists render themselves — a sub-object becomes a foldable section, a dictionary opens a screen of its own with a filter and an Add button, and neither needs a line of UI code.

It also reads what your class already carries: your /// doc comments become the tooltips, [DisplayFormat] decides how a number reads, validation attributes are enforced with the messages you wrote — including your own ValidationAttribute — and a nullable value type keeps its null instead of showing it as zero.

Full guides are linked under Documentation, just below.

Documentation

All of it lives in the repository, so it stays with the code it describes:

  • Structured config — what each shape becomes on screen: nested classes, dictionaries, lists, and every attribute that steers them. With screenshots.
  • Integrating — the API, when your values are actually there, client and server, and what to look at when a setting does not appear.
  • The config file format — settings, patches, JSON paths and expressions, for a mod with no C# at all.
  • Migrating from configlib — four cases, and most mods fall into the one that needs no work.
  • Compatibility — a survey of the 2,000 most-downloaded 1.22 mods, sorted by what each would have to change.
  • What changed from configlib — the deliberate differences, what was added, and the bugs fixed on the way.

Verifying what you downloaded

Every release is built by GitHub Actions and carries Sigstore-signed provenance tying the zip to the commit that produced it:

gh attestation verify configkit_<version>.zip --repo dizzyd/configkit

The build also refuses to package anything questionable: it asserts that ConfigKit.dll declares only its own types (dependencies ship as separate files and are never merged in), that every third-party dll matches its publisher's SHA-256, and that each one ships with its licence. What that proves is provenance: the binary contains what the source says, not that the behaviour is correct. The source is short; read it.

Origin, and credit

ConfigKit is derived from configlib by Maltiez, released under CC0. The config model, the patch format, the expression syntax and the server-sync design are his work, and they are good work. configlib solved a real problem for hundreds of mods, and its file format is the reason ConfigKit can read existing mods without asking anyone to change anything. What was rebuilt, and the bugs fixed along the way, including which are still present upstream and which this project introduced itself, is listed in what changed from configlib.

This fork exists because, for a period, configlib's published builds contained a class that appeared in no commit of its public source, which fingerprinted other loaded assemblies and degraded or disconnected multiplayer clients after a randomised delay. Those releases have since been withdrawn, and current configlib builds match their public source.

None of that is a judgement of the person. But the principle matters more than any one incident: players run our code on their machines, and they should be able to see what it does. A mod should do what its source says it does, and nothing else. That is the whole reason for the verification above: not because this project is more trustworthy, but because trust shouldn't have to be the mechanism.

If you use configlib today and it works for you, that is a perfectly reasonable choice.

Links

Source, issues and releases: github.com/dizzyd/configkit
Licence: MIT. Third-party notices ship in the zip under licenses/.

Mod Version Mod IdentifierFor Game version Downloads Released Changelog Download 1-click mod install*
1.4.2 configkit 274 2 days ago configkit_1.4.2.zip 1-click install

1.4.2 is released! A closed world is cleaned up of instead of staying in memory -- this bug is long-standing in ConfigLib, fwiw.

For players

  • Every world you left kept its whole server in memory until the game was closed, so leaving one singleplayer world and opening another grew the game's memory each time. A closed world is freed now. 

For mod authors

  • The static ConfigKitModSystem.ConfigsChanged event is cleared when the world closes. A handler subscribed there kept your mod system, and the world behind it, alive into the next world and was called again there. Subscribe in each world's start-up, as you would any other event.
  • Running more than one server in one process, as a test harness does, no longer keeps every one of them. One headless suite grew by about 2 GB a server before this.

Thanks to Beefy_Swain for finding the leak, measuring it, and sending the fix.

1.4.1 configkit 890 Sep 19th at 1:40 AM configkit_1.4.1.zip 1-click install

1.4.1 is released! A JSON patch of your own to a file a mod's config also patches is kept.

For players

  • A json patch you wrote against a file that a mod's ConfigKit config also patches was silently undone. Found on the Skaven/Rat Player Model mod, where a server's patch moving the model to a different group on the character selection screen had no effect at all. Your patch stays now.
  • The reverting only happened on a client, so a server and the players on it could disagree about a patched file. They agree now.

For mod authors

  • ConfigKit no longer puts a whole asset file back when it applies its patches a second time. It restores only the json paths its own patch definitions name, so another mod's changes to the same file, and the json patch loader's, survive.
  • A patch written against the asset's own value ("value * 2") still applies exactly once, including on a file someone else has patched.
  • When another writer's version of an asset is kept, the log says so at VerboseDebug and names the asset. Nothing is reverted in silence.

Thanks to Burgersim for the report, and for narrowing it to the Skaven mod and ConfigKit together.

1.4.0 configkit 448 Sep 12th at 3:03 PM configkit_1.4.0.zip 1-click install

1.4.0 is released! Optional sections, and two more of TheInsanityGod's bug reports.

For players

* A long setting name no longer runs into the rows below it. The row grows to fit the name instead.
* A mod registered under a name with spaces in it showed "name:setting-Field" on every row. It shows the setting's own name now.
* A section whose class carries a description shows that description under its heading.
* A section the mod lets you switch off has an Enabled switch as its first row. Off, its rows show what they would hold and cannot be edited; on, they can.

For mod authors

* A nested class declared nullable (public SailsConfig? Sails;) is an optional section. Null is left null rather than replaced with a fresh instance, the section gets an Enabled switch, and the file holds null when it is off and an object when it is on. Switching off and on again keeps the values. Before this, a null sub-config was silently turned back on with defaults at registration.
* The '?' is read from the compiled annotation, so it works whether or not your project has nullable checking on. A nested class declared without it and left uninitialised still gets an instance, as before.
* A [Description] or doc comment on a nested class is the line under its section heading.

Thanks to TheInsanityGod for the reports, and for noticing that null sub-configs were not surviving.

1.3.6 configkit 579 Sep 6th at 6:29 PM configkit_1.3.6.zip 1-click install

1.3.6 is released! Mostly TheInsanityGod's reports, and what turned up chasing them:

For mod authors

  • A field inside a dictionary or list entry gets the same control its attributes earn at the root — a slider for a [Range], a dropdown for an enum, an empty box for a nullable — and the same validation, with the container's row naming the entry and field that failed
  • A dictionary keyed by an enum offers its members rather than a text box; a [Flags] key accepts a combination; a numeric key is checked against its own type, so 300 is refused for a byte and a ulong past long.MaxValue is not
  • Enums backed by a byte, short or long register — they threw at registration before, and the mod did not load
  • A field added to a class after files were written reads as the class's own default in every stored entry, on screen and in validation, rather than as null

For players

  • A refused value marks its own row: the label turns red and a mark appears past Reset with the message as its tooltip, so you no longer have to look at the foot of the window to find it
  • A nullable number stays empty when you click away from it, instead of turning into 0

Fixes

  • The lag spike with "Texture ... is leaking memory" in the log: rows scrolled out of view on a long list were never freed when the screen rebuilt after a remove, add, rename or fold
  • A saved enum choice was reset to its default on every start — and written back over the file; it loads now, by name or by number
  • Choosing "(unset)" on a nullable enum kept writing the old member
  • An enum inside an entry that the file stored as a number showed the first member instead of the right one
  • A null entry in a dictionary no longer fails validation as an object with every field null
  • A mistyped enum or numeric key is refused with a message instead of being written to the file and lost on the next load
  • The colour swatch beside a colour field now redraws as you type, and no longer leaks

Special thanks to TheInsanityGod for the reports, and for the traced log that pinned the leak down to a line.

1.3.5 configkit 171 Sep 6th at 12:12 AM configkit_1.3.5.zip 1-click install

1.3.5 is released; the first of the release 1.3 series, so this covers everything since 1.2:

For mod authors

  • Nested classes, dictionaries and lists render themselves — a sub-object becomes a foldable section, a dictionary or list gets its own screen with a filter, Add and Rename, and neither needs a line of UI code
  • Your /// doc comments become the tooltips, so a documented settings class needs no [Description] at all
  • Validation attributes are enforced with the messages you wrote, including your own ValidationAttribute
  • Nullable value types keep their null — a float? reads empty rather than 0, and can be cleared back to it
  • [DisplayFormat] decides how a number reads, [Key] labels a list row by one of its fields, and [Display(Order)] and [ReadOnly] are honoured
  • SetConfigDisplayName names a config in the dropdown; WillManage lets another config manager ask whether ConfigKit owns a given mod

For players

  • A filter box on the settings list
  • Sliders show the setting's own value rather than the slider's internal one
  • ModConfig/configkit.json can hand a single mod to another config manager without switching ConfigKit off

Fixes

  • Text fields accept typing, and the settings window no longer passes keystrokes through to the game
  • An unbounded [Range] no longer crashes the client
  • A config containing a null saves and syncs correctly
  • Raw JSON settings get a readable box instead of overlapping the rows below
  • Rows sit on a baseline rather than above their controls

Thanks to TheInsanityGod, whose ideas for structured config and mods helped me get this all sorted.

1.2.0 configkit 555 Sep 3rd at 7:07 PM configkit_1.2.0.zip 1-click install

1.2.0 is released! Wasn't expecting to do another release today but found a few things doing the survey of top 2k mods:

  • Mods that look up configlib's RegisterCustomManagedConfig by name now find it here too, so their setting screens work as expected
  • Every setting now has its own reset-to-default button (great suggestion by Nattie98!)
1.1.0 configkit 94 Sep 3rd at 4:54 PM configkit_1.1.0.zip 1-click install

* Fixed some strange clipping issues with certain permutations of configs
* Correct requirements when running on server to ensure client will download it

1.0.1 configkit 188 Sep 3rd at 2:27 AM configkit_1.0.1.zip 1-click install

Minor GUI fixes

1.0.0 configkit 15 Sep 3rd at 2:00 AM configkit_1.0.0.zip 1-click install

Initial release

Disclaimer

By downloading a mod you consent to our Terms of Use.

We tell you this specifically because we want to make sure you are aware that we cannot validate every mod, and you are responsible for any damages you might incur by installing or loading mods.

This prompt will not be shown to you again (for the current browser session) if you proceed.


94 Comments (oldest first | newest first) (threaded | flat)

Turist79, 2 days ago

I don`t get it fully: if some other mods list ImGui and configlib as requirements will this one suffice (like replacing both of the above transparently) or do i have to go with exceptions configuration for this mod?  Thanks.

dizzyd , 1 day ago
@Turist79: I don`t get it fully: if some other mods list ImGui and configlib as requirements will this one suffice (like replacing both of the above transparently) or do i have to go with exceptions configuration for this mod? Thanks.

Yes - you can replace configlib+imgui with just ConfigKit. ConfigKit uses the native UI controls that are already in VintageStory so it doesn't need an external library. :) 

dizzyd , 2 days ago

1.4.2 is released! A closed world is cleaned up of instead of staying in memory -- this bug is long-standing in ConfigLib, fwiw.

For players

  • Every world you left kept its whole server in memory until the game was closed, so leaving one singleplayer world and opening another grew the game's memory each time. A closed world is freed now. 

For mod authors

  • The static ConfigKitModSystem.ConfigsChanged event is cleared when the world closes. A handler subscribed there kept your mod system, and the world behind it, alive into the next world and was called again there. Subscribe in each world's start-up, as you would any other event.
  • Running more than one server in one process, as a test harness does, no longer keeps every one of them. One headless suite grew by about 2 GB a server before this.

Thanks to Beefy_Swain for finding the leak, measuring it, and sending the fix.

Zaelesh, 5 days ago

Love this mod. It's so much more visually appealing than configlib. I hope i never have to go back.

MrOwl04, Sep 27th at 12:06 AM

The mod is really great alternative but only a slider to change values doesn't allow precise configuration. 

DilanRona, Sep 19th at 4:24 AM

Thank you. Keep up the great work.

dizzyd , Sep 19th at 1:40 AM

1.4.1 is released! 

For players

  • A json patch you wrote against a file that a mod's ConfigKit config also patches was silently undone. Found on the Skaven/Rat Player Model mod, where a server's patch moving the model to a different group on the character selection screen had no effect at all. Your patch stays now.
  • The reverting only happened on a client, so a server and the players on it could disagree about a patched file. They agree now.

For mod authors

  • ConfigKit no longer puts a whole asset file back when it applies its patches a second time. It restores only the json paths its own patch definitions name, so another mod's changes to the same file, and the json patch loader's, survive.
  • A patch written against the asset's own value ("value * 2") still applies exactly once, including on a file someone else has patched.
  • When another writer's version of an asset is kept, the log says so at VerboseDebug and names the asset. Nothing is reverted in silence.

Thanks to Burgersim for the report, and for narrowing it to the Skaven mod and ConfigKit together.

Vyh06, Sep 17th at 9:51 PM

Pls don't become the next Maltiez😭

dizzyd , Sep 17th at 10:33 PM
@Vyh06: Pls don't become the next Maltiez😭

Well, I'll do my best. :) But in all seriousness, please note that all builds of ConfigKit are attested. What this means, is that you can go to a release page like, https://github.com/dizzyd/configkit/releases/tag/v1.4.0, and see that the exact version of the code that a given release was built from. Basically, GitHub "attests" (promises, vouches) that the build contains ONLY what was in the code is part of the binary -- and you can check the code to make sure there's nothing odd like "anti-cheat" code or whatever. 

 

It's important to me that you know what you're getting and you're getting only what you want. :) 

Burgersim, Sep 17th at 3:18 PM

I seem to have a problem that when I want to use the Skaven/ Rat Player Model Mod together with configkit, a patch I wrote for my server to change the category (from its own skaven, to the beast category) in the character selection screen, just silently doesn't get applied or overwritten again.

DilanRona, Sep 16th at 6:46 AM

Will it be possible for me to contact you on the forums, I want to know how you did GitHub Actions and the Sigstore-signed provenance on this mod, so I can do the same for mine.

SunshineCorgi, Sep 13th at 1:25 AM

had an issue where configkit wasn't working at all; clearing my cache fixed the issue o/

dizzyd , Sep 13th at 1:28 AM
@SunshineCorgi: had an issue where configkit wasn't working at all; clearing my cache fixed the issue o/

Sorry to hear that. What cache are you referring to?

SunshineCorgi, Sep 14th at 9:46 PM
@dizzyd: Sorry to hear that. What cache are you referring to?

AppData\Roaming\VintagestoryData\Cache

 

deleting it sometimes fixes a lot of mod problems, i always do that first before any other trouble-shooting

dizzyd , Sep 12th at 3:03 PM

1.4.0 is released! Optional sections, and two more of TheInsanityGod's bug reports.

For players

  • A long setting name no longer runs into the rows below it. The row grows to fit the name instead.
  • A mod registered under a name with spaces in it showed "name:setting-Field" on every row. It shows the setting's own name now.
  • A section whose class carries a description shows that description under its heading.
  • A section the mod lets you switch off has an Enabled switch as its first row. Off, its rows show what they would hold and cannot be edited; on, they can.

For mod authors

  • A nested class declared nullable (public SailsConfig? Sails;) is an optional section. Null is left null rather than replaced with a fresh instance, the section gets an Enabled switch, and the file holds null when it is off and an object when it is on. Switching off and on again keeps the values. Before this, a null sub-config was silently turned back on with defaults at registration.
  • The '?' is read from the compiled annotation, so it works whether or not your project has nullable checking on. A nested class declared without it and left uninitialised still gets an instance, as before.
  • A [Description] or doc comment on a nested class is the line under its section heading.

Thanks to TheInsanityGod for the reports, and for noticing that null sub-configs were not surviving.

Madalovin, Sep 7th at 5:14 AM (modified Sep 7th at 5:15 AM)

(This is for an older version but still reporting) VS 1.22.6, configkit_1.2.0 (on client and serverside)


Had a problem where my client would frequently freeze up entirely and had to be terminated to close game. I saw a rumor that led me to believe this mod may've been the culprit so I trimmed it out first (out of the list of 101 mods) and after playing for a few hours I didn't have any more problems of game freezing. I couldn't confirm for certain what was causing the problem because I could find no errors in my logs or server-side logs so I didn't know where else to look.

I see versions 1.3.5, 1.3.6 have both fixed errors that relate to crashes maybe if I tried those my problem will be gone. :)
edit: In the future if you could point me where to look I'd be grateful because after checking logs I felt stumped.

dizzyd , Sep 7th at 2:40 PM
@Madalovin: (This is for an older version but still reporting) VS 1.22.6, configkit_1.2.0 (on client and serverside) Had a problem where my client would frequently freeze up entirely and had to be terminated to close game. I saw a rumor that led me to believe this mo

Thanks for the report; definitely try 1.3.6. 

Quick question: were you opening the Mods settings screen much in those sessions? Most of the changes between 1.2.x and 1.3.x are in the config screens; if you weren't opening the config editor during your session, it's unlikely to be a 1.2 vs 1.3 problem. If you rarely or never opened it, the freeze is almost certainly somewhere else - outside that screen ConfigKit does very little while you play.

On where to look: a freeze writes no crash log, which is why yours were clean. Check the last few lines of client-main.log and client-debug.log before the timestamps stop. And next time it hangs, before killing it, open Task Manager, right-click Vintagestory, and choose "Create dump file". That shows exactly which thread is stuck and where. Send me that plus the log tails and I'll take a look.

Madalovin, Sep 7th at 4:12 PM
@dizzyd: Thanks for the report; definitely try 1.3.6. Quick question: were you opening the Mods settings screen much in those sessions? Most of the changes between 1.2.x and 1.3.x are in the config screens; if you weren't opening the config editor during your sess

I had not opened the mod setting screen yet while using this mod, one instance of me crashing I related to me grabbing an iron saw off a tool-rack, others I couldn't relate to any cause / didn't pay enough attention.
I'll keep that in mind to create a dump file next time that happens- though I'm using linux and I don't see such an option in the equivalent System Monitor.
image

dizzyd , Sep 7th at 5:02 PM
@Madalovin: I had not opened the mod setting screen yet while using this mod, one instance of me crashing I related to me grabbing an iron saw off a tool-rack, others I couldn't relate to any cause / didn't pay enough attention.I'll keep that in mind to create a dump

Ah, sorry - I assumed Windows. In that case, from a terminal you can do:

dotnet-dump collect -p $(pgrep -f VintageStory | head -n 1) --type Full

 

You'll need to install dotnet-dump via something like:

curl -L -o dotnet-dump https://aka.ms/dotnet-dump/linux-x64; chmod +x dotnet-dump

 

It's worth noting though, that removing a tool from an inventory is vanishingly unlikely to be ConfigKit/configlib, but I know the people got feels about things. :) If you want to do another cross-check, you could remove ConfigKit and put the latest configlib in there - they actually share most of the same code. Good luck!

dizzyd , Sep 6th at 6:30 PM

1.3.6 is released! Mostly TheInsanityGod's reports, and what turned up chasing them:

For players

  • A refused value marks its own row: the label turns red and a mark appears past Reset with the message as its tooltip, so you no longer have to look at the foot of the window to find it
  • A nullable number stays empty when you click away from it, instead of turning into 0

For mod authors

  • A field inside a dictionary or list entry gets the same control its attributes earn at the root and the same validation, with the container's row naming the entry and field that failed
  • A dictionary keyed by an enum offers its members rather than a text box; a [Flags] key accepts a combination; a numeric key is checked against its own type, so 300 is refused for a byte and a ulong past long.MaxValue is not
  • Enums backed by a byte, short or long register; they threw at registration before, and the mod did not load
  • A field added to a class after files were written reads as the class's own default in every stored entry, on screen and in validation, rather than as null

Fixes

  • The lag spike with "Texture ... is leaking memory" in the log: rows scrolled out of view on a long list were never freed when the screen rebuilt after a remove, add, rename or fold
  • A saved enum choice was reset to its default on every start β€” and written back over the file; it loads now, by name or by number
  • Choosing "(unset)" on a nullable enum kept writing the old member
  • An enum inside an entry that the file stored as a number showed the first member instead of the right one
  • A null entry in a dictionary no longer fails validation as an object with every field null
  • A mistyped enum or numeric key is refused with a message instead of being written to the file and lost on the next load
  • The colour swatch beside a colour field now redraws as you type, and no longer leaks

Special thanks to TheInsanityGod for the reports, and for the traced log that pinned the leak down to a line.

dizzyd , Sep 6th at 12:12 AM

1.3.5 is released! The first of the release 1.3 series, so this covers everything since 1.2:

For mod authors

  • Nested classes, dictionaries and lists render themselves β€” a sub-object becomes a foldable section, a dictionary or list gets its own screen with a filter, Add and Rename, and neither needs a line of UI code
  • Your /// doc comments become the tooltips, so a documented settings class needs no [Description] at all
  • Validation attributes are enforced with the messages you wrote, including your own ValidationAttribute
  • Nullable value types keep their null β€” a float? reads empty rather than 0, and can be cleared back to it
  • [DisplayFormat] decides how a number reads, [Key] labels a list row by one of its fields, and [Display(Order)] and [ReadOnly] are honoured
  • SetConfigDisplayName names a config in the dropdown; WillManage lets another config manager ask whether ConfigKit owns a given mod

For players

  • A filter box on the settings list
  • Sliders show the setting's own value rather than the slider's internal one
  • ModConfig/configkit.json can hand a single mod to another config manager without switching ConfigKit off

Fixes

  • Text fields accept typing, and the settings window no longer passes keystrokes through to the game
  • An unbounded [Range] no longer crashes the client
  • A config containing a null saves and syncs correctly
  • Raw JSON settings get a readable box instead of overlapping the rows below
  • Rows sit on a baseline rather than above their controls

Thanks to TheInsanityGod, whose ideas for structured config and mods helped me get this all sorted.

YangWenLi, Sep 5th at 8:44 PM

Hey there, I'm the author of IMM, I wanted to know how we should handle compatibility between our mods.

Would you rather add IMM to ConfigKit's incumbents string array, or should I do something on my end to detect and handle ConfigKit?

dizzyd , Sep 6th at 12:25 AM (modified Sep 6th at 12:25 AM)
@YangWenLi: Hey there, I'm the author of IMM, I wanted to know how we should handle compatibility between our mods. Would you rather add IMM to ConfigKit's incumbents string array, or should I do something on my end to detect and handle ConfigKit?

Hiya!

I'd lean away from the incumbents list. It's less a per-mod courtesy than a global switch; it's there for configlib and autoconfiglib, which contend with us over everything. You and I overlap much less than that: you take mods carrying a config/imm.json, ConfigKits takes a configlib-patches.json or registering in C#, so only mods described to both are ever contested. Turning ConfigKit off everywhere to settle those is too big a hammer.

Your ImmExternalManagerOwnership looks like the right shape to me. The awkward bit is that neither half of the detector would give you a reliable answer about us: your Discover runs at -0.001 and we don't register asset-declared configs until 0.01, and a descriptor only says a mod declared one, not that we took it β€” we stand down when configlib is around, and a player can hand any single mod over to you.

So I've added something in 1.3.5 that should hold whenever you call it:

bool ours = api.ModLoader.GetModSystem<ConfigKitModSystem>().WillManage(modId);

Happy to treat that and IConfigProvider.Domains as stable so you can rely on them. And in the meantime 1.3.5 takes an UnmanagedDomains list in ModConfig/configkit.json, so anyone hitting a real clash can hand one mod to IMM by name without either of us shipping anything.

Does that work on your end?

YangWenLi, Sep 6th at 8:30 AM
@dizzyd: Hiya! I'd lean away from the incumbents list. It's less a per-mod courtesy than a global switch; it's there for configlib and autoconfiglib, which contend with us over everything. You and I overlap much less than that: you take mods carrying a config/imm.

Works for me πŸ‘, I'll probably hook onto it with a C# dynamic to avoid a compile dependency. Thank you for helping make our mods play nice with each other. I'll see to it to add compatibility on my end by the next release in an hour or so.

Furio, Sep 6th at 1:06 PM (modified Sep 6th at 1:40 PM)
@dizzyd: Hiya! I'd lean away from the incumbents list. It's less a per-mod courtesy than a global switch; it's there for configlib and autoconfiglib, which contend with us over everything. You and I overlap much less than that: you take mods carrying a config/imm.

I'm testing adding both of your mods at the same time in my really simple boats patch and it seems to apply both independently it applies IMM last so depending on how the logic is written it can override ConfigKit.

BlueFuryDragon, Sep 5th at 6:42 AM

I don't really know or understamd most of this, but I have 91 mods and used Config lib. So if I delete Config lib and install Configkit I should be okay?

ezrazazel, Sep 4th at 3:10 PM

Would be cool if it weren't vibecoded. It's a shame how far game modding has fallen.

dizzyd , Sep 4th at 3:26 PM
@ezrazazel: Would be cool if it weren't vibecoded. It's a shame how far game modding has fallen.

I've been writing software professionally for the past 30 years, and I've been using AI tooling for this mod the same way I've used every other tool that's come along in that time: I direct it, I read what it produces, I test it, and I put my name on it. Nothing ships that I haven't reviewed and wouldn't have been comfortable writing myself. The source is public β€” if you find something sloppy, wrong, or that you'd have done differently, open an issue or a PR and I'll take it seriously. That's the standard the code should be held to, and it's the only one I care about.

ezrazazel, Sep 4th at 4:59 PM
@dizzyd: I've been writing software professionally for the past 30 years, and I've been using AI tooling for this mod the same way I've used every other tool that's come along in that time: I direct it, I read what it produces, I test it, and I put my name on it.

I guess I just have a stubborn ethical backbone when it comes to oneself actually doing their own work. Sadly, the VS modding scene is absolutely littered with AI generated projects, and it is practically impossible to tell what is and isn't slop, which is why I made the above comment. As a junior game dev myself (still learning the basics tbh), I just cannot understand the decision to use AI at all, even after weighing the genuine pros (which do exist, I concede; LLM-backed code review can be genuinely useful, a great example of this is Box3D) and glaring cons (the general sentiment of AI being a blackbox slop machine, the overwhelming majority of its users not understanding the code it generates, LLM hallucinations, the severe environmental and economic catastrophe it perpetuates, etc., ad nauseam). Ultimately I hope you look back on those thirty years and understand that if you didn't need AI then, you don't need it now.

ezrazazel, Sep 4th at 5:01 PM
@ezrazazel: I guess I just have a stubborn ethical backbone when it comes to oneself actually doing their own work. Sadly, the VS modding scene is absolutely littered with AI generated projects, and it is practically impossible to tell what is and isn't slop, which i

Addendum: I'd highly recommend adding the AI tag to the mod's page. Hopefully some time in the future Anego will implement some sort of tag-based sorting and/or blocklist.

dizzyd , Sep 4th at 6:05 PM
@ezrazazel: I guess I just have a stubborn ethical backbone when it comes to oneself actually doing their own work. Sadly, the VS modding scene is absolutely littered with AI generated projects, and it is practically impossible to tell what is and isn't slop, which i

I appreciate you taking the time to write that out, and I actually agree with more of it than you might expect. The scene is full of low-effort AI projects, it is hard to tell from the outside what's been reviewed and what hasn't, and most of the people generating code don't understand what they're shipping. That's a legitimate thing to be frustrated about. My only pushback is that the fix for "I can't tell who understands their code" is to look at the code and the person, not to assume the worst about the tool.

On "if you didn't need it then, you don't need it now" β€” I didn't need IDEs, garbage collection, or Stack Overflow in 1996 either. I still adopted every one of them the moment they made me faster without making the result worse. That's the whole test, and it's the same test I hold this to. The tooling changes; the standard doesn't.

For what it's worth, since you're learning: the skill that will matter most for you isn't whether you use these tools, it's whether you can read code critically enough to know when they're wrong. That skill is what makes the difference between someone who ships slop and someone who doesn't, and it's the same skill it's always been. Good luck with the game dev.

Hyomoto, Sep 5th at 12:56 AM (modified Sep 5th at 12:57 AM)
@dizzyd: I appreciate you taking the time to write that out, and I actually agree with more of it than you might expect. The scene is full of low-effort AI projects, it is hard to tell from the outside what's been reviewed and what hasn't, and most of the people g

There's no thumbs up button, but thumbs up.  I learned to write code taking apart Hypercard stacks on a Macintosh LC II, I learned a lot from doing that but I am glad I can use my modern tools.

Hyomoto, Sep 5th at 2:21 AM
@dizzyd: You don't miss writing "on mouseup"?! ;)

You know I do miss stacks.  Stack scope, background scope, card scope, local scope.  Sometimes you want a scope between global and instance, putting aside the language itself, I think it really made working with data intuitive.  Like instead of an array, you have a field.  You can see it, interact with it.  You can see when you put 10 into line 1, that it's there.  Not to mention you could manually edit fields basically giving yourself combo cheat and debug tools for the low low cost of literally zero extra effort!  Then I would paint over the background to hide them XD

I mean there was the whole the program is the source code thing, which I guess I like about Python too.  But no, I don't miss writing code in what was essentially a text editor with no documentation.

Persona, Sep 4th at 6:17 AM

Is this backwards compatable with game version 1.22.3? Not all the mods I used have been fuly updated to 22.7 yet, and the fact that configlib is no longer around... (Thanks Maltz...) its not helping much.

TheInsanityGod, Sep 4th at 9:45 AM
@Persona: Is this backwards compatable with game version 1.22.3? Not all the mods I used have been fuly updated to 22.7 yet, and the fact that configlib is no longer around... (Thanks Maltz...) its not helping much.

I would recommend just giving it a try, mods are usually compatible with all minor versions of the major version they where made for (in fact although not as commen some mods even survive major version changes) even if they don't explicitly mention it.

NotTheGian, Sep 4th at 1:21 AM

brother

dizzyd , Sep 4th at 1:30 AM
@NotTheGian: brother

bruh

bopielo, Sep 4th at 3:46 AM
@dizzyd: bruh

bro

Yookers, Sep 14th at 9:47 PM
@bopielo: bro

b

Spidey5635, Sep 3rd at 9:58 PM

Thanks mate if i had a nickel where someone put maleware or malicious code i'd have two nickels which isn't a lot but its strange it happended twice.

Cromestien, Sep 4th at 5:14 AM
@Spidey5635: Thanks mate if i had a nickel where someone put maleware or malicious code i'd have two nickels which isn't a lot but its strange it happended twice.

4 now, Starsector, Starbound, Project zomboid, and now Vintage Story. effectively the same damn reason cross all 4 events too. they didn't like something and decided it was their right to fun/thought police. I will now forever regard Maltiez as Malt Liqour.

Foxtrot88, Sep 6th at 3:06 AM
@Cromestien: 4 now, Starsector, Starbound, Project zomboid, and now Vintage Story. effectively the same damn reason cross all 4 events too. they didn't like something and decided it was their right to fun/thought police. I will now forever regard Maltiez as Malt Liqou

Project Zomboid and Starbound? God damn now you got me worried, I never knew about any of those doing the same. I hope I'm not derailing too much but may I please ask the name of the controversial mods? I've both games heavily modded to hell and bad and now I got a little paranoid.

Cromestien, Sep 13th at 7:49 AM
@Foxtrot88: Project Zomboid and Starbound? God damn now you got me worried, I never knew about any of those doing the same. I hope I'm not derailing too much but may I please ask the name of the controversial mods? I've both games heavily modded to hell and bad and n

been getting a new pc set up so i've been offline a bit.

 Starbounds nonsense was F.U./fractal universe dude had save bricking code if he found you had porn mods in your game and zomboids was a dude having a crashout when people chose to remove his politics from his mod and he added save/world bricking code that kicked off when his mod detected the political gibbering was removed.

 Starsectors was the dude behind take no prisoners mod getting shitty that people added things he didn't like as addons to his mod and so added save bricking code as a response.

For the record. all incident resulted in the removal of the afflicted code and in 2 cases iirc the modders were perma'd being zomboids and starsectors git. starsectors' mod was given to a custodian, I think zomboids mod was full purged and Starbounds was cleaned and the dev was sternly warned by steam for his dickery.

that's what I remember but freely factcheck me cause my memory's shit.

dorkeater, Sep 6th at 3:43 PM (modified Sep 6th at 3:45 PM)
@Cromestien: 4 now, Starsector, Starbound, Project zomboid, and now Vintage Story. effectively the same damn reason cross all 4 events too. they didn't like something and decided it was their right to fun/thought police. I will now forever regard Maltiez as Malt Liqou

GShade which turned peoples computers off, resulting in it being banned from Github.
(EDITED: Lightless was also apparently spyware. One dev on the team had some code in there I guess? I heard this one through grapevine, can't give much more info.)

Vergial, Sep 3rd at 7:59 PM

Much appreciated for this. 

TT_PLEB, Sep 3rd at 7:57 PM

You have LowLightSpawns listen under nothing needing to change on your survey but it keeps telling me i need configlib.

 

https://ibb.co/v6hKhZh4

dizzyd , Sep 3rd at 8:07 PM
@TT_PLEB: You have LowLightSpawns listen under nothing needing to change on your survey but it keeps telling me i need configlib. https://ibb.co/v6hKhZh4

You're right - I missed a variation on how mods depend on each other in my scanner. The compatibility guide is now updated - there are six in the "no changes needed" group that do this:

  • Combat Overhaul Armor Tweak
  • Heatproof Bricks
  • Low Light Spawns
  • No Waste Bloomery
  • Rustbound Magic Easy Mode
  • Vintage Rfit - Client

 

I could make configkit fake the dependency here, but I'm leary of making one mod "pose" as another (even though it's totally possible).

TheInsanityGod, Sep 3rd at 9:35 PM
@dizzyd: You're right - I missed a variation on how mods depend on each other in my scanner. The compatibility guide is now updated - there are six in the "no changes needed" group that do this: Combat Overhaul Armor Tweak Heatproof Bricks Low Light Spawns No Wast

Most of my mods are actually also an interesting variation, I effectively have a code first config approach inside InsanityLib with ConfigLib integration (essentially a refinement of my AutoConfigLib code) that most of my mods work with.

Having said that... any chance you plan on adding support for complex objects (such as arrays, lists, dicts and custom sub classes) in the custom managed configs? Most of my ModConfigs heavily rely on these to make configs logic and efficient from a code perspective.
(if not I'll probably give it a shot myself, once I feel motivated enough to get into another fist fight with the VS GUI code that is :P)

dizzyd , Sep 3rd at 7:08 PM

1.2.0 is released! Wasn't expecting to do another release today but found a few things doing the survey of top 2k mods:

  • Mods that look up configlib's RegisterCustomManagedConfig by name now find it here too, so their setting screens work as expected
  • Every setting now has its own reset-to-default button (great suggestion by Nattie98!)
Hollenfeuer, Sep 3rd at 6:44 PM

Man, looks LOADS better. Not to hate on any mod, but this looks amazing. 

dizzyd , Sep 3rd at 6:43 PM

If you're wondering what mods are compatible with ConfigKit, I did a quick survey: Mod Compatibility

dorkeater, Sep 3rd at 6:43 PM

Vanilla UI <3

Madalovin, Sep 3rd at 5:55 PM

Thanks, King. πŸ’œπŸ

Nattie98, Sep 3rd at 5:53 PM (modified Sep 3rd at 5:56 PM)

It needs a way to show what the default value is
And a button to change a specific setting to a default value not just a button that changes all of them to it.

lilgatr, Sep 3rd at 5:42 PM

Thank you SO MUCH. If you're hiding what your code does from the end user, it's malware, end of discussion. Such a delight to log into the mod page and not even have to search long for a replacement lol. Cheers m8

dizzyd , Sep 3rd at 4:55 PM

1.1.0 is released! Changes are minor, but important:

  • Fixed some strange clipping issues with certain permutations of configs
  • Correct requirements when running on server to ensure client will download it (h/t to Shiver on Discord)
Eldoonsnoodles, Sep 3rd at 4:11 PM

Feel free to fork the project under a

RakkaRyusui, Sep 3rd at 2:32 PM

Xskills Fork still want imGui 😞

TheInsanityGod, Sep 3rd at 3:31 PM
@RakkaRyusui: Xskills Fork still want imGui 😞

Actually last time I checked the XSkills Fork doesn't require ImGui despite it being mentioned on their modpage, only the gilded addon truly required it.

dizzyd , Sep 3rd at 4:37 PM
@RakkaRyusui: Xskills Fork still want imGui 😞

XSkills Fork/Gilded do not use configlib to start with, as best I can tell. XSkills uses vsimgui, but that is for its own nice window rendering, not config management.

BraniyaKz, Sep 3rd at 1:59 PM

This is gold :) Nothing against imgui, but when guis don't match, it bothers a certain part of mah brain...

Pell, Sep 3rd at 10:40 AM

would it cause any problems to swap the original configlib for this on an existing server? (serverside)

dizzyd , Sep 3rd at 7:13 PM
@Pell: would it cause any problems to swap the original configlib for this on an existing server? (serverside)

Generally it should be a drop-in replacement, but it depends on the mods you're using. I've published a mod compatibility guide which can help you map out what might not work after the upgrade. Hope that helps!

TheInsanityGod, Sep 3rd at 10:09 AM

""'

Draws its own ImGui settings screen? Describe the settings instead, usually less code than you had.

A settings class needs only stock .NET attributes ([Description], [Range], [Category])

"""

Now you're speaking my language, I wonder how well this would hold op against my configs containing complex nested sub classes though πŸ€”

 

Guess I will have to go test it when I get home.

TheInsanityGod, Sep 3rd at 10:28 AM (modified Sep 3rd at 10:29 AM)
@TheInsanityGod: ""' Draws its own ImGui settings screen? Describe the settings instead, usually less code than you had. A settings class needs only stock .NET attributes ([Description], [Range], [Category]) """ Now you're speaking my language, I wonder how well this woul

Actually looking at the migration guide... It doesn't support that, which is fair enough ConfigLib itself didn't either (I was supposed to rework my approach for that into it but I never got to finishing that)

""'

Field types

bool, string, int, float, double, long and enums all work. An enum becomes a dropdown of its member names.

"""

kitrana, Sep 3rd at 10:03 AM

based, thank you, and wow you are serious on accountability with the provenance thing.

DilanRona, Sep 3rd at 10:44 AM
@kitrana: based, thank you, and wow you are serious on accountability with the provenance thing.

Something I intend to do myself as well, once I am at a point where I can release my own code mods. nowhere close to that point yet.

Mollycoddle, Sep 3rd at 5:57 AM

Thank you for this. Trust is the bedrock of modding, and someone taking a sledgehammer to it is just... Plus now we have to reckon with the fact that depending on where they live, electronic crime law may have been breached and because they knew and didn't say anything, the devs of the game may be legally complicit. All this for what?

I hope going forward that this, and other mods like it, will help rebuild the trust that the community needs to be able to function.

RakkaRyusui, Sep 3rd at 4:56 AM

Thank you!

DilanRona, Sep 3rd at 4:53 AM

Thank you very much, will be installing this gem today.

Baka_yellow, Sep 3rd at 3:48 AM

based

Zalea, Sep 3rd at 3:32 AM

Thank you for this! Using the game's own interface is an amazing idea. Will defs move my mods over to this when I have the chance πŸ’œ

l33tmaan, Sep 3rd at 3:29 AM

The Maltschism has begun...

JALAMITY, Sep 3rd at 2:53 AM

:)c

FaustDoe, Sep 3rd at 2:44 AM

Basedbasedbasedbasedbased

BlazetteFire, Sep 3rd at 2:32 AM

Thank you for making this and being so transparent. It's appreciated.