TERRAFORM PLAN SECRET EXPOSURE CHECK · RUNS IN YOUR BROWSER

Did your Terraform plan just print a secret in plaintext?

Paste or load a Terraform structured plan (terraform show -json) and get a deterministic report of every attribute value that looks like a real secret -- an AWS access key, a PEM private key, a JWT, or a URL with embedded credentials -- which the provider schema did not mark sensitive.

Nothing is uploaded. The file you load is read in this browser and never leaves your device.

1. Load your plan

Prefer a CLI, or want this as a CI gate before you apply?

Same logic, zero dependencies, one file — run it right after you generate the plan, before anything applies:

terraform plan -out=tfplan && terraform show -json tfplan > plan.json
node cli.mjs check plan.json                    # human-readable, exit 1 if anything unmarked is found
node cli.mjs check plan.json --json

Get cli.mjs — Node 18+, nothing to install. It reads only the local file you name: no network call, ever.

What this checks — and what it cannot

Failure this is checked againstChecked here as

Sources and the exact scope: why a Terraform plan can print a secret even though the schema has a `sensitive` flag. Already run a general secret scanner like Gitleaks, or a broader policy scanner like Checkov? See how this checker differs from Gitleaks, this checker vs. Checkov, or this checker vs. reading the plan JSON by eye — the short version is they all catch different things. Config drifting from what a codebase actually reads is a related, separate failure — see Env Example Drift Check for `.env.example` rather than a Terraform plan. And the same plan file answers a second question this tool does not ask: Terraform Plan Blast Radius Check reports what the apply would destroy or replace — every replace on a database, disk, bucket or secret, with the attribute that forced it.

Common questions

Does this catch every possible secret leak in my Terraform plan?

No. It matches a fixed set of high-confidence secret shapes — AWS access keys, PEM private keys, JWTs, and URLs with embedded credentials — against every attribute value the provider schema did not already mark sensitive. It will not catch a secret in a shape it doesn't recognise, and it cannot see your provider's source to know whether a field should have been marked sensitive in the first place. Treat a clean report as one more gate passed, not a guarantee.

Is my plan uploaded anywhere?

No. The browser page parses a pasted or locally loaded file entirely in your own browser and never sends it anywhere. The CLI reads only a local file — no network call, ever.

What file does it need?

The structured plan JSON from terraform show -json, not the human-readable terraform plan output and not the line-by-line terraform plan -json stream. Run: terraform plan -out=tfplan && terraform show -json tfplan > plan.json

Why doesn't the report show the actual secret value?

Because the report itself is meant to be pasted into an issue, a Slack message, or a CI log — doing that with the real value would recreate the exact leak this tool exists to catch. It shows the first and last four characters and which pattern matched, enough to find and rotate the value without re-exposing it.