Français · English
Launcher Minecraft multi-comptes pour Windows, écrit en Rust. Il ouvre plusieurs clients côte à côte sans mettre la machine à genoux : une instance démarre à la fois, et rien ne se lance s'il ne reste pas assez de RAM.
Une ruche, c'est beaucoup d'ouvrières dans un seul cadre, et une colonie qui se régule d'elle-même. C'est tout le programme.
Il s'appuie sur l'installation officielle (%APPDATA%\.minecraft) — vanilla,
OptiFine, Fabric et Forge compris, la chaîne inheritsFrom est résolue — et
télécharge à la demande les versions qui n'y sont pas encore.
Un seul fichier, rien à installer :
- récupérer
ruche.exedans les releases ; - le lancer. La configuration atterrit dans
%APPDATA%\Ruche\.
Depuis les sources :
cargo build --release| Garde-fou | Effet |
|---|---|
| Budget RAM | Avant chaque lancement : RAM libre − (Xmx + surcoût) ≥ réserve. Sinon l'instance patiente dans la file, puis est abandonnée avec un message clair. |
| Plafond d'instances | Les suivantes attendent qu'une place se libère. |
| Démarrage décalé | La file lance une instance à la fois et n'enchaîne que lorsque la précédente a ouvert sa fenêtre (détectée par EnumWindows) ou dépassé le délai maximum. |
Xmx modeste, -XX:-AlwaysPreTouch |
La JVM ne réserve pas tout son tas au démarrage ; G1 avec pauses courtes. |
| Priorité basse | Les clients tournent en belownormal (ou idle) : le bureau garde la main. |
| Affinité CPU | Chaque instance est épinglée sur son propre groupe de cœurs. |
| Réglages graphiques bas | Les instances neuves reçoivent un options.txt en distance de rendu 3, 60 FPS, son coupé, pauseOnLostFocus:false. |
Le bouton Calculer un réglage sûr relit la RAM libre et propose un nombre d'instances et de cœurs. Il plafonne à quatre clients : au-delà, c'est la VRAM qui lâche avant la RAM.
Le sélecteur ne se limite pas à ce que contient .minecraft : il liste le
catalogue complet de Mojang — plus de 900 entrées, sorties, snapshots et
versions anciennes — avec une recherche et quatre filtres. Ce qui est déjà là
est marqué installée, le reste à télécharger.
Choisir une version absente suffit : au lancement, la file télécharge dans l'ordre le json de version, le jar client, les libraries manquantes et les ressources, puis démarre le jeu. L'avancement s'affiche dans la carte de l'instance, et les téléchargements passent avant la réservation mémoire — inutile de bloquer une place pendant un transfert.
Ce qui est déjà sur le disque n'est jamais retéléchargé, le jar client et les ressources sont vérifiés par empreinte SHA-1, et rien n'atterrit à son emplacement final avant d'être complet. Un profil moddé entraîne l'installation de la version dont il hérite.
Le manifeste est mis en cache : sans réseau, le launcher garde la liste et se contente de dire ce qu'il ne peut pas télécharger.
Les deux types cohabitent dans la même liste.
Hors-ligne — l'UUID est calculé comme le fait un serveur en
online-mode=false (MD5("OfflinePlayer:<pseudo>"), UUID v3). Ajouter en lot
génère Alt1…AltN d'un coup ; Importer du launcher reprend pseudos et UUID de
launcher_accounts.json.
Premium (Microsoft) — flux device code : le launcher affiche un code, on le
saisit sur microsoft.com/link, et la chaîne complète se déroule (Microsoft →
Xbox Live → XSTS → Minecraft Services → profil). Aucun mot de passe ne transite
par le launcher.
Il faut une application Azure personnelle (gratuite) : Microsoft ne délivre pas de jeton Minecraft à une application non déclarée.
portal.azure.com→ Microsoft Entra ID → Inscriptions d'applications → Nouvelle inscription ;- comptes pris en charge : comptes Microsoft personnels uniquement, aucune URI de redirection ;
- Authentification → Autoriser les flux client publics = Oui ;
- coller l'« ID d'application (client) » dans le launcher (une seule fois, pour tous les comptes).
La session Minecraft dure 24 h et se renouvelle automatiquement au lancement
tant que le jeton de rafraîchissement Microsoft est valide (90 jours). Ce jeton
est chiffré par DPAPI avant d'être écrit : accounts.json est illisible
depuis une autre session Windows. Sur les autres systèmes, il est stocké en
clair — c'est signalé ici, pas dissimulé.
Double-clic sur une ligne : version et RAM propres à ce compte, par exemple les alts en 1.8.9 à 1 Go pendant que le compte principal est en 26.2 à 4 Go.
L'interface existe en français et en anglais ; le choix se fait dans
Réglages → Langue et dossiers et s'applique immédiatement, journal compris.
Les traductions vivent dans src/i18n.rs : chaque texte y est
déclaré une fois avec ses deux versions côte à côte, et une macro en fait une
structure de champs — un oubli de traduction ne compile pas.
Réglages → Discord affiche une Rich Presence : le nombre de clients ouverts, la version, et un chronomètre depuis le premier lancement. Les pseudos ne sortent jamais — tes contacts voient « 3 clients en jeu · sur 1.20.1 », rien de plus.
Il faut une application Discord, gratuite :
discord.com/developers/applications→ New Application ;- copier l'Application ID dans le launcher ;
- facultatif : Rich Presence → Art Assets, y déposer une image nommée
ruchepour l'icône de l'activité.
Le dialogue se parle directement sur le tube IPC local
(\\.\pipe\discord-ipc-N), sans bibliothèque tierce : une trame de huit
octets puis du JSON. Discord fermé, tube absent ou connexion coupée en cours de
route, le launcher retente en silence et l'état est affiché sous le réglage.
Chaque compte a son dossier de jeu (%APPDATA%\Ruche\instances\<compte>),
ce qui évite les conflits de fichiers entre clients. Ce qui est lourd reste
partagé avec .minecraft : assets et libraries ne sont jamais recopiés, et
mods, resourcepacks, shaderpacks, config sont montés en jonction NTFS.
Le champ Serveur (hôte:port) connecte directement au lancement :
--quickPlayMultiplayer sur 1.20+, --server/--port avant, et l'entrée est
ajoutée au servers.dat de l'instance.
Chaque lancement écrit instances/<compte>/logs/ruche-<date>.log, dont la
première ligne est la commande Java complète — rejouable telle quelle.
| Module | Rôle |
|---|---|
mc::version |
lecture des json de versions/, fusion inheritsFrom, règles d'OS et de features |
mc::manifest |
catalogue Mojang, fusionné avec les profils locaux, mis en cache |
mc::install |
téléchargement du json, du jar, des libraries et des ressources |
mc::command |
classpath, natives, substitution des arguments, options.txt, servers.dat |
mc::java |
choix du JRE (runtimes du launcher officiel, JDK système, PATH) |
queue |
file de lancement, garde-fous mémoire, surveillance des process |
auth |
UUID hors-ligne et connexion Microsoft |
sys |
mémoire, working set, détection de fenêtre, affinité, DPAPI |
i18n |
les deux langues, déclarées côte à côte |
discord |
Rich Presence, en direct sur le tube IPC |
app |
interface egui |
Un détail qui coûte cher si on le rate : le jar client à mettre au classpath
est celui du dossier de la version choisie, pas celui du parent inheritsFrom
— les installeurs le recopient sous leur propre nom, et l'ignoreList de Forge
ne couvre que ce nom-là. Prendre celui du parent fait échouer Forge ≥ 1.17 en
ResolutionException.
cargo testLes tests unitaires couvrent la fusion des versions, les règles, les chemins
maven, l'UUID hors-ligne (valeurs de référence), le NBT de servers.dat, le
chiffrement DPAPI et le refus de lancer sans mémoire.
Un test parle au vrai Discord (il vérifie que le tube, le cadrage des trames et la détection d'un refus fonctionnent) et deux autres lancent vraiment le jeu ; tous demandent quelque chose de la machine, donc ils sont ignorés par défaut :
cargo test --test real_launch -- --ignored --nocapture
cargo test --test real_install -- --ignored --nocapture
cargo test --lib discord -- --ignored --nocapturereal_install supprime une version du disque, la réinstalle depuis les serveurs
de Mojang et vérifie que la commande de lancement est complète ; il efface aussi
une ressource pour vérifier qu'elle revient à l'identique.
Vérifiés sur cette machine : 1.7.10, 1.8 / 1.8.8 / 1.8.9, 1.12.2, 1.20.1, 1.20.1-Forge 47.4.13, 1.20.2-Forge 48.1.0, 1.21.8, 1.21.11, OptiFine, Fabric 0.18/0.19, 26.1.2, 26.2 — 24 profils produisent une commande complète, et 1.8.9, Forge 1.20.1 et 26.2 atteignent l'écran de jeu.
- Windows est la cible : la détection de fenêtre, l'affinité et DPAPI y sont natives. Le reste compile ailleurs, en mode dégradé.
- Les libraries manquantes sont récupérées à la volée quand le json donne une URL ; sinon le lancement s'arrête avec la liste des fichiers.
MIT — voir LICENSE.

