This page follows one release from the /rp release command in game to players downloading the new pack. If your pack isn't in the pipeline yet, read Pack repository first. Releasing needs the permission architect.resourcePackAdmin, part of MCME-Architect.
There are two commands, for two separate decisions:
/rp releasebuilds the zips and publishes them as a GitHub release. Nobody gets them yet./rp serverpoints one Minecraft version's slot at a release. From then on, players get that release.
So you can look at a release before it reaches players, and going back to an older release is a single /rp server command.
Two stages: test, then production
Every pack goes through the same steps twice: once on the RP server, the test stage, then once on a main server, which is production.
| Test: the RP server | Production: the main servers | |
|---|---|---|
| Pack branch that is built | development |
master |
| ResourcePackScripts branch used | development |
master |
| Where the GitHub release goes | A test repository | The pack's own repository, such as MCME/RP-Human |
| Who gets the pack | Players on the RP server | Players on the servers whose slots you set |
| A release with a tag that already exists | Replaces that release's zips | Refused before anything is built |
flowchart TD
dev["Push to development"] --> rel1["/rp release on the RP server"]
rel1 --> test["GitHub release in the test repository"]
test --> srv1["/rp server on the RP server"]
srv1 --> check{"Looks right in game?"}
check -- no --> dev
check -- yes --> pr["Pull request: development to master"]
pr --> rel2["/rp release on a main server"]
rel2 --> prod["GitHub release in the pack's repository"]
prod --> srv2["/rp server on the main servers"]
srv2 --> players["Players get the pack"]
1. Before you release
- Push your work to the branch the stage builds:
developmentfor the RP server,masterfor production. At the start of every release the server brings its copy of the pack up to date with that branch on GitHub, and builds exactly that. Work that is only on your computer, or on another branch, isn't in the release. - Pick a new version tag, for example
v4.1.4. It becomes part of every download URL, so use only letters, digits, dots, dashes and underscores, starting with a letter or digit. The release refuses any other tag before it builds anything. Keep it short: each player's pack URL must fit in 100 characters, and today's longest are 96. - Use a new tag for every release. On the RP server, reusing a tag replaces that release's zips; on production, a tag that exists is refused.
- Recommended: run the conversion on your own computer and read the warnings (see Pack repository). The server runs the same code.
2. Start the release
/rp release <pack> <version tag> <release title>
| Part | Example | Notes |
|---|---|---|
<pack> |
h or Human |
The pack's name in the server's config, or its start. The server takes the first pack whose name starts with what you typed, ignoring case. |
<version tag> |
v4.1.3 |
The Git tag of the release, and part of every download URL |
<release title> |
Better leaves |
The title of the GitHub release. Everything after the tag counts, spaces included. |
- Run it on the server of the stage you want: the RP server for a test release, a main server for production. It also works from the server console.
- The build runs in the background. You get a line when it starts, a line as each group of zips is done, and a closing message (see The result).
3. What runs on the server
MCME-Architect looks the pack up in its config, which says which release script builds it, which GitHub repository gets the release, and where on the server to run it. Operators set this up: see Resource pack server (operators only).
Before anything is built:
- The release lock. Only one release runs at a time on each stage. A second
/rp releasewhile one runs is refused and starts nothing; the message says which release is running. Run it again once the first has finished. - ResourcePackScripts is updated to its branch on GitHub (
developmenton the RP server,masteron production). A change merged into ResourcePackScripts reaches the next release on that stage. - The release script starts, through a wrapper that keeps a log and a summary of every run.
MCME-Architect gives a release 30 minutes (operators can raise this per pack). A release still running then is stopped, with everything it started. A Human release takes a little over 5 minutes (see How long a release takes).
4. The release script, step by step
The release script first checks its arguments and asks GitHub whether the tag exists; on production an existing tag stops it there. Then it brings the server's copy of the pack up to date with GitHub. It only ever fast-forwards to what GitHub has: if the server's copy was edited, has commits GitHub doesn't, or isn't on a branch that follows one on GitHub, the release stops before building, and an operator fixes the server's copy.
Sodium packs: six zips
Used by Human, Mordor and Paths of the Dead. <Pack> is the pack's name in the config, for example Human. Each line in the first column is printed as the step starts, and shows up in chat.
| Step | What happens | Output |
|---|---|---|
compiling <Pack> RP zips |
Start | |
<Pack>-Sodium |
The pack is updated from GitHub, copied and zipped as it is, without its vanilla/ folder |
<Pack>-Sodium.zip |
<Pack>-Sodium-Footprints |
The footprints texture is copied over activator_rail.png, and zipped again |
<Pack>-Sodium-Footprints.zip |
<Pack>-Vanilla |
generateVanilla converts the Sodium pack, walking Minecraft 26.2's blocks and items | <Pack>-Vanilla.zip |
<Pack>-Vanilla-Footprints |
Both footprints textures (activator_rail.png, activator_rail_on.png) are copied in, and zipped again |
<Pack>-Vanilla-Footprints.zip |
<Pack>-Lite |
generateVanilla runs again with --limit 2: at most two models per blockstate list, and the Lite shaders |
<Pack>-Lite.zip |
<Pack>-Lite-Footprints |
Footprints again | <Pack>-Lite-Footprints.zip |
releasing <Pack> RP zips |
gh release create with your title and the release note, then all six zips are uploaded |
GitHub release |
Vanilla-only packs: two zips
Used by Dwarven, Rohan and Lothlorien. There is no conversion.
| Step | What happens | Output |
|---|---|---|
compiling <Pack> RP zips |
The pack is updated from GitHub, copied and zipped, leaving out any inventories folder |
<Pack>.zip |
| (no step line) | Both footprints textures are copied in, and zipped again | <Pack>-Footprints.zip |
releasing <Pack> RP zips |
gh release create with the release note, then both zips are uploaded |
GitHub release |
Checks before anything is published
- Each Footprints zip must differ from the zip it was made from, or the release stops: the footprints textures didn't make it in.
- The Lite zip must differ from the Vanilla zip. Every Lite conversion turns on the shader base's Lite mode, so the two always differ; the same files mean Lite mode didn't apply.
- Any failed step stops the release before it publishes: the pack's update, zipping, generateVanilla, a footprints texture, or the release note. Nothing from an earlier release is ever uploaded in its place.
- The release note is worked out from the zips'
pack.mcmeta: it names every Minecraft version all the zips support, through ResourcePackScripts'pack_formats.json(88 is 26.2, 97 is 26.3). For example: "Version v4.1.5 for Minecraft 26.2 and 26.3". A pack format the map doesn't know is left out of the note.
What gets into each zip, and why the top level of your repository matters, is on Pack repository.
5. The result
In game, the closing message says how the release went:
- published, with its first three warnings if it had any. Its
Put it live:line has a button for each Minecraft version the release note names; a click fills in/rp server <Pack> <tag> <version>for you to send.[Open on GitHub]opens the release. - published, but its checks found problems: look at the run before you put it live.
- failed, with the release's last
ERROR:line, which says why. - didn't start, with why: another release is running, or the release system on that server needs an operator.
- stopped after the time limit.
A releaser who left the server gets the message when they next join it, unless the server restarts first. Every message is explained in Troubleshooting.
On GitHub, the release appears at https://github.com/<owner>/<repo>/releases/tag/<tag>, with its zips. gh release create publishes the release before the zips are uploaded, so if the upload fails, the release is there without all of them, and the ERROR: line says what to do.
The run summary. For every run the wrapper records the steps and how long each took, every zip with its file count, the warnings and errors, and a status:
| Status | Meaning |
|---|---|
ok |
Finished, with no warnings and no problems |
warnings |
Finished, but the converter or the script printed warnings. Normal for Human and Mordor; read them anyway. |
failed |
An error line, or a problem with a zip or the GitHub release |
interrupted |
The run was cut off, for example by a server restart |
The summary flags a zip that is empty or wasn't finished, a zip with under 90 % of the files the same zip had in the pack's last good release (usually a conversion that broke half-way), and a missing GitHub release, even when the script itself ended without an error. Operators can read the full log of every RP server run.
6. Put the release on a server
/rp server <pack> <version tag> <Minecraft version>
For example /rp server h v4.1.3 26.2. It needs architect.resourcePackAdmin.
- The plugin downloads each zip of that release, works out its SHA-1, and writes the download URL and the SHA-1 into the pack's slot for that Minecraft version. Dots become underscores, so
26.2is the slot26_2. Minecraft checks every download against the SHA-1. - Which zips it uses depends on the pack: for a Sodium pack,
<Pack>-Vanilla.zip,-Vanilla-Footprints,-Sodium,-Sodium-Footprints,-Liteand-Lite-Footprints; for a vanilla-only pack,<Pack>.zipand<Pack>-Footprints.zip. - If a zip is missing from the release, that variant keeps its old URL and SHA-1, and the plugin says so.
- Type the Minecraft version as the game names it:
26.2,26.3,1.21.4. The plugin refuses a version it doesn't know, and lists the ones it does. /rp server remove <pack> <Minecraft version>takes a slot out of a pack. A pack's last slot can't be removed./rp calcsha <pack>downloads the zips again and stores fresh SHA-1s for the newest slot;/rp calcsha <pack> alldoes it for every slot. Use it after a release's zips were replaced under the same tag.- Several servers share one config file. The command writes that file, but servers that share it and didn't run the command keep their copy in memory. Run
/rp serveron each of them, or run/architect reloadon the others afterwards.
7. Players get the pack
Which pack. Each area of the world gets its pack through RP regions, which staff draw with /rp create. A player with automatic switching on (the default) gets the region's pack when they walk into it. Players can also choose a pack with /rp <pack>, for example /rp h.
Which zip. Within a pack, the plugin picks:
- the client type:
sodiumfor players who join with the MCME modpack,vanillafor any other client, andliteonly when chosen with/rp client lite; - the variant:
light(the normal pack), orfootprintswith/rp variant footprints; - the slot: the newest slot whose Minecraft version is not newer than the player's. A 26.3 player gets the
26_2slot until the pack has a26_3one.
If the pack has nothing for the player's choice, for example a Sodium player in a vanilla-only pack, the first option listed in the config is used.
When. Players get a new zip when they join the network, when they walk into a different RP region, and when they use /rp <pack>, /rp reset, /rp client or /rp variant. Nothing pushes a new release to players who are already online. /rp <pack> -force resends the pack to you, even if the URL hasn't changed, which is handy for checking a release yourself.
How long a release takes
Measured on the RP server in September and October 2026:
| Pack | Whole release | Vanilla step | Lite step |
|---|---|---|---|
| Human | 5 min 10 s to 5 min 40 s | about 3½ min | about 2 min |
| Mordor | about 2 min 15 s | about 1 min 20 s | under 1 min |
Almost all the time goes to generateVanilla baking the .obj models, once for Vanilla and once for Lite. Zipping and uploading take seconds, and a vanilla-only release takes a few seconds in all.
Changing the release scripts
The launcher, the release scripts and the wrapper are in ResourcePackScripts under automation/, and the server runs them from its checkout without editing them. A change goes through a pull request into development, reaches the RP server's next release, and reaches production after a development → master pull request.
The lines the scripts print (the step lines, WARNING! and ERROR: lines, the release note: line and others) are read by MCME-Architect to build its chat messages and buttons. Change one only together with MCME-Architect. The full list is in What MCME-Architect reads.