Diff di Config: confronta file INI, TOML, .env online
Incolla due file di configurazione affiancati e vedi esattamente quali chiavi, valori e commenti sono cambiati. Funziona con .env, TOML, INI, .properties e .conf.
Cos'è lo strumento di diff configurazione?
Uno strumento gratuito nel browser per confrontare file di configurazione. Incolla un .env di staging a sinistra, quello di produzione a destra, e le chiavi mancanti, i valori cambiati e i commenti obsoleti si illuminano subito. Stesso flusso per un pyproject.toml prima e dopo un update di Poetry, un nginx.conf che stai per ricaricare, o un application.properties Java che si sposta tra ambienti.
Il diff è a livello di carattere. Niente parser, niente schema, nessuna opinione su quale dialetto stai incollando. È voluto. I file di configurazione non condividono una grammatica unica. INI non ha spec formale e ogni parser non concorda su quoting ed escape. TOML 1.0 ha una grammatica stretta ma aggiunge valori tipizzati. I file .env non hanno proprio spec, solo quello che dotenv o la tua shell finiscono per fare.
Se sei venuto qui cercando prosa semplice, il nostro strumento di diff testo è la scelta giusta. Per configurazione YAML (manifest Kubernetes, valori Helm, playbook Ansible), usa diff YAML. Per config che gira come JSON (settings di VS Code, package.json di npm, tfstate di Terraform), diff JSON gestisce il riordino degli oggetti più pulitamente di un diff testuale.
Come funziona davvero il diff
Il diff gira a livello di carattere, poi un passaggio di post-processing semantico sposta gli highlight in modo che cadano su chiavi intere, valori interi e righe di commento complete invece che su rumore a metà token. Le inserzioni appaiono in verde nel pannello destro, le cancellazioni in rosso a sinistra. Il contatore di modifiche in ogni header ti dice quante edit distinte ha trovato l'algoritmo.
I formati di configurazione variano abbastanza che un solo parser non può servirli tutti, quindi questo strumento resta deliberatamente agnostico al formato. .env è il più lasco: la maggior parte dei loader tratta tutto il lato destro come una stringa, ma alcuni espandono $VAR e altri no, alcuni rispettano export, e il quoting attorno ai valori con spazi è specifico del parser. I file .properties (lo standard Java, documentato nell'API java.util.Properties) accettano = o : come separatore e richiedono escape Unicode come \u00e9 per caratteri non ASCII. I file INI nella pratica vanno dalla convenzione Windows (sezioni tra parentesi quadre, punti e virgola per i commenti) al dialetto leggermente diverso che il modulo configparser di Python accetta.
Tre trabocchetti reali da conoscere prima di fidarti di un diff pulito. Primo, gli spazi in coda. Un valore come API_KEY=abc con uno spazio di troppo a fine riga è una stringa diversa per la maggior parte dei loader, e il diff lo segnala ma gli umani raramente vedono lo spazio colpevole. Secondo, i fine riga. Un file committato su Windows con CRLF e uno scritto su Linux con LF avranno lo stesso contenuto ma il diff mostrerà ogni riga come modificata; formatta entrambi i lati o normalizza i fine riga prima. Terzo, il byte order mark UTF-8. Notepad su Windows continua allegramente a scrivere un BOM all'inizio di un .env salvato, cosa su cui la maggior parte dei loader inciampa e che si presenta come un diff fantasma di un carattere alla riga 1.
Come confrontare file di config in tre passi
Due pannelli di testo, un diff. Niente viene caricato. Niente viene loggato.
- 1
Incolla o carica la tua config
Incolla la config vecchia a sinistra, quella nuova a destra. Oppure clicca Upload su uno dei lati per caricare direttamente un file .env, .toml, .ini, .properties o .conf. Il bottone Sample riempie entrambi i pannelli con un piccolo esempio .env così vedi come vengono renderizzate le modifiche di valore, le nuove chiavi e le voci rimosse prima di incollare la tua.
- 2
Formatta e normalizza
Clicca Format su ogni pannello per tagliare lo spazio in coda e applicare fine riga coerenti. Questo uccide la classe più comune di falsi positivi: due file che sembrano identici ma diffano come completamente diversi perché uno è stato salvato con CRLF e l'altro con LF. Il diff si concentra su cambiamenti reali di chiavi e valori una volta che i due lati sono d'accordo sugli spazi.
- 3
Leggi il diff
Le cancellazioni appaiono con highlight rosso a sinistra, le inserzioni con highlight verde a destra. Scorri un lato e l'altro segue. Commenti e chiavi commentate vengono diffate come testo normale, quindi una chiave che hai rimosso anteponendo # appare come la riga di commento aggiunta invece che come la chiave cancellata.
Quando il diff config è lo strumento giusto
Diffare file .env tra locale e staging
Tiri su un branch di feature in locale, funziona, poi crasha su staging perché STRIPE_WEBHOOK_SECRET manca dal .env di staging. Incolla il file locale che funziona contro quello di staging e la chiave mancante, l'host DATABASE_URL cambiato e il LOG_LEVEL=debug obsoleto vengono fuori tutti in una passata. Più rapido che camminare tra i due file riga per riga, e molto più sicuro che lanciare uno script che stampa entrambi i set di variabili in un terminale.
Confrontare pyproject.toml dopo un upgrade di dipendenze
Poetry o uv ha appena riscritto il tuo pyproject.toml dopo un poetry update. Diffa la versione committata precedente contro la working tree per confermare gli upgrade reali: fastapi è passato da 0.110.0 a 0.115.4, è apparsa una nuova tabella [tool.ruff.lint], e il pin di build-system.requires si è spostato. La spec TOML 1.0 è abbastanza stretta che il diff è normalmente pulito e facile da leggere.
Revisionare modifiche a nginx.conf prima del reload
Ricaricare nginx con una config rotta tira giù un sito di produzione più velocemente di quasi qualsiasi altra cosa su un server. Prima del nginx -s reload, incolla il nginx.conf in esecuzione contro quello proposto e conferma che il cambiamento è esattamente quello voluto: un nuovo blocco upstream, un target proxy_pass aggiornato, uno scambio di cipher suite TLS. Il diff prende il punto e virgola mancante per sbaglio ogni volta.
Auditare una unit systemd o config supervisord
Un servizio sta riavviando in loop dopo un deploy. Diffa il foo.service che funzionava contro quello nuovo e di solito trovi la causa entro trenta secondi: un ExecStart cambiato, una riga Environment= caduta, un NoNewPrivileges stretto. Stesso flusso per blocchi .conf di supervisord, run-script di runit e i vari config init in stile .ini che vedi ancora su macchine più vecchie.
Confrontare file di config infrastructure-as-code
Variabili Terraform in terraform.tfvars, config di stack Pulumi, group_vars Ansible, valori Helm per ConfigMap di Kubernetes. Ogni ambiente ha la sua copia e l'unico modo sicuro di mergiarli è diffare. Incolla prod contro staging e il drift salta fuori: una region pinnata su us-east-1 in uno e us-west-2 nell'altro, un instance type che qualcuno ha alzato durante un incidente e mai riportato indietro, un ARN di IAM role che punta sull'account sbagliato.
Verificare che un file di environment di CI corrisponda al template documentato
Entra una nuova ingegnera, copia il .env.example dal repo, e la build fallisce comunque alla sua prima PR perché il template è andato fuori sincrono rispetto a quello che la pipeline CI si aspetta davvero. Diffa il .env.example committato contro un .env noto come funzionante di qualcuno le cui build passano e le chiavi mancanti escono in rosso a sinistra o in verde a destra. Stesso trucco vale per blocchi env di Taskfile, sezioni env: di GitHub Actions e file .envrc di direnv.
Riferimento rapido formati di config
Un breve cheat sheet sui formati che questo strumento vede più spesso. La configurazione è più caotica di quanto suggerisca la sua reputazione, e le differenze qui sotto sono dove la maggior parte dei diff finisce di traverso.
| Topic | What this tool does |
|---|
| Dialetti di formato | INI (nessuna spec formale, dialetti per parser), TOML 1.0 (stretto, tipizzato), .env (nessuna spec, definito dal parser), .properties (Java, vedi java.util.Properties), .conf (per applicazione: nginx, Apache, sshd_config sono tutti diversi). |
|---|
| Caratteri di commento | INI: ; o #. TOML: solo #. .env: solo #, e solo a inizio riga nella maggior parte dei loader. .properties: # o !. nginx .conf: solo #. |
|---|
| Header di sezione | INI e TOML usano [section]. TOML aggiunge tabelle annidate via [a.b.c] e array di tabelle via [[a]]. .env e .properties sono piatti, senza sezioni. nginx usa blocchi { ... } invece di header. |
|---|
| Tipi di valore | TOML ha valori tipizzati: stringhe, int, float, bool, date, array, tabelle. INI, .env e .properties sono solo stringa; l'applicazione decide come parsare true o 42. |
|---|
| Interpolazione ed espansione | La maggior parte dei loader dotenv non espande $VAR di default. Alcuni sì (dotenv-expand, direnv, sourcing della shell via source .env). TOML non espande mai. INI espande raramente; configparser di Python supporta ${section:key} se opti per accenderlo. |
|---|
| Spazio in coda | Una vera fonte di bug. FOO=bar con uno spazio in coda imposta FOO a "bar " nella maggior parte dei loader, cosa che fallisce i check di uguaglianza stringa a valle. Sempre tagliare o mettere tra virgolette. |
|---|
| Fine riga | CRLF (Windows) vs LF (Unix). Due file identici salvati su OS diversi diffano come ogni-riga-cambiata. Usa il bottone Format o normalizza i fine riga (dos2unix, git config core.autocrlf) prima di diffare. |
|---|
| Encoding e BOM | TOML impone UTF-8. .properties storicamente richiedeva ISO-8859-1 con escape \uXXXX, ma il Java moderno accetta UTF-8 via Properties.load(Reader). Un BOM UTF-8 all'inizio di un .env è una causa classica di diff fantasma; Notepad su Windows ne scrive ancora uno di default. |
|---|
Diff di config: domande frequenti
Lo strumento capisce i tipi dei valori?
No. È un diff testuale. TOML distingue stringhe, interi, float, booleani, date e array, ma il diff tratta ogni riga come testo semplice e ti mostra quali caratteri sono cambiati. Di solito basta perché i cambiamenti di configurazione sono cambiamenti di caratteri comunque. Se ti serve davvero un confronto tipizzato, parsa entrambi i file nel linguaggio che preferisci (tomllib di Python, crate toml di Rust, pelletier/go-toml di Go) e confronta le mappe risultanti. Per il caso 95%, il diff testuale prende quello che devi prendere.
Come gestisco righe commentate che "differiscono" ma sono equivalenti?
Di solito non le gestisci, e dovresti essere contento che lo strumento le abbia segnalate. Una riga che passa da API_KEY=abc a #API_KEY=abc è semanticamente significativa: la chiave ora è disabilitata. Il diff evidenzia il cambio di prefisso del commento, che è esattamente quello che un revisore umano dovrebbe vedere durante una review di config. Se vuoi davvero ignorare il churn dei commenti, formatta entrambi i lati per buttare via le righe di solo commento prima di incollare, ma raramente è la mossa giusta per un file rilevante per la sicurezza.
Come verifico se una chiave manca da un lato?
Incolla entrambi i file, lancia il diff, e qualsiasi chiave presente da un lato e assente dall'altro appare come una cancellazione rossa o un'inserzione verde dell'intera riga. Il diff non prova ad allineare le chiavi strutturalmente, quindi una chiave riordinata in una posizione diversa apparirà una volta come cancellazione e una come inserzione. Per un confronto totalmente insensibile all'ordine, ordina prima entrambi i file per chiave (sort .env su Unix) e poi diffa. L'approccio agnostico al formato prende le chiavi mancanti senza bisogno di parser.
È sicuro incollare file .env con secret reali?
Sì, il tuo input non lascia mai il browser. Il diff gira interamente sul client. Niente upload al server, niente telemetria sui contenuti dei pannelli, nessuna analytics che cattura quello che hai digitato. È intenzionale perché i diff di .env sono uno dei flussi a più alta fiducia su questo sito. Se sei paranoico (e dovresti esserlo un po'), apri i devtools del browser e conferma che la tab di rete resti vuota mentre incolli. Per organizzazioni che preferiscono uno strumento totalmente air-gapped, apri il sito offline una volta e gli asset in cache funzionano senza ulteriore accesso di rete.
Qual è la differenza tra TOML e INI?
INI è una convenzione; TOML è una specifica. INI è cresciuto su Windows, non ha grammatica formale, e ogni parser gestisce i casi limite (quoting, escape, valori a lista, sezioni annidate) in modo leggermente diverso. TOML 1.0 è una spec stretta e versionata usata da Cargo, Poetry, Hugo, e sempre più dal packaging Python via pyproject.toml. Entrambi usano header [section] e coppie key = value, quindi sembrano simili a prima vista, ma TOML aggiunge valori tipizzati, letterali datetime e tabelle inline che i file INI classici non hanno.
Il diff normalizza il casing delle chiavi o gli spazi?
No. API_KEY=abc e api_key=abc sono righe diverse per il diff perché sono byte diversi. Anche la maggior parte dei loader è case-sensitive (dotenv, java.util.Properties, configparser di default), quindi questo combacia con la realtà. Lo spazio attorno a = è preservato così com'è, il che conta perché alcuni parser più stretti (in particolare alcuni pattern di sourcing Bash) rifiutano FOO = bar con spazi e accettano solo FOO=bar. Il bottone Format taglia lo spazio in coda di ogni riga, che è l'unico passo di normalizzazione che applica.
Privacy e come funziona
I tuoi file di configurazione non lasciano mai il browser. Il diff, il formattatore e ogni byte del tuo input restano sulla tua macchina, in locale. Niente analytics sui contenuti dei pannelli, niente log, niente upload. Qui conta più che nella maggior parte degli strumenti di diff perché i file .env contengono di routine password di database, API key e secret client OAuth, e incollarli in uno strumento che fa round-trip attraverso un server sarebbe un vero incidente di sicurezza. Letture di sfondo sui formati: TOML 1.0, file INI e il concetto Unix di variabili d'ambiente. Per secret che proprio non devono vivere in un file, guarda sops, HashiCorp Vault o AWS Parameter Store.