Skip to content

Releasing

Pavel Erokhin edited this page Nov 9, 2026 · 3 revisions

A release goes to GitHub, Modrinth (mobosses), and Hangar (MairwunNx/MoBosses) from one workflow. Nothing in the repository holds the version: the workflow takes it as input.

Steps

  1. Write the notes. Add a ## X.Y.Z section to CHANGELOG.md, written for server owners, and push it. Patch for fixes, minor for features, major for breaking changes.

  2. Run the “Release” workflow:

    gh workflow run release.yml -R MairwunNx/mobosses -f version=X.Y.Z -f modrinth=true -f hangar=true

    Its changelog field overrides the CHANGELOG.md section. One of the two must be there.

  3. Watch it: gh run watch.

  4. Check every place: the GitHub release, Modrinth’s versions, and Hangar’s versions page.

What the workflow does

  1. Builds and tests with -PreleaseVersion=X.Y.Z.
  2. Tags vX.Y.Z and attaches mobosses-paper-X.Y.Z.jar and a version-less mobosses-paper.jar to a GitHub release, so releases/latest/download/mobosses-paper.jar always fetches the newest. It attaches mobosses.jar too, the jar’s name up to 2.9.0, so older links keep working.
  3. With modrinth, uploads the jar to Modrinth and syncs MODRINTH.md as the project’s description. It needs the MODRINTH_TOKEN secret.
  4. With hangar, publishes to Hangar with the HANGAR_TOKEN secret. The jar is over Hangar’s 15 MB limit, so Hangar gets a link to the GitHub release jar. Hangar doesn’t sync its page from MODRINTH.md. Edit it on the site after a big change.
  5. With moonlands (on by default), starts Moonlands’ shipping workflow with the FAMILY_ACTIONS_TOKEN secret, which puts the jar on the server.

When something fails

Never delete or re-tag a published release. If GitHub succeeded and Modrinth didn’t, fix the build and finish the upload locally:

./gradlew :paper:modrinth -PreleaseVersion=X.Y.Z -PchangelogFile=notes.md --no-configuration-cache

Then fix the workflow for next time.

The mods

The Fabric and NeoForge mods build with every release but stay out of it while mobosses.mods=false in gradle.properties, since they don’t play yet. Once they do, mobosses.mods=true makes the release attach mobosses-fabric-X.Y.Z.jar and mobosses-neoforge-X.Y.Z.jar (each also without the version), and Modrinth gets X.Y.Z+paper, X.Y.Z+fabric, and X.Y.Z+neoforge, the mods through scripts/modrinth_mods.py. Hangar stays Paper’s alone.

Clone this wiki locally