Skip to main content
MCReleaser’s primary strength is its ability to publish to multiple platforms with a single command. This guide shows you how to configure multi-platform publishing.

Publishing to All Platforms

The simplest way to publish to all supported platforms is to use platforms="all":
java \
  -Dname="My Universal Mod" \
  -Dversion="1.0.0" \
  -Ddescription="Works everywhere!" \
  -DgameVersions="1.20.1,1.20.2" \
  -Dplatforms="all" \
  -Dfiles="build/libs/*.jar" \
  -DgithubToken="$GITHUB_TOKEN" \
  -DgithubRepository="username/repo" \
  -DgithubRef="refs/tags/v1.0.0" \
  -DmodrinthToken="$MODRINTH_TOKEN" \
  -DmodrinthProject="project-id" \
  -DmodrinthLoaders="fabric" \
  -DcurseforgeToken="$CURSEFORGE_TOKEN" \
  -DcurseforgeProject="123456" \
  -DhangarKey="$HANGAR_KEY" \
  -DhangarProject="MyMod" \
  -DhangarChannel="Release" \
  -DpolymartKey="$POLYMART_KEY" \
  -DpolymartResource="987" \
  -jar mcreleaser.jar
When using platforms="all", MCReleaser will only publish to platforms where all required credentials are provided. Missing credentials for a platform will be silently skipped.

Publishing to Specific Multiple Platforms

You can specify exactly which platforms to publish to using a comma-separated list or space-separated list:
java \
  -Dname="My Mod" \
  -Dversion="1.0.0" \
  -Ddescription="Publishing to popular platforms" \
  -DgameVersions="1.20.1" \
  -Dplatforms="modrinth,curseforge,github" \
  -Dfiles="build/libs/*.jar" \
  -DmodrinthToken="$MODRINTH_TOKEN" \
  -DmodrinthProject="project-id" \
  -DmodrinthLoaders="fabric" \
  -DcurseforgeToken="$CURSEFORGE_TOKEN" \
  -DcurseforgeProject="123456" \
  -DgithubToken="$GITHUB_TOKEN" \
  -DgithubRepository="username/repo" \
  -DgithubRef="refs/tags/v1.0.0" \
  -jar mcreleaser.jar

Synchronous vs Asynchronous Publishing

By default, MCReleaser publishes to all platforms asynchronously (in parallel) for faster execution. You can control this behavior with the SYNC property.

Asynchronous (Default)

Publishes to all platforms simultaneously:
java \
  -Dplatforms="modrinth,curseforge" \
  -Dsync="false" \
  # ... other properties
  -jar mcreleaser.jar
Asynchronous publishing is faster but may be harder to debug if errors occur. Check logs carefully to identify which platform failed.

Synchronous

Publishes to platforms one at a time in sequence:
java \
  -Dplatforms="modrinth,curseforge" \
  -Dsync="true" \
  # ... other properties
  -jar mcreleaser.jar
Use synchronous mode when debugging or if you have rate limiting concerns with the platform APIs.

How Platform Selection Works

Behind the scenes, MCReleaser uses the BundlePlatform class to manage multi-platform publishing:
BundlePlatform.java:37-48
if (usingPlatforms.equalsIgnoreCase("all")) {
    platforms = PLATFORM_MAP.values()
            .stream()
            .map(Supplier::get)
            .toList();
} else {
    platforms = Stream.of(StringUtil.splitCommaOrSpace(usingPlatforms))
            .map(PLATFORM_MAP::get)
            .filter(Objects::nonNull)
            .map(Supplier::get)
            .toList();
}
  • When platforms="all", all platforms in the PLATFORM_MAP are used
  • When specific platforms are listed, they are split by comma or space
  • Invalid platform names are filtered out (ignored)

Common Multi-Platform Scenarios

Modding Platforms Only

For Minecraft mods, you typically want Modrinth and CurseForge:
java \
  -Dplatforms="modrinth,curseforge" \
  -DgameVersions="1.20.1" \
  -DmodrinthLoaders="fabric,forge" \
  -DcurseforgeModLoaders="Fabric,Forge" \
  # ... other properties
  -jar mcreleaser.jar

Plugin Platforms

For server plugins, focus on Hangar and Polymart:
java \
  -Dplatforms="hangar,polymart" \
  -DhangarChannel="Release" \
  -DpolymartTag="release" \
  # ... other properties
  -jar mcreleaser.jar

Full Distribution

For maximum reach, publish everywhere:
java \
  -Dplatforms="all" \
  # ... configure all platform credentials
  -jar mcreleaser.jar

Handling Missing Credentials

When using platforms="all", MCReleaser gracefully handles missing credentials:
1

Check Required Variables

MCReleaser checks if all required variables for each platform are present
2

Skip Incomplete Platforms

Platforms with missing credentials are automatically skipped
3

Publish to Valid Platforms

Only platforms with complete credentials receive uploads
If you want to be notified about missing credentials, set ANNOUNCE_MISSING_KEY="true" to log warnings for missing environment variables.

Example: Selective Multi-Platform Release

Here’s a complete example that publishes to Modrinth and GitHub only:
#!/bin/bash

# Build your mod/plugin first
./gradlew build

# Publish to Modrinth and GitHub
java \
  -Dname="My Fabric Mod" \
  -Dversion="${VERSION}" \
  -Ddescription="$(cat CHANGELOG.md)" \
  -DgameVersions="1.20.1,1.20.2,1.20.3" \
  -Dplatforms="modrinth,github" \
  -Dfiles="build/libs/*-[0-9]*.jar build/libs/*-sources.jar" \
  -DmodrinthToken="${MODRINTH_TOKEN}" \
  -DmodrinthProject="my-fabric-mod" \
  -DmodrinthLoaders="fabric" \
  -DmodrinthVersionType="release" \
  -DgithubToken="${GITHUB_TOKEN}" \
  -DgithubRepository="${GITHUB_REPOSITORY}" \
  -DgithubRef="${GITHUB_REF}" \
  -jar mcreleaser.jar

Next Steps

CI/CD Integration

Automate multi-platform publishing with GitHub Actions

Game Versions

Learn how to specify compatible Minecraft versions

Build docs developers (and LLMs) love