configuración original
configuración modificada

Diff de Config: Compara archivos INI, TOML, .env online

Pega dos archivos de configuración en paralelo y observa exactamente qué claves, valores y comentarios cambiaron. Funciona con .env, TOML, INI, .properties y .conf.

¿Qué es la herramienta de diff de configuración?

Una herramienta gratuita en el navegador para comparar archivos de configuración. Pega un .env de staging a la izquierda, el de producción a la derecha, y las claves ausentes, los valores cambiados y los comentarios obsoletos se iluminan al instante. El mismo flujo sirve para un pyproject.toml antes y después de un update de Poetry, un nginx.conf que vas a recargar, o un application.properties de Java que se mueve entre entornos.

El diff es a nivel de carácter. No hay parser, no hay esquema, no hay opinión sobre qué dialecto pegas. Es a propósito. Los archivos de configuración no comparten una sola gramática. INI no tiene spec formal y cada parser discrepa sobre comillas y escapes. TOML 1.0 tiene una gramática estricta pero añade valores tipados. Los archivos .env no tienen spec en absoluto, solo lo que dotenv o tu shell hagan en cada caso.

Si llegaste buscando prosa simple, nuestra herramienta de diff de texto es la opción correcta. Para configuración YAML (manifiestos de Kubernetes, valores de Helm, playbooks de Ansible), usa diff de YAML. Para configuración que viaja como JSON (settings de VS Code, package.json de npm, tfstate de Terraform), diff de JSON maneja el reordenamiento de objetos con más claridad que un diff de texto.

Cómo funciona el diff en realidad

El diff corre a nivel de carácter, luego una pasada de post-procesamiento semántico mueve los resaltados para que caigan sobre claves enteras, valores enteros y líneas de comentario completas, en vez de ruido a media palabra. Las inserciones aparecen en verde a la derecha, las eliminaciones en rojo a la izquierda. El contador de cambios en cada cabecera te dice cuántas ediciones distintas encontró el algoritmo.

Los formatos de configuración varían lo suficiente como para que un solo parser no sirva para todos, así que esta herramienta se mantiene deliberadamente agnóstica al formato. .env es el más laxo: la mayoría de los loaders tratan todo el lado derecho como string, pero algunos expanden $VAR y otros no, algunos respetan export, y las comillas en valores con espacios dependen del parser. Los archivos .properties (el estándar de Java, documentado en la API java.util.Properties) aceptan = o : como separador y requieren escapes Unicode como \u00e9 para caracteres no ASCII. Los archivos INI en la práctica van desde la convención de Windows (secciones entre corchetes, punto y coma para comentarios) hasta el dialecto ligeramente distinto que acepta el módulo configparser de Python.

Tres trampas reales que conviene conocer antes de fiarte de un diff limpio. Primera, el espacio en blanco al final. Un valor como API_KEY=abc con un espacio extra al final de la línea es una cadena distinta para la mayoría de loaders, y el diff lo marcará pero los humanos rara vez ven el espacio culpable. Segunda, los finales de línea. Un archivo commiteado en Windows con CRLF y otro escrito en Linux con LF tendrán el mismo contenido pero el diff mostrará todas las líneas como cambiadas; formatea ambos lados o normaliza los finales antes. Tercera, el byte order mark UTF-8. Notepad en Windows todavía escribe alegremente un BOM al principio de un .env guardado, lo que tropieza a la mayoría de loaders y se presenta como un diff fantasma de un carácter en la línea 1.

Cómo comparar archivos de config en tres pasos

Dos paneles de texto, un diff. Nada se sube. Nada se registra.

  1. 1

    Pega o sube tu config

    Pega la config vieja a la izquierda, la nueva a la derecha. O pulsa Subir en cualquiera de los lados para cargar un archivo .env, .toml, .ini, .properties o .conf directamente. El botón Sample llena ambos paneles con un pequeño ejemplo de .env para que veas cómo se renderizan los cambios de valor, las claves nuevas y las entradas eliminadas antes de pegar el tuyo.

  2. 2

    Formatea y normaliza

    Pulsa Formatear en cada panel para recortar el espacio en blanco final y aplicar finales de línea consistentes. Esto mata la clase más común de falsos positivos: dos archivos que se ven idénticos pero salen como completamente distintos en el diff porque uno se guardó con CRLF y otro con LF. El diff se centra en cambios reales de claves y valores una vez que ambos lados acuerdan los espacios.

  3. 3

    Lee el diff

    Las eliminaciones aparecen con resaltado rojo a la izquierda, las inserciones con resaltado verde a la derecha. Si haces scroll en un lado, el otro lo sigue. Los comentarios y las claves comentadas se diffean como texto ordinario, así que una clave que quitaste anteponiendo # aparece como la línea de comentario añadida, no como la clave eliminada.

