configuração original
configuração alterada

Diff de Config: Compare arquivos INI, TOML, .env online

Cole dois arquivos de configuração lado a lado e veja exatamente quais chaves, valores e comentários mudaram. Funciona com .env, TOML, INI, .properties e .conf.

O que é a ferramenta de diff de configuração?

Uma ferramenta gratuita no navegador para comparar arquivos de configuração. Cole um .env de staging à esquerda, o de produção à direita, e as chaves ausentes, valores alterados e comentários obsoletos acendem na hora. O mesmo fluxo serve para um pyproject.toml antes e depois de um update do Poetry, um nginx.conf que você está prestes a recarregar, ou um application.properties Java migrando entre ambientes.

O diff é em nível de caractere. Não há parser, não há schema, nenhuma opinião sobre qual dialeto você está colando. Isso é proposital. Arquivos de configuração não compartilham uma única gramática. INI não tem spec formal e cada parser discorda sobre quoting e escapes. TOML 1.0 tem uma gramática estrita mas adiciona valores tipados. Arquivos .env não têm spec nenhuma, apenas o que dotenv ou seu shell decidirem fazer.

Se veio aqui buscando texto simples, nossa ferramenta de diff de texto é a escolha certa. Para configuração YAML (manifests Kubernetes, valores Helm, playbooks Ansible), use diff de YAML. Para config que vem como JSON (settings do VS Code, package.json do npm, tfstate do Terraform), diff de JSON lida com reordenação de objetos de forma mais limpa do que um diff de texto.

Como o diff funciona de verdade

O diff roda em nível de caractere e depois um passo de pós-processamento semântico desloca os destaques para que caiam sobre chaves inteiras, valores inteiros e linhas de comentário completas, em vez de ruído no meio do token. Inserções aparecem em verde no painel direito, deleções em vermelho à esquerda. O contador de mudanças em cada cabeçalho informa quantas edições distintas o algoritmo encontrou.

Os formatos de configuração variam o suficiente para que um único parser não sirva para todos, então esta ferramenta permanece deliberadamente agnóstica ao formato. .env é o mais permissivo: a maioria dos loaders trata todo o lado direito como string, mas alguns expandem $VAR e outros não, alguns honram export, e a forma de quoting em valores com espaços é específica do parser. Arquivos .properties (o padrão Java, documentado na API java.util.Properties) aceitam = ou : como separador e exigem escapes Unicode como \u00e9 para caracteres não-ASCII. Arquivos INI no mundo real vão da convenção do Windows (seções entre colchetes, ponto e vírgula para comentários) até o dialeto ligeiramente diferente que o módulo configparser do Python aceita.

Três pegadinhas reais que vale conhecer antes de confiar em um diff limpo. Primeira, espaço em branco final. Um valor como API_KEY=abc com um espaço sobrando no fim da linha é uma string diferente para a maioria dos loaders, e o diff vai sinalizar, mas humanos raramente veem o espaço culpado. Segunda, finais de linha. Um arquivo commitado no Windows com CRLF e outro escrito no Linux com LF terão conteúdo idêntico, mas o diff mostrará todas as linhas como alteradas; formate ambos os lados ou normalize os finais antes. Terceira, o byte order mark UTF-8. O Notepad no Windows ainda escreve alegremente um BOM no início de um .env salvo, no que a maioria dos loaders tropeça e que se apresenta como um diff fantasma de um caractere na linha 1.

Como comparar arquivos de config em três passos

Dois painéis de texto, um diff. Nada é enviado. Nada é registrado.

  1. 1

    Cole ou faça upload da sua config

    Cole a config antiga à esquerda, a nova à direita. Ou clique em Upload em qualquer lado para carregar um arquivo .env, .toml, .ini, .properties ou .conf diretamente. O botão Sample preenche os dois painéis com um pequeno exemplo .env para você ver como mudanças de valor, novas chaves e entradas removidas são renderizadas antes de colar a sua.

  2. 2

    Formate e normalize

    Clique em Format em cada painel para aparar espaço em branco final e aplicar finais de linha consistentes. Isso mata a classe mais comum de falsos positivos: dois arquivos que parecem idênticos mas dão diff completamente diferente porque um foi salvo com CRLF e o outro com LF. O diff foca em mudanças reais de chaves e valores assim que os dois lados concordam no espaço em branco.

  3. 3

    Leia o diff

    Deleções aparecem com destaque vermelho à esquerda, inserções com destaque verde à direita. Role um lado e o outro acompanha. Comentários e chaves comentadas são diffadas como texto comum, então uma chave que você removeu prefixando com # aparece como a linha de comentário sendo adicionada, não como a chave sendo deletada.

Quando o diff de config é a ferramenta certa

Diffar arquivos .env entre local e staging

