CLI tool
RetroMod ships with a command-line tool (RetroModCli) for transforming mods outside Minecraft. It’s handy for scripting, CI pipelines, bulk modpack prep, and poking at what RetroMod would do to a mod without actually booting the game.
Running the CLI
One quirk: the published JAR doesn’t bundle its dependencies, so java -jar retromod.jar ... won’t work. You run the CLI through Maven instead, from a checkout of the repo:
git clone https://github.com/Bownlux/RetroMod.git
cd RetroMod
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="<command> <args>" \
-q
The -q flag keeps Maven quiet so you only see RetroMod’s output. Every example below assumes you’re in the repo root.
Commands
transform — transform a single mod
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="transform path/to/mod.jar" -q
Transforms mod.jar in-place to target the current TARGET_MC_VERSION (26.1.2). The original is backed up next to it with a .bak suffix.
Output: path/to/mod.jar (transformed), path/to/mod.jar.bak (original).
transform --verify — transform and verify
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="transform path/to/mod.jar --verify" -q
Same as transform, but after transformation runs the verifier and writes a report to config/retromod/verify-reports/. Non-zero exit if verification finds unresolved references.
batch — transform every mod in a folder
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="batch /path/to/mods" -q
Iterates every .jar in the given folder, transforming each one. For targets at 26.1+ this also runs the metadata-only patch on mods that don’t need bytecode rewrites, so version constraints get relaxed regardless.
Pass --verify to verify each mod after transforming:
-Dexec.args="batch /path/to/mods --verify"
aot — AOT-compile a folder of mods
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="aot /path/to/mods" -q
Runs the full AOT compiler over every mod in the folder, writing cache entries into config/retromod/aot-cache/. Next time Minecraft launches with RetroMod, those mods load from the cache without being transformed again.
Useful for bulk-preparing a modpack on a faster machine before shipping it out.
embed — bake RetroMod into a mod JAR
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="embed path/to/mod.jar" -q
Embeds a minimal RetroMod runtime directly into mod.jar so the mod can self-transform at load time without needing RetroMod installed separately. Produces a self-contained JAR that works on a vanilla Fabric/NeoForge/Forge install.
diff — show what transformation would do
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="diff path/to/mod.jar" -q
Dry-run: prints the class/method/field renames, mixin target rewrites, and metadata changes RetroMod would apply, without actually writing anything. Great for “what is RetroMod going to do to my mod?” before you commit.
shims — list registered shims
mvn exec:java \
-Dexec.mainClass="com.retromod.cli.RetroModCli" \
-Dexec.args="shims" -q
Prints every registered version shim, grouped by loader (Fabric / NeoForge / Forge / API), with fromVersion → toVersion and redirect count. Useful for confirming a shim is actually loaded.
Abbreviated output:
Fabric shims (112):
1.20.1 → 1.20.2 (18 redirects)
1.20.2 → 1.20.4 (23 redirects)
...
NeoForge shims (21):
1.20.4 → 1.20.6 (5 redirects)
...
Flags
--verify
Works with transform and batch. Runs the verifier after each transformation and writes a report. Non-zero exit code if any verification misses are found.
-q (Maven quiet mode)
Not a RetroMod flag, but worth mentioning. Pass -q to Maven to suppress its progress output. Without it you’ll see Maven’s standard blah about downloading dependencies and running the exec plugin.
Scripting tips
- Every command returns a non-zero exit on error, so you can chain with
&&or check$?in shell scripts. batchlogs one line per mod to stdout — easy togrepfor specific mod IDs or failures.- Verify reports are plain text; parse them with whatever you like.