Env File Editor — Free Online .env Editor, Linter, Secret Auditor & Converter

~/env-editor ☀ LIGHT apps ← about me
🔒 100% client-side · Your secrets NEVER leave this browser · No server · No logging · No storage
 ███████╗███╗   ██╗██╗   ██╗
 ██╔════╝████╗  ██║██║   ██║
 █████╗  ██╔██╗ ██║██║   ██║
 ██╔══╝  ██║╚██╗██║╚██╗ ██╔╝
 ███████╗██║ ╚████║ ╚████╔╝
 ╚══════╝╚═╝  ╚═══╝  ╚═══╝
Edit · validate · audit · convert .env files — 30 lint rules, 40+ secret detectors, 16 export formats
Secret & hygiene audit
Everything below is computed in this tab. Nothing is uploaded, and no value is ever sent anywhere.
◀ Environment A (e.g. .env.example)
▶ Environment B (e.g. .env.production)
Format
.env

.env files, from syntax to secrets — every question answered

Eighty-four questions on dotenv syntax and its traps, what each lint rule catches, how the secret audit decides something is a live credential, which export format your tool actually wants, and what to do the moment a real key turns up in a repository.

01. Using the editor

What does this tool do?

It is a full workbench for .env files: a syntax-highlighted editor with line numbers, a live validator, a secret audit, an editable table view, an environment diff and a converter that turns the same file into 16 other formats. Everything happens in your browser — there is no server involved at any point.

How do I get my file in?

Four ways: Load .env file opens a file picker (the file is read locally, never uploaded), Paste from clipboard reads your clipboard if the browser allows it, you can simply type or paste into the editor, or Import JSON / YAML converts an existing config object into .env lines.

What is the “Load messy sample” button?

It loads a deliberately broken example — a duplicate key, a space before the =, an unterminated line, a live-looking Stripe key, a placeholder JWT secret, TLS verification switched off and an unresolved ${VAR} — and jumps to the Audit tab. It is the fastest way to see what the linter and the audit actually catch.

What do the five tabs do?
  • Editor — highlighted text editing with a gutter that marks problem lines
  • Table — one row per variable, editable in place, with a filter box
  • Audit — secret detection, unsafe settings and a graded score
  • Compare — diff two environments and merge the gaps
  • Export — live preview of 16 output formats
Are the tabs kept in sync?

Yes, in both directions. Editing a cell in the Table tab rewrites the .env text, and editing the text updates the table, the stats, the lint list and the audit. The .env text is the single source of truth — comments, blank lines and quote style survive a round trip through the table.

What do the numbers in the sidebar mean?

Live counts of variables, comment lines, duplicate keys, empty values, flagged secrets (keys with a critical or high audit finding) and total lines. Underneath, the worst syntax issues are listed — click any of them to jump straight to that line in the editor.

Which keyboard shortcuts exist?

Ctrl/+F opens find and replace, Ctrl/+S downloads the current .env, Ctrl/+Shift+M toggles value masking, Tab inserts two spaces, and Esc closes the find bar or the import dialog.

What does “Mask values” do?

It replaces every value with dots in the editor, the table, the compare results and the status bar, while leaving the real text untouched underneath. It is meant for screen sharing, pair programming and screenshots. The Export tab has its own separate redact values checkbox for when you want to hand the file to someone.

Can I search and replace across keys only?

Yes. Open Find, turn on Keys only, and replace runs against key names rather than the whole file — the safe way to rename a prefix such as OLD_APP_ to NEW_APP_ without touching any values that happen to contain the same text. Aa toggles case sensitivity.

How do the clean-up tools work?
  • Sort keys A→Z — alphabetical, and each comment block stays attached to the variable it documents
  • Group by prefix — splits into # ── DB ── style sections based on the first word of each key
  • Trim & normalise — removes stray whitespace around keys and unquoted values
  • Remove duplicates — keeps the last occurrence, because that is the one that wins at load time
  • Fix quoting — adds quotes where a value needs them and removes them where it does not
  • UPPER_SNAKE keys — converts apiKey or api-key to API_KEY
What does “Generate secret” produce?

Three values from crypto.getRandomValues: a 256-bit hex string, the same 256 bits as base64, and a UUID. They are appended to the end of the file for you to rename and use. They are generated in your browser from the operating system's secure random source — not from a seeded pseudo-random generator, and not from a server.

Is my work saved if I reload?

