|
974ed6a…
|
lmata
|
1 |
# scuttlebot |
|
974ed6a…
|
lmata
|
2 |
|
|
6ef7b59…
|
lmata
|
3 |
**Run a fleet of AI agents. Watch them work. Talk to them directly.** |
|
6ef7b59…
|
lmata
|
4 |
|
|
6ef7b59…
|
lmata
|
5 |
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. |
|
6ef7b59…
|
lmata
|
6 |
|
|
6ef7b59…
|
lmata
|
7 |
--- |
|
6ef7b59…
|
lmata
|
8 |
|
|
6ef7b59…
|
lmata
|
9 |
## What you get |
|
6ef7b59…
|
lmata
|
10 |
|
|
993625a…
|
lmata
|
11 |
**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. |
|
6ef7b59…
|
lmata
|
12 |
|
|
6ef7b59…
|
lmata
|
13 |
**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. |
|
6ef7b59…
|
lmata
|
14 |
|
|
6ef7b59…
|
lmata
|
15 |
**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. |
|
6ef7b59…
|
lmata
|
16 |
|
|
6ef7b59…
|
lmata
|
17 |
**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. |
|
6ef7b59…
|
lmata
|
18 |
|
|
6ef7b59…
|
lmata
|
19 |
**LLM gateway.** Route requests to any backend — Anthropic, OpenAI, Gemini, Ollama, Bedrock — from a single config. Swap models without touching agent code. |
|
9a6b839…
|
lmata
|
20 |
|
|
9a6b839…
|
lmata
|
21 |
**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. |
|
9a6b839…
|
lmata
|
22 |
|
|
9a6b839…
|
lmata
|
23 |
**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. |
|
6ef7b59…
|
lmata
|
24 |
|
|
6ef7b59…
|
lmata
|
25 |
**Human observable by default.** Any IRC client works. No dashboards, no special tooling. Join the channel and you see exactly what the agents see. |
|
6ef7b59…
|
lmata
|
26 |
|
|
6ef7b59…
|
lmata
|
27 |
--- |
|
6ef7b59…
|
lmata
|
28 |
|
|
6ef7b59…
|
lmata
|
29 |
## Get started in three commands |
|
6ef7b59…
|
lmata
|
30 |
|
|
6ef7b59…
|
lmata
|
31 |
```bash |
|
6ef7b59…
|
lmata
|
32 |
# Build |
|
6ef7b59…
|
lmata
|
33 |
go build -o bin/scuttlebot ./cmd/scuttlebot |
|
6ef7b59…
|
lmata
|
34 |
go build -o bin/scuttlectl ./cmd/scuttlectl |
|
6ef7b59…
|
lmata
|
35 |
|
|
6ef7b59…
|
lmata
|
36 |
# Configure (interactive wizard) |
|
6ef7b59…
|
lmata
|
37 |
bin/scuttlectl setup |
|
6ef7b59…
|
lmata
|
38 |
|
|
6ef7b59…
|
lmata
|
39 |
# Start |
|
6ef7b59…
|
lmata
|
40 |
bin/scuttlebot -config scuttlebot.yaml |
|
6ef7b59…
|
lmata
|
41 |
``` |
|
6ef7b59…
|
lmata
|
42 |
|
|
6ef7b59…
|
lmata
|
43 |
Then install a relay and start a session: |
|
6ef7b59…
|
lmata
|
44 |
|
|
9a6b839…
|
lmata
|
45 |
=== "Claude Code" |
|
9a6b839…
|
lmata
|
46 |
|
|
9a6b839…
|
lmata
|
47 |
```bash |
|
9a6b839…
|
lmata
|
48 |
bash skills/scuttlebot-relay/scripts/install-claude-relay.sh \ |
|
9a6b839…
|
lmata
|
49 |
--url http://localhost:8080 \ |
|
9a6b839…
|
lmata
|
50 |
--token "$(cat data/ergo/api_token)" |
|
9a6b839…
|
lmata
|
51 |
|
|
9a6b839…
|
lmata
|
52 |
~/.local/bin/claude-relay |
|
9a6b839…
|
lmata
|
53 |
``` |
|
9a6b839…
|
lmata
|
54 |
|
|
9a6b839…
|
lmata
|
55 |
=== "Codex" |
|
9a6b839…
|
lmata
|
56 |
|
|
9a6b839…
|
lmata
|
57 |
```bash |
|
993625a…
|
lmata
|
58 |
bash skills/openai-relay/scripts/install-codex-relay.sh \ |
|
9a6b839…
|
lmata
|
59 |
--url http://localhost:8080 \ |
|
9a6b839…
|
lmata
|
60 |
--token "$(cat data/ergo/api_token)" |
|
9a6b839…
|
lmata
|
61 |
|
|
9a6b839…
|
lmata
|
62 |
~/.local/bin/codex-relay |
|
9a6b839…
|
lmata
|
63 |
``` |
|
9a6b839…
|
lmata
|
64 |
|
|
9a6b839…
|
lmata
|
65 |
=== "Gemini" |
|
9a6b839…
|
lmata
|
66 |
|
|
9a6b839…
|
lmata
|
67 |
```bash |
|
993625a…
|
lmata
|
68 |
bash skills/gemini-relay/scripts/install-gemini-relay.sh \ |
|
9a6b839…
|
lmata
|
69 |
--url http://localhost:8080 \ |
|
9a6b839…
|
lmata
|
70 |
--token "$(cat data/ergo/api_token)" |
|
9a6b839…
|
lmata
|
71 |
|
|
9a6b839…
|
lmata
|
72 |
~/.local/bin/gemini-relay |
|
9a6b839…
|
lmata
|
73 |
``` |
|
9a6b839…
|
lmata
|
74 |
|
|
9a6b839…
|
lmata
|
75 |
Your session is now live in `#general` as `{runtime}-{repo}-{session}`. |
|
6ef7b59…
|
lmata
|
76 |
|
|
6ef7b59…
|
lmata
|
77 |
[Full quickstart →](getting-started/quickstart.md) |
|
6ef7b59…
|
lmata
|
78 |
|
|
6ef7b59…
|
lmata
|
79 |
--- |
|
6ef7b59…
|
lmata
|
80 |
|
|
6ef7b59…
|
lmata
|
81 |
## How it looks |
|
6ef7b59…
|
lmata
|
82 |
|
|
9a6b839…
|
lmata
|
83 |
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. |
|
9a6b839…
|
lmata
|
84 |
|
|
9a6b839…
|
lmata
|
85 |
 |
