EnvRune
CLI de código abierto que saca los secretos del .env
Métricas clave

Contexto
Todo proyecto tiene un .env: un archivo en texto plano junto al código que se copia entre máquinas, aparece en capturas de pantalla y registros, y es el primer archivo que lee un agente de IA. EnvRune mantiene el mismo flujo de trabajo —un nombre para cada variable, un valor por entorno— y traslada los valores a una bóveda cifrada que solo los entrega a los procesos que tú inicias.
El desafío
Una herramienta de seguridad que estorba acaba abandonada: si ejecutar el proyecto resulta más difícil que con el .env, el equipo vuelve al .env. Cada protección debía costar casi nada en el día a día y, aun así, mantener el valor fuera del repositorio, de la terminal, de los registros y del contexto de un agente de IA. El siguiente paso es aún más difícil: compartir secretos con el equipo a través de un servidor sin tener que confiar en él.
La arquitectura
Construí en solitario una CLI en Go, distribuida como un único binario. Los valores viven en una bóveda local cifrada con XChaCha20-Poly1305, con la clave protegida por la contraseña maestra mediante Argon2id; el proyecto solo guarda nombres, en un envrune.yml versionable; y envrune run inyecta las variables directamente en el proceso y enmascara la salida. Para equipos, EnvRune Cloud es opcional y está cifrado de extremo a extremo: el servidor almacena texto cifrado y nombres y, por defecto, no puede leer ningún valor.
Cómo se organiza el código
Un módulo de Go organizado en 23 paquetes internos por responsabilidad —entre ellos vault, crypto, runner, redact, agent, keychain, team, cloud, cloudcrypto y sealproxy— con unas 290 pruebas. EnvRune Cloud es una aplicación Next.js sobre Supabase: la seguridad a nivel de fila (Row Level Security) decide quién puede obtener el texto cifrado, y el cifrado decide quién puede leerlo. La CI ejecuta la suite unitaria y la de integración, con el binario real, en Linux, macOS y Windows; las versiones se publican con GoReleaser y GitHub Actions como instaladores para los tres sistemas, además de Homebrew, Scoop y un repositorio apt firmado.
Flujo de la arquitectura
Valor secreto
Bóveda cifrada
- XChaCha20-Poly1305
- Argon2id
Referencia con nombre
- shop.stripe.test-key
envrune.yml
- Solo nombres, versionable
Proceso
- Variables inyectadas
- Salida enmascarada
Decisiones de ingeniería
Enmascaramiento que resiste el streaming
Los valores inyectados que el proceso imprima salen como ****, incluidas sus formas codificadas en URL y en base64. Como un valor puede llegar dividido entre dos bloques de salida, el filtro retiene solo el final que todavía podría ser el comienzo de un secreto; y, en una terminal, el proceso se ejecuta dentro de un pseudoterminal, de modo que los colores, las barras de progreso y los prompts siguen funcionando.
Los agentes de IA ejecutan, pero no leen
envrune mcp es un servidor MCP para Claude Code, Cursor y Copilot: el agente ejecuta las pruebas o arranca el servidor de desarrollo con los secretos inyectados y recibe la salida enmascarada. Ninguna herramienta devuelve un valor, y solo pueden ejecutarse los comandos con nombre definidos en envrune.yml: los comandos arbitrarios vienen desactivados por defecto.
Un servidor que no lee ni se concede acceso
En EnvRune Cloud, la clave de cada entorno se cifra para cada dispositivo con age (X25519), y toda clave pública se alcanza a través de una cadena de firmas Ed25519 que termina en raíces fijadas por el propio equipo. Un servidor comprometido puede denegar el servicio o ver quién obtuvo qué; no puede leer un valor ni hacer que un cliente cifre para una clave que ningún administrador ha firmado.
Salir del equipo es perder el acceso futuro
Eliminar a un miembro genera claves nuevas para cada entorno que utilizaba y vuelve a cifrar los valores actuales; después, una rotación guiada enumera cada secreto que esa persona llegó a obtener, hasta que alguien sustituye el valor o decide mantenerlo. Las consultas, las escrituras y los cambios de acceso quedan en un registro de auditoría de solo inserción, encadenado con SHA-256, que la CLI exporta y verifica sin conexión.
La excepción declarada: usar sin ver
Un secreto marcado como sensible nunca llega a la máquina del desarrollador: el programa recibe un marcador de posición, y un proxy en loopback —con una autoridad de certificación que solo existe en memoria, durante ese comando— desvía las peticiones a través del servidor, que inserta el valor real únicamente para los hosts permitidos. Es el único caso en que el servidor puede leer un valor: se elige por secreto, tras una advertencia, y está documentado como tal.
Límites por escrito, no ocultos
Cada protección va acompañada de lo que no cubre: enmascarar la salida evita accidentes, no un programa que quiera filtrar datos; el rol de consumidor impide descuidos, no la extracción; y un servidor comprometido sigue viendo los metadatos. En una herramienta de seguridad, prometer menos y cumplirlo forma parte del diseño.