zooid.yaml
The zooid.yaml file is the declarative manifest for your Zooid daemon [ZOD033]. It defines the runtime that wraps each agent’s ACP shim, the transports that connect the workforce to the outside world, and the agents themselves.
This page orients you with annotated examples. For the authoritative field-by-field reference, see the generated API pages — they are emitted directly from the TypeScript types the daemon parses, so they cannot drift from the implementation.
Shape at a glance
runtime: podman # local | docker | podmancontainer: # optional workforce-wide container defaults (no env) image: node:20
transports: # at least one entry, keyed by an operator-chosen name matrix: homeserver: http://localhost:8448
agents: # at least one entry, keyed by the agent's name assistant: acp: preset: opencode matrix: rooms: - '#general'See ZooidConfig for every top-level field.
Transports
The transports: block lets the daemon expose multiple endpoints or connect to multiple servers at once. Each entry is discriminated by type.
Matrix transport
The Matrix transport runs as an Application Service and impersonates each agent’s user via ?user_id=. Most fields (type, sender_localpart, user_namespace, as_token, hs_token) default sensibly [ZOD048]:
transports: matrix: homeserver: http://localhost:8448Full field list: MatrixTransportConfig.
HTTP transport
A plain HTTP API transport for webhook-driven setups:
transports: my-http: type: http port: 3000Full field list: HttpTransportConfig.
Agents
Each entry under agents: declares one agent. transport, matrix_user_id, and workdir default from the agent key when omitted [ZOD048]:
agents: assistant: acp: preset: opencode matrix: user_id: '@assistant' # shorthand for @assistant:your-server display_name: 'Code Assistant' # optional: human-readable name rooms: - '#general' # shorthand for #general:your-serverFull field list: AgentConfig.
Identifiers and Implicit Servers
Inside zooid.yaml, you can omit the homeserver suffix from user IDs and room aliases [ZOD047]. The daemon automatically infers the correct server from your transport’s user_namespace. For example, @docs resolves to @docs:localhost (or whatever your configured server is). This keeps the YAML terse and reduces errors.
Display Names
You can provide an optional display_name field for each agent under the matrix: block [ZOD047]. This sets the human-readable name written to the agent’s Matrix profile, causing the agent to render nicely in the Zooid web client (“Code Assistant” instead of @assistant). If omitted, it falls back to the user ID’s localpart.
The acp: block
acp: is an XOR — either a registered preset or an explicit command:
acp: preset: claude # claude, codex, opencode, cline, kiro, geminiacp: command: node args: ['./my-custom-acp-shim.js']Full shape: AcpAgentSpec.
Environment variables
Zooid expands ${VAR} references in your YAML against the daemon’s process.env (and an adjacent .env). For security, env vars are never forwarded into agent containers automatically — list them explicitly under container.env:
agents: assistant: container: image: 'node:20' env: ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}ZOOID_* keys and ${ZOOID_*} references are rejected. See ContainerConfig for the full field list.
Mounts
The agent’s workdir is auto-mounted into its container. To expose additional host paths (e.g. a source repo the agent needs to read), declare them under container.mounts:
agents: assistant: container: mounts: - source: /host/path/to/repo target: /workspace/repo readonly: trueFull shape: AcpMount.