No, deliberately. Nothing is written to localStorage, cookies or IndexedDB, because everything you paste here is by definition a secret. Reloading the page loses the content — export or copy before you leave.

Does it work offline?

Yes, once the page has loaded. The parser, the linter, the secret patterns and every export format are part of the page. You can disconnect and keep working, which is a reasonable habit when handling production credentials.

Is there a size limit?

No hard limit. Above roughly 3,000 lines the syntax highlighting switches off automatically to keep typing responsive; everything else — linting, auditing, exports — keeps working normally.

02. .env syntax, quoting and the classic gotchas

What is a .env file?

A plain text file of KEY=VALUE lines that holds configuration outside your source code — database URLs, API keys, feature flags, ports. Loaders such as Node's dotenv, Python's python-dotenv, Ruby's dotenv, Laravel, Docker Compose and Vite read it at startup and put the values into the process environment.

Is there an official .env specification?

No, and that is the root of most confusion. Every loader implements its own dialect. They agree on KEY=VALUE, # comments and quoting, and disagree about interpolation, multi-line values, escape sequences and whitespace. This editor follows the common denominator and warns wherever a line would behave differently depending on the parser.

Do I need quotes around values?

Only when the value contains something ambiguous: a leading or trailing space, a #, a quote character or a line break. Everything else is fine unquoted. Fix quoting applies exactly that rule across the file.

What is the difference between single and double quotes?

In most loaders, double quotes expand escape sequences"line1\nline2" becomes two lines — and often expand ${VAR} references too. Single quotes are literal: 'a\nb' stays as backslash-n. The editor decodes \n, \t, \r, \\ and \" inside double quotes and leaves single-quoted values alone.

Can a value span several lines?

Yes, if it is quoted — which is how people paste RSA private keys and certificates. The parser here follows the value across lines until the closing quote, keeps it as one variable, and marks the continuation lines in the gutter. If the closing quote is missing you get an unterminated quote error, because a real loader would swallow the rest of your file into that one value.

Why does my value get cut off at the #?

Because an unquoted # preceded by whitespace starts an inline comment. PASSWORD=abc#123 keeps the hash (no space in front), but PASSWORD=abc #123 gives you abc. Quote the value and the problem disappears.

Are spaces around the = allowed?

Shell syntax says no, and several loaders agree. KEY = value can end up with a key literally named "KEY " and a value of " value". The linter flags both sides separately, and Trim & normalise fixes them.

Does export KEY=value work?

Yes — the prefix exists so the file can also be sourced by a shell. The parser recognises and preserves it, colours it separately, and drops it in formats where it makes no sense, such as JSON or a Kubernetes manifest.

What characters can a key contain?

To be safe: a letter or underscore first, then letters, digits and underscores — the POSIX identifier rule. Anything else may load in Node but will break export, shell interpolation and several parsers. The linter warns on invalid identifiers and, more gently, on lower-case keys, since the universal convention is UPPER_SNAKE_CASE.

What does ${VAR} do inside a .env file?

Some loaders substitute another variable's value there. Support is inconsistent: dotenv alone does not expand, dotenv-expand, Docker Compose and Laravel do. This tool shows the resolved value under the field in the Table tab, warns when a reference points at a key that does not exist, catches self-references, and can bake the references into literal values with Resolve ${VAR} refs.

Does ${VAR:-default} work?

The editor understands the shell-style default syntax — ${PORT:-3000} resolves to 3000 when PORT is absent, and the missing key is not reported as an error. Whether your loader supports it is another matter; Docker Compose does, plain dotenv does not.

What happens if the same key appears twice?

Practically every loader keeps the last occurrence, so the earlier line is dead config that still looks alive during code review. Duplicates are counted in the sidebar, marked red in the table, listed with all their line numbers, and Remove duplicates deletes the earlier ones.

Why does my first variable read as undefined?

Nine times out of ten it is a UTF-8 BOM at the start of the file — usually added by a Windows editor. The first key becomes \uFEFFDATABASE_URL, which no lookup will match. The linter detects a BOM and strips it when you paste the file in.

Why do my values have a stray character at the end in Docker?

CRLF line endings. A file saved on Windows and mounted into a Linux container leaves \r at the end of every value, so PORT becomes "3000\r" and the port parse fails. The linter reports CRLF endings, and anything you export from here is written with plain LF.

Can a .env file contain arrays or nested objects?

