WHAT RUNS
WHERE.

EmperorClaw is a server, not a single-binary CLI. A Next.js panel, a WebSocket control plane and PostgreSQL run in Docker; each agent runs in its own container and keeps its state in a volume and in the database, so a restart is not a lost day of work.

The install is one command, or one compose file

curl -fsSL https://raw.githubusercontent.com/emperorclaw/emperorclaw/main/install.sh | bash

The installer writes to ~/emperorclaw, warns if port 3000 (or 80/443 for a domain) is taken, starts the stack, waits for the app and database to report ready, and opens the browser. On Ubuntu/Debian it can install Docker Engine itself; macOS and Windows need Docker Desktop. Images are published for amd64 — Apple Silicon runs them through Docker Desktop emulation.

The stack is small and boring on purpose:

ServiceWhat it is
appghcr.io/emperorclaw/emperorclaw — the panel, the REST/MCP API and the WebSocket control plane
postgrespostgres:16-alpine, data in the pgdata volume
caddyoptional automatic HTTPS when you give the installer a domain
drive-syncoptional rclone sidecar for Google Drive backups

A source build is supported and documented: Node.js 20+ and PostgreSQL, npm run dev for the development server (a tsx server wrapper, because the app needs WebSockets), db:migrate for the schema. What is not offered is an npx-style single binary: this is a multi-user server with a panel, a database and a control plane, not a process manager for your terminal.

Every agent gets its own container

Hiring an agent with Local: this machine provisions it as a sibling Docker container on the Emperor host, named emperor-<agent>-<id8>, created with RestartPolicy: unless-stopped, joined to the app's Docker network, and given its own API token and the app's internal URL. You can docker exec into it, read its logs, and hit Recreate Runtime in the agent panel to stop, remove and re-provision it — the same primitive used for image updates and model-key rotations.

What survives that recreation is the point: a named Docker volume is mounted at /home/hermes/.hermes/profiles, holding the agent's model configuration, SOUL.md, sessions (state.db), local memory and skills. One Emperor agent maps to one Hermes profile, and that profile is the isolation boundary for memory, sessions and keys.

Agents do not have to live on the Emperor host. Settings → Runtime hosts connects another machine over SSH; the host reports free memory and disk against what a new agent needs, whether a browser is installed, and how many agents it already runs. Hosted deployments without Docker socket access run Emperor and put the workers on another machine. OpenClaw is supported as a second runtime.

State survives a restart

Tasks, notes, approvals, messages, run records and costs live in PostgreSQL, not in a terminal buffer. Three mechanisms keep work moving when something dies:

What the platform model costs you

AspectEmperorClawA local Node CLI
InstallDocker required; one commandnpx, nothing else
IsolationOne container and one profile per agentAgents share your shell and your files
24/7 on a serverNative: compose stack with restart policiesYours to wire: systemd, PM2 or a tmux session
Survives a terminal closingYes — state is in Postgres, agents are containersNo, unless you daemonize it yourself
First five minutesSlower: Docker pull and setupFaster: nothing to install

Three limits worth stating plainly. Containers are not virtual machines: agents on one host share the kernel, and agent containers join the app's Docker network by default, so treat the container as isolation of files, keys and process — not as a hostile-code sandbox. Resource limits are real but coarse: each agent container is created with a 1 GiB memory limit and 1.5 CPUs (Memory and NanoCpus in src/lib/hermes-provisioning.ts), so one runaway agent cannot eat the host, but the panel does not expose a per-agent slider and no PID limit or read-only root filesystem is set. Third: published images are amd64.

Where to check

Next→ Capability by capability