Welcome

PMCL

Personal Minecraft Custom Launcher

A cross-platform Minecraft launcher from HCS Team. The UI is Compose Desktop; the core is Java. Install versions, manage mods, host rooms, and write plugins. Working directory: ~/.pmcl.

What it does

01 / 06

01

Launch

Compose Desktop / Material 3. Install Minecraft from Alpha to the latest release. Microsoft accounts use OAuth 2.0 Device Code. Java 8 / 17 / 21 is detected or downloaded automatically; Apple Silicon can use the x86_64 compatibility layer.

02

Content

Modrinth / CurseForge with conflict detection. Modpacks scan their own mods folder. Worlds and screenshots from PMCL, HMCL, and the official launcher can be viewed together. Datapacks, shaders, and resource packs install in one click.

03

Multiplayer

Backend is Terracotta / EasyTier / ConnectX. Rooms use a state machine with unique room codes. Traffic goes through a relay.

04

Plugins

.ppk packages (ZIP files with plugin.xml). Register commands, sidebar pages, and launch hooks. 13 checks, 56 reserved command words, zip-slip protection on unpack. A crash will not take down the launcher.

05

Terminal

A shell is embedded in the sidebar, with 35 commands for versions, mods, multiplayer, Java, and the Wiki. History and colored output included.

06

Embed

An optional plugin embeds a JavaFX UI in the Compose window (JFXPanel + Scene Stealing). Package name: hmcl-embed-1.0.0.ppk.

01 / 10

Launch

Pick a version and start the game.

Play

02 / 10

News

Minecraft.net RSS.

News

03 / 10

Multiplayer

Rooms.

Online

04 / 10

Download

Versions, the mod marketplace, and the Wiki.

Install

05 / 10

Content

Mods, shaders, and resource packs.

Content

06 / 10

Saves

Worlds and screenshots.

Saves

07 / 10

Accounts

Microsoft accounts.

Account

08 / 10

Settings

Themes and download sources.

Prefs

09 / 10

Terminal

Those 35 commands.

Shell

10 / 10

Plugins

Plugin manager and plugin pages.

Extend

Scroll to open this letter · download, build, plugins

HCS · PMCL

Download

Shipped on GitHub Releases. Installers carry SHA-256 and Ed25519 signatures; the launcher checks them again before updating. The current v1.3.0 release only has a Fat JAR; native installers will appear on the same page when they are ready.

macOS arm64 / x86_64 · pkg、dmg、jar
Windows x64 · msi、exe、jar
Linux x64 (Java path also scans LoongArch / RISC-V) · deb, rpm, AppImage, jar

Running pmcl-*-all.jar needs JDK 21+ on this machine: java -jar pmcl-1.3.0-all.jar. Java 8 / 17 / 21 for the game is downloaded by the launcher.

Build it

JDK 21+, Gradle 8.10+ (the repo includes gradlew). JavaFX native libraries follow the machine you compile on.

Fat JAR
# clone
git clone https://github.com/PCML-Z/PCML.git
cd PCML

./gradlew :ui:fatJar
java -jar ui/build/libs/pmcl-1.3.0-all.jar
Installer for this OS
./gradlew :ui:packageDistributionForCurrentOS
PMCL/
├── core/          # Java core
├── ui/            # Compose, 22 pages
├── cli/           # 35 commands
├── plugin-api/
├── hmcl-plugin/
├── custom-downloader-plugin/
├── test-plugin/
└── test-plugin-package/

Plugins

Implement PmclPlugin. Install into ~/.pmcl/plugins/<id>/.

MyPlugin.kt
class MyPlugin : PmclPlugin {
    override val pluginId = "my-plugin"

    override fun onEnable(ctx: PluginContext) {
        ctx.registerCommand("hello", "Say hello") { args ->
            "Hello, ${args.firstOrNull() ?: "World"}!"
        }
        ctx.registerPage("my-page", "My Page", MyPageContent())
    }
}
Install from the terminal
plugin package /absolute/path/to/my-plugin-1.0.0.ppk
my-plugin-1.0.0.ppk
├── plugin.xml
├── META-INF/pmcl-plugin.properties
├── classes/
├── lib/
├── resources/
└── src/

Rejected if the path prefix, extension, main class, or version does not match. Full rules in PLUGIN_REQUIREMENTS.md

Updates

Checks GitHub Releases once on launch. In Settings you can poll every 30 minutes. After you confirm, the matching OS/arch package is downloaded to ~/.pmcl/updates/, verified, then the launcher exits and a helper finishes the install.

  1. A launch check is required; periodic sync is extra.
  2. Compare numbers after stripping v from tag_name.
  3. macOS prefers pkg/dmg, Windows msi/exe, Linux deb/rpm/AppImage; otherwise fall back to the platform JAR.
  4. No install without SHA-256 or a matching .sig.
  5. Unauthenticated GitHub API: 60 requests per hour. If X-RateLimit-Remaining: 0, the interval stretches to two hours.

Stack

UICompose Multiplatform 1.7.0
LanguageKotlin 2.0.21 / Java 21
BuildGradle 8.10 (Kotlin DSL), 8 modules
SerializationGson 2.11 + kotlinx.serialization
NetworkOkHttp 4.12; falls back to system curl if TLS is interfered with
System infoOSHI 6.6.5
JavaFXOpenJFX 25
Update signingSHA-256 + Ed25519
Architecture java -XshowSettings:properties -version reads the real arch. Apple Silicon prefers natives-*-arm64.
Legacy versions 1.12.2 and earlier require Java 8. LWJGL 2 .jnilib files get a .dylib copy on Java 9+.
Modpacks gameDir points at the version folder, not mcRoot, so packs stay isolated.
Fat JAR All module-info.class files are stripped at package time.

FAQ

HCS Team

Also building LBSH Society and Lash Think Tank.

Write us

Bugs first: GitHub Issues.