Configuration reference
Environment variables, Helm values, project YAML, and agent app YAML schema for Helix deployments.
Project YAML
Projects are defined in YAML. The full schema:
apiVersion: helix.ml/v1alpha1
kind: Project
metadata:
name: my-app # Used as the project identifier
spec:
description: "What this project is for"
repositories:
- url: "https://github.com/org/my-app"
branch: main
primary: true # The primary repo is cloned first and receives PRs
- url: "https://github.com/org/shared-lib"
branch: main
agent:
name: "My Agent"
runtime: claude_code # claude_code | goose_code | qwen_code | zed_agent
model: claude-sonnet-4-6 # omit for claude_code
provider: anthropic # anthropic | openai | helix | (any configured provider)
code_agent_credential_type: api_key # api_key (default) | subscription (Claude Code only)
# Goose-specific:
goose:
recipes:
- name: triage
path: .goose/recipes/triage.yamlAgent app YAML
Agent apps (called assistants in the YAML schema) configure conversational agents with skills, knowledge, and triggers. See Build an agent app for a walkthrough.
name: My Assistant
description: "What this agent app does"
assistants:
- name: Support
model: claude-sonnet-4-6
provider: anthropic
system_prompt: |
You are a helpful assistant.
temperature: 0.3
max_tokens: 4096
max_iterations: 10
agent_type: helix_agent # helix_basic | helix_agent
# Skills
web_search:
enabled: true
max_results: 10
browser:
enabled: true
# Knowledge bases (RAG) — see guide-rag-knowledge
knowledge:
- name: my-docs
description: "Product documentation"
refresh_enabled: true
refresh_schedule: "0 */6 * * *"
rag_settings:
results_count: 4
chunk_size: 1024
chunk_overflow: 64
enable_vision: false # true to index images and scanned PDFs
source:
web:
urls:
- https://docs.example.com/
crawler:
enabled: true
max_depth: 2
max_pages: 200
readability: true
# API integrations (OpenAPI)
apis:
- name: My API
description: "Internal API"
url: https://api.example.com
schema: ./openapi.yaml
headers:
Authorization: Bearer ${MY_API_KEY}
# MCP servers — HTTP transport
mcps:
- name: My MCP Server
url: https://mcp.example.com/tools
headers:
Authorization: Bearer ${MCP_TOKEN}
# MCP servers — stdio transport (runs as subprocess)
# mcps:
# - name: Filesystem
# type: stdio
# cmd: npx
# args: ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
# Triggers — see guide-triggers
triggers:
- slack:
bot_token: ${SLACK_BOT_TOKEN}
channels:
- support
- teams:
tenant_id: ${TEAMS_TENANT_ID}
client_id: ${TEAMS_CLIENT_ID}
client_secret: ${TEAMS_CLIENT_SECRET}
- discord:
bot_token: ${DISCORD_BOT_TOKEN}
guild_id: "123456789"
- cron:
schedule: "0 9 * * 1-5"
input: "Generate daily summary"
- webhook: {} # Helix generates a unique URL
- azure_devops:
org_url: https://dev.azure.com/myorg
token: ${AZURE_DEVOPS_TOKEN}
events: [work_item_created, work_item_updated]
- crisp:
website_id: ${CRISP_WEBSITE_ID}
api_key: ${CRISP_API_KEY}
api_secret: ${CRISP_API_SECRET}Control plane environment variables
These are passed via controlplane.extraEnv in the Helm chart (or as environment variables in a non-Kubernetes deploy). See Linux & Kubernetes for how to set them.
Desktop streaming
| Variable | Default | Description |
|---|---|---|
HELIX_VIDEO_MODE | zerocopy | PipeWire capture: zerocopy (DMA-BUF→CUDA, fastest), native (DMA-BUF via GStreamer), shm (shared memory, most compatible). Use shm if browser shows endless reconnects. |
HELIX_ENCODER | auto | H.264 encoder: nvenc (NVIDIA), vaapi/vaapi-legacy (Intel/AMD), openh264/x264 (software). |
HELIX_GOP_SIZE | 120 | Group of Pictures size in frames (120 = 2s at 60fps). Lower = faster mid-stream join. |
HELIX_RENDER_NODE | unset | VA-API render device path (e.g. /dev/dri/renderD129). Set on multi-GPU hosts. Use SOFTWARE to disable VA-API. |
Control plane behaviour
| Variable | Default | Description |
|---|---|---|
HELIX_DISABLE_VERSION_CHECK | unset | Disable the upstream version-check ping at startup. Set to any non-empty value. |
HELIX_SKIP_AUTOMIGRATE | unset | Skip GORM AutoMigrate on startup. Only set if you run schema migrations out-of-band. |
HELIX_GITHUB_BASE_URL | https://github.com | Override for GitHub Enterprise Server. |
FRONTEND_URL | (from serverUrl) | Public URL of the Helix UI, injected into email links and OAuth callbacks. |
Sandbox host (sandbox.extraEnv)
| Variable | Default | Description |
|---|---|---|
HELIX_SANDBOX_APT_MIRROR | unset | Override APT mirror for dev container bootstrapping. Useful in air-gapped environments. |
Helm chart key reference
helix-controlplane
| Key | Description |
|---|---|
global.serverUrl | Public URL of the deployment. Must be set correctly — sandboxes use it to reach the control plane. |
controlplane.licenseKeyExistingSecret | Kubernetes secret name containing the license key |
controlplane.encryptionKeyExistingSecret | AES-256-GCM encryption key secret. Do not rotate after data is written. |
controlplane.runnerTokenExistingSecret | Shared token for sandbox↔control-plane auth |
controlplane.providers.* | LLM provider configuration (see Configure LLM providers) |
controlplane.extraEnv | Additional environment variables for the control plane pod |
global.extraEnv | Environment variables for all pods (useful for proxy settings) |
helix-sandbox
| Key | Description |
|---|---|
sandbox.apiUrl | URL of the control plane, as seen from inside the cluster |
sandbox.runnerTokenExistingSecret | Must match controlplane.runnerTokenExistingSecret |
sandbox.extraEnv | Additional environment variables for the sandbox pod |
Full values-example.yaml files are in the Helix repository.