Mixin Helper
Take control of mixin conflicts in your modpack. Mixin Helper lets you blacklist, prioritize, and surgically modify mixins from any loaded mod, all from a single JSON config file. No code, no recompiling, no removing mods.
Documentation
Full documentation, guides, and examples at https://tysontheember.dev/mixin-helper/intro/
⚠️ USE AT YOUR OWN RISK ⚠️
This is an advanced tool. If you don't know what mixins are or how they work, this mod is not for you.
While there are guardrails Mixin Helper directly interferes with how other mods patch the game. Incorrect use will break things. This includes but is not limited to:
- Game crashes with difficult-to-diagnose stacktraces
- Broken mod features that may not be immediately obvious
- World corruption, back up your worlds before making changes
- Incompatible save files if disabled mixins affect world data
Do NOT report bugs to mod authors if you have modified their mixins with this tool. Any issues caused by Mixin Helper are your responsibility.
Features
- Mixin Blacklisting: Disable individual mixins, entire mixin configs, or block all mixins targeting a specific class
- Priority Control: Override mixin execution order to resolve load-order conflicts between mods
- Method Removal: Neutralize or remove specific injected methods without disabling the entire mixin
- Audit Report: Generate a detailed JSON report of every loaded mixin config, including annotations, to diagnose conflicts fast
How It Works
- Install Mixin Helper, drop the jar in your
modsfolder - Launch the game, a default config is generated at
config/mixinhelper.json - Check the audit report at
config/mixinhelper-report.jsonto see every mixin loaded in your game - Edit the config to blacklist, reprioritize, or strip methods as needed
- Restart and you're done
Quick Example
Two mods crash because they both modify the same class? Blacklist the offending mixin:
{
"enabled": true,
"blacklist": {
"mixins": ["com.conflictingmod.mixin.MixinLevelRenderer"],
"mixinConfigs": [],
"targetClasses": []
}
}
Need finer control? Neutralize a single injected method instead of the whole mixin:
{
"methodRemovals": {
"rules": [
{
"targetClass": "net.minecraft.world.level.Level",
"method": "brokenMethod",
"action": "nop"
}
]
}
}
Use Cases
- Modpack developers resolving mod conflicts without waiting for mod authors to fix them
- Server admins disabling specific mod behaviors that cause instability
- Debugging which mixins are causing crashes or unexpected behavior
- Fine-tuning mod interactions by controlling execution order
Notes
- Config changes require a full game restart, mixins load very early in startup
- Mixin Helper itself has no mixins, it uses the Mixin plugin system to intercept other mods
- Zero runtime performance impact, all work is done during startup
How to Install Mixin Helper (Mod)
Mixin Helper by TysonTheEmber is verified for Fabric, Forge, Neoforge across Minecraft versions 1.20.1, 1.21.1 (latest release: 1.1.2+neoforge-1211, file size: 41 KB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.20.1, 1.21.1) and platform (Fabric, Forge, Neoforge).
- Make sure you have the compatible loader or environment installed for Fabric, Forge, Neoforge.
- Move the downloaded Mixin Helper file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add Version### Fixed
mixinPrioritiesnow works. The map was read from the config but never applied, so per-mixin overrides had no effect and the mixin kept its own priority.mixinConfigPrioritiesnow changes the priority of every mixin in that config. It used to change only the config's own ordering value, which Mixin had already copied into each mixin before Mixin Helper ran.- An individual
mixinPrioritiesentry wins over amixinConfigPrioritiesentry for the same config. - Mixin applies lower priorities first. To make a mixin win a
@Redirectconflict, give it a lower number than the other mixin, not a higher one.
### Fixed
mixinPrioritiesnow works. The map was read from the config but never applied, so per-mixin overrides had no effect and the mixin kept its own priority.mixinConfigPrioritiesnow changes the priority of every mixin in that config. It used to change only the config's own ordering value, which Mixin had already copied into each mixin before Mixin Helper ran.- An individual
mixinPrioritiesentry wins over amixinConfigPrioritiesentry for the same config. - Mixin applies lower priorities first. To make a mixin win a
@Redirectconflict, give it a lower number than the other mixin, not a higher one.
### Fixed
mixinPrioritiesnow works. The map was read from the config but never applied, so per-mixin overrides had no effect and the mixin kept its own priority.mixinConfigPrioritiesnow changes the priority of every mixin in that config. It used to change only the config's own ordering value, which Mixin had already copied into each mixin before Mixin Helper ran.- An individual
mixinPrioritiesentry wins over amixinConfigPrioritiesentry for the same config. - Mixin applies lower priorities first. To make a mixin win a
@Redirectconflict, give it a lower number than the other mixin, not a higher one.
### Fixed
mixinPrioritiesnow works. The map was read from the config but never applied, so per-mixin overrides had no effect and the mixin kept its own priority.mixinConfigPrioritiesnow changes the priority of every mixin in that config. It used to change only the config's own ordering value, which Mixin had already copied into each mixin before Mixin Helper ran.- An individual
mixinPrioritiesentry wins over amixinConfigPrioritiesentry for the same config. - Mixin applies lower priorities first. To make a mixin win a
@Redirectconflict, give it a lower number than the other mixin, not a higher one.
### Fixed
- Mixin names in the audit log are no longer recorded with a doubled dot before the class name (for example
org.example.mixin..FooMixin). Mixin appends a trailing dot to the configured package internally; the audit log and the string-list blacklist matching now join the full name with a single separator, so annotation scanning and blacklist lookups resolve correctly.
## v1.1.0
### Added
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
### Fixed
- Mixin names in the audit log are no longer recorded with a doubled dot before the class name (for example
org.example.mixin..FooMixin). Mixin appends a trailing dot to the configured package internally; the audit log and the string-list blacklist matching now join the full name with a single separator, so annotation scanning and blacklist lookups resolve correctly.
## v1.1.0
### Added
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
### Fixed
- Mixin names in the audit log are no longer recorded with a doubled dot before the class name (for example
org.example.mixin..FooMixin). Mixin appends a trailing dot to the configured package internally; the audit log and the string-list blacklist matching now join the full name with a single separator, so annotation scanning and blacklist lookups resolve correctly.
## v1.1.0
### Added
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
### Fixed
- Mixin names in the audit log are no longer recorded with a doubled dot before the class name (for example
org.example.mixin..FooMixin). Mixin appends a trailing dot to the configured package internally; the audit log and the string-list blacklist matching now join the full name with a single separator, so annotation scanning and blacklist lookups resolve correctly.
## v1.1.0
### Added
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default
- Guardrails system** to prevent accidental modifications to critical classes that could corrupt worlds or crash the JVM
- Protects chunk generation classes (
ChunkGenerator,NoiseBasedChunkGenerator,WorldGenRegion,LevelChunk,ChunkStatus) - Protects palette container classes (
PalettedContainer,LinearPalette,HashMapPalette,Palette) - Protects mixin system internals (
org.spongepowered.asm.*) - Protects JVM/classloader internals (
java.lang.ClassLoader,sun.misc.Unsafe,jdk.internal.*) - Protects threading classes (
BlockableEventLoop,TickTask) - Protects world persistence classes (
LevelStorageSource,net.minecraft.nbt.*,LevelData) - New
guardrailsconfig section with: enabled— master toggle (default:true)bypassProtectedClasses— override protection at your own risk (default:false)additionalProtectedPatterns— add your own protected class prefixesexcludeFromProtection— selectively unprotect specific classes (requires bypass)- Early config validation logs warnings at startup when protected classes are referenced
- Guardrails block target-class blacklisting and method removal/nop on protected classes by default