Multi-Framework AI Agent Swarm Orchestration
Zoink is an open-source CLI, terminal dashboard, and web dashboard for running AI agent swarms inside Docker. Define your team in swarm.yaml, launch it with one command, then manage runtime, health, logs, state, task flow, and chat from the CLI, the TUI, or a browser.
npm install -g @zoink-dev/zoink-cli
zoink config init
zoink up
View on GitHub » · npm package » ·
Zoink is a multi-framework control plane for AI agents. v0.3 evolved it from a single-framework orchestrator into a tool that can run OpenClaw and Hermes agents side-by-side in the same swarm, sharing one Docker network, one workspace, and one Kanban board.
Each agent runs in its own isolated Docker container with persistent state, health checks, resource limits, and bearer-authenticated HTTP access for chat and config reload.
Who it’s for
runtime fieldswarm.yaml v2.0 — frameworks, runtime, provider, image, profiles, cpu_limit, memory_limit, gateway, ports, persistState, autoPickup, temperature, skills, optional kanban blockzoink up / zoink down handles networks, containers, volumes, and the Kanban boardzoink up safely; containers are matched by zoink.swarm + zoink.agent labelszoink config validate reports issues with file, line, and column contextmodel, temperature, skills) and prompts before restarts for critical changesdefault, hybrid, and coding-team via zoink config init --templateworkspace/agent-state/<agent>/<runtime>/ survive zoink down / zoink up. Disable with persistState: false. Export with zoink agent state export.zoink ps, dashboards, and crash-loop detectioncpu_limit / memory_limit become Docker constraints; zoink agent stats shows live usageconfigFiles: [{source, target, mode}] drops verbatim files into an agent’s state mount before bootkanban.yaml with add, move, assign, and watch commandszoink run task "<goal>" sends a high-level goal to the PM agent for decompositionzoink run query --agent <role>autoPickup: true self-claim assigned To Do cards (with repoUrl), clone the repo into their persistent state, run, and move the card to Donezoink daemon with login + cookie authchat_completions fallback for legacy gatewayszoink daemon start runs a long-lived HTTP service for remote Kanban, agent control, chat, and SSE eventskanban: { mode: remote } routes every Kanban command and pickup loop through the daemon over HTTP--follow, --tail, --since, --until, and automatic API-key redactionprovider.name + keyEnv / key / baseUrl for OpenAI, Anthropic, OpenRouter, Google, and OpenAI-compatible gateways~/.zoink/config.yml for default_model, dashboard.theme, chat.adapter, and api_keys.<provider>pm, coder, researcher, devops) plus user-created templates under ~/.zoink/roles/| Command | Description |
|---|---|
zoink up |
Launch the swarm, create the network, initialize kanban.yaml |
zoink down |
Stop and remove swarm containers and network (state is preserved) |
zoink ps |
Show name, role, runtime, status, health, container ID |
zoink dashboard |
Open the terminal dashboard |
| Command | Description |
|---|---|
zoink agent spawn <name> |
Add a new agent using runtime-aware defaults |
zoink agent rm <name> |
Remove an agent container |
zoink agent pause / unpause <name> |
Pause / resume a container |
zoink agent exec <name> [cmd] |
Run a command inside an agent |
zoink agent logs <name> [-f] [--tail N] |
Stream logs with filtering and redaction |
zoink agent stats <name> [--stream] |
One-shot or live Docker resource stats |
zoink agent state export <name> |
Tar an agent’s persistent state directory |
| Command | Description |
|---|---|
zoink config init [--template <name>] |
Generate a v2 swarm.yaml (templates: default, hybrid, coding-team) |
zoink config validate |
Validate swarm.yaml against the v2 schema with line numbers |
zoink config reload [--mode hot\|hybrid\|restart\|off] |
Apply safe changes and prompt for restarts on critical changes |
zoink config set / get |
Read or write global config in ~/.zoink/config.yml |
zoink config role list / create / delete |
Manage built-in and user-created role templates |
| Command | Description |
|---|---|
zoink kanban show |
Display the shared board |
zoink kanban add --title <text> [--repo-url <url>] [--assign <agent>] |
Add a card; --repo-url enables autonomous pickup |
zoink kanban move <id> <column> |
Move between To Do, In Progress, Done |
zoink kanban assign <id> <agent> |
Assign a card |
zoink kanban watch [--json] |
Watch the board (debounced diffs or JSON events) |
| Command | Description |
|---|---|
zoink run task "<description>" [--repo-url <url>] |
Delegate to the PM agent; falls back to a local card if unreachable |
zoink run query "<prompt>" --agent <role> |
Stream a direct query to any agent role |
| Command | Description |
|---|---|
zoink daemon start --token-env <VAR> [--port 9999] [--bind 127.0.0.1] |
Start the HTTP daemon (web SPA + APIs) |
zoink daemon status |
Report bind, workspace, auth source, PID |
zoink daemon stop |
Gracefully stop the running daemon |
Both the terminal dashboard (zoink dashboard) and the browser dashboard (served by zoink daemon start) provide the same five-tab experience:
| Tab | Features |
|---|---|
| Overview | Swarm health summary, activity feed, crash-loop events, command/task input |
| Kanban | Interactive board backed by kanban.yaml, with add/move/assign and approval modal |
| Logs | Multi-agent log viewer with filtering, follow mode, secret redaction |
| Agents | Runtime, health, status, resource stats, pause/exec controls |
| Chat | Stream a conversation with any gateway-enabled agent (history persisted to chat-history.yaml) |
The TUI honors zoink config set dashboard.theme dark|light. The web dashboard adds a login page that exchanges a bearer token for a zoink_session HttpOnly cookie.
A single zoink daemon instance can serve:
GET /)/kanban, /kanban/events)/api/agents/:name/{pause,unpause,restart,logs/events,stats/events})/api/agents/:name/chat/...)/api/approvals/:requestId/decision)/auth/login, /auth/logout, /auth/me)/events) and health (/health)All API routes require Authorization: Bearer <token> or the zoink_session cookie. The daemon binds to 127.0.0.1 by default; expose it wider with --bind 0.0.0.0 and put TLS termination in front of it (nginx, Caddy, etc.).
To share one board across multiple swarm hosts, set kanban: { mode: remote, daemonUrl, authTokenEnv } in each consumer swarm.yaml. Every zoink kanban subcommand and the autonomous-pickup cron will then talk to the daemon over HTTP instead of touching kanban.yaml directly.
| Runtime | Default image | What it adds |
|---|---|---|
openclaw (default) |
ghcr.io/openclaw/openclaw:latest |
OpenClaw defaults, process-based health check, config mount at /root/.openclaw/config |
hermes |
nousresearch/hermes-agent:v2026.4.23 |
Hermes defaults, profile support, HTTP /health check, data mount at /opt/data |
Mixed-framework swarms share one Docker network and one workspace, so OpenClaw and Hermes agents collaborate inside the same project.
>= 20Zoink is released under the MIT License.
Made with care by the Zoink community.