# Environment variables (/docs/compute/environment-variables) > For the complete Prisma documentation index, see [llms.txt](https://www.prisma.io/docs/llms.txt). A markdown version of any docs page is available by appending `.md` to its URL. Project configuration that gets injected into your deployments, scoped to production, preview, or a single branch. Location: Compute > Environment variables Environment variables are project configuration that gets injected into your deployments. You scope each one to production, to preview, or to a single preview branch. This is also how you connect your app to a database: set its connection string as a variable like `DATABASE_URL`. ## How it works [#how-it-works] There are three layers: 1. **Production variables**: used by production deploys. 2. **Preview variables**: used by every preview deploy. 3. **Branch overrides**: replace a preview value for one specific branch. A preview deploy gets the preview variables, with any branch overrides layered on top. Overrides help when one branch needs a different API key, database URL, or feature flag than the rest. Values are resolved at deploy time and baked into the deployment. Changing a variable doesn't touch deployments that already exist and doesn't trigger a redeploy. The new value applies the next time you deploy. ## Set a variable [#set-a-variable] Pass `KEY=value` and a role or branch: #### bun ```bash bunx prisma project env add DATABASE_URL=postgresql://example --role production bunx prisma project env add DATABASE_URL=postgresql://preview --role preview bunx prisma project env add FEATURE_FLAG=enabled --branch feature/search ``` #### pnpm ```bash pnpm prisma project env add DATABASE_URL=postgresql://example --role production pnpm prisma project env add DATABASE_URL=postgresql://preview --role preview pnpm prisma project env add FEATURE_FLAG=enabled --branch feature/search ``` #### yarn ```bash yarn prisma project env add DATABASE_URL=postgresql://example --role production yarn prisma project env add DATABASE_URL=postgresql://preview --role preview yarn prisma project env add FEATURE_FLAG=enabled --branch feature/search ``` #### npm ```bash npx prisma project env add DATABASE_URL=postgresql://example --role production npx prisma project env add DATABASE_URL=postgresql://preview --role preview npx prisma project env add FEATURE_FLAG=enabled --branch feature/search ``` To keep a secret out of your shell history, pass just the key and let the CLI read it from your environment: ```bash DATABASE_URL=postgresql://example npx prisma project env add DATABASE_URL --role production ``` To import many variables at once, pass a dotenv file with `--file` instead of a `KEY=value` argument (one or the other, not both). It works for `add` and `update`: #### bun ```bash bunx prisma project env add --file .env.production --role production ``` #### pnpm ```bash pnpm prisma project env add --file .env.production --role production ``` #### yarn ```bash yarn prisma project env add --file .env.production --role production ``` #### npm ```bash npx prisma project env add --file .env.production --role production ``` ## Connect a database [#connect-a-database] To give your app a database, set its connection string per scope, then redeploy. Use a different database per scope if you want preview deployments isolated from production data. > [!NOTE] > Don't assume production data is copied into preview branches, and don't assume migrations run automatically on deploy. Run migrations yourself against the right database. ## List, update, remove [#list-update-remove] #### bun ```bash bunx prisma project env list --role production bunx prisma project env list --branch feature/search bunx prisma project env update DATABASE_URL=postgresql://new --role production bunx prisma project env delete DATABASE_URL --role preview ``` #### pnpm ```bash pnpm prisma project env list --role production pnpm prisma project env list --branch feature/search pnpm prisma project env update DATABASE_URL=postgresql://new --role production pnpm prisma project env delete DATABASE_URL --role preview ``` #### yarn ```bash yarn prisma project env list --role production yarn prisma project env list --branch feature/search yarn prisma project env update DATABASE_URL=postgresql://new --role production yarn prisma project env delete DATABASE_URL --role preview ``` #### npm ```bash npx prisma project env list --role production npx prisma project env list --branch feature/search npx prisma project env update DATABASE_URL=postgresql://new --role production npx prisma project env delete DATABASE_URL --role preview ``` `list --role` shows names and metadata, never values. `list --branch` shows the variables a deploy of that branch would receive. `rm` works as an alias for `remove`. `add` never overwrites: it fails if the key already exists in that scope, so use `update` to change a value. Every `project env` subcommand also accepts `--project ` to target a project other than the linked one. ## Values are write-only [#values-are-write-only] Once you save a variable, its value is encrypted at rest and never returned: not by the CLI, the API, or the Console. In practice: * `project env list` shows keys and metadata, not values. * There's no command to pull values into a local `.env`. * To rotate a secret, `project env update` it and redeploy. * To confirm an app sees a value, redeploy and check its behavior or logs. Keep your own copy of every value in a secret manager. Treat Prisma as the place values are *injected*, not a store you read back from. ## Rules [#rules] * Keys must match `[A-Z_][A-Z0-9_]*`, up to 256 characters. * Values must be non-empty, up to 8 KB. * Production variables can't be branch-scoped: use `--role production` for production, and `--branch ` only for preview overrides. ## In CI and agents [#in-ci-and-agents] Add `--json` so the output is machine-readable, and `--no-interactive` so the CLI fails with an error code instead of waiting on a prompt: #### bun ```bash bunx prisma project env list --role preview --json --no-interactive ``` #### pnpm ```bash pnpm prisma project env list --role preview --json --no-interactive ``` #### yarn ```bash yarn prisma project env list --role preview --json --no-interactive ``` #### npm ```bash npx prisma project env list --role preview --json --no-interactive ``` Don't build anything that depends on reading a value back. Pass the source value in from your own secret store, and let Prisma inject it at deploy time. ## Next steps [#next-steps] * [Deployments](https://www.prisma.io/docs/compute/deployments): redeploy to apply new values. * [Branching](https://www.prisma.io/docs/compute/branching): how preview branches work. ## Related pages - [`Alchemy`](https://www.prisma.io/docs/compute/alchemy): Provision Prisma Postgres and deploy applications to Prisma Compute in one TypeScript stack. - [`Branching`](https://www.prisma.io/docs/compute/branching): Branches are isolated environments that map to your Git branches, so preview work never touches production. - [`Deploy Button`](https://www.prisma.io/docs/compute/deploy-button): Add a Deploy with Prisma button that copies a public Composer repository and starts a Composer-managed deployment. - [`Deploy on push`](https://www.prisma.io/docs/compute/deploy-on-push): Graduate a Composer app from manual deploys to a Git workflow, with production deploys on push and an isolated preview environment per branch. - [`Deployments`](https://www.prisma.io/docs/compute/deployments): How deploys create service versions on Prisma Compute, and how to inspect, promote, roll back, start, and stop them.