Você sobe um branch de feature local, funciona, aí dá crash em staging porque STRIPE_WEBHOOK_SECRET está faltando no .env de staging. Cole o arquivo local que funciona contra o de staging e a chave ausente, o host de DATABASE_URL alterado e o LOG_LEVEL=debug obsoleto aparecem todos numa passada. Mais rápido do que percorrer os dois arquivos linha a linha, e bem mais seguro do que rodar um script que imprime os dois conjuntos de variáveis no terminal.

Comparar pyproject.toml após upgrade de dependências

Poetry ou uv acabou de reescrever seu pyproject.toml depois de um poetry update. Diffe a versão commitada anterior contra a working tree para confirmar os upgrades reais: fastapi passou de 0.110.0 para 0.115.4, surgiu uma nova tabela [tool.ruff.lint], e o pin de build-system.requires mudou. A spec TOML 1.0 é estrita o suficiente para que o diff geralmente saia limpo e fácil de ler.

Revisar mudanças no nginx.conf antes de recarregar

Recarregar o nginx com config quebrada derruba um site de produção mais rápido do que quase qualquer outra coisa num servidor. Antes do nginx -s reload, cole o nginx.conf em execução contra o proposto e confirme que a mudança é exatamente a que você queria: um novo bloco upstream, um destino proxy_pass atualizado, uma troca de cipher suite TLS. O diff pega o ponto e vírgula faltando acidental toda vez.

Auditar uma unit do systemd ou config do supervisord

Um serviço está reiniciando em loop depois de um deploy. Diffe o foo.service que funcionava contra o novo e geralmente você encontra a causa em trinta segundos: um ExecStart alterado, uma linha Environment= caída, um NoNewPrivileges apertado. Mesmo fluxo para blocos .conf de supervisord, run-scripts do runit e os vários configs de init com cara de .ini que ainda se vê em máquinas mais antigas.

Comparar arquivos de config de infraestrutura como código

Variáveis Terraform em terraform.tfvars, configs de stack do Pulumi, group_vars do Ansible, valores Helm para ConfigMaps do Kubernetes. Cada ambiente tem sua cópia e a única forma segura de mesclar é diffar. Cole prod contra staging e o drift salta aos olhos: uma região fixada em us-east-1 em uma e us-west-2 na outra, um tipo de instância que alguém aumentou durante um incidente e nunca reverteu, um ARN de IAM role apontando para a conta errada.

Verificar se um arquivo de ambiente de CI bate com o template documentado

Um engenheiro novo entra, copia o .env.example do repo, e o build ainda quebra no primeiro PR porque o template ficou fora de sincronia com o que o pipeline de CI realmente espera. Diffe o .env.example commitado contra um .env conhecido como bom de alguém cujos builds passam e as chaves ausentes aparecem em vermelho à esquerda ou em verde à direita. O mesmo truque vale para blocos env de Taskfile, seções env: de GitHub Actions e arquivos .envrc do direnv.

Referência rápida de formatos de config

Uma cola curta sobre os formatos que esta ferramenta vê com mais frequência. Configuração é mais bagunçada do que sua reputação sugere, e as diferenças abaixo são onde a maioria dos diffs descarrila.

TopicWhat this tool does
Dialetos de formatoINI (sem spec formal, dialetos por parser), TOML 1.0 (estrito, tipado), .env (sem spec, definido por parser), .properties (Java, ver java.util.Properties), .conf (por aplicação: nginx, Apache, sshd_config diferem todos).
Caracteres de comentárioINI: ; ou #. TOML: só #. .env: só #, e só no início da linha na maioria dos loaders. .properties: # ou !. nginx .conf: só #.
Cabeçalhos de seçãoINI e TOML usam [section]. TOML adiciona tabelas aninhadas via [a.b.c] e arrays de tabelas via [[a]]. .env e .properties são planos, sem seções. nginx usa blocos { ... } em vez de cabeçalhos.
Tipos de valorTOML tem valores tipados: strings, ints, floats, bools, datas, arrays, tabelas. INI, .env e .properties são só string; a aplicação decide como parsear true ou 42.
Interpolação e expansãoA maioria dos loaders dotenv não expande $VAR por padrão. Alguns expandem (dotenv-expand, direnv, sourcing de shell via source .env). TOML nunca expande. INI raramente expande; configparser do Python suporta ${section:key} se você habilitar.
Espaço em branco finalFonte real de bugs. FOO=bar com espaço final coloca FOO como "bar " na maioria dos loaders, o que falha em checks de igualdade de string mais adiante. Sempre apare ou coloque entre aspas.
Finais de linhaCRLF (Windows) vs LF (Unix). Dois arquivos idênticos salvos em SOs diferentes diffam como cada-linha-alterada. Use o botão Format ou normalize finais (dos2unix, git config core.autocrlf) antes de diffar.
Encoding e BOMTOML obriga UTF-8. .properties historicamente exigia ISO-8859-1 com escapes \uXXXX, mas o Java moderno aceita UTF-8 via Properties.load(Reader). Um BOM UTF-8 no início de um .env é causa clássica de diff fantasma; o Notepad no Windows ainda escreve um por padrão.

