MulderConfig is a small Windows launcher/configurator driven by a JSON file. It can:
- apply file tweaks (copy/rename/delete/replace text)
- change game executable and/or add arguments
- provide a simple WinForms UI to pick options and save them per Title
- Put
MulderConfig.jsonnext to the executable. - Run
MulderConfig.exefor the UI. - Optional headless modes (requires existing save)
MulderConfig.exe -applyMulderConfig.exe -launch
The app writes user selections to MulderConfig.save.json.
This is mainly for Steam games that expose "official addons/DLC" through Steam launch options (for example: Duke Nukem 3D: Megaton Edition).
In that setup, when you start the game from Steam, Steam shows a launch options dialog and then starts the game with an extra argument like -addon X (where X is an integer).
With MulderConfig, you can define an addons list in MulderConfig.json and write different rules depending on which addon is selected.
If no addon matches (or if -addon is not provided), MulderConfig falls back to the base game title.
If your config contains at least one actions.launch rule, MulderConfig will perform an “exe replacement” step.
In practice, it moves the original game executable aside (renaming it to *_o.exe) and copies MulderConfig.exe in its place.
The goal is to keep launching the game from Steam (or another launcher that expects the original executable) while still applying your configuration. This help to keep Steam features such as playtime tracking, overlay, and of course Steam achievements.
If your config has no launch rules, MulderConfig will not replace the executable with Apply.
Top-level structure:
{
"game": { "title": "...", "originalExe": "..." },
"addons": [ { "title": "...", "steamId": 123 } ],
"optionGroups": [ ... ],
"actions": {
"operations": [ ... ],
"launch": [ ... ]
}
}Validation rules (important):
addonsis optional.actions.operationsandactions.launchare optional individually.- But you must have at least one action:
launchORoperationsmust contain at least one item.
{
"game": { "title": "Fallout", "originalExe": "Fallout.exe" },
"optionGroups": [
{
"name": "Renderer",
"type": "radioGroup",
"radios": [ { "value": "DX9" }, { "value": "DX11" } ]
}
],
"actions": {
"launch": [
{
"when": [ { "Renderer": "DX11" } ],
"exec": { "name": "FalloutDX11.exe", "workDir": ".\\" },
"args": [ "-novsync" ]
}
]
}
}when is used in actions.launch and actions.operations.
disabledWhen is used in optionGroups to disable a radio/checkbox.
Logic:
- list of groups = OR
- inside a group = AND
- missing/empty list = “always apply”
The operator is encoded in the key prefix:
Key: "Value"→ equals (case-insensitive)!Key: "Value"→ notEquals*Key: "Value"→ contains (substring)!*Key: "Value"→ notContains
Title is always available to when.
Example:
{ "when": [ { "Renderer": "DX11" }, { "!Title": "Vanilla" } ] }Checkbox groups are stored as a list of strings:
Key/!Keybehaves like “list contains value” / “list does not contain value”*Key/!*Keybehaves like “any item contains substring” / “no item contains substring”
Special case: Key: "" matches when the selection is empty (null/empty list).
Missing keys:
Key/*Keycannot match!Key/!*Keyis treated as true
Operations run in JSON order (optional when). Supported operations:
rename/move(requiressource,target)copy(requiressource,target)delete(requiressource)setReadOnly(requiresfiles)removeReadOnly(requiresfiles)replaceLine(requiresfiles,pattern,replacement)removeLine(requiresfiles,pattern)replaceText(requiresfiles,search,replacement)
Paths are relative to the game directory (app startup directory). Windows environment variables like %USERPROFILE% are expanded.
Launch rules are evaluated in JSON order:
argsare cumulative (appended)execis atomic and last-match-wins (exe + workDir together)
Defaults if no exec matches:
- exe:
game.originalExe - workDir: app startup directory