No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
bunchy7s 2f72227ac6
Some checks failed
release / linux (push) Failing after 1s
release / windows (push) Has been cancelled
release / release (push) Has been cancelled
MiniL: the portable Horizon launcher
CLI and a small Prism-style GUI: install game releases from GitHub, fetch
Minecraft from Mojang's CDN in parallel, prepare automatically, Microsoft
accounts with skin upload, Horizon mods (.hmod), and a self-update check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 04:06:09 -05:00
.forgejo/workflows MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
horizon-release-sign MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
src MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
.gitignore MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
Cargo.lock MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
Cargo.toml MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
README.md MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00
version MiniL: the portable Horizon launcher 2026-10-28 04:06:09 -05:00

MiniL

The bare-minimum Horizon launcher: download the game from Horizon's GitHub releases and launch it. A CLI in a few hundred lines of Rust, in place of the GUI launcher (../launcher/). No UI, no telemetry — just download, verify and run.

cargo run --release -- list
cargo run --release -- install            # the newest release
cargo run --release -- update             # the newest release, unless already installed
cargo run --release -- login              # link a Microsoft account (online servers)
cargo run --release -- launch             # the newest prepared version
cargo run --release -- launch v2026.10.24 -- --world Test

Portable by design

Everything lives in data/ beside the binary:

<wherever minil is>
├─ minil
└─ data/
   ├─ versions/<tag>/      one unpacked release per tag
   └─ horizon/             the game's home: saves, logs, options (HORIZON_HOME)

Nothing is written to ~/.local/share or anywhere outside the folder, so copying the folder to a flashdrive moves the game, its versions and the saves with it. When launching, MiniL points the game at data/horizon with HORIZON_HOME — the same variable the real launcher uses.

Linux only

MiniL is built for Linux x86-64 and plays horizon-linux-x86_64.tar.gz only. macOS and Windows are not supported: there is no per-platform asset picking, no .zip unpacking, and no .exe handling. On another platform, use the real launcher (../launcher/).

What is kept from the real launcher

  • Signed downloads: every archive's SHA-256 is checked against the release's SHA256SUMS, signed by Horizon's release keys (horizon-release-sign, the same crate the real launcher uses). A tampered download is deleted, never unpacked.

  • The Linux asset: horizon-linux-x86_64.tar.gz, the same file the real launcher's Linux build uses.

  • Portable game home: HORIZON_HOME inside data/.

  • Sound: minil prepare runs horizon-prepare sounds beside the preparation, copying the pinned version's sounds (~380 MB) from the Minecraft files minil fetch-minecraft downloaded into data/versions/<tag>/.local/, the same step the real launcher runs (#1035). Without them the game plays nothing; minil sounds [TAG] copies them on their own. The game also starts under the audio stream name the real launcher gives it (PIPEWIRE_PROPS).

  • Microsoft account: minil login runs the OAuth device-code flow (Microsoft → Xbox Live → XSTS → Minecraft services, the ownership check and the profile), the same chain the real launcher runs. The account and its tokens are kept in data/account.json (mode 0600, beside the binary). At launch the token is refreshed if needed and handed to the game in a private session file it reads once (--session-file), so the game joins online-mode servers as the account — never on the command line. minil account shows who is linked, minil logout unlinks. With no account the game plays offline exactly as before.

    The Azure app (client ID) is Prism Launcher's public client ID, used by their permission for development builds (do not ship it to regular users); set HORIZON_MSA_CLIENT_ID to use another. Horizon's own app registration is first-party, so Microsoft only lets pre-authorized accounts consent to it. See docs/microsoft-account.md.

What is left out on purpose

  • No telemetry: MiniL sends nothing anywhere, and it starts the game with HORIZON_TELEMETRY_URL=off, which turns the game's own "I'm playing" ping off too.
  • No preparation: Horizon's release archives carry the game but not Mojang's assets, which Horizon may not redistribute. Preparing needs your own Minecraft 26.3 once (horizon-prepare --prepare, or the full launcher's install flow); the prepared files then sit in data/versions/<tag>/.local/ and travel with the folder like everything else. A not-yet-prepared version is refused with a note, not launched into a broken start.
  • No modpacks: everything else is automated now. minil with no arguments opens a small Prism-style window (egui): the installed versions with a Play button, the linked account, and what the updater is doing. A background thread checks GitHub at the first start and then every ten minutes; a new release is installed, its Minecraft files fetched from Mojang's CDN in parallel, and the version prepared — all on its own. The CLI commands do the same prepare-after-download step inline (minil install, minil update, minil fetch-minecraft).