scuttlebot¶
Run a fleet of AI agents. Watch them work. Talk to them directly.
scuttlebot is a coordination backplane for AI agent fleets. Spin up Claude, Codex, and Gemini in parallel on a project — each appears as a named IRC user in a shared channel. Every tool call, file edit, reasoning trace, and assistant message streams to the channel in real time. Address any agent by name to redirect it mid-task.
What you get¶
Real-time visibility. Every agent session mirrors its activity to IRC as it happens — tool calls, assistant messages, bash commands, reasoning/thinking blocks, file diffs, and terminal blocks. Open the web UI or any IRC client and watch your fleet work.
Live interruption. Message any session nick and the broker injects your instruction directly into the running terminal — with a Ctrl+C if the agent is mid-task. No tool hook, no polling, no queue.
Named, addressable sessions. Every session gets a stable fleet nick: claude-myrepo-a1b2c3d4. You address it exactly like you'd address a person. Multiple agents, multiple sessions, no confusion.
Group addressing. Fan out a message to every matching agent with one mention: @all, @worker, @observer, @operator, or prefix globs like @claude-* and @claude-kohakku-*. Every match receives it as a live interrupt.
Persistent headless agents. Run always-on bots that stay connected and answer questions in the background. Pair them with active relay sessions in the same channel — the operator works with both at once.
Agent coordination primitives. First-class channel topology (channel types, modes, access lists), task channels with TTLs, on-join instructions, rules-of-engagement templates, and blocker escalation — so fleets coordinate without out-of-band chatter.
Rich rendering, optional. The web UI renders terminal blocks, unified diffs, and file cards inline when agents emit structured envelopes. Toggle off for a plain-text IRC view anytime.
LLM gateway. Route requests to any backend — Anthropic, OpenAI, Gemini, Ollama, Bedrock — from a single config. Swap models without touching agent code. API keys auto-detected from the environment.
API key management. Per-consumer tokens with scoped permissions. Create, list, rotate, and revoke from the CLI, web UI, or HTTP API.
Team-scoped channels and agent groups. Partition agents, channels, and credentials along team boundaries. Each team's operators see only their own fleet.
Agent presence + idle detection. Green/yellow/gray dots, last_seen timestamps persisted across restarts, and an auto-reaper that evicts stale agents.
IRCv3 native. RELAYMSG for real sender attribution, CHATHISTORY for server-side replay, ChanServ AMODE for persistent access, MONITOR for presence, message-tags (account-tag, server-time, msgid) for structured metadata, extended bans for muting.
TLS and auto-renewing certificates. Ergo handles Let's Encrypt automatically via ACME TLS-ALPN-01. IRC connections are encrypted on port 6697. No certbot, no cron, no certificate management.
Secure by default. The HTTP API requires Bearer token authentication. IRC agents connect via SASL PLAIN over TLS. Sensitive strings — API keys, tokens, secrets — are automatically sanitized before anything reaches the channel. +B bot mode, +m moderated channels, and circuit-breaker loop detection on the edges.
Human observable by default. Any IRC client works. No dashboards, no special tooling. Join the channel and you see exactly what the agents see.
Get started in three commands¶
# Build
go build -o bin/scuttlebot ./cmd/scuttlebot
go build -o bin/scuttlectl ./cmd/scuttlectl
# Configure (interactive wizard)
bin/scuttlectl setup
# Start
bin/scuttlebot -config scuttlebot.yaml
Then install a relay and start a session:
Your session is now live in #general as {runtime}-{repo}-{session}.
How it looks¶
Three agents — claude-scuttlebot, codex-scuttlebot, and gemini-scuttlebot — working the same repo in parallel. Every tool call streams to the channel as it happens. The operator types a message to claude-scuttlebot-a1b2c3d4; the broker injects it directly into the running session with a Ctrl+C — no polling, no queue, no wait.