Diff de config: perguntas frequentes

A ferramenta entende tipos de valor?

Não. É um diff de texto. TOML distingue strings, inteiros, floats, booleanos, datas e arrays, mas o diff trata cada linha como texto plano e mostra quais caracteres mudaram. Geralmente isso basta porque mudanças de configuração são mudanças de caracteres de qualquer forma. Se você realmente precisa de uma comparação tipada, parseie os dois arquivos na linguagem que preferir (tomllib do Python, crate toml do Rust, pelletier/go-toml do Go) e compare os mapas resultantes. Para o caso 95%, o diff de texto pega o que precisa pegar.

Como lidar com linhas comentadas que "diferem" mas são equivalentes?

Geralmente você não lida, e deveria ficar feliz que a ferramenta sinalizou. Uma linha que vai de API_KEY=abc para #API_KEY=abc é semanticamente significativa: a chave agora está desabilitada. O diff destaca a mudança do prefixo de comentário, que é exatamente o que um revisor humano deveria ver durante uma revisão de config. Se você realmente quer ignorar churn de comentários, formate os dois lados para descartar linhas só de comentário antes de colar, mas raramente é o caminho certo para um arquivo sensível à segurança.

Como verifico se uma chave está faltando em um lado?

Cole os dois arquivos, rode o diff, e qualquer chave presente em um lado e ausente no outro aparece como uma deleção vermelha ou inserção verde da linha inteira. O diff não tenta alinhar chaves estruturalmente, então uma chave reordenada para outra posição vai aparecer uma vez como deleção e uma vez como inserção. Para uma comparação completamente insensível à ordem, ordene os dois arquivos por chave primeiro (sort .env no Unix) e depois diffe. A abordagem agnóstica ao formato pega chaves ausentes sem precisar de parser.

É seguro colar arquivos .env com secrets reais?

Sim, sua entrada nunca sai do navegador. O diff roda inteiramente no cliente. Não há upload para servidor, nem telemetria sobre o conteúdo dos painéis, nem analytics que capturem o que você digitou. Isso é intencional porque diffs de .env são um dos fluxos de maior confiança neste site. Se você é paranoico (e deveria ser um pouco), abra o devtools do navegador e confirme que a aba de rede fica vazia enquanto você cola. Para organizações que preferem uma ferramenta totalmente air-gapped, abra o site offline uma vez e os assets em cache funcionam sem mais acesso de rede.

Qual a diferença entre TOML e INI?

INI é uma convenção; TOML é uma especificação. INI cresceu no Windows, não tem gramática formal, e cada parser trata casos de borda (quoting, escapes, valores de lista, seções aninhadas) de forma um pouco diferente. TOML 1.0 é uma spec estrita e versionada usada por Cargo, Poetry, Hugo e cada vez mais pelo packaging Python via pyproject.toml. Os dois usam cabeçalhos [section] e pares key = value, então parecem semelhantes à primeira vista, mas TOML adiciona valores tipados, literais de datetime e tabelas inline que arquivos INI clássicos não têm.

O diff normaliza casing de chaves ou espaços?

Não. API_KEY=abc e api_key=abc são linhas diferentes para o diff porque são bytes diferentes. A maioria dos loaders também é case-sensitive (dotenv, java.util.Properties, configparser por padrão), então isso bate com a realidade. Espaço em volta do = é preservado como está, o que importa porque alguns parsers mais estritos (notavelmente alguns padrões de sourcing do Bash) rejeitam FOO = bar com espaços e só aceitam FOO=bar. O botão Format apara espaço em branco final em cada linha, que é o único passo de normalização que ele aplica.

Privacidade e como isto funciona

Seus arquivos de configuração nunca saem do navegador. O diff, o formatador e cada byte da sua entrada ficam na sua máquina, localmente. Sem analytics sobre o conteúdo dos painéis, sem logs, sem upload. Isso importa mais aqui do que na maioria das ferramentas de diff porque arquivos .env contêm rotineiramente senhas de banco de dados, API keys e secrets de cliente OAuth, e colá-los numa ferramenta que faz round-trip por um servidor seria um incidente de segurança real. Leitura de fundo sobre os formatos: TOML 1.0, arquivos INI e o conceito Unix de variáveis de ambiente. Para secrets que não devem viver em arquivo nenhum, veja sops, HashiCorp Vault ou AWS Parameter Store.