Skip to main content
HQ’s default Compose stack has seven services that work together. The UI runs on its own; the other six are gateway services that run agents, process data, and handle event-driven plugins.

ui

Next.js dashboard. Renders the workspace — agents, CRM, tasks, knowledge, routines, settings — and writes to Supabase through server actions. Port 3000.

gateway

Agent runtime host. Runs OpenClaw, Chrome/Chromium, XFCE desktop, noVNC, and the files API. This is where agents live. Port 18790 (files API). noVNC runs inside the container and is proxied through the UI — no host port needed.

dispatcher

Inbox daemon. Watches agent_inbox_items for new work, filters to agents on the local gateway, checks budget status, and wakes agents through OpenClaw.

runner

Command daemon. Watches agent_commands, leases commands for the local gateway, executes lifecycle and auth operations, and reports results back to Supabase.

embedder

Knowledge indexing daemon. Runs FastEmbed locally with the BGE embedding model pre-loaded in the image. Indexes pending knowledge items into searchable knowledge chunks. Override the model via EMBEDDER_MODEL env var — non-default models download on first boot.

file-processor

File processing daemon. Leases uploaded knowledge files (PDF, DOCX, XLSX, CSV, PPTX, TXT), extracts plain text, and triggers embedding. Runs independently so file processing doesn’t block other gateway operations.

plugin-runner

Plugin daemon. Watches the hq_plugin_event_queue for events emitted by SQL triggers and dispatches them to enabled plugins — local Python handlers or remote webhook endpoints with HMAC signatures. See Plugins.

Shared state

The gateway, dispatcher, and runner containers share the gateway-state Docker volume (mounted at /home/openclaw/.openclaw). This volume holds OpenClaw config, the bare git repo, agent worktrees, browser profiles, and auth state. The embedder uses gateway-embedding-cache for downloaded local embedding models, so restarts reuse the cached BGE files. The runner additionally mounts /var/run/docker.sock so it can restart sibling containers when needed.
For single-host installs, start everything with docker compose --profile gateway up -d. For multi-host setups, run docker compose up -d ui separately from the gateway services. See Add a gateway.