NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #3608 most downloaded on npm
a secure dotenv–from the creator of `dotenv`
Last release 3 days ago
01 Oct 2026
Ships fairly regularly
a new release about every 9 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
358 releases · first in 2023
see CHANGELOG
see CHANGELOG
.env.keys file is generated WITHOUT quotes going forward. This is to minimize friction around Docker gotchas to developers - old versions of Docker do not support --env-file containing quoted keys/values. (#480) (additional note)see CHANGELOG
see CHANGELOG
One column per month.
\t expansion when double quoted. (e.g. TAB="hi\tfriend" becomes hi friend) (#479)see CHANGELOG
see CHANGELOG
see CHANGELOG
main.parse method (#475)see CHANGELOG
see CHANGELOG
privateKey option to main.parse method (#474)see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
run --strict flag to exit with code 1 if any errors are encountered - like a missing .env file or decryption failure (#460)get --strict flag to exit with code 1 if any errors are encountered - like a missing .env file or decryption failure (#461)strict option to config() to throw for any errors (#459)MISSING_ENV_FILE and DECRYPTION_FAILED errors to stderr (prior was stdout as a warning) (#459)dotenvx.get() function from lib/main.js. (parse already historically exists for this purpose) (#461)see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
process.env (#450)see CHANGELOG
see CHANGELOG
cross-spawn to prevent potential ReDoS CVE-2024-21538 (#449)see CHANGELOG
see CHANGELOG
FOO=foo
FOO=${FOO}bar
# foobar
<img width="1608" alt="image" src="https://github.com/user-attachments/assets/fdd55a0a-9b36-4cb3-b0c6-6b019441aef4">
dotenvx.parse now maps to dotenvx's internal parser. (prior it was mapping to dotenv's)dotenvx.configDotenv(). use dotenvx.config() (#445)see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
-- separator and better error messaging when flags are ambiguous (#438)see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
--pattern argument to ext gitignore (dotenvx ext gitignore --pattern .env.keys) (#430)see CHANGELOG
see CHANGELOG
see CHANGELOG
🎓 now if you choose to single quote, double quote, no quote, or backtick your value it will be respected - including for encrypted values. this more intuitively handles complex cases like escaped characters, literals, and json.
see CHANGELOG
see CHANGELOG
see CHANGELOG
process.env.DOTENV_PRIVATE_KEY and/or process.env.DOTENV_PUBLIC_KEY on set (#401)process.env.DOTENV_PRIVATE_KEY and/or process.env.DOTENV_PUBLIC_KEY on encrypt (#411)process.env.DOTENV_PRIVATE_KEY on decrypt (#412)logger.help to use brighter blue (#414)main.decrypt,encrypt,set (#410)see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
SIGTERM or SIGINT sent, don't bubble wrapped process error (#402)see CHANGELOG
see CHANGELOG
encrypt and decrypt. example: dotenvx encrypt -ek "NEXT_PUBLIC_*" (#397)see CHANGELOG
see CHANGELOG
$1 or $2. (#396)see CHANGELOG
see CHANGELOG
set and encrypt preserve leading spaces (#395) HELLO=world
set, encrypt, and decrypt (#395)encrypt, then decrypt, then encrypt on a json value (#377)Note: the underlying replace engine to support these changes now wraps your values in single quotes. the prior replace engine wrapped in double quotes.
So where your .env used to look like this with double quotes:
HELLO="encrypted:1234"
API_KEY="encrypted:5678"
It will now begin looking like this with single quotes:
HELLO='encrypted:1234'
API_KEY='encrypted:5678'
It's an aesthetic side effect only. Your values will continue to be decrypted and encrypted correctly.
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
process.stdout.write for console.log to patch up npx edge case (#387)see CHANGELOG
see CHANGELOG
see CHANGELOG
dotenvx keypair command for printing your public/private keypairs (#375)see CHANGELOG
see CHANGELOG
decrypt fails in any way (#374)see CHANGELOG
see CHANGELOG
see CHANGELOG
logger and setLogLevel to lib/main.js - const = { logger, setLogLevel } = require('@dotenvx/dotenvx') (#368)see CHANGELOG
see CHANGELOG
see CHANGELOG
dotenvx get --format shell (#366)see CHANGELOG
see CHANGELOG
see CHANGELOG
tinyexec for execa - to support usage in bunsee CHANGELOG
see CHANGELOG
tinyexec and add postrelease-bunx check (#362)see CHANGELOG
see CHANGELOG
process.env.TERM for color depth where deno and bun do not support it (#360)see CHANGELOG
see CHANGELOG
.env* file on run/get (#359)see CHANGELOG
see CHANGELOG
export KEY variables and preserve #!shebangs (#357)see CHANGELOG
see CHANGELOG
--exclude-env-file (-ef) to ext ls (#356)ext precommit ignores tests/ directory (and similar) (#356)see CHANGELOG
see CHANGELOG
see CHANGELOG
see CHANGELOG
config to empty [] array so that DOTENV_KEY_${environment} looks up correctly (#352)see CHANGELOG
see CHANGELOG
dotenvx ext precommit hook (#350)see CHANGELOG
see CHANGELOG
dotenvx ext vault, replace with dotenvx-ext-vault (install there to continue using ext vault) (#351)see CHANGELOG
see CHANGELOG
see CHANGELOG
--exclude-key (-ek) option to dotenvx encrypt and dotenvx decrypt (#344)winston - logger simplified to use console.log going forward (#347)see CHANGELOG
see CHANGELOG
ansi colors over rgb - for wider terminal coverage (#340)chalk with picocolors and color-name - cutting down on 5 dependencies (#335)execa with tinyexec - cutting down on 15 dependencies (#328)Ls._filepaths (#317)see CHANGELOG
see CHANGELOG
see CHANGELOG
chomp for interpolation. strip ending newline (was stripping first found newline) (#322)see CHANGELOG
see CHANGELOG
see CHANGELOG
dotenvx pro to be dynamic if dotenvx-pro is installed user's machinesee CHANGELOG
Your coding agent can read these notes before it upgrades. Set up the MCP server →