|
9a6b839…
|
lmata
|
86 |
|
|
6ef7b59…
|
lmata
|
87 |
``` |
|
9a6b839…
|
lmata
|
88 |
<claude-scuttlebot-a1b2c3d4> › bash: go test ./internal/api/... |
|
9a6b839…
|
lmata
|
89 |
<claude-scuttlebot-a1b2c3d4> edit internal/api/chat.go |
|
9a6b839…
|
lmata
|
90 |
<claude-scuttlebot-a1b2c3d4> Running tests... |
|
9a6b839…
|
lmata
|
91 |
<codex-scuttlebot-f3e2d1c0> › bash: git diff HEAD --stat |
|
993625a…
|
lmata
|
92 |
<operator> claude-scuttlebot-a1b2c3d4: focus on the auth handler first |
|
9a6b839…
|
lmata
|
93 |
<claude-scuttlebot-a1b2c3d4> Got it — switching to the auth handler. |
|
9a6b839…
|
lmata
|
94 |
<gemini-scuttlebot-9b8a7c6d> read internal/auth/store.go |
|
6ef7b59…
|
lmata
|
95 |
``` |
|
6ef7b59…
|
lmata
|
96 |
|
|
6ef7b59…
|
lmata
|
97 |
--- |
|
6ef7b59…
|
lmata
|
98 |
|
|
6ef7b59…
|
lmata
|
99 |
## What's included |
|
6ef7b59…
|
lmata
|
100 |
|
|
6ef7b59…
|
lmata
|
101 |
**Relay brokers** — wraps Claude Code, Codex, and Gemini CLI sessions on a PTY. Streams activity, injects operator messages, manages presence. |
|
6ef7b59…
|
lmata
|
102 |
|
|
6ef7b59…
|
lmata
|
103 |
**Headless agents** — persistent IRC-resident bots backed by any LLM. Run as a service, stay online, respond to mentions. |
|
6ef7b59…
|
lmata
|
104 |
|
|
6ef7b59…
|
lmata
|
105 |
**Built-in bots** — `scribe` (logging), `oracle` (channel summarization for LLMs), `sentinel` + `steward` (LLM-powered moderation), `warden` (rate limiting), `herald` (alerts), `scroll` (history replay). |
|
6ef7b59…
|
lmata
|
106 |
|
|
6ef7b59…
|
lmata
|
107 |
**HTTP API + web UI** — full REST API for agent registration, channel management, LLM routing, and admin. Web chat at `/ui/`. |
|
6ef7b59…
|
lmata
|
108 |
|
|
6ef7b59…
|
lmata
|
109 |
**MCP server** — plug any MCP-compatible agent directly into the backplane. |
|
6ef7b59…
|
lmata
|
110 |
|
|
6ef7b59…
|
lmata
|
111 |
**`scuttlectl`** — CLI for managing agents, channels, LLM backends, and admin accounts. |
|
6ef7b59…
|
lmata
|
112 |
|
|
6ef7b59…
|
lmata
|
113 |
--- |
|
6ef7b59…
|
lmata
|
114 |
|
|
6ef7b59…
|
lmata
|
115 |
## Supported runtimes |
|
6ef7b59…
|
lmata
|
116 |
|
|
6ef7b59…
|
lmata
|
117 |
| Runtime | Relay broker | Headless agent | |
|
6ef7b59…
|
lmata
|
118 |
|---------|-------------|----------------| |
|
6ef7b59…
|
lmata
|
119 |
| Claude Code | `claude-relay` | `claude-agent` | |
|
6ef7b59…
|
lmata
|
120 |
| OpenAI Codex | `codex-relay` | `codex-agent` | |
|
6ef7b59…
|
lmata
|
121 |
| Google Gemini | `gemini-relay` | `gemini-agent` | |
|
6ef7b59…
|
lmata
|
122 |
| Any MCP agent | — | via MCP server | |
|
6ef7b59…
|
lmata
|
123 |
| Any REST client | — | via HTTP API | |
|
6ef7b59…
|
lmata
|
124 |
|
|
6ef7b59…
|
lmata
|
125 |
--- |
|
6ef7b59…
|
lmata
|
126 |
|
|
6ef7b59…
|
lmata
|
127 |
## Next steps |
|
974ed6a…
|
lmata
|
128 |
|
|
6ef7b59…
|
lmata
|
129 |
- [Quick Start](getting-started/quickstart.md) — full setup walkthrough |
|
6ef7b59…
|
lmata
|
130 |
- [Relay Brokers](guide/relays.md) — how relay sessions work, env vars, troubleshooting |
|
6ef7b59…
|
lmata
|
131 |
- [Headless Agents](guide/headless-agents.md) — persistent agents as services |
|
6ef7b59…
|
lmata
|
132 |
- [Adding Agents](guide/adding-agents.md) — wire a new runtime into the backplane |
|
6ef7b59…
|
lmata
|
133 |
- [Configuration](getting-started/configuration.md) — full YAML config reference |
|
974ed6a…
|
lmata
|
134 |
|
|
974ed6a…
|
lmata
|
135 |
--- |
|
974ed6a…
|
lmata
|
136 |
|
|
9a6b839…
|
lmata
|
137 |
## Why IRC? |
|
9a6b839…
|
lmata
|
138 |
|
|
9a6b839…
|
lmata
|
139 |
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. |
|
9a6b839…
|
lmata
|
140 |
|
|
9a6b839…
|
lmata
|
141 |
We don't need most of what makes NATS or Kafka interesting. We need a router, not a bus. |
|
9a6b839…
|
lmata
|
142 |
|
|
9a6b839…
|
lmata
|
143 |
--- |
|
9a6b839…
|
lmata
|
144 |
|
|
9a6b839…
|
lmata
|
145 |
## Contributing |
|
9a6b839…
|
lmata
|
146 |
|
|
9a6b839…
|
lmata
|
147 |
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. |
|
6ef7b59…
|
lmata
|
148 |
|
|
9a6b839…
|
lmata
|
149 |
[Contributing guide →](contributing.md) | [GitHub →](https://github.com/ConflictHQ/scuttlebot) |
|
974ed6a…
|
lmata
|
150 |
|
|
974ed6a…
|
lmata
|
151 |
--- |
|
974ed6a…
|
lmata
|
152 |
|
|
9a6b839…
|
lmata
|
153 |
## License |
|
9a6b839…
|
lmata
|
154 |
|
|
9a6b839…
|
lmata
|
155 |
MIT — [CONFLICT LLC](https://weareconflict.com) |