Your .env, everywhere.
On your terms.

Store your env vars in one place. Give each teammate, coding agent, and deployment the values you choose.

Free for one person. Unlimited agents and CI.

One place, not seven

The same values live in GitHub, AWS, Vercel, a .env on every laptop, and a settings file in Cursor. Put them in Envlet once. Everything else reads from it.

where your values live
  • GitHubActions secrets6 values
  • AWSSecrets Manager4 values
  • VercelEnvironment variables6 values
  • .env filesOne per laptop5 values
  • CursorSettings and MCP config3 values
  • 1PasswordShared vault notes2 values
  • SlackA DM from March1 value
Envlet0values in one placeteamagentsCIproduction

Migrate with one prompt

Add the Envlet MCP server to Claude Code, Cursor, or Codex and run the migrate prompt. The agent signs you in, creates the project, imports your .env files, and creates its own token with production withheld.

claude code / acme-backend
Move us to Envlet.
  1. working
claude mcp add --scope user envlet -- npx -y @envlet/cli mcp

Integrate before lunch

One token in your runtime. SDKs for the languages you already write, a CLI for everything else, and a plain REST API underneath.

import { inject } from "@envlet/sdk";

await inject();

const stripe = new Stripe(process.env.STRIPE_KEY);

Decide who gets what

Give a value to everyone, change it for one teammate, or keep it away from an agent. The variable name stays the same for all of them.

acme-backend / production / policy
Variablemayahumanclaudeagentcici job
DATABASE_URL••••••••shared••••••••shared••••••••shared
STRIPE_KEY••••••••shared-withheld••••••••override
API_URL••••••••shared••••••••override••••••••shared
DEPLOY_TOKEN••••••••shared-withheld••••••••shared
SENTRY_DSN••••••••shared••••••••shared••••••••shared

Give every agent its own token

Claude, Codex, and Cursor each get a token for one environment. Mark a value withheld and it is left out of that agent's environment.

acme-backend / staging / access
claudeagent, token for staging, expires in 6 days
  • DATABASE_URLshared
  • API_URLoverride
  • REDIS_URLshared
  • SENTRY_DSNshared
  • STRIPE_KEYwithheld
  • DEPLOY_TOKENwithheld
Resolves 4 of 62 withheld
codexagent, token for staging, expires in 12 days
  • DATABASE_URLshared
  • API_URLshared
  • REDIS_URLshared
  • SENTRY_DSNwithheld
  • STRIPE_KEYwithheld
  • DEPLOY_TOKENwithheld
Resolves 3 of 63 withheld
cursoragent, token for staging, expires in 3 days
  • DATABASE_URLoverride
  • API_URLshared
  • REDIS_URLshared
  • SENTRY_DSNshared
  • STRIPE_KEYwithheld
  • DEPLOY_TOKENwithheld
Resolves 4 of 62 withheld

Know who read what

Every read records who read, the project, environment, key names, and time. The values themselves are never in the log.

acme-backend / activity
WhoEnvironmentKeysSourceWhen
cici jobproductionread 6 keyssdknow
cursoragentdevelopmentread 4 keys2 withheldcli14s
codexagentstagingread 3 keys3 withheldcli31s
cici jobstagingread 8 keysci1m
claudeagentstagingread 4 keys2 withheldcli2m
mayahumandevelopmentread 6 keyscli4m

Encrypted one value at a time.

Nine rules cover how a value is stored, who can read it, and what the log keeps. Open any one to see how it works.

Encryption per value

Each value gets its own AES-256-GCM ciphertext.

One data key per project

Values in a project are encrypted under that project's own data key.

Context binding

A ciphertext only decrypts in its own project, environment, and variable name.

Key rotation

Rotate the root key without touching a single value.

Scoped tokens that expire

A token opens one project and one environment, then expires.

Tokens stored as digests

The raw token is shown once, when you create it.

Withheld values

Mark a value withheld for an agent and it is left out of that agent's environment.

Audit records name keys, not values

Every read records who read, the project, environment, key names, source, and time.

Encrypted local cache

The CLI keeps the last resolution encrypted on disk for five minutes.

Read the full security page

Stop pasting .env files.

One command. The right values for whoever runs it.

Frequently asked questions

What is Envlet?

Envlet keeps your project's env vars in one place. Your team, your coding agents, and CI all get the right values by running one command.

How is Envlet different from Doppler or Infisical?

Envlet is the smaller tool. It keeps shared env vars for people, coding agents, and CI, and for each variable it lets you decide who gets the value, who gets a different one, and who gets none. Install the CLI, sign in, and run your command.

How do agents and CI authenticate?

Create a token for each agent or CI job in the dashboard. A token works for one project and one environment, and it expires.

What does Envlet store?

Your values, stored encrypted. Tokens are stored only as digests, so the raw token is shown once when you create it.

How do I use it in a project?

Install the CLI with npm install -g @envlet/cli, then run envlet login and envlet init inside your project. From then on, start any command with envlet run -- your command.

What does the free plan include?

Free is everything for one person: unlimited projects, environments, resolves, and agent and CI identities. From the second human member it is $10 per member per month. Agents and CI never count as members.

Can I keep a value away from an agent?

Yes. Mark any variable as withheld for an agent and it never enters that agent's environment. You can also give an agent its own value for a variable.