Mods / Early Mod Tool Kit
Author: mathgeniuszach
Side: Both
Created: Jul 19th 2023 at 11:56 AM
Last modified: Jun 12th at 2:51 AM
Downloads: 6603
Follow Unfollow 146
Latest release:
EarlyModToolKit-3.2.0.zip
This is a zip file containing an executable, not a mod you put in the mod folder. Why? Because mods that could modify the title screen were patched out by the devs, so this is the next best thing.
Both a Windows and Linux version are available. Let me know of any issues on Discord.
Description
Early Mod Toolkit is an executable wrapper that launches Vintage Story with several patches to the mod screen and loader. In specific, it adds the ability to browse mods, swap out various mod profiles (for differing servers), update or downgrade mods, and load mods early (before loading into a world) from within the game itself. It also logs the time it takes to run any C# code in a mod. If you want to help localize the mod, you can do so via an early mod as described below.
Got a problem with this wrapper or need to see it updated? Let me know on my Discord! Support me on Patreon or Ko-Fi.
I also recommend checking out Laerinok's ModsUpdater script if you want just the automatic mod updating functionality without all the extra features, or if you're running a server. EMTK also doesn't play well with Maestro's Vintage Launcher, while ModsUpdater does a bit better.
NOTE: This is a zip file contaning an executable, not a mod you put in the mod folder. If you installed Vintage Story automatically, you should just be able to run the linux or windows executable and it will automatically find the game; if this doesn't work for you or if you installed Vintage Story manually, put the Vintagestory executable and any dlls into the place you installed Vintagestory and try running it again.
Usage