Cuándo el diff de config es la herramienta correcta

Diff de archivos .env entre local y staging

Levantas una rama de feature en local, funciona bien, y luego revienta en staging porque a STRIPE_WEBHOOK_SECRET le falta del .env de staging. Pega el archivo local que funciona contra el de staging y la clave ausente, el host de DATABASE_URL cambiado y el LOG_LEVEL=debug obsoleto salen todos en una pasada. Más rápido que recorrer ambos archivos línea por línea, y mucho más seguro que correr un script que imprime ambas variables en una terminal.

Comparar pyproject.toml tras un upgrade de dependencias

Poetry o uv acaba de reescribir tu pyproject.toml tras un poetry update. Diffea la versión previa commiteada contra el working tree para confirmar los upgrades reales: fastapi pasó de 0.110.0 a 0.115.4, apareció una tabla nueva [tool.ruff.lint], y el pin de build-system.requires se movió. La spec TOML 1.0 es lo bastante estricta para que el diff sea normalmente limpio y fácil de leer.

Revisar cambios de nginx.conf antes de recargar

Recargar nginx con una config rota tira un sitio de producción más rápido que casi cualquier otra cosa. Antes del nginx -s reload, pega el nginx.conf que está corriendo contra el propuesto y confirma que el cambio es exactamente el que pretendías: un nuevo bloque upstream, un destino proxy_pass actualizado, un cambio de cipher suite TLS. El diff atrapa el punto y coma faltante accidental cada vez.

Auditar una unit de systemd o config de supervisord

Un servicio reinicia en bucle tras un deploy. Diffea el foo.service que funcionaba contra el nuevo y normalmente encuentras la causa en treinta segundos: un ExecStart cambiado, una línea Environment= caída, un NoNewPrivileges apretado. Mismo flujo para bloques .conf de supervisord, run-scripts de runit y los varios configs de init con sabor a .ini que aún ves en máquinas viejas.

Comparar archivos de config de infraestructura como código

Variables de Terraform en terraform.tfvars, configs de stack de Pulumi, group_vars de Ansible, valores de Helm para ConfigMaps de Kubernetes. Cada entorno tiene su propia copia y la única forma segura de mergearlas es diffear. Pega prod contra staging y la deriva salta a la vista: una región fijada en us-east-1 en una y us-west-2 en la otra, un tipo de instancia que alguien subió durante un incidente y nunca revirtió, un ARN de IAM role que apunta a la cuenta equivocada.

Verificar que un archivo de entorno de CI coincide con la plantilla

Entra una persona nueva, copia el .env.example del repo, y la build sigue fallando en su primer PR porque la plantilla derivó respecto a lo que el pipeline de CI espera realmente. Diffea el .env.example commiteado contra un .env conocido que funciona de alguien cuyas builds pasan y las claves ausentes salen en rojo a la izquierda o en verde a la derecha. El mismo truco vale para bloques env de Taskfile, secciones env: de GitHub Actions y archivos .envrc de direnv.

Referencia rápida de formatos de config

Una hoja resumen breve sobre los formatos que esta herramienta ve más a menudo. La configuración es más caótica de lo que sugiere su reputación, y las diferencias de abajo son donde la mayoría de los diffs se descarrilan.

TopicWhat this tool does
Dialectos de formatoINI (sin spec formal, dialectos por parser), TOML 1.0 (estricto, tipado), .env (sin spec, definido por parser), .properties (Java, ver java.util.Properties), .conf (por aplicación: nginx, Apache, sshd_config difieren todos).
Caracteres de comentarioINI: ; o #. TOML: solo #. .env: solo #, y solo al inicio de línea en la mayoría de loaders. .properties: # o !. nginx .conf: solo #.
Cabeceras de secciónINI y TOML usan [section]. TOML añade tablas anidadas vía [a.b.c] y arrays de tablas vía [[a]]. .env y .properties son planos, sin secciones. nginx usa bloques { ... } en vez de cabeceras.
Tipos de valorTOML tiene valores tipados: strings, ints, floats, bools, fechas, arrays, tablas. INI, .env y .properties son solo strings; la aplicación decide cómo parsear true o 42.
Interpolación y expansiónLa mayoría de loaders dotenv no expanden $VAR por defecto. Algunos sí (dotenv-expand, direnv, sourcing de shell vía source .env). TOML nunca expande. INI rara vez expande; configparser de Python soporta ${section:key} si lo activas.
Espacio en blanco al finalUna fuente real de bugs. FOO=bar con un espacio final pone FOO a "bar " en la mayoría de loaders, lo que falla en checks de igualdad de strings aguas abajo. Recorta o entrecomilla siempre.
Finales de líneaCRLF (Windows) vs LF (Unix). Dos archivos idénticos guardados en sistemas distintos diffean como todas-las-líneas-cambiadas. Usa el botón Formatear o normaliza los finales (dos2unix, git config core.autocrlf) antes de diffear.
Codificación y BOMTOML obliga a UTF-8. .properties históricamente requería ISO-8859-1 con escapes \uXXXX, pero el Java moderno acepta UTF-8 vía Properties.load(Reader). Un BOM UTF-8 al inicio de un .env es una causa clásica de diff fantasma; Notepad en Windows aún lo escribe por defecto.

