--- title: "Environment Variables" description: "Read and configure environment variables in Bun, including automatic .env file support" --- Bun reads your `.env` files automatically and provides idiomatic ways to read and write your environment variables programmatically. You can also configure parts of Bun's runtime behavior with Bun-specific environment variables. ## Setting environment variables Bun reads the following files automatically (listed in order of increasing precedence). - `.env` - `.env.production`, `.env.development`, `.env.test` (depending on the value of `NODE_ENV`) - `.env.local` (not loaded when `NODE_ENV=test`) - `.env.production.local`, `.env.development.local`, `.env.test.local` (depending on the value of `NODE_ENV`) ```ini .env icon="settings" FOO=hello BAR=world ``` You can also set variables on the command line. ```sh Linux/macOS icon="terminal" FOO=helloworld bun run dev ``` ```sh Windows icon="windows" # Using CMD set FOO=helloworld && bun run dev # Using PowerShell $env:FOO="helloworld"; bun run dev ``` For a cross-platform solution, use [Bun Shell](/runtime/shell), for example through `bun exec`. ```sh bun exec 'FOO=helloworld bun run dev' ``` On Windows, `package.json` scripts called with `bun run` automatically use the **Bun Shell**, so the following is also cross-platform. ```json package.json icon="file-json" "scripts": { "dev": "NODE_ENV=development bun --watch app.ts", }, ``` Or set them programmatically by assigning a property to `process.env`. ```ts process.env.FOO = "hello"; ``` --- ## Manually specifying `.env` files The `--env-file` flag overrides which `.env` files Bun loads. It works both when running a file with `bun` and when running `package.json` scripts. ```sh bun --env-file=.env.1 src/index.ts bun --env-file=.env.abc --env-file=.env.def run build ``` ## Disabling automatic `.env` loading Use `--no-env-file` to disable Bun's automatic `.env` file loading, for example in production or CI/CD pipelines where you want to rely solely on system environment variables. ```sh bun run --no-env-file index.ts ``` You can also disable it in `bunfig.toml`: ```toml bunfig.toml icon="settings" # Disable loading .env files env = false ``` Files passed with `--env-file` still load even when default loading is disabled. When invoked as `node` (for example via `bun --bun`, `bunx --bun`, or a `node` symlink pointing at Bun), Bun disables automatic `.env` loading to match Node.js. This lets tools with their own mode-aware `.env` resolution, such as Vite's `loadEnv`, pick the correct `.env.{mode}` file instead of seeing Bun's pre-populated values as shell-set overrides. Bun still honors explicit `--env-file` arguments. --- ## Quotation marks Bun supports double quotes, single quotes, and template literal backticks: ```ini .env icon="settings" FOO='hello' FOO="hello" FOO=`hello` ``` ### Expansion Bun automatically _expands_ environment variables, so you can reference previously-defined variables. ```ini .env icon="settings" FOO=world BAR=hello$FOO ``` ```ts process.env.BAR; // => "helloworld" ``` Expansion is useful for constructing connection strings or other compound values. ```ini .env icon="settings" DB_USER=postgres DB_PASSWORD=secret DB_HOST=localhost DB_PORT=5432 DB_URL=postgres://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME ``` To disable expansion, escape the `$` with a backslash. ```ini .env icon="settings" FOO=world BAR=hello\$FOO ``` ```ts process.env.BAR; // => "hello$FOO" ``` ### `dotenv` Bun reads `.env` files automatically, so `dotenv` and `dotenv-expand` are unnecessary. ## Reading environment variables Read the current environment variables from `process.env`. ```ts process.env.API_TOKEN; // => "secret" ``` Bun also exposes these variables as `Bun.env` and `import.meta.env`, both aliases of `process.env`. ```ts Bun.env.API_TOKEN; // => "secret" import.meta.env.API_TOKEN; // => "secret" ``` To print all currently-set environment variables, run `bun --print process.env`. ```sh bun --print process.env BAZ=stuff FOOBAR=aaaaaa ``` ## TypeScript In TypeScript, all properties of `process.env` are typed as `string | undefined`. ```ts Bun.env.whatever; // string | undefined ``` To get autocompletion and tell TypeScript to treat a variable as a non-optional string, use [interface merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces). ```ts declare module "bun" { interface Env { AWESOME: string; } } ``` Add this declaration to any file in your project. It globally adds the `AWESOME` property to `process.env` and `Bun.env`. ```ts process.env.AWESOME; // => string ``` ## Configuring Bun Bun reads these environment variables to configure aspects of its behavior. | Name | Description | | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `NODE_TLS_REJECT_UNAUTHORIZED` | `NODE_TLS_REJECT_UNAUTHORIZED=0` disables SSL certificate validation. Useful for testing and debugging, but be very hesitant to use it in production. Node.js introduced this variable; Bun keeps the name for compatibility. | | `BUN_CONFIG_VERBOSE_FETCH` | If `BUN_CONFIG_VERBOSE_FETCH=curl`, then fetch requests log the URL, method, request headers and response headers to the console. This also works with `node:http`. `BUN_CONFIG_VERBOSE_FETCH=1` is equivalent to `BUN_CONFIG_VERBOSE_FETCH=curl` except without the `curl` output. | | `BUN_RUNTIME_TRANSPILER_CACHE_PATH` | The runtime transpiler caches the transpiled output of source files larger than 4 KB, which makes CLIs using Bun load faster. If `BUN_RUNTIME_TRANSPILER_CACHE_PATH` is set, Bun writes the cache to that directory. If it is set to an empty string or the string `"0"`, caching is disabled. If it is unset, Bun writes the cache to the platform-specific cache directory. | | `TMPDIR` | Bun occasionally requires a directory to store intermediate assets during bundling or other operations. If unset, defaults to the platform-specific temporary directory: `/tmp` on Linux, `/private/tmp` on macOS. | | `NO_COLOR` | If `NO_COLOR=1`, then ANSI color output is [disabled](https://no-color.org/). | | `FORCE_COLOR` | If `FORCE_COLOR=1`, then ANSI color output is forced on, even if `NO_COLOR` is set. | | `BUN_CONFIG_MAX_HTTP_REQUESTS` | Sets the maximum number of concurrent HTTP requests sent by fetch and `bun install`. Defaults to `256`. Lower it if you run into rate limits or connection issues. | | `BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD` | If `BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD=true`, then `bun --watch` does not clear the console on reload | | `DO_NOT_TRACK` | Disable uploading crash reports to `bun.report` on crash. On macOS & Windows, crash report uploads are enabled by default. Bun sends no other telemetry, though we plan to add some. If `DO_NOT_TRACK=1`, then auto-uploading crash reports and telemetry are both [disabled](https://do-not-track.dev/). | | `BUN_OPTIONS` | Prepends command-line arguments to any Bun execution. For example, `BUN_OPTIONS="--hot"` makes `bun run dev` behave like `bun --hot run dev`. | ## Runtime transpiler caching For files larger than 4 KB, Bun caches transpiled output into `$BUN_RUNTIME_TRANSPILER_CACHE_PATH` or the platform-specific cache directory. This makes CLIs using Bun load faster. The cache is global and shared across all projects. It is content-addressable, so it never contains duplicate entries. It is safe to delete at any time, even while a Bun process is running. Disable this cache when using ephemeral filesystems like Docker. Bun's Docker images disable it automatically. ### Disable the runtime transpiler cache To disable the runtime transpiler cache, set `BUN_RUNTIME_TRANSPILER_CACHE_PATH` to an empty string or the string `"0"`. ```sh BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 bun run dev ``` ### What does it cache? It caches: - The transpiled output of source files larger than 4 KB. - The sourcemap for the transpiled output of the file Cached files use the `.pile` extension.