Architecture for operators
How Helix's components fit together. What runs where, what talks to what, and what you need to provide.
Components
Helix has three distinct tiers:
1. Control plane
The control plane is the main Helix API and UI. It manages:
- User authentication and organizations
- Projects, spec tasks, and the Kanban board
- Repository connections and code intelligence indexing
- Assistant and agent configuration
- Orchestration of sandbox sessions
The control plane is a single Go binary serving HTTP on port 8080 (or whatever you configure). It ships as a Docker image and a Helm chart (helix-controlplane).
Dependencies:
- PostgreSQL (main database; bundled in the chart or external)
- pgvector with vectorchord extension (for RAG and code intelligence; bundled separately)
- An LLM provider for inference (configured via
controlplane.providers)
2. Sandbox (Hydra)
The sandbox is a separate service that runs agent desktop sessions. It uses Docker-in-Docker to provide isolated container environments for each session.
The sandbox ships as a Helm chart (helix-sandbox). It connects to the control plane via a shared runner token.
Dependencies:
- The control plane must be reachable from inside the sandbox
- Privileged pods (for Docker-in-Docker)
- GPU nodes (for hardware video encoding; software fallback available)
- Large persistent volumes (for Docker image cache)
3. Agent (inside the sandbox)
The code agent (Claude Code, Goose, Qwen Code, or Zed Agent) runs inside a container that the sandbox provisions per session. The agent:
- Connects to Zed IDE via ACP
- Routes inference through the control plane's
/v1proxy - Clones the project's repositories
- Makes commits to a working branch
The agent process is started automatically when a sandbox session starts.
Network diagram
Internet / User Browser
│
│ HTTPS (port 443 or 8080)
↓
Control Plane (API + UI)
│
├── Postgres (main DB)
├── pgvector (vector DB for RAG/code intelligence)
├── SearXNG (web search for assistants)
└── Chrome (headless browser for assistants)
│
│ Internal HTTP (runner token auth)
↓
Helix Sandbox (Docker-in-Docker host)
│
└── Hydra (session isolation)
├── Agent Session A ──────────────┐
│ └── Code Agent │ WebSocket
├── Agent Session B │ (H.264 video)
└── ... ↓
User Browser
SearXNG and Chrome serve the web search API and the agents' web search and browser skills. See Configure web search.
The video stream for agent desktop sessions goes directly from the sandbox to the user browser over WebSocket — the control plane doesn't proxy video.
Ports
| Service | Port | Notes |
|---|---|---|
| Control plane API + UI | 8080 | The main entry point for users |
| Sandbox (internal) | 8080 | Internal only; not exposed to users |
| Agent video WebSocket | 8080+ | Multiplexed through the control plane URL |
For production, put a reverse proxy (nginx, Traefik) in front of the control plane to handle TLS and serve on 443.
global.serverUrl
The global.serverUrl Helm value (or FRONTEND_URL env var) is the public URL that:
- Users type into their browsers
- OAuth callbacks return to
- Sandbox containers use to reach the control plane API for inference
This must be set correctly. In Kubernetes, localhost resolves to the pod itself — if you set this to http://localhost:8080, agent inference will fail with connection errors. Set it to either:
- The cluster-internal service URL:
http://my-helix-controlplane.helix.svc.cluster.local - Your public ingress hostname:
https://helix.example.com
What you provide
| What you provide | Notes |
|---|---|
| LLM provider API keys | Anthropic, OpenAI, etc. — or a self-hosted endpoint |
| Source control OAuth app | GitHub App, GitLab OAuth consumer, or Bitbucket OAuth consumer |
| TLS termination | Ingress with cert-manager or a load balancer |
| License key | From your account |
| Encryption key | 32-byte hex string; generate once, never rotate |
| Storage | PVCs for Postgres, pgvector, and the control plane data volume |
| GPU nodes (optional) | For hardware video encoding; software fallback available |
Scaling
- Control plane: Stateless beyond the database. Scale horizontally by adding replicas; use a shared Postgres and pgvector.
- Sandbox: Scales by adding GPU nodes. The sandbox chart can run on multiple nodes; Hydra distributes sessions.
- Database: Use a managed Postgres (Amazon RDS, Cloud SQL, Azure Flexible Server) for production HA. Keep pgvector on the bundled chart (it requires extensions that managed services don't provide).