Zero-knowledge .env storage · $1.99/mo per workspace
Stop handing your secrets to vendors who can read them.
envstore is encrypted .env storage for teams that take "least privilege" literally. Your secrets get encrypted on your laptop with your key — and arrive on our servers as ciphertext we cannot open. End-to-end encryption with X25519 + ChaCha20-Poly1305. Open source. Comically cheap.
curl -fsSL https://envstore.xyz/install | shWhat you get
Boring crypto. Sharp pricing. Honest scope.
Zero-knowledge by design
Your .env files are encrypted on your laptop with age before they leave. The server stores ciphertext it physically can't open. We never see your secrets — neither does an intruder, a subpoena, or a future us.
Priced like a SaaS should be
$1.99 per workspace, per month. Flat. Invite everyone on your team — there is no per-seat charge. The pricing page will not change every time you hire someone.
Open source, AGPL v3
Read every line of the encryption, the CLI, the API. Run your own if you want — the code is the product. We don't get to claim "secure" without showing our work.
How it works
Three commands. Real encryption.
All cryptography happens on your machine via the CLI. The web dashboard shows metadata — projects, environments, member lists, timestamps. There is no decrypt button to click, because there is nothing on the server to decrypt.
- Step 1
Install the CLI
One command — see the hero above. The CLI is a single static binary you can audit, vendor, or check into CI. No Node, no Python, no surprises.
- Step 2
Push your .env
Run
envstore push .envand the CLI encrypts your file to every workspace member's public key, then uploads the ciphertext. Your secrets never hit a server that can read them. - Step 3
Pull on any machine
On a teammate's laptop, a fresh CI runner, your new MacBook — run
envstore pull. Their private key decrypts. Lose every copy of every member's key and the data is gone. We mean it.
The hard rule
Your private key never enters the browser. The server never receives it. If you lose every copy of your key, your data is gone — we don't have a backdoor for you, because we don't have a backdoor for anyone.
Just shipped
Built for monorepos.
One envstore.json at the root of your repo, every .env file in it — apps, services, workers, whatever shape your repo has. envstore init walks the tree, registers one project per file, and tags them with a shared group so the dashboard renders the monorepo as a single thing.
envstore.json
{
"workspace": "shinra",
"files": [
{ "path": "apps/web/.env.local", "project": "shinra-web", "environment": "development" },
{ "path": "apps/api/.env", "project": "shinra-api", "environment": "development" },
{ "path": "apps/worker/.env", "project": "shinra-worker", "environment": "development" }
]
}init detects, push moves everything
$ envstore init
Found 3 .env files. Group them as a monorepo? Y
Group name: shinra
shinra-web -> apps/web/.env.local
shinra-api -> apps/api/.env
shinra-worker -> apps/worker/.env
Wrote envstore.json (3 files).
$ envstore push # encrypts & uploads every file
$ envstore push apps/web # path-prefix filter
$ envstore sync # reconcile when files change
envstore initwalks the tree and proposes one project per .env file it finds- Apps stay as separate projects — apps/web is not an environment of apps/api
- Project groups cluster monorepo siblings together in the dashboard and CLI listings
pushandpullfilter by path prefix,--project, or--envenvstore syncreconciles envstore.json with the filesystem, with--dry-runand--prunemodesenvstore link <code>offers to register every .env file when joining an existing workspace
Also new
Wired into how your team actually deploys.
Monorepo support is the headline. The rest of this week's ship list is the operational glue around it — CI, audit, recovery.
Service tokens for CI
"envstore token create" generates an X25519 keypair on your runner — the private key never leaves the box. Tokens get their own public recipient, so every push encrypts to CI alongside humans.
GitHub Action
A composite action wraps "envstore pull" for workflows. Installs the pinned release binary, verifies it against the sha256 sidecar, and runs the pull with ENVSTORE_TOKEN + ENVSTORE_IDENTITY.
Audit log viewer
Every push and pull is recorded with timestamp, actor, and resource. Human members and CI tokens are attributed distinctly so the dashboard tells you at a glance which was which.
envstore rekey
Teammate joined or a token rotated? "envstore rekey" walks every (project, env) reachable from envstore.json and re-encrypts to the workspace's current recipient set.
Comparison
envstore vs. the other vaults
We are not the right tool for every job. We are the right tool when "the vendor can't see it" is a non-negotiable.
| envstore | Typical secrets SaaS | |
|---|---|---|
| Pricing | $1.99 / workspace | $5–21 / user / month |
| Team members | Unlimited | Per-seat |
| Monorepo support | One envstore.json — init walks every .env | One project per service, set up by hand |
| Server can decrypt your files | No. By construction. | Yes — "encrypted at rest" |
| Compromised API can silently widen who decrypts you | No — CLI prints the recipient set and prompts on later changes | Yes — server already had the key |
| Key custody | You hold the key | Vendor holds the key |
| Web dashboard can leak secrets | No — no decrypt path exists | XSS / session theft |
| Runtime integration | Writes a plain .env — your app reads it like always | "vendor run -- your-app" wrapper or SDK injection |
Pricing
One price. No per-seat fee. No "contact sales".
You pay per workspace, not per person. Bring your whole team. Bring your CI runners. Bring the intern. Every new workspace gets a 14-day free trial.
Per workspace
Flat fee — unlimited members. 14-day free trial, no card required.
Start 14-day free trial- Monorepo-aware — one config, every .env in the repo
- Unlimited projects & environments
- Unlimited members (no per-seat charge)
- Multi-recipient encryption — every member can decrypt
- Service tokens + GitHub Action for CI/CD
- Audit log of every push & pull
- 30-day soft-delete window
- Personal workspace at /me + as many team workspaces as you want
- Cancel anytime — see refund policy
Billed in USD via Paddle (merchant of record — applicable VAT/sales tax handled automatically). See our Terms and Refund Policy.
FAQ
The honest answers
- Wait — really, you can't read my secrets?
- Correct. The CLI encrypts your file with age (X25519 + ChaCha20-Poly1305) on your machine to every workspace member's public key. We store the resulting ciphertext on Cloudflare R2. We do not hold any private key. There is no decrypt endpoint, no admin override, no support backdoor. If we wanted to read your file we would need to compromise your laptop, not our server.
- What stops a compromised envstore from quietly adding its own key to your next push?
- Nothing server-side — which is exactly why the CLI does. The very first push from a workstation prints every recipient it’s about to encrypt to and caches that set under
~/.config/envstore/trust.json. That first contact is trust-on-first-use, so we rely on you actually reading the list (or comparing it to a teammate’s) — but after that, if our API ever returns a public key your CLI hasn’t seen before, your push flags the new entry and waits for you to confirm before encrypting. In CI the push fails outright unless you’ve passed--trust-new. The “compromised server silently adds a key to read future pushes” attack is real in every end-to-end-encrypted vault that takes the server’s recipient list on faith. envstore surfaces it. - What happens if I lose my key?
- Your data is gone. We tell you that loud and often. This is the tradeoff for a vendor that cannot read your secrets. We help you avoid it: the CLI prompts you to back up your identity on first run, supports multiple recipients per workspace, and re-encrypts on every push. A teammate or a second key on a yubikey gets you out of single-point-of-failure territory.
- How is this different from Doppler, Infisical, Vault, 1Password Secrets?
- Those products are good, but they all hold your keys. Their server has, at some layer, the capability to return plaintext — which means an internal compromise or a credential theft is a leak. envstore deliberately gives up that capability. The flip side: we cannot offer "click to reveal in the web UI" because there is nothing on the server to reveal. If you want a vault that can show you the value in a browser, those vendors are the right fit. If you want a vendor that cannot leak your secrets even when breached, you are in the right place.
- My repo has six services in it. Do I have to register them by hand?
- No.
envstore initwalks your tree, lists every .env file it finds, and registers all of them in one go. Each app becomes its own project (so secrets stay scoped) but they share a group, so the dashboard shows them as a single monorepo at a glance. After that,envstore pushwith no arguments encrypts and uploads every file;envstore push apps/webnarrows by path. When you add a new .env tomorrow,envstore syncpulls it into the config. - How do I get secrets into CI without burning a real user identity?
- Mint a workspace service token. The CLI generates the X25519 keypair on your laptop, registers the public part, and hands you the bearer token once. Pass
ENVSTORE_TOKENandENVSTORE_IDENTITYas secrets to your runner — or use the bundled GitHub Action, which installs the binary (sha256-verified) and runs the pull for you. Tokens can't mint other tokens or change ACL, so the blast radius of a leak is the workspace's current ciphertext, nothing more. - My team needs to share .env files for staging and production. Does this work?
- Yes — that is exactly the use case. Each workspace member registers their public key. Every push encrypts to all of them. Add a new member: the next push picks them up automatically. Remove a member: rotate by re-pushing. The CLI handles the bookkeeping; you handle the humans.
- What does the web dashboard do, then?
- Metadata only — projects, environments, member list, file names, sizes, timestamps, key fingerprints, audit log. You can manage your workspace and billing from the browser. You cannot decrypt anything from the browser. There is no "view file" button. We did not build one, and we are not going to.
- Why AGPL v3 and not MIT?
- Two reasons. First, AGPL lets us be open without giving away the ability to run the business — if a competitor hosts envstore as a service they have to share their changes back. Second, you can self-host today, with the same code we run. There is no proprietary "enterprise edition." If we ever get acquired and the new owner gets cute, you fork.
- Is this production-ready?
- envstore is early. The crypto primitives are not — they are age, an off-the-shelf, peer-reviewed format. The web app, billing, and CLI are new, and you should treat the service like any other early-stage product: keep a backup of your secrets in your password manager, watch the changelog, and tell us when something is wrong. We will earn the word "stable" by behaving like it.
Take back the keys.
$1.99 a month. 14-day free trial, no card required. Cancel and we keep your data readable for 30 days so you can pull it out.