MiniEnv vs
dotenvx

dotenvx encrypts the .env file itself so the ciphertext can be committed with your code, and it runs anywhere. MiniEnv keeps values out of the repository and gives every person their own key. The choice is really about one thing: whether taking somebody's access away should be a manual job.

FIGURES CHECKED 30 AUGUST 2026
MiniEnv compared with dotenvx
MiniEnvdotenvx
PriceFree to five people, then $29.99/mo flatFree and open source; Armor add-on from $5/mo
Where the ciphertext livesOur relay, which cannot decrypt itIn your git repository, by design
KeysOne key per person, in the macOS KeychainOne private key per environment, shared with whoever needs it
Runs onApp: macOS 12+, Apple Silicon. CLI: comes with the app, needs Node 20.19Anywhere Node runs, any language, any CI
When somebody leavesEvery value re-encrypted before the removal is acceptedRotate the private key and redistribute it yourself
Secrets that are not KEY=valueA vault of up to 100 entries per project, alongside the env varsEverything is a value in the .env file

dotenvx figures are from its own pricing page. The tool is free; the paid tiers are the Armor add-on, which is an audit and key management service rather than the encryption itself.

What MiniEnv does not do. The app runs on macOS 12 or later, on Apple Silicon. There is a CLI, which does the same encryption with the same Keychain identity and covers projects, members, teams, devices and the vault, but it is macOS only as well and it needs Node 20.19. So: no Windows, no Linux, no iOS, no Android, on either. Nothing injects secrets into a running service and nothing fetches values at boot. If any of that is a requirement, stop reading here: the tool on the other side of this page is the right one.

Two different answers to "where does the ciphertext go"

dotenvx writes a DOTENV_PUBLIC_KEY into your .env, encrypts each value to it, and the encrypted file is meant to be committed. Decryption needs DOTENV_PRIVATE_KEY, which stays out of the repository and is handed to teammates and to CI as an environment variable. The encryption is AES-256 with ephemeral keys over the secp256k1 curve.

MiniEnv encrypts to the public key of every current member, and the result goes to our relay, which holds no private key and has no decrypt-capable dependency. Nothing goes in your repository at all.

Committing ciphertext is a genuinely good property and we do not have it. A dotenvx repo carries its own history of encrypted values; ours does not, and if our relay is unreachable you are waiting for us.

The day somebody leaves

This is the whole comparison, so it is worth being precise rather than persuasive.

With dotenvx, the private key is one key, and everybody who can decrypt has a copy of it. Taking one person's access away therefore means generating a new key, re-encrypting, and getting the new key to everyone else and to CI. The dotenvx README does not document a procedure for it. That does not mean it is hard; it means it is yours to do, correctly, by hand, at the exact moment everybody is busy.

Remove somebody from a project and every value in it is re-encrypted, on the machine of whoever removed them, before the change is accepted. There is no window in which the removed person can still read a new value.

What that does not do, and what no tool can do, is reach backwards. Anything they already pulled, they still have. Rotate it at the source.

If your team is one person, none of this is a difference. A single private key you never share is a fine design, and dotenvx is a better fit for a solo project than we are.

The secrets that are not KEY=value

A service-account JSON, an Apple .p8, a PEM, an SSH deploy key, a page of recovery codes. Every team has a handful, and they are the ones that actually get mailed around, because they do not fit on one line.

dotenvx encrypts your .env, so everything it holds is a value in that file. MiniEnv keeps a vault beside the env vars: up to 100 entries per project, each up to 65,536 bytes encrypted, with a free-text label instead of a shouty variable name.

The part that is structural rather than cosmetic is that it is a separate collection, not a flag on an env var. A pull cannot write a vault entry into a .env, and a Vercel push cannot send one, because both iterate the other collection. There is no filter to forget.

Creating an entry is a Pro feature. Existing entries stay readable, editable and deletable on Free, which is the same rule everything else here follows: a downgrade takes away what you may do next, never what you have.

And the thing dotenvx has that we cannot match

It runs everywhere. Any language, any CI runner, any operating system, in a container, on a server. It recorded 11,451,662 npm downloads in a single week and shipped v2.22.0 on 27 August 2026, so it is busy and maintained.

MiniEnv has a CLI too, with the same encryption and the same Keychain identity, but it does not close this gap: it is macOS only, and it does not yet know about environment tabs, so a project the app has organised into several named tabs is not fully visible to it.

There is no runtime story either: nothing in a deployment fetches a value from us at boot. If your problem is "my container needs this secret", dotenvx solves it and we do not.

When to use dotenvx instead

Where these numbers came from

Every figure above, including ours. If one of them has gone stale, it is a bug on this page and worth telling us about.

The other comparisons