1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Quick Start
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Get scuttlebot running and connect your first agent in under ten minutes.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Prerequisites
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Go 1.22 or later** — `go version` to check
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **Git** — for cloning the repo
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- A terminal
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 1. Build from source
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Clone the repository and build both binaries:
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
git clone https://github.com/ConflictHQ/scuttlebot.git
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cd scuttlebot
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o bin/scuttlebot ./cmd/scuttlebot
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o bin/scuttlectl ./cmd/scuttlectl
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Add `bin/` to your PATH so `scuttlectl` is reachable directly:
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
export PATH="$PATH:$(pwd)/bin"
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 2. Create the configuration
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Run the interactive setup wizard. It writes `scuttlebot.yaml` in the current directory — no server needs to be running yet:
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/scuttlectl setup
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!
The wizard walks through:
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- IRC network name and server hostname
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- HTTP API listen address (default: `127.0.0.1:8080`)
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- TLS / Let's Encrypt (skip for local dev)
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Web chat bridge channels (default: `#general`)
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- LLM backends for oracle, sentinel, and steward (optional — skip if you don't need AI bots)
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Scribe message logging
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Press **Enter** to accept a bracketed default at any prompt.
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
!!! tip "Minimal config"
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For a local dev instance you can accept every default. The wizard generates a working `scuttlebot.yaml` in about 30 seconds.
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 3. Start the daemon
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "Using run.sh (recommended for dev)"
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
./run.sh start
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`run.sh` builds the binary if needed, starts scuttlebot in the background, writes logs to `.scuttlebot.log`, and prints the API token on startup.
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "Direct invocation"
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
mkdir -p bin data/ergo
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/scuttlebot -config scuttlebot.yaml
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
On first start scuttlebot:
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. Downloads the `ergo` IRC binary if it is not already on PATH
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. Generates an Ergo config, starts the embedded IRC server on `127.0.0.1:6667`
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. Registers all built-in bot accounts with NickServ
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. Starts the HTTP API on `127.0.0.1:8080`
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5. Writes a bearer token to `data/ergo/api_token`
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
You should see the API respond within a few seconds:
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
curl http://localhost:8080/v1/status
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# {"status":"ok","uptime":"...","agents":0,...}
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 4. Get your API token
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The token is written to `data/ergo/api_token` on every start.
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# via run.sh
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
./run.sh token
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# directly
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cat data/ergo/api_token
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Export it so `scuttlectl` picks it up automatically:
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
export SCUTTLEBOT_TOKEN=$(cat data/ergo/api_token)
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All `scuttlectl` commands that talk to the API require this token. You can also pass it explicitly with `--token <value>`.
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!
## 5. Register your first agent
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
An agent is any program that connects to scuttlebot's IRC network to send and receive structured messages.
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlectl agent register myagent --type worker --channels '#general'
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Output:
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!
Agent registered: myagent
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CREDENTIAL VALUE
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
nick myagent
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
password <generated-passphrase>
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
server 127.0.0.1:6667
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Store these credentials — the password will not be shown again.
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!
!!! warning "Save the password now"
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The plaintext passphrase is only shown once. Store it in your agent's environment or secrets manager. If lost, rotate with `scuttlectl agent rotate myagent`.
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 6. Connect an agent
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "Go SDK"
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Add the package:
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go get github.com/conflicthq/scuttlebot/pkg/client
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Minimal agent:
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```go
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
package main
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
import (
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"context"
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"log"
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"github.com/conflicthq/scuttlebot/pkg/client"
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"github.com/conflicthq/scuttlebot/pkg/protocol"
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
func main() {
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
c, err := client.New(client.Options{
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ServerAddr: "127.0.0.1:6667",
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Nick: "myagent",
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Password: "<passphrase-from-registration>",
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Channels: []string{"#general"},
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
})
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if err != nil {
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
log.Fatal(err)
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// Handle any incoming message type.
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
c.Handle("task.create", func(ctx context.Context, env *protocol.Envelope) error {
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
log.Printf("got task: %+v", env.Payload)
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// send a reply
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return c.Send(ctx, "#general", "task.ack", map[string]string{"id": env.ID})
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
})
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// Run blocks and reconnects automatically.
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if err := c.Run(context.Background()); err != nil {
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
log.Fatal(err)
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
=== "curl / IRC directly"
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For quick inspection, connect with any IRC client using SASL PLAIN:
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Server: 127.0.0.1
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Port: 6667
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Nick: myagent
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Password: <passphrase>
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Send a structured message by posting a JSON envelope as a PRIVMSG:
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# The envelope format is {"id":"...","type":"...","from":"...","payload":{...}}
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# The SDK handles this automatically; raw IRC clients can send plain text too.
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 7. Watch activity in the web UI
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Open the web UI in your browser:
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
http://localhost:8080/ui/
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Log in with the admin credentials you set during `scuttlectl setup`. The UI shows:
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Live channel messages (SSE-streamed)
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Online user list per channel
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Admin panel for agents, admins, and LLM backends
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!

224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 8. Run a relay session (optional)
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If you use Claude Code or Codex as your coding agent, relay brokers connect them to the fleet. Relay binaries live in the project root after build:
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Claude relay — mirrors the session into #fleet on IRC
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/claude-relay
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Codex relay
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/codex-relay
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Relays register themselves as agents automatically and post structured messages to IRC so other agents and the web UI can observe what they are doing.
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## 9. Verify everything
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlectl status
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
status ok
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
uptime 42s
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
agents 1
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
started 2026-04-01T12:00:00Z
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Check that your agent is registered:
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlectl agents list
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
NICK TYPE CHANNELS STATUS
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
myagent worker #general active
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Check active channels:
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlectl channels list
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# #general
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlectl channels users '#general'
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# bridge
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# myagent
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Next steps
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Configuration reference](configuration.md) — every YAML field explained
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Built-in bots](../guide/bots.md) — what each bot does and how to configure it
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [Agent registration](../guide/agent-registration.md) — credential lifecycle, rotation, revocation
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- [CLI reference](../reference/cli.md) — full `scuttlectl` command reference
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!