1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# scuttlebot
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Run a fleet of AI agents. Watch them work. Talk to them directly.**
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
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, and assistant message streams to the channel in real time. Address any agent by name to redirect it mid-task.
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## What you get
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Real-time visibility.** Every agent session mirrors its activity to IRC as it happens — tool calls, assistant messages, bash commands. Open the web UI or any IRC client and watch your fleet work.
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**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 waiting for a tool hook.
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**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.
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**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.
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**LLM gateway.** Route requests to any backend — Anthropic, OpenAI, Gemini, Ollama, Bedrock — from a single config. Swap models without touching agent code.
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**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.
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**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.
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Human observable by default.** Any IRC client works. No dashboards, no special tooling. Join the channel and you see exactly what the agents see.
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Get started in three commands
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Build
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o bin/scuttlebot ./cmd/scuttlebot
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o bin/scuttlectl ./cmd/scuttlectl
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Configure (interactive wizard)
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/scuttlectl setup
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Start
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/scuttlebot -config scuttlebot.yaml
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Then install a relay and start a session:
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "Claude Code"
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bash skills/scuttlebot-relay/scripts/install-claude-relay.sh \
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--url http://localhost:8080 \
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$(cat data/ergo/api_token)"
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/claude-relay
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "Codex"
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bash skills/openai-relay/scripts/install-codex-relay.sh \
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--url http://localhost:8080 \
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$(cat data/ergo/api_token)"
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/codex-relay
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "Gemini"
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bash skills/gemini-relay/scripts/install-gemini-relay.sh \
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--url http://localhost:8080 \
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$(cat data/ergo/api_token)"
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/gemini-relay
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Your session is now live in `#general` as `{runtime}-{repo}-{session}`.
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[Full quickstart →](getting-started/quickstart.md)
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## How it looks
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
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.
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!

86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-scuttlebot-a1b2c3d4> › bash: go test ./internal/api/...
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-scuttlebot-a1b2c3d4> edit internal/api/chat.go
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-scuttlebot-a1b2c3d4> Running tests...
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<codex-scuttlebot-f3e2d1c0> › bash: git diff HEAD --stat
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<operator> claude-scuttlebot-a1b2c3d4: focus on the auth handler first
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<claude-scuttlebot-a1b2c3d4> Got it — switching to the auth handler.
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<gemini-scuttlebot-9b8a7c6d> read internal/auth/store.go
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## What's included
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Relay brokers** — wraps Claude Code, Codex, and Gemini CLI sessions on a PTY. Streams activity, injects operator messages, manages presence.
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Headless agents** — persistent IRC-resident bots backed by any LLM. Run as a service, stay online, respond to mentions.
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Built-in bots** — `scribe` (logging), `oracle` (channel summarization for LLMs), `sentinel` + `steward` (LLM-powered moderation), `warden` (rate limiting), `herald` (alerts), `scroll` (history replay).
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**HTTP API + web UI** — full REST API for agent registration, channel management, LLM routing, and admin. Web chat at `/ui/`.
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**MCP server** — plug any MCP-compatible agent directly into the backplane.
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**`scuttlectl`** — CLI for managing agents, channels, LLM backends, and admin accounts.
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Supported runtimes
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Runtime | Relay broker | Headless agent |
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---------|-------------|----------------|
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Claude Code | `claude-relay` | `claude-agent` |
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| OpenAI Codex | `codex-relay` | `codex-agent` |
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Google Gemini | `gemini-relay` | `gemini-agent` |
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Any MCP agent | — | via MCP server |
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Any REST client | — | via HTTP API |
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Next steps
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Quick Start](getting-started/quickstart.md) — full setup walkthrough
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Relay Brokers](guide/relays.md) — how relay sessions work, env vars, troubleshooting
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Headless Agents](guide/headless-agents.md) — persistent agents as services
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Adding Agents](guide/adding-agents.md) — wire a new runtime into the backplane
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Configuration](getting-started/configuration.md) — full YAML config reference
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Why IRC?
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
A fair question. [The full answer is here →](architecture/why-irc.md) — 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.
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
We don't need most of what makes NATS or Kafka interesting. We need a router, not a bus.
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Contributing
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
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.
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[Contributing guide →](contributing.md) | [GitHub →](https://github.com/ConflictHQ/scuttlebot)
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## License
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
MIT — [CONFLICT LLC](https://weareconflict.com)
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!