Skip to content

Environment variables

Two workers, each with their own env. The app worker holds Supabase/Electric credentials; the agents worker holds stream and LLM credentials.

App worker (packages/www)

.env (committed)

Public values baked into the build. Not secrets.

VariableDescription
PUBLIC_SUPABASE_URLSupabase API URL
PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEYSupabase publishable key
PUBLIC_ELECTRIC_URLElectric SQL shape API base URL
PUBLIC_DURABLE_STREAMS_URLElectric durable streams endpoint
PUBLIC_POSTHOG_KEYPostHog project API key (client-side analytics)
PUBLIC_POSTHOG_HOSTPostHog ingest endpoint (https://eu.i.posthog.com)

.env.local (gitignored)

Secrets. Copy from .env.example and fill in values.

VariableDescriptionWhere to find it
SUPABASE_JWT_SECRETJWT signing key for bot auth tokensSupabase dashboard → Settings → API → JWT Secret
DURABLE_STREAMS_SECRETJWT for durable stream requestsElectric SQL dashboard
ELECTRIC_SOURCE_IDElectric SQL source identifierElectric SQL dashboard
ELECTRIC_SOURCE_SECRETJWT for Electric shape requestsElectric SQL dashboard

SvelteKit conventions: PUBLIC_* vars are exposed to the browser via $env/static/public. All other vars are server-only ($env/static/private). SvelteKit loads .env first, then .env.local overrides.

Agents worker (packages/worker)

wrangler.jsonc (committed)

VariableTypeDescription
SUPABASE_URLvarSupabase API URL (same value as app’s PUBLIC_SUPABASE_URL)
DURABLE_STREAMS_URLvarDurable streams endpoint (same value as PUBLIC_DURABLE_STREAMS_URL)

.dev.vars (gitignored)

For local dev, wrangler reads secrets from .dev.vars.

VariableDescription
DURABLE_STREAMS_SECRETSame value as app’s DURABLE_STREAMS_SECRET
ANTHROPIC_API_KEYAnthropic API key — used by default for all bots unless the model is a @cf/ Workers AI model
SUPABASE_PUBLISHABLE_KEYSupabase publishable key (same value as app’s PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY) — used by bot DOs for PostgREST queries with RLS

Production secrets

PUBLIC_* vars are baked at build time from .env. Everything else must be set via Wrangler:

Terminal window
# App worker
cd packages/www
bunx wrangler secret put SUPABASE_JWT_SECRET
bunx wrangler secret put DURABLE_STREAMS_SECRET
bunx wrangler secret put ELECTRIC_SOURCE_ID
bunx wrangler secret put ELECTRIC_SOURCE_SECRET
# Agents worker
cd packages/worker
bunx wrangler secret put DURABLE_STREAMS_SECRET
bunx wrangler secret put ANTHROPIC_API_KEY
bunx wrangler secret put SUPABASE_PUBLISHABLE_KEY