Originele configuratie
Gewijzigde configuratie

Config Diff: vergelijk INI-, TOML-, .env-bestanden online

Plak twee configuratiebestanden naast elkaar en zie precies welke keys, waarden en commentaarregels veranderd zijn. Werkt voor .env, TOML, INI, .properties en .conf.

Wat is de config-diff-tool?

Een gratis browsertool voor het diffen van configuratiebestanden. Plak een staging-.env links, de productie-versie rechts, en de ontbrekende keys, gewijzigde waarden en verouderde comments lichten direct op. Zelfde werkstroom voor een pyproject.toml voor en na een Poetry-update, een nginx.conf die je gaat herladen, of een Java-application.properties die tussen omgevingen wisselt.

De diff werkt op tekenniveau. Geen parser, geen schema, geen oordeel over welk dialect je plakt. Dat is met opzet zo. Configuratiebestanden delen geen enkele grammatica. INI heeft geen formele spec en elke parser is het oneens over quoting en escapes. TOML 1.0 heeft een strikte grammatica maar voegt typed values toe. .env-bestanden hebben helemaal geen spec, alleen wat dotenv of je shell toevallig doet.

Als je hier kwam voor gewone tekst, is onze tekst-diff-tool de juiste keuze. Voor YAML-configuratie (Kubernetes-manifests, Helm-values, Ansible-playbooks) gebruik YAML-diff. Voor config die als JSON wordt afgeleverd (VS Code-settings, npm-package.json, Terraform-tfstate), behandelt JSON-diff objectherordening netter dan een tekst-diff kan.

Hoe de diff echt werkt

De diff loopt op tekenniveau, daarna verschuift een semantische naverwerkingsstap de highlights zodat ze op hele keys, hele waarden en hele commentaarregels landen in plaats van op ruis midden in een token. Toevoegingen verschijnen groen in het rechterpaneel, verwijderingen rood links. De wijzigingsteller in elke header vertelt hoeveel afzonderlijke edits het algoritme vond.

