Skip to main content

What is MCReleaser?

MCReleaser is a powerful Java-based command-line tool designed to simplify the process of publishing Minecraft-related artifacts (mods, plugins, datapacks, etc.) to multiple distribution platforms simultaneously. Instead of manually uploading your builds to each platform individually, MCReleaser automates the entire release workflow.
MCReleaser supports publishing to 5 major platforms: GitHub Releases, Modrinth, Hangar (PaperMC), Polymart, and CurseForge.

Key Benefits

Multi-Platform Publishing

Publish to GitHub, Modrinth, Hangar, Polymart, and CurseForge with a single command

Flexible Deployment

Use as a CLI tool, Docker container, or GitHub Action based on your workflow

Version Management

Automatically handles game version filtering and version type selection

Concurrent or Sequential

Run platform uploads in parallel for speed or sequentially for control

How It Works

MCReleaser follows a modular architecture that separates concerns and allows for easy extensibility:

Architecture Overview

Core Components

1

Entry Point

The CLIExecutor class serves as the main entry point, reading system properties and initializing the release process.
// From CLIExecutor.java:17-21
String platforms = CLIPropertyKey.PLATFORMS.getValue("all");
boolean runSync = CLIPropertyKey.SYNC.asBoolean(false);
BundlePlatform bundlePlatform = new BundlePlatform(platforms, runSync);
2

Platform Bundling

The BundlePlatform class coordinates multiple platform implementations, managing concurrent or sequential execution.
// From BundlePlatform.java:23-29
private static final Map<String, Supplier<Platform>> PLATFORM_MAP = Map.ofEntries(
    Map.entry("github", GithubPlatform::new),
    Map.entry("modrinth", ModrinthPlatform::new),
    Map.entry("hangar", HangarPlatform::new),
    Map.entry("polymart", PolymartPlatform::new),
    Map.entry("curseforge", CurseForgePlatform::new)
);
3

File Management

The FileBundle record encapsulates the primary artifact and any additional files to be uploaded.
// From FileBundle.java:7-14
public record FileBundle(File primaryFile, List<File> secondaryFiles) {
    public List<File> allFiles() {
        List<File> files = new ArrayList<>();
        files.add(primaryFile);
        files.addAll(secondaryFiles);
        return files;
    }
}
4

Platform Interface

Each platform implements the Platform interface, providing a consistent upload mechanism.
// From Platform.java:8-10
public interface Platform {
    Optional<BatchRunnable> createUploadRunnable(FileBundle fileBundle);
}

Execution Modes

MCReleaser offers flexibility in how you run it:
java \
    -Dname="My Minecraft Plugin" \
    -Dversion="1.0.0" \
    -Ddescription="An awesome plugin" \
    -DgameVersions="1.20,1.20.1,1.20.2" \
    -Dfiles="build/libs/*.jar" \
    -jar mcreleaser.jar

Platform Support

Each supported platform has its own set of configuration options:
PlatformUse CaseRequired Variables
GitHubSource code releases and changelogsGITHUB_TOKEN, GITHUB_REPOSITORY, GITHUB_REF
ModrinthModern mod distributionMODRINTH_TOKEN, MODRINTH_PROJECT, MODRINTH_LOADERS
HangarPaper/Velocity pluginsHANGAR_KEY, HANGAR_PROJECT, HANGAR_CHANNEL
PolymartCommercial plugin marketplacePOLYMART_KEY, POLYMART_RESOURCE
CurseForgeLegacy mod distributionCURSEFORGE_TOKEN, CURSEFORGE_PROJECT
Each platform requires authentication tokens/keys. Never commit these credentials to version control. Use environment variables or CI/CD secrets instead.

Common Properties

All release operations require these core properties:
// From CommonPropertyKey.java:3-10
public interface CommonPropertyKey {
    PropertyKey NAME = new PropertyKey("name");
    PropertyKey VERSION = new PropertyKey("version");
    PropertyKey DESCRIPTION = new PropertyKey("description");
    PropertyKey GAME_VERSIONS = new PropertyKey("gameVersions");
    PropertyKey GAME_VERSION_TYPE = new PropertyKey("gameVersionType");
    PropertyKey ANNOUNCE_MISSING_KEY = new PropertyKey("announceMissingKey");
}

Next Steps

Quickstart Guide

Get up and running with your first release in minutes

Platform Configuration

Learn how to configure each supported platform

Build docs developers (and LLMs) love