This is how we add environment variables to the project:
- Add to
.env.example:NEW_VARIABLE=value_example
-
Add to
apps/web/env.ts:// For server-only variables server: { NEW_VARIABLE: z.string(), } // For client-side variables client: { NEXT_PUBLIC_NEW_VARIABLE: z.string(), } experimental__runtimeEnv: { NEXT_PUBLIC_NEW_VARIABLE: process.env.NEXT_PUBLIC_NEW_VARIABLE, } -
For client-side variables:
- Must be prefixed with
NEXT_PUBLIC_ - Add to both
clientandexperimental__runtimeEnvsections
- Must be prefixed with
-
Add to
turbo.jsonunderglobalDependencies:{ "tasks": { "build": { "env": [ "NEW_VARIABLE" ] } } }
examples:
-
input: |
Adding a server-side API key .env.exampleAPI_KEY=your_api_key_here
env.tsserver: { API_KEY: z.string(), }
turbo.json"build": { "env": ["API_KEY"] } output: "Server-side environment variable properly added"
-
input: |
Adding a client-side feature flag .env.exampleNEXT_PUBLIC_FEATURE_ENABLED=false
env.tsclient: { NEXT_PUBLIC_FEATURE_ENABLED: z.coerce.boolean().default(false), }, experimental__runtimeEnv: { NEXT_PUBLIC_FEATURE_ENABLED: process.env.NEXT_PUBLIC_FEATURE_ENABLED, }
turbo.json"build": { "env": ["NEXT_PUBLIC_FEATURE_ENABLED"] } output: "Client-side environment variable properly added"
references:
- apps/web/env.ts
- apps/web/.env.example
- turbo.json