Access environment variables with static imports (replaced at build time) or dynamic imports (accessed at runtime).
// Static public environment variables (build-time replacement)
import { PUBLIC_API_URL, PUBLIC_SITE_NAME } from '$env/static/public';
// Static private environment variables (server-only, build-time replacement)
import { DATABASE_URL, SECRET_KEY } from '$env/static/private';
// Dynamic public environment variables (runtime access)
import { env } from '$env/dynamic/public';
// Dynamic private environment variables (server-only, runtime access)
import { env } from '$env/dynamic/private';Publicly available environment variables that are replaced at build time. All variables must start with PUBLIC_ prefix.
// From '$env/static/public'
export const PUBLIC_*: string;Usage:
import { PUBLIC_API_URL, PUBLIC_SITE_NAME } from '$env/static/public';
// Safe to use in client-side code
const response = await fetch(`${PUBLIC_API_URL}/posts`);
console.log('Site:', PUBLIC_SITE_NAME);Example .env file:
PUBLIC_API_URL=https://api.example.com
PUBLIC_SITE_NAME=My Awesome Site
PUBLIC_ANALYTICS_ID=UA-12345678-9Private environment variables available only on the server that are replaced at build time. Can have any name (no PUBLIC_ prefix).
// From '$env/static/private'
export const *: string;Usage:
// In +page.server.ts, +server.ts, hooks.server.ts, etc.
import { DATABASE_URL, SECRET_KEY, API_TOKEN } from '$env/static/private';
export async function load() {
const db = await connectDatabase(DATABASE_URL);
const data = await fetchData(API_TOKEN);
return { data };
}Example .env file:
DATABASE_URL=postgresql://localhost:5432/mydb
SECRET_KEY=super-secret-key-123
API_TOKEN=secret-api-tokenPublicly available environment variables accessed at runtime through an env object.
// From '$env/dynamic/public'
export const env: Record<string, string>;Usage:
import { env } from '$env/dynamic/public';
// Access variables dynamically
const apiUrl = env.PUBLIC_API_URL;
const featureFlag = env.PUBLIC_FEATURE_X === 'true';
// Iterate over all public env vars
Object.entries(env).forEach(([key, value]) => {
console.log(`${key}: ${value}`);
});Use cases:
Private environment variables accessed at runtime through an env object. Server-only.
// From '$env/dynamic/private'
export const env: Record<string, string>;Usage:
// In server-only contexts
import { env } from '$env/dynamic/private';
export async function load() {
// Access variables dynamically
const dbUrl = env.DATABASE_URL;
const apiKey = env.API_KEY;
// Useful for plugin systems or dynamic configuration
const plugins = Object.keys(env)
.filter(key => key.startsWith('PLUGIN_'))
.map(key => ({ name: key, config: env[key] }));
return { plugins };
}Static imports:
Dynamic imports:
env objectPublic variables (PUBLIC_* prefix):
Private variables (no prefix requirement):
*.server.ts, hooks.server.ts, server-side load functionsEnvironment variables are loaded from:
.env file (committed to repo, default values).env.local file (not committed, local overrides)Variables are loaded in this priority order:
process.env (highest priority).env.local.env (lowest priority)PUBLIC_* variablesFor better type safety, create type definitions:
// src/app.d.ts
declare namespace App {
interface Platform {
env: {
PUBLIC_API_URL: string;
PUBLIC_SITE_NAME: string;
DATABASE_URL: string;
SECRET_KEY: string;
};
}
}