No — the format is flat strings only. The usual workaround is a delimiter (ALLOWED_HOSTS=a.com,b.com) or embedded JSON in a quoted value. When you import a nested JSON or YAML config here, the keys are flattened with underscores: {"db":{"host":"x"}} becomes DB_HOST=x.

Are values always strings?

Always. DEBUG=false arrives in your code as the string "false", which is truthy in JavaScript and Python alike — a bug that has shipped to production more times than anyone will admit. Parse and validate explicitly, or use a schema library such as zod or envalid.

Should I commit my .env file?

No. Add it to .gitignore and commit .env.example instead — same keys, no values — so a new developer knows what to fill in. The Export tab generates that file for you, keeping your comments and section headers intact.

03. Validation and lint rules

What does the validator check?

Around thirty rules across three severities. Errors: duplicate keys, invalid lines, unterminated quotes. Warnings: spaces around the =, invalid identifiers, unquoted values containing spaces, text after a closing quote, unresolved ${VAR} references, self-references, a UTF-8 BOM. Notes: lower-case keys, empty values, very long values or key names, CRLF line endings, unquoted $ or backticks.

How do I jump to a problem line?

Click the issue in the sidebar. The editor scrolls to that line and selects it. Problem lines are also marked in the gutter — red for errors and any critical or high audit finding, yellow for warnings.

Why is an empty value only a note and not an error?

Because it is often intentional — OPTIONAL_FEATURE_URL= is a legitimate way to say “not configured”. It is worth seeing at a glance, though, because an empty value and a missing key behave differently: the first gives your code an empty string, the second gives undefined.

What is an “invalid line”?

A non-empty, non-comment line with no =, or one that starts with =. Most loaders skip these silently, so a typo like DATABASE_URL postgres://… simply produces no variable at all and you find out at runtime.

Why warn about unquoted values with spaces?

Because behaviour diverges. Some parsers keep the whole rest of the line, some stop at the first space, and a shell sourcing the file will try to run the second word as a command. Quoting removes the ambiguity entirely.

What counts as an unresolved reference?

A ${VAR} or $VAR pointing at a key that is not defined anywhere in the same file and has no :-default. It may still resolve at runtime from the real environment, so it is a warning rather than an error — but it is the most common cause of a value that comes out as the literal text ${DB_HOST}.

Does it check whether values are valid?

It checks the shape of the file, not the meaning of your configuration — it cannot know that your database URL points at a database that exists. What it does check is that a value looks like what its key claims: a credential-shaped value, a plausible URL scheme, a plain http:// where TLS was expected.

Can it fix problems automatically?

The mechanical ones, yes: remove duplicates, trim whitespace, fix quoting, uppercase key names, resolve references, sort or group. Anything that requires a decision — which of two duplicate values is right, whether a secret should be rotated — is reported and left to you.

What is the difference between the linter and the audit?

The linter is about syntax and hygiene: will this file load correctly. The audit is about security: is there a live credential in it, is a secret a placeholder, is a protection switched off. A file can be perfectly valid and still fail the audit badly.

04. The secret audit

What does the Audit tab actually do?

It runs every value against more than forty provider token formats, a placeholder-secret list, an entropy calculation and a set of configuration rules, then grades what it finds from critical to low and turns that into a score out of 100 with a letter grade. All of it in your browser — no value is ever sent anywhere, and the values are not even included in the report you copy.

Which credential formats does it recognise?

AWS access keys, GitHub tokens (ghp_, gho_, github_pat_), GitLab PATs, Slack tokens and webhooks, Stripe live and test keys, OpenAI and Anthropic keys, Google API keys and OAuth client secrets, SendGrid, Twilio SIDs and API keys, Mailgun, npm, PyPI, DigitalOcean, Shopify, Square, Discord, Telegram, Hugging Face, Cloudinary, Algolia, Datadog, Azure storage keys and SAS tokens, Sentry DSNs, JSON Web Tokens, SSH keys, PEM private key blocks, and credentials embedded in a connection URL.

Why does it distinguish Stripe live from test keys?

Because the consequences are completely different. sk_test_… in a repository is untidy; sk_live_… is a payment incident. The same logic runs throughout: a Twilio account SID is medium, a Twilio API key is critical.

What is a “placeholder secret”?

A value like changeme, secret, password, admin or abc123 sitting in a key named *_SECRET, *_TOKEN or *_PASSWORD. It is flagged high because these survive from the first day of a project into staging and sometimes into production, where they are effectively public knowledge.

What does the entropy check do?

