EnvRune
CLI open source que tira os segredos do .env
Métricas-chave

Contexto
Todo projeto tem um .env: um arquivo em texto puro, ao lado do código, que é copiado entre máquinas, aparece em prints e em logs e é o primeiro arquivo que um agente de IA lê. O EnvRune mantém o mesmo fluxo de trabalho — um nome para cada variável, um valor por ambiente — e move os valores para um cofre criptografado, que só os entrega aos processos que você inicia.
O desafio
Ferramenta de segurança que atrapalha é abandonada: se rodar o projeto ficar mais difícil do que com o .env, o time volta para o .env. Cada proteção precisava custar quase nada no dia a dia e, mesmo assim, manter o valor fora do repositório, do terminal, dos logs e do contexto de um agente de IA. O passo seguinte é ainda mais difícil: compartilhar segredos com o time por meio de um servidor sem precisar confiar nele.
A arquitetura
Construí sozinho uma CLI em Go, distribuída como um único binário. Os valores vivem em um cofre local cifrado com XChaCha20-Poly1305, com a chave protegida pela senha mestra via Argon2id; o projeto guarda só nomes, em um envrune.yml versionável; e o envrune run injeta as variáveis direto no processo e mascara a saída. Para times, o EnvRune Cloud é opcional e criptografado de ponta a ponta: o servidor guarda texto cifrado e nomes e, por padrão, não lê valor nenhum.
Organização do código
Um módulo Go organizado em 23 pacotes internos por responsabilidade — entre eles vault, crypto, runner, redact, agent, keychain, team, cloud, cloudcrypto e sealproxy — com cerca de 290 testes. O EnvRune Cloud é um app Next.js sobre Supabase: Row Level Security decide quem pode buscar o texto cifrado, e a criptografia decide quem consegue ler. O CI roda a suíte unitária e a de integração, com o binário real, em Linux, macOS e Windows; as releases saem por GoReleaser e GitHub Actions como instaladores para os três sistemas, além de Homebrew, Scoop e um repositório apt assinado.
Fluxo da arquitetura
Valor secreto
Cofre criptografado
- XChaCha20-Poly1305
- Argon2id
Referência nomeada
- shop.stripe.test-key
envrune.yml
- Só nomes, versionável
Processo
- Variáveis injetadas
- Saída mascarada
Decisões de engenharia
Mascaramento que aguenta streaming
Os valores injetados que o processo imprimir saem como ****, inclusive nas formas codificadas em URL e em base64. Como um valor pode chegar partido entre dois blocos de saída, o filtro retém apenas o final que ainda pode ser o começo de um segredo — e, no terminal, o processo roda em um pseudoterminal, então cores, barras de progresso e prompts continuam funcionando.
Agentes de IA executam, mas não leem
O envrune mcp é um servidor MCP para Claude Code, Cursor e Copilot: o agente roda os testes ou sobe o servidor de desenvolvimento com os segredos injetados e recebe a saída mascarada. Nenhuma ferramenta devolve um valor, e só os comandos nomeados no envrune.yml podem ser executados — comando arbitrário vem desligado por padrão.
Um servidor que não lê nem se dá acesso
No EnvRune Cloud, a chave de cada ambiente é cifrada para cada dispositivo com age (X25519), e toda chave pública é alcançada por uma cadeia de assinaturas Ed25519 que termina em raízes fixadas pelo próprio time. Um servidor comprometido pode negar serviço ou ver quem buscou o quê; não consegue ler um valor nem fazer um cliente cifrar para uma chave que nenhum administrador assinou.
Sair do time é perder o acesso futuro
Remover um membro gera chaves novas para cada ambiente que ele usava e recifra os valores atuais; depois, uma rotação guiada lista cada segredo que a pessoa chegou a buscar, até alguém trocar o valor ou decidir mantê-lo. Buscas, escritas e mudanças de acesso ficam em um log de auditoria somente de inserção, encadeado por SHA-256, que a CLI exporta e confere offline.
A exceção declarada: usar sem ver
Um segredo marcado como sensível nunca chega à máquina do desenvolvedor: o programa recebe um marcador, e um proxy em loopback — com uma autoridade certificadora que existe só em memória, durante aquele comando — desvia as requisições pelo servidor, que insere o valor real apenas para os hosts permitidos. É o único caso em que o servidor consegue ler um valor: escolhido por segredo, depois de um aviso, e documentado como tal.
Limites escritos, não escondidos
Cada proteção vem acompanhada do que ela não cobre: mascarar a saída evita acidentes, não um programa que quer vazar; o papel de consumidor impede descuidos, não a extração; e um servidor comprometido ainda vê metadados. Em ferramenta de segurança, prometer menos e cumprir faz parte do projeto.