- Rust 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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> |
||
| .forgejo/workflows | ||
| horizon-release-sign | ||
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
| version | ||
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_HOMEinsidedata/. -
Sound:
minil preparerunshorizon-prepare soundsbeside the preparation, copying the pinned version's sounds (~380 MB) from the Minecraft filesminil fetch-minecraftdownloaded intodata/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 loginruns 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 indata/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 accountshows who is linked,minil logoutunlinks. 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_IDto 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 indata/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.
minilwith 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).