[PITCH] Cansei de montar modpack na mão, então fiz um CLI pra isso: Elo
Faz um tempo que eu voltei a jogar Minecraft (clássico né, sempre volta), e bateu aquela vontade de montar uns modpacks só pra mim mesmo e pra galera:
- mc-dungeon: tentativa antiga (e recorrente) de replicar a vibe de Minecraft Dungeons dentro do Minecraft Java, usando addons tipo Dungeons Perspective, BetterCombat e outros.
- amazing-vanilla: deixar o jogo bonito e detalhado, mas sem fugir da experiência vanilla.
Aliás, a ideia do mc-dungeon é bem mais velha do que o Elo em si. Antes de achar o Dungeons Perspective eu já tinha tentado com outro mod de câmera isométrica, o Isometric Renders, só que ele era focado em take em lugar aberto: dentro de construção a câmera perdia o sentido, bugava toda tipo um x-ray sem querer. Acabei desistindo por um tempo e só voltei mais tarde, quando encontrei o Dungeons Perspective (aliás descobri ele bem no início, quando o autor tinha acabado de publicar no Modrinth e no canal do YouTube). O mais engraçado é que fui saber recentemente que o Void Append teve exatamente a mesma ideia e chegou a publicar um vídeo sobre isso, só que bem depois de eu já ter desistido da minha tentativa. Mas foco, vamos falar do Elo mesmo kkkj.
O problema
Rolou um problema clássico, e no meu caso era ainda pior. Antigamente eu fazia as "instâncias" totalmente na mão, do jeito mais tosco possível: criava uma pasta pra cada versão/conjunto de mods, jogava os .jar lá dentro, e quando eu queria trocar, ia em /mods, apagava tudo, e copiava avulso os arquivos da subpasta que eu queria usar pra dentro de /mods de novo. Shader, resourcepack e esse tipo de coisa eu nem gerenciava, pq eu não era tão louco assim kkkj.
Depois de um tempo eu aprendi sobre symlinks (valeu Diolinux) e a ficha caiu: aquilo resolvia exatamente essa dor, só que de um jeito muito mais elegante. De lá pra cá eu uso symlink pra tudo, inclusive em projeto de API em produção (deploy atômico e afins). É absurdo o quanto isso facilita a vida. Windows, aprenda isso pelo amor de Darwin.
Então quando bati de novo nesse problema com o Minecraft, já sabia exatamente que caminho eu queria seguir.
"Mas por que não usa um launcher que já faz isso?"
Sei que alguns já tão pensando:
"PoR qUe VoCê NãO uSa AlGuM lAuNcHeR qUe FaÇa IsSo" uh duh???
Simples: os launchers que costumam permitir isso (PrismLauncher, PolyMC etc) exigem o Minecraft original logado pra ter acesso completo às funcionalidades. Sem isso vc fica preso na versão offline, o que não é lá essas coisas, confesso. E aí sobra o caminho manual mesmo, que até funciona, mas tem um limite aceitável pra sanidade mental de qualquer um kkkj.
A ideia do Elo
Foi nesse contexto que pensei: e se em vez de um launcher completo (que gerencia o Minecraft, contas, versões, tudo), eu fizesse só um gerenciador de addons? Focado especificamente em mods, resource packs, shaders e config, via CLI, com instalação simples de dar um curl (que é basicamente o padrão hoje em dia pra instalar qualquer coisa).
Surgiu o Elo.
O nome, confesso, é meio bobo: pedi ideias pra IA, ela cuspiu um monte, e "Elo" foi a que ficou mais fácil de lembrar e ainda remete bem à ideia central do projeto, que é usar symlinks pra gerenciar tudo.
Como funciona na prática
A ideia é simples: cada instância (fabric-1.21, vanilla, modpack-x...) fica guardada isolada dentro de ~/.elo/instances/, com seus próprios mods, resourcepacks, shaders e config. Quando vc ativa uma instância, o Elo cria symlinks ligando essas pastas na sua .minecraft de verdade. Trocar de instância é só trocar os links. E antes de mexer em qualquer coisa, ele faz backup das pastas originais, então não corre risco de perder nada seu.
Dá pra usar de forma guiada (interface interativa, com menu e tudo) ou na moral, direto por comando:
elo init --minecraft-path "$HOME/.minecraft"
elo instances create fabric-1_21 --version 1.21.1 --loader fabric
elo instances activate fabric-1_21
elo addons search sodium --instance fabric-1_21
elo addons install fabric-1_21 sodium
elo addons list fabric-1_21
Ele já resolve dependência de addon sozinho, detecta arquivo modificado/ausente/externo, e busca tudo direto no Modrinth. A instalação é só isso aqui:
curl -fsSL https://raw.githubusercontent.com/3nderXP/elo/main/install.sh | bash
Sem sudo, sem mexer em pacote do sistema, sem sujeira.
Sobre o processo de desenvolvimento
Aqui vai a parte que acho mais interessante pra compartilhar: decidi fazer o projeto inteiro em vibe-coding, mas com uma abordagem spec-driven e skill-driven, tentando manter umas "boas práticas" (entre aspas mesmo, pq eu tava testando viabilidade, não buscando perfeição):
- Modularização do código;
- Gitflow básico;
- PRs organizadas;
- Releases seguindo SemVer.
Foi bem produtivo, inclusive pra aprender na prática uns padrões de git/GitHub e versionamento que eu só conhecia de teoria.
A única coisa que me arrependo um pouco: ter escolhido Bash puro em vez de alguma stack multiplataforma desde o início. Hoje o Elo só roda em Linux e macOS, Windows nativo não tem suporte ainda kkkkj. Já tô pensando em portar aproveitando Git Bash + WSL, com umas adaptações (tipo trocar symlink por junction no Windows), mas isso fica pra uma próxima fase.
Estado atual
O projeto já tá em release estável (v0.5.0 no momento), com suite de testes, comandos de update/uninstall que não deixam sujeira pra trás, e um modelo de segurança que tenta nunca sobrescrever nada seu sem confirmação.
Limitações mais importantes hoje:
- Só dá pra configurar um
.minecraftpor vez; - Modrinth é o único provider suportado;
- Não tem lock de processo concorrente (então evite rodar dois
eloao mesmo tempo).
E já tem novidade a caminho: tô preparando a v0.6.0, que vai trazer suporte a importar/instalar modpacks direto de arquivo .mrpack, usando a própria API do Modrinth. Já fiz os primeiros testes localmente e funfou bonito, então a ideia é lançar uma pré-release em breve com isso e mais umas correções extras que foram surgindo pelo caminho.
Se curtiu a ideia ou quiser dar uma bisbilhotada no código (é tudo Shell, sem frescura), tá tudo aberto aqui:
🔗 https://github.com/3nderXP/elo
Feedback, PR e crítica construtiva são bem-vindos. Valeu por ler até aqui 🙏