It measures the Shannon entropy of a value in bits per character. A secret-named key holding a 16-character value with under 2.6 bits per character is repetitive or dictionary-like rather than random, and is flagged. The reverse check also runs: a very high-entropy random string in a key that is not named like a secret is flagged low, because keys named CLIENT_CONFIG sometimes hold real credentials.

Why is it warning about a value I know is fine?

Detection is by shape, so a 32-character hex build hash can look exactly like an API key. Findings are signals to check, not verdicts — that is why every finding names the rule that produced it and links to the line. A short low-entropy value in a key called APP_SECRET deserves the flag even if you know the app is a toy.

What configuration problems does it detect?
  • NODE_TLS_REJECT_UNAUTHORIZED=0 — turns off certificate validation for the whole Node process
  • Debug or verbose mode enabled while the environment is production
  • Any *VERIFY*, *SSL*, *CSRF* or *SECURE* key set to false
  • DISABLE_*, SKIP_* or UNSAFE_* flags switched on
  • Wildcard * in a CORS, origin, allowed-hosts or whitelist key
  • Plain http:// endpoints that are not localhost
  • Default database passwords such as postgres, root or admin
  • The same secret value reused across several keys
How is the score calculated?

It starts at 100 and subtracts a weight per finding — 34 for critical, 16 for high, 7 for medium, 2 for low — with the result mapped to a letter: A from 90, B from 75, C from 55, D from 35, F below that. It is a rough prioritisation aid, not a compliance measure: a single critical finding drops you to a D on purpose.

Can I share the audit result?

Copy report puts a Markdown table on your clipboard with the severity, key name, line number and finding for each issue. Values are never included, so the report is safe to paste into a ticket or a pull request.

Does a clean audit mean my secrets are safe?

No. It means nothing in this file matched a known pattern or an unsafe setting. It cannot tell you whether the file is in .gitignore, whether it was committed six months ago, whether the same key is pasted in a Slack thread, or whether the token has the right scopes. Those checks are on you.

I found a real key in my file. What now?

Rotate it first, before cleaning anything up — a key that has been exposed stays exposed, and deleting the line does not un-expose it. Then check git history with git log --all --full-history -- .env; if it appears there, rewriting history is not enough on its own either. Rotate, then clean.

Does it detect secrets in comments?

Not currently — the audit looks at values. It is worth remembering that a commented-out #OLD_API_KEY=… line is exactly as exposed as an active one, since the file is still a file.

05. Converting and exporting

Which formats can I export to?

Sixteen: .env, .env.example, JSON, YAML, Docker Compose, Dockerfile ENV, Kubernetes ConfigMap, Kubernetes Secret, a sourceable shell script, PowerShell, a systemd EnvironmentFile, a GitHub Actions env: block, gh secret set commands, Terraform tfvars, CSV, and a TypeScript env.d.ts.

How does the Export tab work?

Pick a format on the left and the preview on the right updates immediately from whatever is in the editor. Copy puts it on your clipboard, Download saves it with a sensible filename and extension. Switching format never re-reads or changes your source file.

What is the redact checkbox for?

It replaces every value with ******** in the exported output while keeping keys, comments and structure intact. Use it when you need to show someone the shape of your configuration — in a ticket, a document or a code review — without handing over the contents.

How is .env.example generated?

Every key is kept with an empty value, and all comments, section headers and blank lines are preserved exactly. That gives you a committable template that documents which variables the project needs, in the order and grouping you already use.

Does the Kubernetes Secret export encrypt anything?

No, and it says so in the output. A Kubernetes Secret stores base64, which is an encoding, not encryption — anyone who can read the manifest can decode it with one command. The export gives you both the readable stringData form and the base64 data form; for real protection you still need encryption at rest, RBAC, or a tool like Sealed Secrets or an external secret store.

What does the GitHub Actions export produce?

Two blocks. The first maps each key to ${{ secrets.KEY }}, which is what you actually want in a workflow. The second contains the literal values, for the non-sensitive variables where that is appropriate. There is also a separate gh secret set format that pushes every variable to your repository secrets in one script.

Why would I want a TypeScript env.d.ts?

Because it turns a missing environment variable into a compile error instead of a runtime crash. The generated declaration extends NodeJS.ProcessEnv with your keys, so your editor autocompletes them and TypeScript objects when you reference a variable that does not exist.

What is the difference between the shell and systemd exports?

The shell script uses export KEY='value' with single quotes escaped properly, so you can source env.sh in any POSIX shell. The systemd EnvironmentFile format has no export, no inline comments and its own quoting rules — systemd will not parse a shell script, which is a surprisingly common cause of a service that starts with empty configuration.