Diff de config: preguntas frecuentes

¿La herramienta entiende los tipos de valor?

No. Es un diff de texto. TOML distingue strings, enteros, floats, booleanos, fechas y arrays, pero el diff trata cada línea como texto plano y te muestra qué caracteres cambiaron. Eso normalmente es suficiente porque los cambios de configuración son cambios de caracteres de todos modos. Si realmente necesitas una comparación tipada, parsea ambos archivos en el lenguaje que prefieras (tomllib de Python, crate toml de Rust, pelletier/go-toml de Go) y compara los mapas resultantes. Para el caso del 95%, el diff de texto atrapa lo que necesitas atrapar.

¿Cómo manejo líneas comentadas que "difieren" pero son equivalentes?

Normalmente no las manejas, y deberías agradecer que la herramienta las marcó. Una línea que pasa de API_KEY=abc a #API_KEY=abc es semánticamente significativa: la clave ahora está deshabilitada. El diff resalta el cambio del prefijo de comentario, que es exactamente lo que un revisor humano debería ver durante una revisión de config. Si de verdad quieres ignorar el ruido de comentarios, formatea ambos lados para quitar las líneas de solo comentario antes de pegar, pero rara vez es lo correcto para un archivo relevante para seguridad.

¿Cómo verifico si una clave falta en un lado?

Pega ambos archivos, ejecuta el diff, y cualquier clave presente en un lado y ausente en el otro aparece como una eliminación roja o una inserción verde de la línea entera. El diff no intenta alinear claves estructuralmente, así que una clave reordenada a otra posición aparecerá una vez como eliminación y una vez como inserción. Para una comparación insensible al orden, ordena ambos archivos por clave primero (sort .env en Unix) y luego diffea. El enfoque agnóstico al formato atrapa claves ausentes sin necesidad de un parser.

¿Es seguro pegar archivos .env con secretos reales?

Sí, tu input nunca sale del navegador. El diff corre enteramente en el cliente. No hay subida al servidor, ni telemetría sobre el contenido de cualquiera de los paneles, ni analíticas que capturen lo que escribiste. Es intencional porque los diffs de .env son uno de los flujos de mayor confianza en este sitio. Si eres paranoico (y deberías serlo un poco), abre las devtools del navegador y confirma que la pestaña de red queda vacía mientras pegas. Para organizaciones que prefieren una herramienta totalmente air-gapped, abre el sitio offline una vez y los assets cacheados funcionan sin más acceso a red.

¿Cuál es la diferencia entre TOML e INI?

INI es una convención; TOML es una especificación. INI creció en Windows, no tiene gramática formal y cada parser maneja los casos límite (comillas, escapes, valores de lista, secciones anidadas) un poco distinto. TOML 1.0 es una spec estricta y versionada usada por Cargo, Poetry, Hugo y cada vez más por el packaging de Python vía pyproject.toml. Ambos usan cabeceras [section] y pares key = value, así que se ven similares a primera vista, pero TOML añade valores tipados, literales de fecha y hora y tablas inline que los archivos INI clásicos no tienen.

¿El diff normaliza el casing de las claves o el espacio en blanco?

No. API_KEY=abc y api_key=abc son líneas distintas para el diff porque son bytes distintos. La mayoría de loaders también son sensibles al case (dotenv, java.util.Properties, configparser por defecto), así que esto coincide con la realidad. El espacio alrededor del = se preserva tal cual, lo que importa porque algunos parsers más estrictos (notablemente algunos patrones de sourcing de Bash) rechazan FOO = bar con espacios y solo aceptan FOO=bar. El botón Formatear recorta el espacio final de cada línea, que es el único paso de normalización que aplica.

Privacidad y cómo funciona esto

Tus archivos de configuración nunca salen del navegador. El diff, el formateador y cada byte de tu input se quedan en tu máquina, localmente. Sin analíticas sobre el contenido de los paneles, sin logs, sin upload. Esto importa más aquí que en la mayoría de las herramientas de diff porque los archivos .env contienen rutinariamente contraseñas de base de datos, API keys y secretos de cliente OAuth, y pegarlos en una herramienta que los manda y trae a un servidor sería un incidente de seguridad real. Lectura de fondo sobre los formatos: TOML 1.0, archivos INI y el concepto Unix de variables de entorno. Para secretos que no deben vivir en un archivo en absoluto, mira sops, HashiCorp Vault o AWS Parameter Store.