INI / .env Diff
Paste two .env or .ini config files and see exactly what changed — keys added, removed and changed, grouped with a count summary. Optional case-insensitive keys and secret masking. Runs entirely in your browser; nothing is uploaded.
About this tool
INI / .env Diff compares two configuration files — .env dotenv files or
.ini/.conf files — and reports exactly which settings changed between them,
so you never have to eyeball two configs side by side again.
Paste your first (left / old) file and your second (right / new) file. The tool parses both into key→value pairs and groups every difference into four buckets, relative to the left→right direction:
- Added — keys present only in the right file.
- Removed — keys present only in the left file.
- Changed — keys in both files whose value differs (shown
old -> new). - Unchanged — keys present in both with an identical value.
A one-line count summary sits at the top, e.g.:
Config diff (env) — 1 added, 1 removed, 1 changed, 1 unchanged
Added (1):
+ NEW_FLAG = on
Removed (1):
- DEBUG = true
Changed (1):
~ DB_HOST: localhost -> prod.internal
Unchanged (1):
DB_PORT
The parser handles real-world config syntax: KEY=VALUE and key = value /
key: value pairs, # and ; comments, blank lines, single- and double-quoted
values, inline comments, a leading export prefix, and [section] headers
(flattened to dotted section.key). Parse format is auto by default (it
switches to INI parsing if either file has a [section] header, otherwise
treats them as flat .env), or you can force env or ini.
Turn on Ignore key case to treat DB_HOST and db_host as the same key, or
Mask secret values to redact values of sensitive-looking keys (names
containing SECRET, TOKEN, PASSWORD, KEY, AUTH, …) so the diff can be
shared safely. Switch Output to json for a structured
{ format, summary, added, removed, changed, unchanged } object.
Everything runs locally in your browser via WebAssembly — your files are never uploaded.
Handy for
- Catching config drift between a
.env.exampleand a real.env, or between dev, staging and production. - Reviewing exactly which settings a deployment or PR changed.
- Producing a machine-readable diff for tests, audits or change logs.
FAQ
Which file is "old" and which is "new"?
The left file is the old/base one and the right file is the new/compared one. "Added" means a key that appears only on the right, and "removed" means a key that appears only on the left — so the diff always reads as left → right. Swap the two boxes to reverse the direction.
Does it work with .ini / .conf files that have [section] headers?
Yes. In auto mode, the moment either file contains a [section] header the tool switches to INI parsing and reports keys as dotted section.key (e.g. db.host). You can also force it with Parse format → INI. Flat .env files with no sections stay plain KEY names.
How are quotes, comments and `export ` handled?
Wrapping single or double quotes are stripped from values, full-line #/; comments and blank lines are ignored, an inline # … / ; … comment after an unquoted value is dropped, and a leading export prefix (as in export KEY=value) is removed before comparing. So export API_URL="http://x" # dev compares as just API_URL = http://x.
If a key appears twice in one file, which value is used?
The last occurrence wins, matching how shells and dotenv loaders read a file top-to-bottom. Only that final value takes part in the diff.
Are my files uploaded anywhere?
No. The entire diff runs in your browser via WebAssembly — nothing is sent to a server. That's also why Mask secret values is safe to rely on when you paste a real .env: the masking happens locally before anything is shown.
Developer & Automation Access
Run it from the terminal
Same engine as this page, headless — via the gizza CLI:
gizza tool ini-env-diff "# base
export DB_HOST=localhost
DB_PORT=5432
DEBUG=true
API_TOKEN=dev-token-123456" 'right=DB_HOST=prod.internal
DB_PORT=5432
NEW_FLAG=on
API_TOKEN=prod-token-987654'New to the CLI? Get gizza →
Open it by URL
Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:
https://gizza.ai/tools/ini-env-diff/?left=%23%20base%0Aexport%20DB_HOST%3Dlocalhost%0ADB_PORT%3D5432%0ADEBUG%3Dtrue%0AAPI_TOKEN%3Ddev-token-123456&right=DB_HOST%3Dprod.internal%0ADB_PORT%3D5432%0ANEW_FLAG%3Don%0AAPI_TOKEN%3Dprod-token-987654&format=auto&ignore_case=true&mask_secrets=true&output=reportMachine-readable descriptor: tool.json — title + parameters JSON Schema for agents.