How does JSON export handle types?

Everything is exported as a string, because that is what an environment variable is. PORT=3000 becomes "3000", not 3000. If you need real types, convert them in your application where the schema lives.

Can I import from JSON or YAML?

Yes — Import JSON / YAML takes a pasted object and converts it into .env lines. Nested JSON is flattened with underscores and upper-cased, so {"redis":{"host":"x"}} becomes REDIS_HOST=x. You can either replace the whole file or merge, which updates the keys that already exist and appends the new ones at the end.

Does exporting change my file?

No. The editor content is the source of truth and exports are generated from it on the fly. The only buttons that rewrite your file are the clean-up tools in the sidebar, and each one tells you exactly what it changed.

06. Comparing environments

What does the Compare tab do?

It diffs two .env files by key: what is missing from B, what only exists in B, which shared keys have different values, and how many are identical. It is the fastest way to answer “why does this work locally and not in staging”.

How do I compare my current file against another?

Use Editor into A or Editor into B to pull the file you are working on into either side, then paste the other one opposite it. Swap flips the two panes when you realise you have them the wrong way round.

Can I check my .env against .env.example?

That is the most useful case. Put .env.example in A and your real .env in B: everything listed as missing from B is a variable the project documents but your environment does not set. Turn off compare values so you only see the key-level differences.

What do the merge buttons do?

Add these to B appends the keys that only exist in A to the B pane (with their values), and vice versa. It is meant for filling the gaps in a new environment file without copying lines by hand. It only touches the compare panes — your editor content is left alone.

What is the “ignore key case” option?

It compares Database_Url and DATABASE_URL as the same key. Useful when two environments were maintained by different people with different habits, and you want the real differences rather than the casing noise.

Can I export the comparison?

Copy diff as Markdown produces a summary and lists of key names for each category, ready to paste into a pull request or a deployment checklist. Only key names are included — no values ever leave the tab.

Does compare respect masking?

Yes. With masking on, the diff shows which keys differ without showing what the values are — the right mode for going through an environment mismatch with someone else on a call.

Can I compare more than two files?

Not in one pass. The practical approach is to use .env.example as the fixed reference in pane A and check each environment against it in turn — that catches drift better than comparing environments against each other anyway.

07. Privacy, security and good practice

Is it safe to paste production secrets here?

The tool is built so that it is: there is no back end, no upload, no analytics on your content, and nothing is written to browser storage. Your file is parsed by JavaScript already in the page and rendered back to the screen. You can verify it — open the network tab and it stays empty while you edit. If your policy forbids pasting production credentials into any web page, that policy still applies, and you can load the page once and work with the network disconnected.

Does the page store anything?

No localStorage, no cookies, no IndexedDB for your content. That is a deliberate trade-off: it means a reload loses your work, and it also means nothing is left behind on a shared machine.

What about the analytics on the site?

The site uses privacy-first page-view analytics with no cookies and no personal data. It records that the page was viewed. It has no access to what you type — that never leaves the JavaScript running in your tab.

Where should secrets actually live?

A local .env is fine for development. For anything shared or deployed, use the platform's secret store — AWS Secrets Manager or Parameter Store, Google Secret Manager, Azure Key Vault, HashiCorp Vault, Doppler, Infisical, or your CI provider's encrypted secrets. The advantages are audit logs, rotation and access control, none of which a file on disk can give you.

How do I share a .env file with a teammate?

Not over Slack or email — both keep searchable copies forever. Use a shared secret manager, an end-to-end encrypted one-time link, or age/gpg to encrypt the file before sending it. If you only need to show the structure, export with redact values on, or send the .env.example.

I accidentally committed my .env. What do I do?

In this order: rotate every credential in it, then remove the file from history with git filter-repo or BFG, then force-push and tell anyone with a clone to re-clone. Rotation comes first because the moment a secret hits a remote — especially a public one — assume it has been scraped. Bots scan new GitHub commits for token patterns within seconds.

How do I stop it happening again?
  • Add .env and .env.* (except .env.example) to .gitignore on day one
  • Add a pre-commit hook — gitleaks, git-secrets or trufflehog
  • Turn on your host's secret scanning and push protection
  • Commit .env.example so nobody is tempted to commit the real thing “just to share the keys”
Should different environments have different secrets?

