.ENV.EXAMPLE DRIFT CHECK · RUNS IN YOUR BROWSER

Does your .env.example still match what the code actually reads?

Paste your .env.example and your source code and see every environment variable the code reads (process.env, os.getenv/os.environ, ENV[], System.getenv) that the example file never mentions — the failure a new contributor hits the moment they run cp .env.example .env and start the app — plus every variable the example file declares that nothing reads anymore.

Nothing is uploaded. Both text boxes are parsed in this browser and never leave your device. This is a name diff, not a secrets scanner: it never reads or shows a value, only variable names.

1. Paste your files

Prefer a CLI, or want this as a CI gate?

Same logic, zero dependencies, one file — and it can walk a whole source tree in one pass, skipping node_modules, .git, and similar:

node cli.mjs check --example .env.example src               # one directory, human-readable
node cli.mjs check --example .env.example . --json             # whole tree, machine-readable
node cli.mjs check --example .env.example src app.py           # a mix of directories and files
node cli.mjs check --example .env.example src --strict          # also fail on unused declared vars

Get cli.mjs — Node 18+, nothing to install. It reads only the local files/directories you name: no network call, ever. Exits 1 if any variable is read in code but missing from the example file, so it works as a PR gate on the same review that adds the read.

What's scanned, per language

LanguagePatterns matched

Matched line by line, name only — the tool never reads or reports a value on either side. Shell scripts, YAML, and Docker Compose files are not scanned in v0; paste the application source that actually reads the variable instead.

More: why example files drift from the code that reads them, and where to wire this into CI. Already running dotenv-linter on your .env files? See how the two compare -- they check different things and compose. Already grep for process.env by hand? See what a quick grep misses.

Common questions

Why does a missing .env.example variable matter so much?

It is usually the very first command a new contributor or a CI runner executes after cloning: copy the example file to .env, then start the app. A variable the code reads but the example file never mentions means that first run crashes immediately, and it reads as "this project is broken" rather than as what it actually is, a doc that fell one pull request behind.

Why would the example file and the code ever disagree?

A pull request adds a new process.env.FOO read (a new API key, a new feature flag) and nobody remembers to add FOO to .env.example in the same review. Nothing mechanical keeps the two in sync unless something checks -- the same reason lockfiles and changelogs drift, just with a sharper, more immediate failure the moment someone new clones the repo.

Is this a secrets scanner?

No. It never reads or reports a value on either side, only variable names -- whether a name is declared in the example file and whether that same name is read anywhere in the scanned code. It cannot see, and does not want to see, what a real .env file (which this tool never asks for) actually contains.

Is my code uploaded anywhere?

No. The browser page parses the text you paste entirely in your own browser and never sends it anywhere. The CLI reads only local files -- no network call, ever.