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.
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.
You can specify exactly which platforms to publish to using a comma-separated list or space-separated list:
Comma-Separated
Space-Separated
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.
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)
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
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:
Check Required Variables
MCReleaser checks if all required variables for each platform are present
Skip Incomplete Platforms
Platforms with missing credentials are automatically skipped
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.
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