Modded problems require modded solutions
How I over-engineered a modded minecraft server pipeline
If you’ve read my other blog post on Minecraft server troubleshooting (Adventures in Modded Minecraft Server Deployment, you might be wondering: “Why build a pipeline for Minecraft servers?”, “How did you get to this point?”, and maybe even, “How would I build something like this?” If you didn’t read that post or found this from my GitHub repo, you probably aren’t asking those questions—but I’ll answer them anyway.
My Craft-Ops adventure spans 4 years and multiple attempts to find what I’d consider the “Optimal Solution.” Let’s dive in.
Section 1 - History:
Part 1 - Simple Beginnings:
I decided to gather some Minecraft friends for a modded playthrough since we’d already exhausted the base game. Initially, there was no automation—everyone manually installed mods (with some help from me), and I’d put them on the server myself. This was far from ideal, as every change required everyone to spend an hour or so getting set up. Not surprisingly, this didn’t take off.
Part 2 - The CurseForge Launcher:
Six months later, we tried again with the CurseForge Launcher app (CFL). The downside? You had to get approval and make your pack public to use their servers, meaning we had to exchange the zip file for the pack with every update. Despite this hassle, the modded server idea started to catch on—except when we had to update. Synchronizing everyone to the same version was still a pain.
Part 3 - Technic Launcher & Technic Solder:
To solve the CFL synchronization issues, I switched to the Technic Launcher a year later. It wasn’t perfect—it took me nearly half an hour to make basic changes—but at least no one else had to worry about updates. Everything just worked… until it didn’t. Technic eventually broke, and I was already hunting for alternatives due to its inefficiency.
Part 4 - Packwiz and Prism Launcher:
Packwiz is the final boss of modpack management. With ornery documentation*, the ability to export for MultiMC/Prism Launcher, Modrinth, and CurseForge, Packwiz automates the updating of both clients and servers via a jar-file that runs before launching the game. The only issue is mod-loaders—it can’t change the server mod-loader on the fly. This is where itzg’s Minecraft-server docker image comes in, allowing any mod-loader and accepting a Packwiz descriptor file URL for downloading mods. Add a shell script to grab the mod-loader from the Packwiz pack.toml descriptor file and feed it into a Docker run command, and voila! You have the pipeline.
*Still better than Technic’s docs, which are straight-up obtuse.
Section 2 - How It Works Today:
Part 1 - Packwiz:
Packwiz, as its creator defines it, is “a command line tool for creating Minecraft modpacks.” Instead of managing resources directly, Packwiz creates metadata files in TOML format that point to resources elsewhere. For smaller files like configs, Packwiz supports placing them directly in the required directory. It’s not perfect—if a mod author doesn’t set the client/server “sidedness” of a mod properly, the server/client connection can get messed up. Fortunately, this is easily fixed with a text editor and the Packwiz CLI.
Part 2 - Prism Launcher:
Prism Launcher (which I just call Prism) is a fork of the already great open-source launcher MultiMC. It runs on almost everything—Steam Deck, Apple Silicon Macs, Windows on ARM—anywhere you can build it that has a Java runtime. We use Prism to handle the auto-updating client, exporting it as a custom MultiMC profile that contains the Packwiz jar-file and corresponding pre-launch command.
Part 3 - Modrinth:
We try to source our mods from Modrinth whenever possible. While Packwiz can mostly handle CurseForge mods, it’s not 100% due to CurseForge’s API quirks. Modrinth also has a nicer launcher app, which is helpful for building packs since Packwiz lacks a GUI.
Part 4 - The Glue:
This is the part I had to write. I originally made a Go app, which I later converted into a set of shell scripts with a little help from OpenAI’s GPT-4. You can check out the scripts at https://github.com/codecraft3r/mc-server-utils. The main one, running on the server, sets up the Docker container from the pack.toml, while a second script, running on the admin’s PC, imports Modrinth’s mrpack files into Packwiz.