Always. Sharing one API key between development, staging and production means a laptop compromise is a production compromise, and it makes rotation an all-or-nothing event. The reused secret finding in the audit exists for the same reason at the file level.

How often should secrets be rotated?

The honest answer is: whenever exposure is plausible, and on a schedule you can actually keep. Immediately after any suspected leak, when someone with access leaves, and periodically for high-value credentials. A rotation process that is used quarterly beats a monthly policy that nobody follows.

Is base64 a way to protect a value?

No. Base64 is an encoding — echo … | base64 -d reverses it in a second. It appears in Kubernetes Secrets and Docker configs for transport reasons, never for secrecy. The Kubernetes export in this tool says so directly in the generated file.

Can this replace a secrets manager?

No, and it is not trying to. It is an editor, a linter and a converter for the files you already have. A secrets manager gives you storage, access control, rotation and audit trails. This tool helps you get the file right before it goes into one.

Is it free? Is there a catch?

Free, no account, no limits, no telemetry on your content. It is one of a set of client-side browser tools at jasperbernaers.com/apps — no server means no running cost, and no server also means nothing that could leak.

Which browsers are supported?

Any current version of Chrome, Edge, Firefox, Safari, Brave, Opera or Vivaldi, on desktop or mobile. There are no external libraries or frameworks — the page is self-contained, which is why it also keeps working offline.

Free online .env file editor, validator and secret auditor

Create, edit, lint, audit and convert .env (dotenv) files directly in your browser. Paste a file and you immediately get syntax highlighting with line numbers, a live validator covering 30 rules, a secret audit that recognises more than 40 provider token formats, an editable table view, an environment diff, and one-click conversion into 16 formats — from docker-compose and Kubernetes manifests to a typed env.d.ts.

Everything runs 100% client-side. There is no back end, no upload, no account, and nothing is written to local storage — close the tab and the content is gone. You can verify it yourself: open the network tab and watch it stay empty while you work.

Real .env parser

Handles export prefixes, single and double quotes, multi-line values, escape sequences and inline comments — not just a naive split on “=”.

30 lint rules

Duplicate keys, unterminated quotes, spaces around “=”, invalid identifiers, empty values, BOM and CRLF, unresolved ${VAR} references.

Secret audit

AWS, GitHub, Stripe, OpenAI, Slack, Google, Twilio, SendGrid, private keys, JWTs, credentials inside URLs — plus placeholder and low-entropy secrets.

Unsafe config detection

NODE_TLS_REJECT_UNAUTHORIZED=0, debug mode in production, wildcard CORS, disabled certificate checks, default database passwords.

16 export formats

.env, .env.example, JSON, YAML, Docker Compose, Dockerfile, K8s ConfigMap and Secret, shell, PowerShell, systemd, GitHub Actions, gh CLI, tfvars, CSV, env.d.ts.

Environment diff

Compare two files, see what is missing, added or different, and merge the gaps across with one click. Copy the result as Markdown — keys only, no values.

Why a .env file needs linting at all

The dotenv format looks trivial and is full of traps. A duplicate key silently wins over the earlier one. A space before the = becomes part of the key name in strict parsers. An unquoted value with a # in it is truncated into a comment. A file saved with a BOM turns the first key into DATABASE_URL, which then reads as undefined at runtime. A CRLF file mounted into a Linux container leaves a stray carriage return at the end of every value — the kind of bug that costs an afternoon. Every one of those is caught here the moment you paste the file, with a clickable line number.

What the audit looks for

Findings are graded from critical to low and rolled into a score, and the report can be copied as Markdown for a ticket or a pull request — with the key names but never the values.

Convert .env to anything

The same file becomes a docker-compose environment block, a Dockerfile with ENV instructions, a Kubernetes ConfigMap or Secret (both stringData and base64 data), a sourceable shell script, PowerShell assignments, a systemd EnvironmentFile, a GitHub Actions env: block, a set of gh secret set commands, Terraform tfvars, CSV, JSON, YAML, a committable .env.example, or a TypeScript env.d.ts that turns a missing variable into a compile error instead of a 3 a.m. incident.

Your secrets stay in the tab

Pasting production credentials into a random website is normally a bad idea, so it is worth being precise about what happens here: the file is parsed by JavaScript already loaded in the page, held in a variable, and rendered back to the screen. It is never sent anywhere, never written to localStorage, and never included in the audit report you copy. The one thing this tool cannot protect you from is a secret that has already been committed — if git log --all -- .env returns anything, rotation is the only real fix.