Environment Variable Reference
Names, purpose, non-secret defaults and consumers for the variables that configure core, the compose stack,
and the Next.js frontends. Secret-bearing variables carry a
secret badge and no value — by design, and no .env, .env.local
or .env.production* file was opened to write this page.
- Sources read
core/.env.example,deploy/compose/.env.example,web/.env.local.example,core/app-config/src/main/resources/application*.yml,web/Dockerfile,web-admin/Dockerfile,deploy/compose/docker-compose.yml,deploy/compose/docker-compose.domain.yml.- Completeness
- core's
application.ymlexposes roughly 200 placeholders. The tables list every operationally relevant group; the exhaustive list is the${NAME:default}placeholders in that file (see the last section). Compose has additional per-service variables not in.env.examplethat were not enumerated. - Environment
- Docker Compose reads
deploy/compose/.env(generated byscripts/vegaduta secrets); Helm reads chart values and Kubernetes Secrets. Localhost defaults below are for local development only.
APP_ENCRYPTION_KEYmust be identical everywhere core boots (deploy/compose/.env,core/.env.local, your Kubernetes Secret). A different value makes every stored provider key and channel secret undecryptable; rotation needs a decrypt/re-encrypt migration.APP_ENCRYPTION_KEY_PREVIOUSis set only during a deliberate rotation window.- The issuer core validates must be exactly the one Keycloak stamps (
PUBLIC_AUTH_URL/realms/agentic-ai); any other accepted issuer goes inKEYCLOAK_ADDITIONAL_ISSUERS. A mismatch 401s every token — see ADR-0005. NEXT_PUBLIC_*build args are optional: empty means nothing is baked and the runtime environment decides. Never bake a localhost URL into an image you deploy — see ADR-0007.- LLM provider keys, Twilio credentials and MCP credentials are not env vars: they are BYOK, entered in the console and stored encrypted per tenant (
core/.env.exampleheader).
Jump to: Core · Compose (deploy/compose/.env) · Web & web-admin
1. core (Spring Boot)
Template: core/.env.example (copy to gitignored core/.env.local). Consumed via ${VAR:default} in core/app-config/src/main/resources/application*.yml. "Default" is the literal in the yml/example when non-secret; blank means unset.
Database, Redis, encryption
| Name | Purpose | Default | Source / notes |
|---|---|---|---|
DB_HOST, DB_PORT | Postgres host/port. | localhost, 5432 | application.yml. Compose Full points these at pgbouncer:6432. |
POSTGRES_DB, POSTGRES_USER | App database and user. | agentic_ai, agentic | application.yml; core/.env.example |
POSTGRES_PASSWORD secret | DB password (required, no default). | — | application.yml |
DB_HIKARI_MAX_POOL_SIZE, DB_HIKARI_MIN_IDLE, DB_HIKARI_CONNECTION_TIMEOUT_MS | Connection pool tuning. | 15, 5, 20000 | application.yml |
REDIS_HOST, REDIS_PORT | Redis for session/cache and signup rate limiting. | localhost, 6379 | core/.env.example; application.yml |
REDIS_PASSWORD secret | Redis auth. | — | application.yml; VALKEY_PASSWORD in Compose |
APP_ENCRYPTION_KEY secret | REQUIRED. AES key for at-rest encryption (generate with openssl rand -base64 32). | — | See callout above. Core refuses to start without it. |
APP_ENCRYPTION_KEY_PREVIOUS secret | Old key during a rotation window only. | blank | core/.env.example |
PLATFORM_MASTER_KEY secret | Platform-admin "delete tenant completely" control (X-Master-Key header). | — | deploy/compose/.env.example; application.yml |
Identity (Keycloak)
| Name | Purpose | Default | Source / notes |
|---|---|---|---|
KEYCLOAK_ISSUER_URI | Primary JWT issuer (scheme-sensitive match). | http://localhost:8180/realms/agentic-ai | application-security.yml |
KEYCLOAK_ADDITIONAL_ISSUERS | Comma-separated extra accepted issuers (the public auth URL). | blank | application-security.yml; deploy/compose/.env.example. |
KEYCLOAK_ADMIN_BASE_URL, KEYCLOAK_REALM, KEYCLOAK_CLIENT_ID | Admin API base, realm, core's client id. | http://localhost:8180, agentic-ai, agentic-ai-core | application-security.yml |
KEYCLOAK_CLIENT_SECRET secret | Confidential-client secret; required for /api/admin/** user management. | — | core/.env.example |
KEYCLOAK_ADMIN, KEYCLOAK_ADMIN_PASSWORD secret, KEYCLOAK_DB_USER, KEYCLOAK_DB_PASSWORD secret, KEYCLOAK_DB_NAME | Compose Keycloak container admin login and its dedicated Postgres. | user/name only | core/.env.example; deploy/compose/.env.example (DB password is :?-required) |
Storage, LLM defaults, web origins
| Name | Purpose | Default | Source / notes |
|---|---|---|---|
STORAGE_ENDPOINT, STORAGE_REGION, STORAGE_BUCKET, STORAGE_PATH_STYLE_ACCESS | S3-compatible storage (SeaweedFS in the Full tier; AWS S3, R2, Ceph, Garage elsewhere). Path-style true for SeaweedFS/MinIO-style gateways. | http://localhost:9000, us-east-1, agentic-ai, true | application.yml; core/.env.example |
STORAGE_ACCESS_KEY, STORAGE_SECRET_KEY secret | Object storage credentials. | — (yml carries a dev default; not reproduced) | Required with :? in compose. |
DEFAULT_MODEL | Fallback model alias (not a provider key). | claude-sonnet-4-5 in application.yml; claude-sonnet-5 in core/.env.example | Example and yml disagree; the effective default is whichever is set at runtime. |
DEFAULT_AGENT_MAX_TOKENS, WORKFLOW_GENERATOR_MAX_TOKENS, APP_BUILDER_MAX_TOKENS | Token ceilings. | 4096, 4096, 8000 | application.yml |
WEB_ALLOWED_ORIGINS / APP_WEB_ALLOWED_ORIGINS | Console CORS origins. | localhost list in yml | core/.env.example says setting WEB_ALLOWED_ORIGINS does nothing (origins are hard-coded in application.yml); set APP_WEB_ALLOWED_ORIGINS for a public domain. |
LLM_HTTP_CONNECT_TIMEOUT, LLM_HTTP_READ_TIMEOUT, LLM_HTTP_IDLE_CONNECTION_TIMEOUT, LLM_HTTP_STREAM_IDLE_TIMEOUT, LLM_HTTP_BUFFERED_TURN_TIMEOUT, LLM_HTTP_STREAM_TIMEOUTS_ENABLED | LLM HTTP client timeouts. | 10s, 10m, 120s, 90s, 240s, true | application.yml. |
HTTP_CLIENT_CONNECT_TIMEOUT, HTTP_CLIENT_READ_TIMEOUT | General outbound HTTP timeouts. | 10s, 120s | application.yml |
VERTEX_ENABLED, VERTEX_POOL_{0,1,2}_{PROJECT_ID,LOCATION,SA_KEY_PATH,USE_ADC,SUPPORTS_TEXT,SUPPORTS_IMAGE,SUPPORTS_VIDEO} | Optional platform-pool Vertex AI slots (operator-supplied credentials). | disabled; location us-central1 | application.yml. SA_KEY_PATH is a path to a key file — treat as sensitive. |
HOSTED_POOL_ORDER_BY_COST, HOSTED_POOL_CIRCUIT_{FAILURE_THRESHOLD,FAILURE_WINDOW_SECONDS,COOLDOWN_SECONDS} | Platform LLM pool ordering and circuit breaker. | true; 3, 120, 180 | application.yml |
APP_JEV_* (ENABLED, BASE_URL, MODEL, API_KEY secret, timeouts, complexity/agent-routing flags) | Optional external routing/complexity service integration. | enabled flags true; base URL and model literals in yml | application.yml; purpose beyond the property names is not documented in the repository docs read here. |
Channels, OAuth, optional billing
| Name | Purpose | Default | Source / notes |
|---|---|---|---|
OMNICHANNEL_PUBLIC_BASE_URL | Public HTTPS base of this core (webhook/callback reconstruction, Twilio signature validation). | blank | core/.env.example |
DISCORD_GATEWAY_SERVICE_URL, DISCORD_GATEWAY_SHARED_SECRET secret | Discord gateway bridge. | example: http://localhost:4002 | core/.env.example |
META_WEBHOOK_VERIFY_TOKEN secret, META_EMBEDDED_SIGNUP_APP_ID, …_APP_SECRET secret, …_CONFIG_ID, …_REDIRECT_URI | Meta WhatsApp Cloud API and Embedded Signup. | blank | core/.env.example. Redirect URI must be a real HTTPS URL registered in the Meta app. |
TELEGRAM_BOT_TOKEN secret, TELEGRAM_WEBHOOK_BASE_URL | Platform fallback Telegram bot. | blank | application-workflow.yml |
DEMO_WHATSAPP_* (access token, app secret, verify token, ID hash key = secrets; business number, phone-number id, per-phone caps) | Demo WhatsApp number configuration. | caps 3 pairs / 60 turns | application.yml |
GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET secret, GOOGLE_OAUTH_REDIRECT_URI, GOOGLE_OAUTH_CONSOLE_REDIRECT_URI | Google Drive/Gmail/Calendar/Sheets OAuth. Redirect must point at core, not the console. | console redirect http://localhost:3000/admin/integrations | core/.env.example; application.yml |
X_OAUTH_REDIRECT_URI, X_OAUTH_CONSOLE_REDIRECT_URI, ATLASSIAN_OAUTH_REDIRECT_URI, ATLASSIAN_OAUTH_CONSOLE_REDIRECT_URI | X and Atlassian OAuth redirects. | console: http://localhost:3000/admin/channels, http://localhost:3000/tools | application.yml |
SIGNUP_RATE_LIMIT_MAX_ATTEMPTS, SIGNUP_RATE_LIMIT_WINDOW_MINUTES, SIGNUP_DISPOSABLE_EMAIL_BLOCK_{ENABLED,ALLOWLIST,EXTRA_DOMAINS} | Signup abuse controls. | 5, 60, block enabled true | application.yml |
RAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET secret, RAZORPAY_WEBHOOK_SECRET secret, RAZORPAY_TRIAL_DAYS | Optional Razorpay gateway for operators who charge for plans. Unused unless set; plan gating in the consoles is off unless NEXT_PUBLIC_BILLING_ENABLED=1. | trial 14 | core/.env.example. |
RAZORPAY_PLAN_PREMIUM_{INR,USD}_{MONTHLY,ANNUAL}, RAZORPAY_PLAN_UNLIMITED_{INR,USD}_{MONTHLY,ANNUAL}, RAZORPAY_PLAN_ID_STARTER, RAZORPAY_PLAN_ID_BUSINESS | Razorpay plan ids (created manually in the dashboard). Last two are legacy fallbacks. | blank | application.yml |
PHONEPE_*, DEFAULT_PAYMENT_GATEWAY, PAYMENTS_LINK_TTL_SECONDS, PAYMENTS_RECONCILE_INTERVAL_MS, BILLING_DUNNING_MAX_FAILED_ATTEMPTS | PhonePe gateway, payment-link and dunning settings. | gateway razorpay; 86400; 60000; 3 | application.yml. PhonePe client secret and webhook password are secrets. |
CORE_COMP_SERVICE_TOKEN secret | Shared secret for an optional external comp-grant integration (X-Service-Token). Blank = endpoint fails closed. | blank | core/.env.example |
Agents, tools, workflows, MCP, sidecars
| Name | Purpose | Default | Source / notes |
|---|---|---|---|
GUARDRAILS_IMPLEMENTATION, GUARDRAILS_MAX_TOOL_CALLS_PER_TURN | semantic (regex + LLM classifier) or pattern (regex only); per-turn tool-call cap. | semantic, 15 | core/.env.example |
TOOL_AUTO_SELECTION_ENABLED, TOOL_AUTO_SELECTION_MAX_TOOLS, TOOL_HARD_CAP_PER_TURN, TOOL_MCP_DISCOVERY_CACHE_TTL_SECONDS | Tool selection and caching. | true, 12, 150, 300 | application.yml |
TOOL_CIRCUIT_BREAKER_{FAILURE_THRESHOLD,WINDOW_MINUTES,COOLDOWN_MINUTES} | Tool circuit breaker. | 5, 5, 10 | application.yml |
WORKFLOW_EXECUTION_ENGINE | legacy (in-process) or temporal (durable). | legacy | core/.env.example; Compose profile temporal sets it to temporal. |
TEMPORAL_TARGET, TEMPORAL_NAMESPACE, TEMPORAL_RUN_TIMEOUT_SECONDS | Temporal connection. | 127.0.0.1:7233, default, 600 | application.yml |
WORKFLOW_EVENTS_ENABLED, WORKFLOW_KAFKA_BOOTSTRAP_SERVERS | Kafka/Redpanda event bus (opt-in). | false, localhost:9092 | application.yml; application-workflow.yml |
WORKFLOW_TRIGGER_RATE_LIMIT_MAX, …_WINDOW_MINUTES | Workflow trigger rate limit. | 20, 10 | application.yml |
AGENT_JOBS_MAX_CONCURRENT, AGENT_JOB_MAX_ATTEMPTS, AGENT_JOB_APPROVAL_TIMEOUT, AGENT_JOB_TRIGGERS_ENABLED, AGENT_JOB_TRIGGER_*, AGENT_SUPERVISOR_SWEEP_ENABLED, RESOLUTION_SWEEP_ENABLED | Agent-job concurrency, retries, trigger fire caps, sweeps. | 4, 2, PT24H, true, caps in yml, true, true | application.yml |
APPROVAL_RETRY_MAX_ATTEMPTS, APPROVAL_RETRY_BASE_DELAY_SECONDS, APPROVAL_RETRY_MAX_DELAY_SECONDS | HITL approval delivery retry backoff. | 5, 30, 3600 | core/.env.example |
SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD secret, WORKFLOW_MAIL_FROM | Workflow "email" output node relay. Blank host = unconfigured. | port 587; from workflows@agentic-ai.local | application-workflow.yml |
GITHUB_REPO, GITHUB_ACTIONS_TOKEN secret, GITHUB_API_BASE | "Run now" trigger for the translation workflow. | https://api.github.com | core/.env.example |
SIDECAR_BASE_URL, SIDECAR_SHARED_SECRET secret, KNOWLEDGE_RERANK_ENABLED | Python ML sidecar URL, X-Internal-Token secret (same value on the sidecar), rerank toggle. | http://localhost:8001; false | application-knowledge.yml; core/.env.example. Sidecar auth is required by default; empty secret means it rejects calls unless SIDECAR_AUTH_REQUIRED=false. |
CODE_INTEL_ENABLED, CODE_INTEL_BASE_URL, CODE_INTEL_INTERNAL_TOKEN secret | Bridge to the code-intel service (off by default). | false, http://localhost:8090 | application.yml; token must equal the service's own CODE_INTEL_INTERNAL_TOKEN. |
TOOL_SANDBOX_ENABLED, TOOL_SANDBOX_BASE_URL, TOOL_SANDBOX_INTERNAL_TOKEN secret, TOOL_SANDBOX_MAX_TOOLS_PER_TENANT, TOOL_SANDBOX_REQUEST_TIMEOUT_MS | Tenant custom-code tool sandbox (off by default). | false, http://tool-sandbox:8095, 25, 30000 | application.yml. See ADR-0009. |
MCP_STDIO_SIDECAR_ENABLED, MCP_STDIO_SIDECAR_URL, MCP_STDIO_SIDECAR_SHARED_SECRET secret | Route dynamic MCP STDIO spawns through mcp-stdio-runner. | false, mcp-stdio-runner:8097 | application.yml |
MCP_FILESYSTEM_COMMAND, MCP_FILESYSTEM_ROOT, MCP_MEMORY_COMMAND, MCP_SEQUENTIAL_THINKING_COMMAND, MCP_PUPPETEER_COMMAND, MCP_PLAYWRIGHT_VISION_COMMAND | Commands for built-in stdio MCP servers. | npx; root ./mcp-data | application-mcp.yml. Windows defaults to npx.cmd automatically. |
APP_BUILDER_CORE_SERVICE_TOKEN secret | Service token shared with app-builder. | blank | application.yml; deploy/compose/.env.example |
LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET secret, LIVEKIT_TOKEN_TTL_SECONDS | In-app voice/video (LiveKit). | ws://localhost:7880; 3600 | application.yml. Key/secret required (no dev defaults). |
APP_A2A_SIGNING_ENABLED, …_KEY_ID, …_PUBLIC_KEY, …_PRIVATE_KEY secret | Agent-to-agent message signing. | enabled true | application.yml |
APP_VISION_ENABLED, APP_VISION_FRAMES_FREE_DAILY, …_PREMIUM_DAILY, APP_VISION_WATCH_MINUTES_PREMIUM_DAILY | Live-vision quotas. | true, 10, 500, 120 | application.yml |
GRAPH_MEMORY_ARBITRATION_ENABLED | Graph-memory arbitration toggle. | false | application.yml |
PLATFORM_ALERTS_WEBHOOK_SECRET secret | Alertmanager to core alert-webhook bearer secret. | — | deploy/compose/.env.example |
Observability and management
| Name | Purpose | Default | Source / notes |
|---|---|---|---|
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, LANGFUSE_OTEL_AUTH_HEADER secret, TRACING_SAMPLING_PROBABILITY | OTLP traces to Langfuse; auth header; sampling. | http://langfuse-web:3000/api/public/otel/v1/traces; 0.1 | application.yml; deploy/compose/.env.example |
ACTUATOR_HEALTH_SHOW_DETAILS, MANAGEMENT_HEALTH_MAIL_ENABLED | Actuator health detail exposure; mail health indicator. | when-authorized; false | application.yml |
APP_SECURITY_PERMISSION_CACHE_TTL, APP_TENANT_STATUS_CACHE_TTL, APP_SYSTEM_STATUS_CACHE_TTL | Cache TTLs. | 10s each | application.yml |
APP_CHAT_SSE_STEP_HEARTBEAT_INTERVAL, APP_CHAT_SSE_BUFFERED_KEEPALIVE_INTERVAL | SSE heartbeats. | 15s, 20s | application.yml |
2. Compose stack (deploy/compose/.env)
Template: deploy/compose/.env.example, consumed by the files in deploy/compose/. Variables already covered above (Postgres, Keycloak, APP_ENCRYPTION_KEY, CODE_INTEL_INTERNAL_TOKEN) are not repeated. scripts/vegaduta secrets (run by up) generates random secrets and never overwrites existing values.
| Name(s) | Purpose | Example default | Notes |
|---|---|---|---|
VEGADUTA_VERSION, VEGADUTA_REGISTRY, VEGADUTA_POSTGRES_IMAGE | Release tag and registry of the images to pull. | registry ghcr.io/cd-lc | Pin a version in production; --build builds from source instead. |
BASE_DOMAIN, ACME_EMAIL, CADDY_AUTO_HTTPS, CADDY_SITE_SCHEME | Domain overlay: hostnames, Let's Encrypt contact (optional), and, behind your own TLS proxy or tunnel, CADDY_AUTO_HTTPS=off plus CADDY_SITE_SCHEME=http:// so Caddy serves plain HTTP on :80. | blank | scripts/vegaduta up --domain writes BASE_DOMAIN and the PUBLIC_* URLs only; set the CADDY_* variables and ACME_EMAIL in .env yourself. PUBLIC_BIND_ADDR (default 0.0.0.0) sets the interface Caddy publishes 80/443 on; use 127.0.0.1 in tunnel mode. |
PUBLIC_APP_URL, PUBLIC_ADMIN_URL, PUBLIC_API_URL, PUBLIC_AUTH_URL, PUBLIC_CODE_INTEL_URL, PUBLIC_BUILDER_URL, PUBLIC_LIVEKIT_URL, PUBLIC_LANGFUSE_URL | Browser-facing URLs; every other public URL is derived from these. | localhost ports | Never localhost on a server; doctor checks. PUBLIC_AUTH_URL sets the token issuer. |
BIND_ADDR, *_HOST_PORT, *_MEM_LIMIT | Host interface and ports for published services; container memory limits. | 127.0.0.1 | |
COMPOSE_PROFILES, CORE_PROFILES_EXTRA, SPRING_PROFILES_ACTIVE, LITE_SPRING_PROFILES, CORE_MCP_PROFILE, CORE_IMAGE_VARIANT | Which Compose profiles and core Spring profiles run. | see example | The CLI sets the matching values per profile (deploy/README.md). |
KEYCLOAK_SMTP_*, KC_VERIFY_EMAIL, GOOGLE_CLIENT_*, GITHUB_CLIENT_*, MICROSOFT_CLIENT_*, THEME_*_URL | Keycloak email, social logins and login-theme links, applied by the realm reconcile. | blank | Client secrets and SMTP password are secrets. |
WEB_FREE_MODE, WEB_EDGE_AGENTS, WEB_DEPLOY_ENV, WEB_BILLING_ENABLED | Passed to the consoles as NEXT_PUBLIC_FREE_MODE, _EDGE_AGENTS, _DEPLOY_ENV, _BILLING_ENABLED. | blank | Billing/plan gating is off unless WEB_BILLING_ENABLED=1. |
TEMPORAL_DB_USER, TEMPORAL_DB_PASSWORD secret | Temporal's dedicated Postgres. | user temporal | |
LANGFUSE_POSTGRES_{USER,PASSWORD,DB}, LANGFUSE_CLICKHOUSE_{USER,PASSWORD}, LANGFUSE_REDIS_AUTH, LANGFUSE_S3_{ACCESS,SECRET}_KEY, LANGFUSE_SALT, LANGFUSE_ENCRYPTION_KEY, LANGFUSE_NEXTAUTH_SECRET | Self-hosted Langfuse v3 stack. Passwords, salt, encryption key and NextAuth secret are secrets (salt/encryption key generated with openssl rand -hex 32). | users langfuse/clickhouse; db langfuse | Optional LANGFUSE_NEXTAUTH_URL, LANGFUSE_HOST are commented in the example. |
LANGFUSE_INIT_PROJECT_PUBLIC_KEY, …_SECRET_KEY, LANGFUSE_INIT_USER_{EMAIL,NAME,PASSWORD}, LANGFUSE_OTEL_AUTH_HEADER | Bootstrap org/project/user/key pair on first start; OTLP auth header. | blank | Keys, password and header are secrets. |
GRAFANA_ADMIN_USER, GRAFANA_ADMIN_PASSWORD secret | Grafana admin login (separate from Keycloak). | user admin | Loki/Promtail/Grafana profile. |
TOOL_SANDBOX_INTERNAL_TOKEN secret, TOOL_SANDBOX_ENABLED, TOOL_SANDBOX_MAX_TOOLS_PER_TENANT, TOOL_SANDBOX_MAX_TIMEOUT_MS, TOOL_SANDBOX_MAX_MEMORY_MB, TOOL_SANDBOX_MAX_CONCURRENT | Custom code tools; same token in core and tool-sandbox. Off by default. | false, 25, 15000, 512, 4 | Read services/tool-sandbox/README.md's threat model first. |
MCP_STDIO_SIDECAR_ENABLED, MCP_STDIO_SIDECAR_SHARED_SECRET secret | MCP STDIO sandbox runner. | false | Same secret in core and runner. |
SIDECAR_SHARED_SECRET secret, SIDECAR_AUTH_REQUIRED | Sidecar internal auth; false only as a bare-local-dev escape hatch (commented out in the example). | required by default | |
ANTHROPIC_API_KEY secret, APP_BUILDER_INTERNAL_TOKEN secret, APP_BUILDER_ADMIN_DATABASE_URL secret | Optional app-builder settings; the compose block reuses CODE_INTEL_INTERNAL_TOKEN. | blank | The database URL may embed credentials — treat as secret. |
LIVEKIT_API_KEY, LIVEKIT_API_SECRET secret, LIVEKIT_URL, VOICE_AGENT_LIVEKIT_URL, VOICE_AGENT_CORE_API_BASE_URL | LiveKit credentials and browser-facing WebSocket URL; voice agent wiring. | blank | Required. |
ALERT_EMAIL_TO, ALERT_SMTP_HOST, ALERT_SMTP_PORT, ALERT_SMTP_FROM, ALERT_SMTP_USER, ALERT_SMTP_PASSWORD secret | Alertmanager email notifications (optional). | port 587 (commented) | Enabled only when both ALERT_EMAIL_TO and ALERT_SMTP_HOST are non-empty. |
RENDER_THREADS, RENDER_PRESET, RENDER_CRF, RENDER_WORKSPACE_DIR, RENDER_CALLBACK_ALLOWED_HOSTS, RENDER_ALLOW_PRIVATE_FETCH | Sidecar video render knobs. | 1, medium, 23, /app/workspace, core, false | Video-pipeline section of the example. |
KEYCLOAK_HOSTNAME, KEYCLOAK_HOSTNAME_STRICT | Override Keycloak's pinned public hostname (full URL required). | commented; default pinned to localhost:8180 | Domain deployments only (the domain overlay derives it from PUBLIC_AUTH_URL). |
3. web and web-admin (build-time)
The Dockerfiles declare the NEXT_PUBLIC_* values as optional build args. Empty (the default) bakes nothing and the runtime environment decides; Compose and the Helm charts supply them at runtime (deploy/helm/README.md). A value you do bake is compiled into the browser bundle and cannot be changed without a rebuild.
| Name | Image | Build-arg default | Purpose / notes |
|---|---|---|---|
NEXT_PUBLIC_API_BASE_URL | web, web-admin | empty | Core API origin (PUBLIC_API_URL in Compose). |
NEXT_PUBLIC_KEYCLOAK_URL | web, web-admin | empty | Public Keycloak origin (PUBLIC_AUTH_URL). A localhost bake breaks sign-in on a server. |
NEXT_PUBLIC_KEYCLOAK_REALM | web, web-admin | empty (code default agentic-ai) | |
NEXT_PUBLIC_KEYCLOAK_CLIENT_ID | web / web-admin | empty (code defaults agentic-ai-web / agentic-ai-platform-admin) | Public OIDC clients, no client secret. |
NEXT_PUBLIC_CODE_INTEL_URL | web | empty | Public origin for the /code-intel page. |
NEXT_PUBLIC_ACADEMY_URL | web | empty | Link to an optional external learning site; not part of this repository. Leave empty. |
NEXT_PUBLIC_APP_BUILDER_URL | web | empty | Empty renders "not available on this deployment". Never bake a localhost value into a deployed build. |
NEXT_PUBLIC_EDGE_AGENTS | web | empty | Edge UI only when exactly 1. |
NEXT_PUBLIC_DEPLOY_ENV | web | full (Compose full stack, Helm); lite / personal in those stacks | Install tier (personal, lite, full: selects install behaviour, no pill) or, for any other value such as production or staging, the console environment pill; WEB_DEPLOY_ENV in Compose. |
NEXT_PUBLIC_FREE_MODE | web | empty | Free-for-everyone mode (1) swaps pricing UI for open-source copy. |
NEXT_PUBLIC_COFFEE_URL | web | empty | Donation link; not rendered when empty. |
NEXT_PUBLIC_BILLING_ENABLED | web, web-admin | empty | Plan/billing surfaces appear only when exactly 1 (hosted operators); off by default. |
CDN_URL, ALLOWED_DEV_ORIGINS | web (build/dev) | unset | Read in next.config.js: asset CDN hook; comma-separated hostnames for dev over a tunnel. |
E2E_ANTHROPIC_API_KEY, E2E_TWILIO_ACCOUNT_SID, E2E_TWILIO_AUTH_TOKEN, E2E_TWILIO_WHATSAPP_FROM, E2E_TWILIO_WHATSAPP_TO | Playwright e2e | — | Names in web/.env.local.example. The first three are secrets. Values in the example are placeholders and are not reproduced. |
BAKE_EXTRA_MODELS, MODULE | sidecar, core | true, app | Non-NEXT_PUBLIC Dockerfile ARGs (services/sidecar/Dockerfile, core/Dockerfile). |
Domain overlay: deploy/compose/docker-compose.domain.yml derives the consoles' public URLs and core's issuer settings from the PUBLIC_* values.
Where to look for the rest
- Exhaustive core list: every
${NAME:default}incore/app-config/src/main/resources/application.ymland itsapplication-{security,knowledge,workflow,mcp,mcpserver}.ymlprofiles. Job/worker shapes haveapplication-shape-*.yml,app-jobs/…/application-jobs.ymlandapp-worker/…/application-worker.yml, which were not enumerated. - Per-service variables for sidecar, code-intel, app-builder, voice-agent: set in their
docker-compose.ymlblocks and Helm chart values (deploy/helm/charts/vegaduta/VALUES.md). - Related pages: Docker Compose Stack, Local Development Setup, Glossary.
Evidence & references
core/.env.example(277 lines, the full commented list),deploy/compose/.env.example,web/.env.local.examplecore/app-config/src/main/resources/application.yml,application-security.yml,application-knowledge.yml,application-workflow.yml,application-mcp.ymlweb/Dockerfile,web-admin/Dockerfile,services/sidecar/Dockerfile,core/Dockerfiledeploy/compose/docker-compose.yml,docker-compose.domain.yml;deploy/helm/charts/vegaduta/values.yaml