In the new mod screen screenshot, here's a list of what each of the numbers mean:
- Clicking on this link will open the EMTK page (this page). Occasionally it will say "Update!!!" which means a new update is available.
- Adds a new empty mod profile.
- Erases the current mod profile.
- Renames the current mod profile.
- Dropdown for swapping existing profiles.
- Clicking on the left side of the mod will open up a new screen showing the mod's versions and description as found on the ModDB. Clicking on the little toggle cells on the right side disable/enable installed mods.
- This button opens up the mod browser, for browsing and quickly installing/uninstalling mods with the toggle cells on the right side.
- This button checks for any updates of the currently installed mods. In the screen that pops up, turn the toggle cells off for any mod you do not want to update.
- In the base game, opens the mod folder.
- In the base game, reloads all mods.
Early Mods
To create mods which load on the title screen, add a new json file to your mod zip called "earlymod.json" (dll-only mods not supported). The presence of this file is enough to get the mod and it's assets to load early (for modding language files and textures on the title screen, for example), but you can specify the field (in the json), "ReloadTitle" (boolean) to change if after enabling/disabling the mod the title screen should be reloaded, and you can also specify the field, "LoadOrder" (double), to change the order the mod and its assets get loaded in (smaller numbers go first).
The default json is: {"ReloadTitle": false, "LoadOrder": 0.0}
EMTK also adds two optional static callbacks called on every ModSystem for code mods:
static void EarlyLoad(ModContainer mod, ScreenManager sm)
Called when mods are loaded/reloaded and the mod is not disabled, or when the mod is re-enabled.
"mod" is the ModContainer this code was found in.
"sm" is the main ScreenManager object used to swap guis and store a lot of early game methods.static void EarlyUnload()
Called when mods are reloaded, or if this mod is disabled/removed.
On reload, unloading occurs in the opposite order of loading.
It's not always feasible for every mod to be "Unloaded" or "Reloaded" with certain changes, but it leads to the best user experience when the user can disable/enable any mods ingame with a runtime reload. If this is not possible, indicate it in your mod description, and guard your EarlyLoad() function with a variable so it only runs once.
| Mod Version | Downloads | Released | Changelog | Download |
|---|---|---|---|---|
| 3.2.0 | 589 | May 12th at 10:21 PM | EarlyModToolKit-3.2.0.zip | |
|
Updates for 1.20.x and the ModDB. | ||||
| 3.1.0 | 947 | Jan 22nd 2024 at 2:59 AM | EarlyModToolKit-3.1.0.zip | |
|
Fixed for 1.19.0 | ||||
| 3.0.5 | 530 | Sep 24th 2023 at 4:24 AM | EarlyModToolKit-3.0.5.zip | |
|
- Fixed updating mods with weird versioning systems | ||||
| 3.0.4 | 366 | Sep 5th 2023 at 1:41 AM | EarlyModToolKit-3.0.4.zip | |
|
Fixed a NullReferenceException in FindEarlyMods(), and added safegaurds to prevent similar issues from occuring except with early mods Added a warning message when a mod attempts to use UnpatchAll() with no arguments. This will not unpatch all mods, but rather unpatch all patches in the harmony instance that called the function. | ||||
| 3.0.3 | 278 | Sep 4th 2023 at 3:27 AM | EarlyModToolkit-3.0.3.zip | |
| ||||
| 3.0.2 | 410 | Aug 10th 2023 at 6:59 AM | EarlyModToolKit-3.0.2.zip | |
|
Final .net4 build included. Fix pathing and display filenames in updates. | ||||
| 3.0.1 | 310 | Aug 3rd 2023 at 3:30 AM | EarlyModToolkit-3.0.1.zip | |
|
Fixed .net7 config path. | ||||
| 3.0.0 | 295 | Aug 1st 2023 at 9:53 PM | EarlyModToolkit-3.0.0.zip | |
|
Added .NET7 release and made 3dpartymodicon.png replacable via earlymod. | ||||
| 2.0.9 | 284 | Jul 30th 2023 at 3:26 AM | EarlyModToolkit-2.0.9.zip | |
|
Improved mod browsing experience on windows and linux, by adding a mod count, limit on shown mods, and dependency list. | ||||
| 2.0.8 | 282 | Jul 27th 2023 at 11:55 PM | EarlyModToolkit-2.0.8.zip | |
|
Added extra automatic search paths on windows and linux to find EMTK, hopefully reducing the amount of people who need to put EarlyModToolkit.exe in the same place as Vintagestory.exe Added Mod Dependency display for installed mods. The EMTK update checker now occurs in another thread, so the game can boot faster. | ||||
| 2.0.7 | 392 | Jul 24th 2023 at 4:23 AM | EarlyModToolkit-2.0.7.zip | |
|
Added extra failsafes in case of missing icons and failed uninstalls. | ||||
| 2.0.6 | 322 | Jul 21st 2023 at 11:46 PM | EarlyModToolkit-2.0.6.zip | |
|
Fixed some mod profile bugs, particularly with large mod numbers | ||||
| 2.0.5 | 234 | Jul 21st 2023 at 8:27 PM | EarlyModToolkit-2.0.5.zip | |
|
Fixed releases without versions from crashing the whole game | ||||
| 2.0.4 | 246 | Jul 21st 2023 at 8:15 PM | EarlyModToolkit-2.0.4.zip | |
|
Fixed more windows issues | ||||
| 2.0.3 | 267 | Jul 21st 2023 at 8:15 AM | EarlyModToolkit-2.0.3.zip | |
|
Multithread mod browsing and fix exe pathing to the assets folder | ||||
| 2.0.2 | 289 | Jul 19th 2023 at 9:35 PM | EarlyModToolkit-2.0.2.zip | |
|
Fixed a race condition that prevented launch on windows | ||||
| 2.0.1 | 245 | Jul 19th 2023 at 12:20 PM | Empty | EarlyModToolkit-2.0.1.zip |
| 2.0.0 | 246 | Jul 19th 2023 at 11:57 AM | Empty | EarlyModToolkit-2.0.0.zip |
1.21.0 looks like not working
I may just be failing to do something right, but I can't seem to make this work with the flatpak version of Vintage Story, and for the life of me, I can't find the place to put it all so that it does work. Do I need to do something different or special?
seems to be working alright for me so far (on game v1.20.12 and mod v3.2.0), this is awesome work. is there any way to close or disable the console window?
For me, this mod need .net version 8 (and install only the 8) to work, then I download the mod, extract it then just drag all files in folder Win-x64 (because I'm using windows) the .exe, the .dll, .pdb, all files to the main folder of Vintagestory that have Vintagestory.exe on it, then just open the Earlymodtoolkit.exe, the mod should open the game and then when u open the mod manager it should open the new setting like create profile, update the mods, uninstall the mods etc
@mathgeniuszach
This is what you get when trying to open in a powershell.
-3.2.0\win-x64> .\EarlyModToolKit.exe
You must install or update .NET to run this application.
App: E:\Users\Travic\Desktop\Vintage\Tools\EarlyModToolKit-3.2.0\win-x64\EarlyModToolKit.exe
Architecture: x64
Framework: 'Microsoft.NETCore.App', version '8.0.0' (x64)
.NET location: C:\Program Files\dotnet\
The following frameworks were found:
7.0.20 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Learn about framework resolution:
https://aka.ms/dotnet/app
-launch-failed
To install missing framework, download:
https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=8.0.0&arch=x64&rid=win10-x64
So it requires .NET 8 framework.
Edit for new info
With .NET 8 I get a crash.
Running on 64 bit Windows 10.0.26120.0 with 32693 MB RAM
EMTK Version: 3.2.0
Game Version: v1.20.12 (Stable)
7/3/2025 9:39:39 PM: Critical error occurred
Loaded Mods:
System.IO.FileNotFoundException: Could not load file or assembly 'PresentationFramework, Version=6.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified.
File name: 'PresentationFramework, Version=6.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
at Eto.Wpf.Platform.<>c.b__10_90()
at Eto.Widget..ctor()
at Eto.Forms.Application..ctor(InitHelper init)
at Eto.Forms.Application..ctor(Platform platform)
at VSPlatform.XPlatImpl.ShowMessageBox(String title, String text) in XPlatformInterface\PlatformFormsImpl.cs:line 38
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 186
at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 130
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 93
Last edit 😝. Ran it without the powershell (from .exe) after installing .NET8 and it ran!
Running the latest update fails to run at all. I'm not sure what the issue is since it doesn't seem to do anything :(
ive used this for as long as i can remember and now all of a sudden it just ,,, doesnt work? no error, nothing. a flash of the comand prompt then nothing. cannot figur out why this is happening.
Having used this program before, I'm currently struggling to figure out why this isn't working. The program won't even create ERROR.txt - when I launch it, the command prompt opens for precisely a frame, then immediately shuts down. I've reinstalled Vintage Story and even the .NET 7 framework, but I've not been able to figure this out.
"Update all" what a magnificent button!
hello, i was testing some mods and upon closing world saw this in the console:
12.6.2025 13:19:31 [Client Warning] Harmony instance "repairme" attempted to run UnpatchAll() with no arguments. This normally unpatches all mods, including EMTK, instead of just the harmony instance itself. Please notify the mod author to use UnpatchAll("repairme") instead.
it told me to alert you so i thought i'd leave a comment. at least i think it means you. thank you for the app thingy
Can this ported to MacOS ??
Return of the king!
THIS SHOULD BE IN VANILLA... I ASKED THEM FOR THAT SINCE YEARS !!!
my life for an updated EMTK........
Any idea how long till its updated for 1.20 stable?
Seems like this is crashing on the 1.20 pre versions. Sad
Shows 2 mods as disabled, no name shown. And selected. Any attempt to disable or remove results in a severe crash.
Also, when installing new mods, there is no option to prioritise specific Vintage Story versions. More and more of the latest mods are for the prerelease VS, and the mod page on EMTK does not always say what version for VS it is meant, resulting in a game crash when not paying attention.
Otherwise a great mod, and is the first one I install when doing a new install for VS
I went to launch the game using this mod, but it immediately crashes the game now before it starts. I'm not sure what is causing it.
I tried to run a certain mod to at least test it, it crashed my game. Sure, those things happen.
But now there's a ghost entry of it in the mod list, saying it couldn't be loaded. Even after deleting the file, it stays. How can I remove that? Where are the load orders saved?
Edit: SOMEHOW it made an empty folder on the vintagestoryData mods folder. That cleared it.
browse wont work for me, it shows 0 mods even if i have some on
things that are missing:
doesn't display "latest file for: <version>"
backup and restore profile (backs up mods that are in the profile so that after an update if anything goes wrong you have a backup that you can restore
config editor so you can edit the selected mod's config
needs to D/Load all the pictures in the mods description
showing the clickable links to the source files
all I can say is wow finally got it working. i see that there are some errors :( in the command window when i run it
this would be great if they could make all this part of the original game so that we could just run the main original vintage story
ATree it does! Any asset in the folders "lang", "textures", "sounds", and "music" will be preloaded and overwrite existing vanilla files. An important thing to note is that you must use the "game" namespace in order to replace these assets.
To make sure your mod is being loaded early, check for a line that looks like this in your log: "EMTK: Early External Origins in load order: ...", and make sure it's got your mod included. Also make sure that the mod is enabled, early mods are disabled by default because someone thought it was a security risk (despite the fact that there is no security risk, you are the one who puts mods in the mods folder after all, and loading into any world will cause problems anyway).
For an example of an early mod I was working on to change the title screen, see here:
https://github.com/mathgeniuszach/vintagemods/tree/main/Title%20Screen%20Tweak
Does this allow the editing of things like the gui backdrop texture, or the main menu music? I am trying to edit both but to no success. Tried turning them into an "earlymod" but still no luck.
No mods are loading in the mod browser. I get the following in the console window when launching EMTK:
EMTK: API request to get mods failed with error: System.NullReferenceException: Object reference not set to an instance of an object.
at EMTK.CustomModCellEntry..ctor() in /home/mgz/Documents/Code/git/vintagemods/Early Mod Toolkit 3/src/ModAPI.cs:line 311
at EMTK.ModAPI.GetMods(Int32 tries) in /home/mgz/Documents/Code/git/vintagemods/Early Mod Toolkit 3/src/ModAPI.cs:line 162
EMTK is allowed in my firewall and I am able to update mods.
OS: Win10 x64
Kaofan EMTK is not a server mod, it's exclusively a client-side mod-wrapper. It uses the ingame GUI so it wouldn't make sense if it could run on a server.
Clients running on Linux use EMTK the same way Windows users do, except they use the Linux binary instead of the Windows one. If you want to ensure that EMTK can find the Vintagestory executable, put the EMTK binary and dll file in the same folder as the Vintagestory binary.
I recommend checking out Laerinok's ModsUpdater for the mod-updating functionality server-side.
mathgeniuszach
Any description of how to install this server mod on Linux?
Zinloz EMTK 3.0.3 now honors the --dataPath cli argument, but as for extra mod paths, those will function the same way as the base game mod paths - they persist across profiles.
Travisplo yes? Nearly every game with mod profiles does it this way. Or they store links to each mod and redownload them when swapping profiles/collections (Steam workshop games). Minecraft launchers do it this way, why should I do any different when the amount of potential space gain is questionable at best? There's no need to spend the time space-optimizing this as there's no real demand to do so, mods are small enough that a few copies of some mods is okay.
Is there meant to be multiple copies of each mod for each profile? That seems a bit messy.
Same question as Xandyr78. You can change the datapath by adding this to your VS shortcut:
--dataPath "D:\Vintage Story\Data"
And this for the mod path:
--addModPath "D:\Vintage Story\Data\Mods"
I'm not seeing a way to change this in EMTK. Can we get support for args on the launcher, please? Was hoping .runtimeconfig would do it but no luck.
Xandyr78 the .NET7 build uses whatever "GamePaths.DataPath" is. If you somehow managed to redirect the main game from using that, then you would have redirected EMTK as well. Unless there's some method of redirection that occurs only in runtime that I don't know about.
Works, thanks! Side note though: if you attempt to update the client while running EMT, it will say the vintagestory.exe is still running. Maybe make a note that the user will need to save the temp location the client update exe was downloaded to and then run said update exe while vintagestory.exe is not running so that an update to the client can be performed. Cannot remember if it does this outside of EMT but it does require these steps to be performed when running EMT.
I have my dataPath for VS redirect to a folder that isn't the default %appdata% directory...is there a way to adjust/install this so that it doesn't just dump a whole new datapath into my C: drive?
Ryuu Fixed in 3.0.1.
I have properly used .net7 version and it runs the .net7 client; however, it's installing mods to the .net4 directory and not .net7 directory.
.net7 directory: %appdata%\VintagestoryDataNet7\
.net4 directory: %appdata%\VintagestoryData\
Please look into fixing this.
Using mod v3.0.0 and had to C&P zip contents to my Vintage Story .Net7 client which I had taken out of %appdata% and added it to c:\games\VintageStory (both on the same drive) since it was not auto-detecting my install directory for the client.
Again, I can run the game but it's detecting the config files and installing mods in the .net4 directory instead of .net7 despite me having installed the .net7 version of EMT from the v3.0.0 zip file.
WeedusFetus That'd be cool, but mods, their authors, or their users don't really provide that data anywhere. I'd have to train an AI or something to parse comments, but even that wouldn't be reliable enough.
Is there any plan for a conflict feature in the future, to show us which mods might have issues with eachother?
:-) It is working! Fantastic. Mostly. I confirm that updating, browsing, and installing new mods works well. (IMHO, the best part of the app)
Issues:
1) Crashes if you create a new profile when you have a large number if mods. (I think) Fixed in 2.0.6
2 ) There may be something funny with the parser in the browser. It seems to work well mostly, however if you select expanded foods 1.6.6 it will crash (Some unhandled charactor on that page in forum?
).
slartibartfast Does 2.0.3 work for you? Someone came onto discord and helped me fix a potentially similar issue
Yes, this is net4 VS. windows 11. Nvidia rtx 2060
I am sorry, I will just wait and keep trying with future updates.
slartibartfast Only other thing I can say if you don't have any more info is the exe is .NET4 only, not .NET7. DanaCraluminum has helped to get it working on Windows, so I know it works there.
Sadly I have the same issue with 2.0.2, I have even removed the mods from the roaming folder. VS 1.8.6 is installed C:\Program Files\Vintagestory\
the only data the log files generate is the same output in client-main.txt
There really isn't more info than that I can provide I don't think.
I place your app in the Vintagestory installed folder. from any other directory I get an unhandled exception that it can not find VintagestoryAPI
Sorry, I am not setup for discord. have to recall what I made for a password from years ago. But, if I got on there I don't think I could be of any more help.
slartibartfast this issue is fixed now in 2.0.2.
slartibartfast could you hop into the discord and provide more info about your problem?
I would love to try this but I get...
C:\Program Files\Vintagestory>EarlyModToolkit-2.0.1.exe
EMTK: Pre-Querying ModDB in a separate thread!
EMTK: Patching for early mods!
EMTK: Patching complete!
EMTK: Awaiting EMTK update checker...
19.7.2023 13:09:34 [Client Notification] Client logger started.
19.7.2023 13:09:34 [Client Notification] Game Version: v1.18.6 (Stable)
19.7.2023 13:09:34 [Client Notification] Screens:
19.7.2023 13:09:34 [Client Notification] 0: {X=0,Y=0,Width=1536,Height=864}, \\.\DISPLAY1 (primary)
19.7.2023 13:09:35 [Client Notification] Exiting game now. Server running=False. Exit reason: Game crashed
I immediately noticed an issue with the update checker that would prevent the launcher from working, fixed in 2.0.1
Looks amazing!! Testing now!! Was dumb and didnt read the .net7 part, cant wait for that, but will test on a different build later! Edit; did end up testing, works perfectly and immediately, great job!