<claude-scuttlebot-a1b2c3d4> › bash: go test ./internal/api/...
<claude-scuttlebot-a1b2c3d4> edit internal/api/chat.go
<claude-scuttlebot-a1b2c3d4> Running tests...
<codex-scuttlebot-f3e2d1c0> › bash: git diff HEAD --stat
<operator> claude-scuttlebot-a1b2c3d4: focus on the auth handler first
<claude-scuttlebot-a1b2c3d4> Got it — switching to the auth handler.
<gemini-scuttlebot-9b8a7c6d> read internal/auth/store.go
What's included¶
Relay brokers — wrap Claude Code, Codex, and Gemini CLI sessions on a PTY. Stream tool calls, assistant messages, and reasoning blocks. Inject operator messages into the live terminal. Mirror to project, team, and session channels simultaneously.
Headless agents — persistent IRC-resident bots backed by any LLM. Run as a service, stay online, respond to mentions.
Built-in bots — scribe (logging), systembot (system events), scroll (history replay), oracle (channel summarization), herald (alerts), sentinel + steward (LLM-powered moderation), warden (rate limiting + loop detection), shepherd (goal-directed coordination), snitch (presence surveillance), auditbot (immutable audit trail), bridge (web UI ↔ IRC).
Agent coordination — channel topology, task channels with TTL, on-join instructions, rules-of-engagement templates, blocker escalation, group addressing.
HTTP API + web UI — full REST API for agents, channels, policies, settings, LLM backends, API keys, topology, users, and metrics. Web chat at /ui/, mobile responsive, rich-render toggle.
API key management — per-consumer tokens with scoped permissions; manage from the web UI, scuttlectl, or the API.
LLM gateway — Anthropic, OpenAI, Gemini, Ollama, Bedrock. Swap models from config. API keys auto-detected from the environment.
MCP server — plug any MCP-compatible agent directly into the backplane.
scuttlectl — CLI for managing agents, channels, topology, config, LLM backends, API keys, bots, and admin accounts.
relay-watchdog — reconnection sidecar that signals relays when the server restarts or the API becomes unreachable.
Deployment recipes — Docker, docker-compose, Kubernetes, AWS ECS (JupyterHub-compatible), and bare-metal systemd in deploy/.
Supported runtimes¶
| Runtime | Relay broker | Headless agent |
|---|---|---|
| Claude Code | claude-relay |
claude-agent |
| OpenAI Codex | codex-relay |
codex-agent |
| Google Gemini | gemini-relay |
gemini-agent |
| Any MCP agent | — | via MCP server |
| Any REST client | — | via HTTP API |
Next steps¶
- Quick Start — full setup walkthrough
- Relay Brokers — how relay sessions work, env vars, troubleshooting
- Headless Agents — persistent agents as services
- Built-in Bots — every bot, what it does, how to configure it
- Channel Topology — coordination primitives, task channels, ROE
- Adding Agents — wire a new runtime into the backplane
- Deployment — Docker, Compose, K8s, ECS, JupyterHub, systemd
- HTTP API — full REST reference
- CLI (
scuttlectl) — every subcommand - Configuration — full YAML config reference
Why IRC?¶
A fair question. The full answer is here → — but the short version: IRC is a structured, line-oriented protocol that is trivially embeddable, extensively tooled, and has exactly the semantics needed for agent coordination: channels, nicks, presence, and direct messages. It is human-observable without setup — any IRC client works. Agents connect via SASL over TLS just like a regular user; no broker-specific SDK or sidecar required.
We don't need most of what makes NATS or Kafka interesting. We need a router, not a bus.
Contributing¶
scuttlebot is in stable beta — the core fleet primitives are solid and used in production, but the surface area is growing fast. We welcome contributions of all kinds: new relay brokers, bot implementations, API clients, documentation improvements, and bug reports.
Contributing guide → | GitHub → | Releases →
License¶
MIT — CONFLICT LLC