Configuratieformaten verschillen genoeg dat één parser niet voor alle volstaat, dus blijft deze tool bewust formaat-onafhankelijk. .env is de losste van het stel: de meeste loaders behandelen de hele rechterkant als string, maar sommige expanderen $VAR en andere niet, sommige respecteren export, en quoting rond waarden met spaties is parser-specifiek. .properties-bestanden (de Java-standaard, gedocumenteerd in de java.util.Properties API) accepteren = of : als scheidingsteken en vereisen Unicode-escapes als \u00e9 voor niet-ASCII-tekens. INI-bestanden in het wild lopen van de Windows-conventie (sections in vierkante haken, puntkomma's voor commentaar) tot het iets afwijkende dialect dat de Python configparser-module accepteert.

Drie reële valkuilen om te kennen voordat je een schone diff vertrouwt. Eerste, trailing whitespace. Een waarde als API_KEY=abc met een verdwaalde spatie aan het einde van de regel is voor de meeste loaders een andere string, en de diff signaleert dat, maar mensen zien de schuldige spatie zelden. Tweede, regeleinden. Een bestand dat op Windows met CRLF is gecommit en een dat op Linux met LF is geschreven, hebben dezelfde inhoud, maar de diff toont elke regel als gewijzigd; formatteer beide kanten of normaliseer de regeleinden eerst. Derde, het UTF-8 byte order mark. Notepad op Windows schrijft nog steeds vrolijk een BOM aan het begin van een opgeslagen .env, waar de meeste loaders over struikelen en wat zich voordoet als een spookdiff van één teken op regel 1.

Config-bestanden vergelijken in drie stappen

Twee tekstpanelen, één diff. Niets wordt geüpload. Niets wordt gelogd.

  1. 1

    Plak of upload je config

    Plak de oude config links, de nieuwe rechts. Of klik Upload aan een van beide kanten om direct een .env-, .toml-, .ini-, .properties- of .conf-bestand te laden. De Sample-knop vult beide panelen met een klein .env-voorbeeld zodat je ziet hoe waardewijzigingen, nieuwe keys en verwijderde entries gerenderd worden voordat je je eigen plakt.

  2. 2

    Formatteren en normaliseren

    Klik Format op elk paneel om trailing whitespace te trimmen en consistente regeleinden toe te passen. Dit doodt de meest voorkomende klasse vals-positieven: twee bestanden die er identiek uitzien maar als compleet anders diffen omdat de een met CRLF en de ander met LF is opgeslagen. De diff focust op echte key- en waardewijzigingen zodra beide kanten het over de whitespace eens zijn.

  3. 3

    Lees de diff

    Verwijderingen verschijnen met een rode highlight links, toevoegingen met een groene highlight rechts. Scroll je een kant, dan volgt de andere. Comments en uitgecommentariëerde keys worden als gewone tekst gediffed, dus een key die je verwijderde door er # voor te zetten, verschijnt als de toegevoegde commentaarregel in plaats van als de verwijderde key.

Wanneer config-diff de juiste tool is

.env-bestanden diffen tussen lokaal en staging

Je start een feature branch lokaal, werkt prima, dan crasht het op staging omdat STRIPE_WEBHOOK_SECRET ontbreekt in de staging-.env. Plak het werkende lokale bestand tegen het staging-bestand en de ontbrekende key, de gewijzigde DATABASE_URL-host en de verouderde LOG_LEVEL=debug komen allemaal in één keer naar boven. Sneller dan beide bestanden regel voor regel doorlopen, en veel veiliger dan een script draaien dat beide variabelesets naar een terminal print.

pyproject.toml vergelijken na een dependency-upgrade

Poetry of uv heeft net je pyproject.toml herschreven na een poetry update. Diff de eerder gecommitte versie tegen de working tree om de feitelijke upgrades te bevestigen: fastapi ging van 0.110.0 naar 0.115.4, een nieuwe [tool.ruff.lint]-tabel verscheen, en de build-system.requires-pin verschoof. De TOML 1.0-spec is strikt genoeg om de diff doorgaans schoon en goed leesbaar te houden.

nginx.conf-wijzigingen reviewen voor het reload

nginx herladen met een kapotte config legt een productiesite sneller plat dan bijna iets anders op een server. Voor de nginx -s reload: plak de draaiende nginx.conf tegen de voorgestelde en bevestig dat de wijziging precies is wat je bedoelde: een nieuw upstream-blok, een bijgewerkt proxy_pass-target, een TLS-cipher-suite-wissel. De diff vangt de per ongeluk ontbrekende puntkomma elke keer.

Een systemd-unit of supervisord-config auditen

Een service herstart in een loop na een deploy. Diff de werkende foo.service tegen de nieuwe en je vindt de oorzaak meestal binnen dertig seconden: een gewijzigde ExecStart, een weggevallen Environment=-regel, een aangescherpte NoNewPrivileges. Zelfde werkstroom voor supervisord-.conf-blokken, runit-run-scripts en de diverse .ini-achtige init-configs die je nog op oudere machines ziet.

Infrastructure-as-code-config-bestanden vergelijken

Terraform-variabelen in terraform.tfvars, Pulumi-stack-configs, Ansible-group_vars, Helm-values voor Kubernetes ConfigMaps. Elke omgeving heeft zijn eigen kopie en de enige veilige manier om ze samen te voegen is diffen. Plak prod tegen staging en de drift springt eruit: een region in de een gepind op us-east-1 en in de ander op us-west-2, een instance-type dat iemand tijdens een incident omhoog zette en nooit terugzette, een IAM-role-ARN die op het verkeerde account wijst.

Controleren of een CI-environmentbestand klopt met de gedocumenteerde template

Een nieuwe engineer komt aan, kopieert de .env.example uit de repo, en de build faalt nog steeds bij haar eerste PR omdat de template uit de pas loopt met wat de CI-pipeline echt verwacht. Diff de gecommitte .env.example tegen een bekend-werkende .env van iemand wiens builds slagen en de ontbrekende keys verschijnen rood links of groen rechts. Zelfde truc werkt voor Taskfile-env-blokken, GitHub Actions env:-secties en direnv-.envrc-bestanden.

Snelle referentie config-formaten

Een korte spiekbrief over de formaten die deze tool het vaakst ziet. Configuratie is rommeliger dan haar reputatie suggereert, en de verschillen hieronder zijn waar de meeste diffs ontsporen.

TopicWhat this tool does
Formaat-dialectenINI (geen formele spec, dialecten per parser), TOML 1.0 (strikt, typed), .env (geen spec, parser-bepaald), .properties (Java, zie java.util.Properties), .conf (per applicatie: nginx, Apache, sshd_config verschillen allemaal).
CommentaartekensINI: ; of #. TOML: alleen #. .env: alleen #, en in de meeste loaders alleen aan het begin van de regel. .properties: # of !. nginx .conf: alleen #.
Section-headersINI en TOML gebruiken [section]. TOML voegt geneste tables toe via [a.b.c] en arrays of tables via [[a]]. .env en .properties zijn plat, zonder sections. nginx gebruikt { ... }-blokken in plaats van headers.
WaardetypesTOML heeft typed values: strings, ints, floats, bools, datums, arrays, tables. INI, .env en .properties zijn alleen string; de applicatie beslist hoe true of 42 geparseerd wordt.
Interpolatie en expansieDe meeste dotenv-loaders expanderen $VAR standaard niet. Sommige wel (dotenv-expand, direnv, shell-sourcing via source .env). TOML expandeert nooit. INI zelden; Pythons configparser ondersteunt ${section:key} als je het inschakelt.
Trailing whitespaceEen echte bron van bugs. FOO=bar met een trailing spatie zet FOO in de meeste loaders op "bar ", wat downstream string-gelijkheidschecks faalt. Altijd trimmen of quoten.
RegeleindenCRLF (Windows) vs LF (Unix). Twee identieke bestanden opgeslagen op verschillende OS'en diffen als elke-regel-veranderd. Gebruik de Format-knop of normaliseer regeleinden (dos2unix, git config core.autocrlf) voor het diffen.
Encoding en BOMTOML schrijft UTF-8 voor. .properties vereiste historisch ISO-8859-1 met \uXXXX-escapes, maar moderne Java accepteert UTF-8 via Properties.load(Reader). Een UTF-8 BOM aan het begin van een .env is een klassieke spookdiff-oorzaak; Notepad op Windows schrijft er standaard nog steeds een.

Config-diff: veelgestelde vragen

Begrijpt de tool waardetypes?

Nee. Het is een tekst-diff. TOML maakt onderscheid tussen strings, integers, floats, booleans, datums en arrays, maar de diff behandelt elke regel als platte tekst en laat zien welke tekens veranderd zijn. Dat is meestal voldoende omdat configuratie-wijzigingen sowieso tekenwijzigingen zijn. Heb je echt een typed compare nodig, parse dan beide bestanden in de taal van keuze (Pythons tomllib, Rusts toml-crate, Gos pelletier/go-toml) en vergelijk de resulterende maps. Voor het 95%-geval pakt de tekst-diff wat je moet pakken.

Hoe ga ik om met uitgecommentariëerde regels die "verschillen" maar gelijkwaardig zijn?

Meestal doe je dat niet, en je mag blij zijn dat de tool het signaleerde. Een regel die van API_KEY=abc naar #API_KEY=abc gaat is semantisch betekenisvol: de key is nu uitgeschakeld. De diff markeert de wijziging van het commentaar-prefix, en dat is precies wat een menselijke reviewer tijdens een config-review zou moeten zien. Wil je echt commentaar-ruis negeren, formatteer dan beide kanten om regels die alleen commentaar zijn weg te gooien voor het plakken, maar dat is zelden de juiste zet voor een security-relevant bestand.

Hoe zie ik of een key aan een kant ontbreekt?

Plak beide bestanden, draai de diff, en elke key die aan de ene kant aanwezig is en aan de andere ontbreekt verschijnt als een rode verwijdering of groene toevoeging van de hele regel. De diff probeert geen keys structureel uit te lijnen, dus een key die naar een andere positie is verplaatst, verschijnt eenmaal als verwijdering en eenmaal als toevoeging. Voor een volledig volgorde-onafhankelijke vergelijking sorteer je beide bestanden eerst op key (sort .env op Unix) en diff je daarna. De formaat-onafhankelijke aanpak vangt ontbrekende keys zonder parser.

Is het veilig om .env-bestanden met echte secrets te plakken?

Ja, je input verlaat de browser nooit. De diff draait volledig op de client. Geen server-upload, geen telemetrie over de inhoud van de panelen, geen analytics die vastleggen wat je typte. Dat is opzettelijk omdat .env-diffs een van de werkstromen met de hoogste vertrouwensvereiste op deze site zijn. Als je paranoïde bent (en dat zou je een beetje moeten zijn), open dan de browser-devtools en bevestig dat de network-tab leeg blijft terwijl je plakt. Voor organisaties die een volledig air-gapped tool willen: open de site eenmaal offline en de gecachte assets werken zonder verdere netwerktoegang.

Wat is het verschil tussen TOML en INI?

INI is een conventie; TOML is een specificatie. INI is op Windows opgegroeid, heeft geen formele grammatica, en elke parser handelt edge cases (quoting, escapes, lijstwaarden, geneste sections) net iets anders af. TOML 1.0 is een strikte, geversioneerde spec die door Cargo, Poetry, Hugo en steeds vaker door Python-packaging via pyproject.toml wordt gebruikt. Beide gebruiken [section]-headers en key = value-paren, dus ze lijken op het eerste gezicht op elkaar, maar TOML voegt typed values, datetime-literals en inline tables toe die klassieke INI-bestanden niet hebben.

Normaliseert de diff key-casing of whitespace?

Nee. API_KEY=abc en api_key=abc zijn voor de diff verschillende regels omdat het verschillende bytes zijn. De meeste loaders zijn ook hoofdlettergevoelig (dotenv, java.util.Properties, configparser standaard), dus dit komt overeen met de werkelijkheid. Whitespace rond de = blijft as-is, wat ertoe doet omdat een paar striktere parsers (met name sommige Bash-sourcing-patronen) FOO = bar met spaties weigeren en alleen FOO=bar accepteren. De Format-knop trimt trailing whitespace per regel, en dat is de enige normalisatiestap die hij toepast.

Privacy en hoe dit werkt

Je configuratiebestanden verlaten je browser nooit. De diff, de formatter en elke byte van je input blijven lokaal op je machine. Geen analytics op de inhoud van de panelen, geen logs, geen upload. Dat telt hier zwaarder dan bij de meeste diff-tools omdat .env-bestanden routinematig databasewachtwoorden, API-keys en OAuth-client-secrets bevatten, en ze in een tool plakken die ze via een server stuurt zou een echt security-incident zijn. Achtergrondleeswerk over de formaten: TOML 1.0, INI-bestanden en het Unix-concept van omgevingsvariabelen. Voor secrets die helemaal niet in een bestand thuishoren, kijk naar sops, HashiCorp Vault of AWS Parameter Store.