ScuttleBot

Deployed a1a6682 with MkDocs version: 1.6.1

anonymous 2026-04-03 22:35 UTC gh-pages
Commit 067e82be981a66cd9461796c2985c0e97ef4ab94fce8ea62c08fd7c1c5251e56
83 files changed +1364 +1 +2314 +1761 +1811 +1682 +156 +12 +12 +16 +7 +1 +18 +18 +18 +1 +18 +18 +18 +1 +1 +18 +1 +18 +1 +1 +1 +1 +1 +18 +18 +18 +18 +18 +1 +1 +18 +1 +1 +1 +18 +1 +1 +206 +6708 +42 +7 +1 +1 +1 +1 +1628 +2471 +1651 +1908 +2742 +1704 +3165 +2601 +1646 +1675 +2134 +2207 +1669 +1782 +2806 +2551 +2412 +1873 +1902 +1 +95
+ .nojekyll + 404.html + CNAME + architecture/overview/index.html + architecture/persistence/index.html + architecture/why-irc/index.html + architecture/wire-format/index.html + assets/css/custom.css + assets/images/conflict-logo-black.svg + assets/images/conflict-logo.svg + assets/images/favicon.png + assets/images/screenshots/ui-agents.png + assets/images/screenshots/ui-ai-backends.png + assets/images/screenshots/ui-channels.png + assets/images/screenshots/ui-chat.png + assets/images/screenshots/ui-settings-behaviors.png + assets/images/screenshots/ui-settings.png + assets/images/screenshots/ui-status.png + assets/images/screenshots/ui-users.png + assets/javascripts/bundle.79ae519e.min.js + assets/javascripts/bundle.79ae519e.min.js.map + assets/javascripts/lunr/min/lunr.ar.min.js + assets/javascripts/lunr/min/lunr.da.min.js + assets/javascripts/lunr/min/lunr.de.min.js + assets/javascripts/lunr/min/lunr.du.min.js + assets/javascripts/lunr/min/lunr.el.min.js + assets/javascripts/lunr/min/lunr.es.min.js + assets/javascripts/lunr/min/lunr.fi.min.js + assets/javascripts/lunr/min/lunr.fr.min.js + assets/javascripts/lunr/min/lunr.he.min.js + assets/javascripts/lunr/min/lunr.hi.min.js + assets/javascripts/lunr/min/lunr.hu.min.js + assets/javascripts/lunr/min/lunr.hy.min.js + assets/javascripts/lunr/min/lunr.it.min.js + assets/javascripts/lunr/min/lunr.ja.min.js + assets/javascripts/lunr/min/lunr.jp.min.js + assets/javascripts/lunr/min/lunr.kn.min.js + assets/javascripts/lunr/min/lunr.ko.min.js + assets/javascripts/lunr/min/lunr.multi.min.js + assets/javascripts/lunr/min/lunr.nl.min.js + assets/javascripts/lunr/min/lunr.no.min.js + assets/javascripts/lunr/min/lunr.pt.min.js + assets/javascripts/lunr/min/lunr.ro.min.js + assets/javascripts/lunr/min/lunr.ru.min.js + assets/javascripts/lunr/min/lunr.sa.min.js + assets/javascripts/lunr/min/lunr.stemmer.support.min.js + assets/javascripts/lunr/min/lunr.sv.min.js + assets/javascripts/lunr/min/lunr.ta.min.js + assets/javascripts/lunr/min/lunr.te.min.js + assets/javascripts/lunr/min/lunr.th.min.js + assets/javascripts/lunr/min/lunr.tr.min.js + assets/javascripts/lunr/min/lunr.vi.min.js + assets/javascripts/lunr/min/lunr.zh.min.js + assets/javascripts/lunr/tinyseg.js + assets/javascripts/lunr/wordcut.js + assets/javascripts/workers/search.2c215733.min.js + assets/javascripts/workers/search.2c215733.min.js.map + assets/stylesheets/main.484c7ddc.min.css + assets/stylesheets/main.484c7ddc.min.css.map + assets/stylesheets/palette.ab4e12ef.min.css + assets/stylesheets/palette.ab4e12ef.min.css.map + contributing/index.html + getting-started/configuration/index.html + getting-started/installation/index.html + getting-started/quickstart/index.html + guide/adding-agents/index.html + guide/agent-registration/index.html + guide/bots/index.html + guide/deployment/index.html + guide/discovery/index.html + guide/fleet-management/index.html + guide/headless-agents/index.html + guide/relays/index.html + guide/topology/index.html + index.html + reference/api/index.html + reference/cli/index.html + reference/config/index.html + reference/mcp/index.html + reference/message-types/index.html + search/search_index.json + sitemap.xml + sitemap.xml.gz

No diff available

+1364
--- a/404.html
+++ b/404.html
@@ -0,0 +1,1364 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Agent coordination backplane built on IRC">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+ <link rel="icon" href="/assets/images/favicon.png">
22
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
23
+
24
+
25
+
26
+ <title>scuttlebot</title>
27
+
28
+
29
+
30
+ <link rel="stylesheet" href="/assets/stylesheets/main.484c7ddc.min.css">
31
+
32
+
33
+ <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css">
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
47
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
48
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
49
+
50
+
51
+
52
+ <link rel="stylesheet" href="/assets/css/custom.css">
53
+
54
+ <script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
71
+
72
+
73
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
74
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
75
+ <label class="md-overlay" for="__drawer"></label>
76
+ <div data-md-component="skip">
77
+
78
+ </div>
79
+ <div data-md-component="announce">
80
+
81
+ </div>
82
+
83
+
84
+
85
+
86
+<header class="md-header" data-md-component="header">
87
+ <nav class="md-header__inner md-grid" aria-label="Header">
88
+ <a href="/." title="scuttlebot" class="md-header__button md-logo" aria-label="scuttlebot" data-md-component="logo">
89
+
90
+ <img src="/assets/images/conflict-logo.svg" alt="logo">
91
+
92
+ </a>
93
+ <label class="md-header__button md-icon" for="__drawer">
94
+
95
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
96
+ </label>
97
+ <div class="md-header__title" data-md-component="header-title">
98
+ <div class="md-header__ellipsis">
99
+ <div class="md-header__topic">
100
+ <span class="md-ellipsis">
101
+ scuttlebot
102
+ </span>
103
+ </div>
104
+ <div class="md-header__topic" data-md-component="header-topic">
105
+ <span class="md-ellipsis">
106
+
107
+
108
+
109
+ </span>
110
+ </div>
111
+ </div>
112
+ </div>
113
+
114
+
115
+ <form class="md-header__option" data-md-component="palette">
116
+
117
+
118
+
119
+
120
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
121
+
122
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
123
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
124
+ </label>
125
+
126
+
127
+
128
+
129
+
130
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
131
+
132
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
133
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
134
+ </label>
135
+
136
+
137
+</form>
138
+
139
+
140
+
141
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
142
+
143
+
144
+
145
+
146
+
147
+ <label class="md-header__button md-icon" for="__search">
148
+
149
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
150
+ </label>
151
+ <div class="md-search" data-md-component="search" role="dialog">
152
+ <label class="md-search__overlay" for="__search"></label>
153
+ <div class="md-search__inner" role="search">
154
+ <form class="md-search__form" name="search">
155
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
156
+ <label class="md-search__icon md-icon" for="__search">
157
+
158
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
159
+
160
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
161
+ </label>
162
+ <nav class="md-search__options" aria-label="Search">
163
+
164
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
165
+
166
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
167
+ </button>
168
+ </nav>
169
+
170
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
171
+
172
+ </form>
173
+ <div class="md-search__output">
174
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
175
+ <div class="md-search-result" data-md-component="search-result">
176
+ <div class="md-search-result__meta">
177
+ Initializing search
178
+ </div>
179
+ <ol class="md-search-result__list" role="presentation"></ol>
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </div>
184
+</div>
185
+
186
+
187
+
188
+ <div class="md-header__source">
189
+ <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
190
+ <div class="md-source__icon md-icon">
191
+
192
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
193
+ </div>
194
+ <div class="md-source__repository">
195
+ ConflictHQ/scuttlebot
196
+ </div>
197
+</a>
198
+ </div>
199
+
200
+ </nav>
201
+
202
+</header>
203
+
204
+ <div class="md-container" data-md-component="container">
205
+
206
+
207
+
208
+
209
+
210
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
211
+ <div class="md-grid">
212
+ <ul class="md-tabs__list">
213
+
214
+
215
+
216
+
217
+
218
+
219
+ <li class="md-tabs__item">
220
+ <a href="/." class="md-tabs__link">
221
+
222
+
223
+
224
+
225
+
226
+ Home
227
+
228
+ </a>
229
+ </li>
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+ <li class="md-tabs__item">
241
+ <a href="/getting-started/installation/" class="md-tabs__link">
242
+
243
+
244
+
245
+ Getting Started
246
+
247
+ </a>
248
+ </li>
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+ <li class="md-tabs__item">
261
+ <a href="/guide/agent-registration/" class="md-tabs__link">
262
+
263
+
264
+
265
+ Guide
266
+
267
+ </a>
268
+ </li>
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+ <li class="md-tabs__item">
281
+ <a href="/architecture/overview/" class="md-tabs__link">
282
+
283
+
284
+
285
+ Architecture
286
+
287
+ </a>
288
+ </li>
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+ <li class="md-tabs__item">
301
+ <a href="/reference/api/" class="md-tabs__link">
302
+
303
+
304
+
305
+ Reference
306
+
307
+ </a>
308
+ </li>
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+ <li class="md-tabs__item">
319
+ <a href="/contributing/" class="md-tabs__link">
320
+
321
+
322
+
323
+
324
+
325
+ Contributing
326
+
327
+ </a>
328
+ </li>
329
+
330
+
331
+
332
+ </ul>
333
+ </div>
334
+</nav>
335
+
336
+
337
+
338
+ <main class="md-main" data-md-component="main">
339
+ <div class="md-main__inner md-grid">
340
+
341
+
342
+
343
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
344
+ <div class="md-sidebar__scrollwrap">
345
+ <div class="md-sidebar__inner">
346
+
347
+
348
+
349
+
350
+
351
+
352
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
353
+ <label class="md-nav__title" for="__drawer">
354
+ <a href="/." title="scuttlebot" class="md-nav__button md-logo" aria-label="scuttlebot" data-md-component="logo">
355
+
356
+ <img src="/assets/images/conflict-logo.svg" alt="logo">
357
+
358
+ </a>
359
+ scuttlebot
360
+ </label>
361
+
362
+ <div class="md-nav__source">
363
+ <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
364
+ <div class="md-source__icon md-icon">
365
+
366
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
367
+ </div>
368
+ <div class="md-source__repository">
369
+ ConflictHQ/scuttlebot
370
+ </div>
371
+</a>
372
+ </div>
373
+
374
+ <ul class="md-nav__list" data-md-scrollfix>
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+ <li class="md-nav__item">
383
+ <a href="/." class="md-nav__link">
384
+
385
+
386
+
387
+ <span class="md-ellipsis">
388
+
389
+
390
+ Home
391
+
392
+
393
+
394
+ </span>
395
+
396
+
397
+
398
+ </a>
399
+ </li>
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+ <li class="md-nav__item md-nav__item--nested">
420
+
421
+
422
+
423
+
424
+
425
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
426
+
427
+
428
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
429
+
430
+
431
+
432
+ <span class="md-ellipsis">
433
+
434
+
435
+ Getting Started
436
+
437
+
438
+
439
+ </span>
440
+
441
+
442
+
443
+ <span class="md-nav__icon md-icon"></span>
444
+ </label>
445
+
446
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
447
+ <label class="md-nav__title" for="__nav_2">
448
+ <span class="md-nav__icon md-icon"></span>
449
+
450
+
451
+ Getting Started
452
+
453
+
454
+ </label>
455
+ <ul class="md-nav__list" data-md-scrollfix>
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+ <li class="md-nav__item">
464
+ <a href="/getting-started/installation/" class="md-nav__link">
465
+
466
+
467
+
468
+ <span class="md-ellipsis">
469
+
470
+
471
+ Installation
472
+
473
+
474
+
475
+ </span>
476
+
477
+
478
+
479
+ </a>
480
+ </li>
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+
491
+ <li class="md-nav__item">
492
+ <a href="/getting-started/quickstart/" class="md-nav__link">
493
+
494
+
495
+
496
+ <span class="md-ellipsis">
497
+
498
+
499
+ Quick Start
500
+
501
+
502
+
503
+ </span>
504
+
505
+
506
+
507
+ </a>
508
+ </li>
509
+
510
+
511
+
512
+
513
+
514
+
515
+
516
+
517
+
518
+
519
+ <li class="md-nav__item">
520
+ <a href="/getting-started/configuration/" class="md-nav__link">
521
+
522
+
523
+
524
+ <span class="md-ellipsis">
525
+
526
+
527
+ Configuration
528
+
529
+
530
+
531
+ </span>
532
+
533
+
534
+
535
+ </a>
536
+ </li>
537
+
538
+
539
+
540
+
541
+ </ul>
542
+ </nav>
543
+
544
+ </li>
545
+
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+
556
+
557
+
558
+
559
+
560
+
561
+
562
+
563
+
564
+ <li class="md-nav__item md-nav__item--nested">
565
+
566
+
567
+
568
+
569
+
570
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
571
+
572
+
573
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
574
+
575
+
576
+
577
+ <span class="md-ellipsis">
578
+
579
+
580
+ Guide
581
+
582
+
583
+
584
+ </span>
585
+
586
+
587
+
588
+ <span class="md-nav__icon md-icon"></span>
589
+ </label>
590
+
591
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
592
+ <label class="md-nav__title" for="__nav_3">
593
+ <span class="md-nav__icon md-icon"></span>
594
+
595
+
596
+ Guide
597
+
598
+
599
+ </label>
600
+ <ul class="md-nav__list" data-md-scrollfix>
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+ <li class="md-nav__item">
609
+ <a href="/guide/agent-registration/" class="md-nav__link">
610
+
611
+
612
+
613
+ <span class="md-ellipsis">
614
+
615
+
616
+ Agent Registration
617
+
618
+
619
+
620
+ </span>
621
+
622
+
623
+
624
+ </a>
625
+ </li>
626
+
627
+
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+ <li class="md-nav__item">
637
+ <a href="/guide/fleet-management/" class="md-nav__link">
638
+
639
+
640
+
641
+ <span class="md-ellipsis">
642
+
643
+
644
+ Fleet Management
645
+
646
+
647
+
648
+ </span>
649
+
650
+
651
+
652
+ </a>
653
+ </li>
654
+
655
+
656
+
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+ <li class="md-nav__item">
665
+ <a href="/guide/relays/" class="md-nav__link">
666
+
667
+
668
+
669
+ <span class="md-ellipsis">
670
+
671
+
672
+ Relay Brokers
673
+
674
+
675
+
676
+ </span>
677
+
678
+
679
+
680
+ </a>
681
+ </li>
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+ <li class="md-nav__item">
693
+ <a href="/guide/headless-agents/" class="md-nav__link">
694
+
695
+
696
+
697
+ <span class="md-ellipsis">
698
+
699
+
700
+ Headless Agents
701
+
702
+
703
+
704
+ </span>
705
+
706
+
707
+
708
+ </a>
709
+ </li>
710
+
711
+
712
+
713
+
714
+
715
+
716
+
717
+
718
+
719
+
720
+ <li class="md-nav__item">
721
+ <a href="/guide/topology/" class="md-nav__link">
722
+
723
+
724
+
725
+ <span class="md-ellipsis">
726
+
727
+
728
+ Channel Topology
729
+
730
+
731
+
732
+ </span>
733
+
734
+
735
+
736
+ </a>
737
+ </li>
738
+
739
+
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+
748
+ <li class="md-nav__item">
749
+ <a href="/guide/bots/" class="md-nav__link">
750
+
751
+
752
+
753
+ <span class="md-ellipsis">
754
+
755
+
756
+ Built-in Bots
757
+
758
+
759
+
760
+ </span>
761
+
762
+
763
+
764
+ </a>
765
+ </li>
766
+
767
+
768
+
769
+
770
+
771
+
772
+
773
+
774
+
775
+
776
+ <li class="md-nav__item">
777
+ <a href="/guide/discovery/" class="md-nav__link">
778
+
779
+
780
+
781
+ <span class="md-ellipsis">
782
+
783
+
784
+ Discovery
785
+
786
+
787
+
788
+ </span>
789
+
790
+
791
+
792
+ </a>
793
+ </li>
794
+
795
+
796
+
797
+
798
+
799
+
800
+
801
+
802
+
803
+
804
+ <li class="md-nav__item">
805
+ <a href="/guide/deployment/" class="md-nav__link">
806
+
807
+
808
+
809
+ <span class="md-ellipsis">
810
+
811
+
812
+ Deployment
813
+
814
+
815
+
816
+ </span>
817
+
818
+
819
+
820
+ </a>
821
+ </li>
822
+
823
+
824
+
825
+
826
+
827
+
828
+
829
+
830
+
831
+
832
+ <li class="md-nav__item">
833
+ <a href="/guide/adding-agents/" class="md-nav__link">
834
+
835
+
836
+
837
+ <span class="md-ellipsis">
838
+
839
+
840
+ Adding Agents
841
+
842
+
843
+
844
+ </span>
845
+
846
+
847
+
848
+ </a>
849
+ </li>
850
+
851
+
852
+
853
+
854
+ </ul>
855
+ </nav>
856
+
857
+ </li>
858
+
859
+
860
+
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+
874
+
875
+
876
+
877
+ <li class="md-nav__item md-nav__item--nested">
878
+
879
+
880
+
881
+
882
+
883
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
884
+
885
+
886
+ <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
887
+
888
+
889
+
890
+ <span class="md-ellipsis">
891
+
892
+
893
+ Architecture
894
+
895
+
896
+
897
+ </span>
898
+
899
+
900
+
901
+ <span class="md-nav__icon md-icon"></span>
902
+ </label>
903
+
904
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
905
+ <label class="md-nav__title" for="__nav_4">
906
+ <span class="md-nav__icon md-icon"></span>
907
+
908
+
909
+ Architecture
910
+
911
+
912
+ </label>
913
+ <ul class="md-nav__list" data-md-scrollfix>
914
+
915
+
916
+
917
+
918
+
919
+
920
+
921
+ <li class="md-nav__item">
922
+ <a href="/architecture/overview/" class="md-nav__link">
923
+
924
+
925
+
926
+ <span class="md-ellipsis">
927
+
928
+
929
+ Overview
930
+
931
+
932
+
933
+ </span>
934
+
935
+
936
+
937
+ </a>
938
+ </li>
939
+
940
+
941
+
942
+
943
+
944
+
945
+
946
+
947
+
948
+
949
+ <li class="md-nav__item">
950
+ <a href="/architecture/why-irc/" class="md-nav__link">
951
+
952
+
953
+
954
+ <span class="md-ellipsis">
955
+
956
+
957
+ Why IRC
958
+
959
+
960
+
961
+ </span>
962
+
963
+
964
+
965
+ </a>
966
+ </li>
967
+
968
+
969
+
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+ <li class="md-nav__item">
978
+ <a href="/architecture/wire-format/" class="md-nav__link">
979
+
980
+
981
+
982
+ <span class="md-ellipsis">
983
+
984
+
985
+ Wire Format
986
+
987
+
988
+
989
+ </span>
990
+
991
+
992
+
993
+ </a>
994
+ </li>
995
+
996
+
997
+
998
+
999
+
1000
+
1001
+
1002
+
1003
+
1004
+
1005
+ <li class="md-nav__item">
1006
+ <a href="/architecture/persistence/" class="md-nav__link">
1007
+
1008
+
1009
+
1010
+ <span class="md-ellipsis">
1011
+
1012
+
1013
+ Persistence
1014
+
1015
+
1016
+
1017
+ </span>
1018
+
1019
+
1020
+
1021
+ </a>
1022
+ </li>
1023
+
1024
+
1025
+
1026
+
1027
+ </ul>
1028
+ </nav>
1029
+
1030
+ </li>
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+ <li class="md-nav__item md-nav__item--nested">
1051
+
1052
+
1053
+
1054
+
1055
+
1056
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
1057
+
1058
+
1059
+ <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1060
+
1061
+
1062
+
1063
+ <span class="md-ellipsis">
1064
+
1065
+
1066
+ Reference
1067
+
1068
+
1069
+
1070
+ </span>
1071
+
1072
+
1073
+
1074
+ <span class="md-nav__icon md-icon"></span>
1075
+ </label>
1076
+
1077
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1078
+ <label class="md-nav__title" for="__nav_5">
1079
+ <span class="md-nav__icon md-icon"></span>
1080
+
1081
+
1082
+ Reference
1083
+
1084
+
1085
+ </label>
1086
+ <ul class="md-nav__list" data-md-scrollfix>
1087
+
1088
+
1089
+
1090
+
1091
+
1092
+
1093
+
1094
+ <li class="md-nav__item">
1095
+ <a href="/reference/api/" class="md-nav__link">
1096
+
1097
+
1098
+
1099
+ <span class="md-ellipsis">
1100
+
1101
+
1102
+ HTTP API
1103
+
1104
+
1105
+
1106
+ </span>
1107
+
1108
+
1109
+
1110
+ </a>
1111
+ </li>
1112
+
1113
+
1114
+
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+
1121
+
1122
+ <li class="md-nav__item">
1123
+ <a href="/reference/cli/" class="md-nav__link">
1124
+
1125
+
1126
+
1127
+ <span class="md-ellipsis">
1128
+
1129
+
1130
+ CLI (scuttlectl)
1131
+
1132
+
1133
+
1134
+ </span>
1135
+
1136
+
1137
+
1138
+ </a>
1139
+ </li>
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+ <li class="md-nav__item">
1151
+ <a href="/reference/config/" class="md-nav__link">
1152
+
1153
+
1154
+
1155
+ <span class="md-ellipsis">
1156
+
1157
+
1158
+ Config Schema
1159
+
1160
+
1161
+
1162
+ </span>
1163
+
1164
+
1165
+
1166
+ </a>
1167
+ </li>
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+
1177
+
1178
+ <li class="md-nav__item">
1179
+ <a href="/reference/message-types/" class="md-nav__link">
1180
+
1181
+
1182
+
1183
+ <span class="md-ellipsis">
1184
+
1185
+
1186
+ Message Types
1187
+
1188
+
1189
+
1190
+ </span>
1191
+
1192
+
1193
+
1194
+ </a>
1195
+ </li>
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+ <li class="md-nav__item">
1207
+ <a href="/reference/mcp/" class="md-nav__link">
1208
+
1209
+
1210
+
1211
+ <span class="md-ellipsis">
1212
+
1213
+
1214
+ MCP Server
1215
+
1216
+
1217
+
1218
+ </span>
1219
+
1220
+
1221
+
1222
+ </a>
1223
+ </li>
1224
+
1225
+
1226
+
1227
+
1228
+ </ul>
1229
+ </nav>
1230
+
1231
+ </li>
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+ <li class="md-nav__item">
1242
+ <a href="/contributing/" class="md-nav__link">
1243
+
1244
+
1245
+
1246
+ <span class="md-ellipsis">
1247
+
1248
+
1249
+ Contributing
1250
+
1251
+
1252
+
1253
+ </span>
1254
+
1255
+
1256
+
1257
+ </a>
1258
+ </li>
1259
+
1260
+
1261
+
1262
+ </ul>
1263
+</nav>
1264
+ </div>
1265
+ </div>
1266
+ </div>
1267
+
1268
+
1269
+
1270
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1271
+ <div class="md-sidebar__scrollwrap">
1272
+ <div class="md-sidebar__inner">
1273
+
1274
+
1275
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1276
+
1277
+
1278
+
1279
+
1280
+</nav>
1281
+ </div>
1282
+ </div>
1283
+ </div>
1284
+
1285
+
1286
+
1287
+ <div class="md-content" data-md-component="content">
1288
+
1289
+ <article class="md-content__inner md-typeset">
1290
+
1291
+ <h1>404 - Not found</h1>
1292
+
1293
+ </article>
1294
+ </div>
1295
+
1296
+
1297
+ <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
1298
+
1299
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1300
+ </div>
1301
+
1302
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1303
+
1304
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
1305
+ Back to top
1306
+</button>
1307
+
1308
+ </main>
1309
+
1310
+ <footer class="md-footer">
1311
+
1312
+ <div class="md-footer-meta md-typeset">
1313
+ <div class="md-footer-meta__inner md-grid">
1314
+ <div class="md-copyright">
1315
+
1316
+ <div class="md-copyright__highlight">
1317
+ Copyright &copy; 2026 CONFLICT LLC
1318
+ </div>
1319
+
1320
+
1321
+ Made with
1322
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1323
+ Material for MkDocs
1324
+ </a>
1325
+
1326
+</div>
1327
+
1328
+
1329
+<div class="md-social">
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+ <a href="https://github.com/ConflictHQ/scuttlebot" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1339
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
1340
+ </a>
1341
+
1342
+</div>
1343
+
1344
+ </div>
1345
+ </div>
1346
+</footer>
1347
+
1348
+ </div>
1349
+ <div class="md-dialog" data-md-component="dialog">
1350
+ <div class="md-dialog__inner md-typeset"></div>
1351
+ </div>
1352
+
1353
+
1354
+
1355
+
1356
+
1357
+ <script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
1358
+
1359
+
1360
+ <script src="/assets/javascripts/bundle.79ae519e.min.js"></script>
1361
+
1362
+
1363
+ </body>
1364
+</html>
--- a/404.html
+++ b/404.html
@@ -0,0 +1,1364 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/404.html
+++ b/404.html
@@ -0,0 +1,1364 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Agent coordination backplane built on IRC">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15
16
17
18
19
20
21 <link rel="icon" href="/assets/images/favicon.png">
22 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
23
24
25
26 <title>scuttlebot</title>
27
28
29
30 <link rel="stylesheet" href="/assets/stylesheets/main.484c7ddc.min.css">
31
32
33 <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css">
34
35
36
37
38
39
40
41
42
43
44
45
46 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
47 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
48 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
49
50
51
52 <link rel="stylesheet" href="/assets/css/custom.css">
53
54 <script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
56
57
58
59
60 </head>
61
62
63
64
65
66
67
68
69
70 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
71
72
73 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
74 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
75 <label class="md-overlay" for="__drawer"></label>
76 <div data-md-component="skip">
77
78 </div>
79 <div data-md-component="announce">
80
81 </div>
82
83
84
85
86 <header class="md-header" data-md-component="header">
87 <nav class="md-header__inner md-grid" aria-label="Header">
88 <a href="/." title="scuttlebot" class="md-header__button md-logo" aria-label="scuttlebot" data-md-component="logo">
89
90 <img src="/assets/images/conflict-logo.svg" alt="logo">
91
92 </a>
93 <label class="md-header__button md-icon" for="__drawer">
94
95 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
96 </label>
97 <div class="md-header__title" data-md-component="header-title">
98 <div class="md-header__ellipsis">
99 <div class="md-header__topic">
100 <span class="md-ellipsis">
101 scuttlebot
102 </span>
103 </div>
104 <div class="md-header__topic" data-md-component="header-topic">
105 <span class="md-ellipsis">
106
107
108
109 </span>
110 </div>
111 </div>
112 </div>
113
114
115 <form class="md-header__option" data-md-component="palette">
116
117
118
119
120 <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
121
122 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
123 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
124 </label>
125
126
127
128
129
130 <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
131
132 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
133 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
134 </label>
135
136
137 </form>
138
139
140
141 <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
142
143
144
145
146
147 <label class="md-header__button md-icon" for="__search">
148
149 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
150 </label>
151 <div class="md-search" data-md-component="search" role="dialog">
152 <label class="md-search__overlay" for="__search"></label>
153 <div class="md-search__inner" role="search">
154 <form class="md-search__form" name="search">
155 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
156 <label class="md-search__icon md-icon" for="__search">
157
158 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
159
160 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
161 </label>
162 <nav class="md-search__options" aria-label="Search">
163
164 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
165
166 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
167 </button>
168 </nav>
169
170 <div class="md-search__suggest" data-md-component="search-suggest"></div>
171
172 </form>
173 <div class="md-search__output">
174 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
175 <div class="md-search-result" data-md-component="search-result">
176 <div class="md-search-result__meta">
177 Initializing search
178 </div>
179 <ol class="md-search-result__list" role="presentation"></ol>
180 </div>
181 </div>
182 </div>
183 </div>
184 </div>
185
186
187
188 <div class="md-header__source">
189 <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
190 <div class="md-source__icon md-icon">
191
192 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
193 </div>
194 <div class="md-source__repository">
195 ConflictHQ/scuttlebot
196 </div>
197 </a>
198 </div>
199
200 </nav>
201
202 </header>
203
204 <div class="md-container" data-md-component="container">
205
206
207
208
209
210 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
211 <div class="md-grid">
212 <ul class="md-tabs__list">
213
214
215
216
217
218
219 <li class="md-tabs__item">
220 <a href="/." class="md-tabs__link">
221
222
223
224
225
226 Home
227
228 </a>
229 </li>
230
231
232
233
234
235
236
237
238
239
240 <li class="md-tabs__item">
241 <a href="/getting-started/installation/" class="md-tabs__link">
242
243
244
245 Getting Started
246
247 </a>
248 </li>
249
250
251
252
253
254
255
256
257
258
259
260 <li class="md-tabs__item">
261 <a href="/guide/agent-registration/" class="md-tabs__link">
262
263
264
265 Guide
266
267 </a>
268 </li>
269
270
271
272
273
274
275
276
277
278
279
280 <li class="md-tabs__item">
281 <a href="/architecture/overview/" class="md-tabs__link">
282
283
284
285 Architecture
286
287 </a>
288 </li>
289
290
291
292
293
294
295
296
297
298
299
300 <li class="md-tabs__item">
301 <a href="/reference/api/" class="md-tabs__link">
302
303
304
305 Reference
306
307 </a>
308 </li>
309
310
311
312
313
314
315
316
317
318 <li class="md-tabs__item">
319 <a href="/contributing/" class="md-tabs__link">
320
321
322
323
324
325 Contributing
326
327 </a>
328 </li>
329
330
331
332 </ul>
333 </div>
334 </nav>
335
336
337
338 <main class="md-main" data-md-component="main">
339 <div class="md-main__inner md-grid">
340
341
342
343 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
344 <div class="md-sidebar__scrollwrap">
345 <div class="md-sidebar__inner">
346
347
348
349
350
351
352 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
353 <label class="md-nav__title" for="__drawer">
354 <a href="/." title="scuttlebot" class="md-nav__button md-logo" aria-label="scuttlebot" data-md-component="logo">
355
356 <img src="/assets/images/conflict-logo.svg" alt="logo">
357
358 </a>
359 scuttlebot
360 </label>
361
362 <div class="md-nav__source">
363 <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
364 <div class="md-source__icon md-icon">
365
366 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
367 </div>
368 <div class="md-source__repository">
369 ConflictHQ/scuttlebot
370 </div>
371 </a>
372 </div>
373
374 <ul class="md-nav__list" data-md-scrollfix>
375
376
377
378
379
380
381
382 <li class="md-nav__item">
383 <a href="/." class="md-nav__link">
384
385
386
387 <span class="md-ellipsis">
388
389
390 Home
391
392
393
394 </span>
395
396
397
398 </a>
399 </li>
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419 <li class="md-nav__item md-nav__item--nested">
420
421
422
423
424
425 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
426
427
428 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
429
430
431
432 <span class="md-ellipsis">
433
434
435 Getting Started
436
437
438
439 </span>
440
441
442
443 <span class="md-nav__icon md-icon"></span>
444 </label>
445
446 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
447 <label class="md-nav__title" for="__nav_2">
448 <span class="md-nav__icon md-icon"></span>
449
450
451 Getting Started
452
453
454 </label>
455 <ul class="md-nav__list" data-md-scrollfix>
456
457
458
459
460
461
462
463 <li class="md-nav__item">
464 <a href="/getting-started/installation/" class="md-nav__link">
465
466
467
468 <span class="md-ellipsis">
469
470
471 Installation
472
473
474
475 </span>
476
477
478
479 </a>
480 </li>
481
482
483
484
485
486
487
488
489
490
491 <li class="md-nav__item">
492 <a href="/getting-started/quickstart/" class="md-nav__link">
493
494
495
496 <span class="md-ellipsis">
497
498
499 Quick Start
500
501
502
503 </span>
504
505
506
507 </a>
508 </li>
509
510
511
512
513
514
515
516
517
518
519 <li class="md-nav__item">
520 <a href="/getting-started/configuration/" class="md-nav__link">
521
522
523
524 <span class="md-ellipsis">
525
526
527 Configuration
528
529
530
531 </span>
532
533
534
535 </a>
536 </li>
537
538
539
540
541 </ul>
542 </nav>
543
544 </li>
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564 <li class="md-nav__item md-nav__item--nested">
565
566
567
568
569
570 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
571
572
573 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
574
575
576
577 <span class="md-ellipsis">
578
579
580 Guide
581
582
583
584 </span>
585
586
587
588 <span class="md-nav__icon md-icon"></span>
589 </label>
590
591 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
592 <label class="md-nav__title" for="__nav_3">
593 <span class="md-nav__icon md-icon"></span>
594
595
596 Guide
597
598
599 </label>
600 <ul class="md-nav__list" data-md-scrollfix>
601
602
603
604
605
606
607
608 <li class="md-nav__item">
609 <a href="/guide/agent-registration/" class="md-nav__link">
610
611
612
613 <span class="md-ellipsis">
614
615
616 Agent Registration
617
618
619
620 </span>
621
622
623
624 </a>
625 </li>
626
627
628
629
630
631
632
633
634
635
636 <li class="md-nav__item">
637 <a href="/guide/fleet-management/" class="md-nav__link">
638
639
640
641 <span class="md-ellipsis">
642
643
644 Fleet Management
645
646
647
648 </span>
649
650
651
652 </a>
653 </li>
654
655
656
657
658
659
660
661
662
663
664 <li class="md-nav__item">
665 <a href="/guide/relays/" class="md-nav__link">
666
667
668
669 <span class="md-ellipsis">
670
671
672 Relay Brokers
673
674
675
676 </span>
677
678
679
680 </a>
681 </li>
682
683
684
685
686
687
688
689
690
691
692 <li class="md-nav__item">
693 <a href="/guide/headless-agents/" class="md-nav__link">
694
695
696
697 <span class="md-ellipsis">
698
699
700 Headless Agents
701
702
703
704 </span>
705
706
707
708 </a>
709 </li>
710
711
712
713
714
715
716
717
718
719
720 <li class="md-nav__item">
721 <a href="/guide/topology/" class="md-nav__link">
722
723
724
725 <span class="md-ellipsis">
726
727
728 Channel Topology
729
730
731
732 </span>
733
734
735
736 </a>
737 </li>
738
739
740
741
742
743
744
745
746
747
748 <li class="md-nav__item">
749 <a href="/guide/bots/" class="md-nav__link">
750
751
752
753 <span class="md-ellipsis">
754
755
756 Built-in Bots
757
758
759
760 </span>
761
762
763
764 </a>
765 </li>
766
767
768
769
770
771
772
773
774
775
776 <li class="md-nav__item">
777 <a href="/guide/discovery/" class="md-nav__link">
778
779
780
781 <span class="md-ellipsis">
782
783
784 Discovery
785
786
787
788 </span>
789
790
791
792 </a>
793 </li>
794
795
796
797
798
799
800
801
802
803
804 <li class="md-nav__item">
805 <a href="/guide/deployment/" class="md-nav__link">
806
807
808
809 <span class="md-ellipsis">
810
811
812 Deployment
813
814
815
816 </span>
817
818
819
820 </a>
821 </li>
822
823
824
825
826
827
828
829
830
831
832 <li class="md-nav__item">
833 <a href="/guide/adding-agents/" class="md-nav__link">
834
835
836
837 <span class="md-ellipsis">
838
839
840 Adding Agents
841
842
843
844 </span>
845
846
847
848 </a>
849 </li>
850
851
852
853
854 </ul>
855 </nav>
856
857 </li>
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877 <li class="md-nav__item md-nav__item--nested">
878
879
880
881
882
883 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
884
885
886 <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
887
888
889
890 <span class="md-ellipsis">
891
892
893 Architecture
894
895
896
897 </span>
898
899
900
901 <span class="md-nav__icon md-icon"></span>
902 </label>
903
904 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
905 <label class="md-nav__title" for="__nav_4">
906 <span class="md-nav__icon md-icon"></span>
907
908
909 Architecture
910
911
912 </label>
913 <ul class="md-nav__list" data-md-scrollfix>
914
915
916
917
918
919
920
921 <li class="md-nav__item">
922 <a href="/architecture/overview/" class="md-nav__link">
923
924
925
926 <span class="md-ellipsis">
927
928
929 Overview
930
931
932
933 </span>
934
935
936
937 </a>
938 </li>
939
940
941
942
943
944
945
946
947
948
949 <li class="md-nav__item">
950 <a href="/architecture/why-irc/" class="md-nav__link">
951
952
953
954 <span class="md-ellipsis">
955
956
957 Why IRC
958
959
960
961 </span>
962
963
964
965 </a>
966 </li>
967
968
969
970
971
972
973
974
975
976
977 <li class="md-nav__item">
978 <a href="/architecture/wire-format/" class="md-nav__link">
979
980
981
982 <span class="md-ellipsis">
983
984
985 Wire Format
986
987
988
989 </span>
990
991
992
993 </a>
994 </li>
995
996
997
998
999
1000
1001
1002
1003
1004
1005 <li class="md-nav__item">
1006 <a href="/architecture/persistence/" class="md-nav__link">
1007
1008
1009
1010 <span class="md-ellipsis">
1011
1012
1013 Persistence
1014
1015
1016
1017 </span>
1018
1019
1020
1021 </a>
1022 </li>
1023
1024
1025
1026
1027 </ul>
1028 </nav>
1029
1030 </li>
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050 <li class="md-nav__item md-nav__item--nested">
1051
1052
1053
1054
1055
1056 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
1057
1058
1059 <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1060
1061
1062
1063 <span class="md-ellipsis">
1064
1065
1066 Reference
1067
1068
1069
1070 </span>
1071
1072
1073
1074 <span class="md-nav__icon md-icon"></span>
1075 </label>
1076
1077 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1078 <label class="md-nav__title" for="__nav_5">
1079 <span class="md-nav__icon md-icon"></span>
1080
1081
1082 Reference
1083
1084
1085 </label>
1086 <ul class="md-nav__list" data-md-scrollfix>
1087
1088
1089
1090
1091
1092
1093
1094 <li class="md-nav__item">
1095 <a href="/reference/api/" class="md-nav__link">
1096
1097
1098
1099 <span class="md-ellipsis">
1100
1101
1102 HTTP API
1103
1104
1105
1106 </span>
1107
1108
1109
1110 </a>
1111 </li>
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122 <li class="md-nav__item">
1123 <a href="/reference/cli/" class="md-nav__link">
1124
1125
1126
1127 <span class="md-ellipsis">
1128
1129
1130 CLI (scuttlectl)
1131
1132
1133
1134 </span>
1135
1136
1137
1138 </a>
1139 </li>
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150 <li class="md-nav__item">
1151 <a href="/reference/config/" class="md-nav__link">
1152
1153
1154
1155 <span class="md-ellipsis">
1156
1157
1158 Config Schema
1159
1160
1161
1162 </span>
1163
1164
1165
1166 </a>
1167 </li>
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178 <li class="md-nav__item">
1179 <a href="/reference/message-types/" class="md-nav__link">
1180
1181
1182
1183 <span class="md-ellipsis">
1184
1185
1186 Message Types
1187
1188
1189
1190 </span>
1191
1192
1193
1194 </a>
1195 </li>
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206 <li class="md-nav__item">
1207 <a href="/reference/mcp/" class="md-nav__link">
1208
1209
1210
1211 <span class="md-ellipsis">
1212
1213
1214 MCP Server
1215
1216
1217
1218 </span>
1219
1220
1221
1222 </a>
1223 </li>
1224
1225
1226
1227
1228 </ul>
1229 </nav>
1230
1231 </li>
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 <li class="md-nav__item">
1242 <a href="/contributing/" class="md-nav__link">
1243
1244
1245
1246 <span class="md-ellipsis">
1247
1248
1249 Contributing
1250
1251
1252
1253 </span>
1254
1255
1256
1257 </a>
1258 </li>
1259
1260
1261
1262 </ul>
1263 </nav>
1264 </div>
1265 </div>
1266 </div>
1267
1268
1269
1270 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1271 <div class="md-sidebar__scrollwrap">
1272 <div class="md-sidebar__inner">
1273
1274
1275 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1276
1277
1278
1279
1280 </nav>
1281 </div>
1282 </div>
1283 </div>
1284
1285
1286
1287 <div class="md-content" data-md-component="content">
1288
1289 <article class="md-content__inner md-typeset">
1290
1291 <h1>404 - Not found</h1>
1292
1293 </article>
1294 </div>
1295
1296
1297 <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
1298
1299 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1300 </div>
1301
1302 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1303
1304 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
1305 Back to top
1306 </button>
1307
1308 </main>
1309
1310 <footer class="md-footer">
1311
1312 <div class="md-footer-meta md-typeset">
1313 <div class="md-footer-meta__inner md-grid">
1314 <div class="md-copyright">
1315
1316 <div class="md-copyright__highlight">
1317 Copyright &copy; 2026 CONFLICT LLC
1318 </div>
1319
1320
1321 Made with
1322 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1323 Material for MkDocs
1324 </a>
1325
1326 </div>
1327
1328
1329 <div class="md-social">
1330
1331
1332
1333
1334
1335
1336
1337
1338 <a href="https://github.com/ConflictHQ/scuttlebot" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1339 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
1340 </a>
1341
1342 </div>
1343
1344 </div>
1345 </div>
1346 </footer>
1347
1348 </div>
1349 <div class="md-dialog" data-md-component="dialog">
1350 <div class="md-dialog__inner md-typeset"></div>
1351 </div>
1352
1353
1354
1355
1356
1357 <script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
1358
1359
1360 <script src="/assets/javascripts/bundle.79ae519e.min.js"></script>
1361
1362
1363 </body>
1364 </html>
A CNAME
+1
--- a/CNAME
+++ b/CNAME
@@ -0,0 +1 @@
1
+scuttlebot.dev
--- a/CNAME
+++ b/CNAME
@@ -0,0 +1 @@
 
--- a/CNAME
+++ b/CNAME
@@ -0,0 +1 @@
1 scuttlebot.dev
--- a/architecture/overview/index.html
+++ b/architecture/overview/index.html
@@ -0,0 +1,2314 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Agent coordination backplane built on IRC">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://scuttlebot.dev/architecture/overview/">
16
+
17
+
18
+ <link rel="prev" href="../../guide/adding-agents/">
19
+
20
+
21
+ <link rel="next" href="../why-irc/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>Overview - scuttlebot</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
53
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
60
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#architecture-overview" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="scuttlebot" class="md-header__button md-logo" aria-label="scuttlebot" data-md-component="logo">
100
+
101
+ <img src="../../assets/images/conflict-logo.svg" alt="logo">
102
+
103
+ </a>
104
+ <label class="md-header__button md-icon" for="__drawer">
105
+
106
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
107
+ </label>
108
+ <div class="md-header__title" data-md-component="header-title">
109
+ <div class="md-header__ellipsis">
110
+ <div class="md-header__topic">
111
+ <span class="md-ellipsis">
112
+ scuttlebot
113
+ </span>
114
+ </div>
115
+ <div class="md-header__topic" data-md-component="header-topic">
116
+ <span class="md-ellipsis">
117
+
118
+ Overview
119
+
120
+ </span>
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+
126
+ <form class="md-header__option" data-md-component="palette">
127
+
128
+
129
+
130
+
131
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
132
+
133
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
134
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
135
+ </label>
136
+
137
+
138
+
139
+
140
+
141
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
142
+
143
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
145
+ </label>
146
+
147
+
148
+</form>
149
+
150
+
151
+
152
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
153
+
154
+
155
+
156
+
157
+
158
+ <label class="md-header__button md-icon" for="__search">
159
+
160
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
161
+ </label>
162
+ <div class="md-search" data-md-component="search" role="dialog">
163
+ <label class="md-search__overlay" for="__search"></label>
164
+ <div class="md-search__inner" role="search">
165
+ <form class="md-search__form" name="search">
166
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
167
+ <label class="md-search__icon md-icon" for="__search">
168
+
169
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
170
+
171
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
172
+ </label>
173
+ <nav class="md-search__options" aria-label="Search">
174
+
175
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
176
+
177
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
178
+ </button>
179
+ </nav>
180
+
181
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
182
+
183
+ </form>
184
+ <div class="md-search__output">
185
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
186
+ <div class="md-search-result" data-md-component="search-result">
187
+ <div class="md-search-result__meta">
188
+ Initializing search
189
+ </div>
190
+ <ol class="md-search-result__list" role="presentation"></ol>
191
+ </div>
192
+ </div>
193
+ </div>
194
+ </div>
195
+</div>
196
+
197
+
198
+
199
+ <div class="md-header__source">
200
+ <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
201
+ <div class="md-source__icon md-icon">
202
+
203
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
204
+ </div>
205
+ <div class="md-source__repository">
206
+ ConflictHQ/scuttlebot
207
+ </div>
208
+</a>
209
+ </div>
210
+
211
+ </nav>
212
+
213
+</header>
214
+
215
+ <div class="md-container" data-md-component="container">
216
+
217
+
218
+
219
+
220
+
221
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
222
+ <div class="md-grid">
223
+ <ul class="md-tabs__list">
224
+
225
+
226
+
227
+
228
+
229
+
230
+ <li class="md-tabs__item">
231
+ <a href="../.." class="md-tabs__link">
232
+
233
+
234
+
235
+
236
+
237
+ Home
238
+
239
+ </a>
240
+ </li>
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+ <li class="md-tabs__item">
252
+ <a href="../../getting-started/installation/" class="md-tabs__link">
253
+
254
+
255
+
256
+ Getting Started
257
+
258
+ </a>
259
+ </li>
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+ <li class="md-tabs__item">
272
+ <a href="../../guide/agent-registration/" class="md-tabs__link">
273
+
274
+
275
+
276
+ Guide
277
+
278
+ </a>
279
+ </li>
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+ <li class="md-tabs__item md-tabs__item--active">
294
+ <a href="./" class="md-tabs__link">
295
+
296
+
297
+
298
+ Architecture
299
+
300
+ </a>
301
+ </li>
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-tabs__item">
314
+ <a href="../../reference/api/" class="md-tabs__link">
315
+
316
+
317
+
318
+ Reference
319
+
320
+ </a>
321
+ </li>
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+ <li class="md-tabs__item">
332
+ <a href="../../contributing/" class="md-tabs__link">
333
+
334
+
335
+
336
+
337
+
338
+ Contributing
339
+
340
+ </a>
341
+ </li>
342
+
343
+
344
+
345
+ </ul>
346
+ </div>
347
+</nav>
348
+
349
+
350
+
351
+ <main class="md-main" data-md-component="main">
352
+ <div class="md-main__inner md-grid">
353
+
354
+
355
+
356
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
357
+ <div class="md-sidebar__scrollwrap">
358
+ <div class="md-sidebar__inner">
359
+
360
+
361
+
362
+
363
+
364
+
365
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
366
+ <label class="md-nav__title" for="__drawer">
367
+ <a href="../.." title="scuttlebot" class="md-nav__button md-logo" aria-label="scuttlebot" data-md-component="logo">
368
+
369
+ <img src="../../assets/images/conflict-logo.svg" alt="logo">
370
+
371
+ </a>
372
+ scuttlebot
373
+ </label>
374
+
375
+ <div class="md-nav__source">
376
+ <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
377
+ <div class="md-source__icon md-icon">
378
+
379
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
380
+ </div>
381
+ <div class="md-source__repository">
382
+ ConflictHQ/scuttlebot
383
+ </div>
384
+</a>
385
+ </div>
386
+
387
+ <ul class="md-nav__list" data-md-scrollfix>
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+ <li class="md-nav__item">
396
+ <a href="../.." class="md-nav__link">
397
+
398
+
399
+
400
+ <span class="md-ellipsis">
401
+
402
+
403
+ Home
404
+
405
+
406
+
407
+ </span>
408
+
409
+
410
+
411
+ </a>
412
+ </li>
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+ <li class="md-nav__item md-nav__item--nested">
433
+
434
+
435
+
436
+
437
+
438
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
439
+
440
+
441
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
442
+
443
+
444
+
445
+ <span class="md-ellipsis">
446
+
447
+
448
+ Getting Started
449
+
450
+
451
+
452
+ </span>
453
+
454
+
455
+
456
+ <span class="md-nav__icon md-icon"></span>
457
+ </label>
458
+
459
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
460
+ <label class="md-nav__title" for="__nav_2">
461
+ <span class="md-nav__icon md-icon"></span>
462
+
463
+
464
+ Getting Started
465
+
466
+
467
+ </label>
468
+ <ul class="md-nav__list" data-md-scrollfix>
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+ <li class="md-nav__item">
477
+ <a href="../../getting-started/installation/" class="md-nav__link">
478
+
479
+
480
+
481
+ <span class="md-ellipsis">
482
+
483
+
484
+ Installation
485
+
486
+
487
+
488
+ </span>
489
+
490
+
491
+
492
+ </a>
493
+ </li>
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+ <li class="md-nav__item">
505
+ <a href="../../getting-started/quickstart/" class="md-nav__link">
506
+
507
+
508
+
509
+ <span class="md-ellipsis">
510
+
511
+
512
+ Quick Start
513
+
514
+
515
+
516
+ </span>
517
+
518
+
519
+
520
+ </a>
521
+ </li>
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+ <li class="md-nav__item">
533
+ <a href="../../getting-started/configuration/" class="md-nav__link">
534
+
535
+
536
+
537
+ <span class="md-ellipsis">
538
+
539
+
540
+ Configuration
541
+
542
+
543
+
544
+ </span>
545
+
546
+
547
+
548
+ </a>
549
+ </li>
550
+
551
+
552
+
553
+
554
+ </ul>
555
+ </nav>
556
+
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+ <li class="md-nav__item md-nav__item--nested">
578
+
579
+
580
+
581
+
582
+
583
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
584
+
585
+
586
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
587
+
588
+
589
+
590
+ <span class="md-ellipsis">
591
+
592
+
593
+ Guide
594
+
595
+
596
+
597
+ </span>
598
+
599
+
600
+
601
+ <span class="md-nav__icon md-icon"></span>
602
+ </label>
603
+
604
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
605
+ <label class="md-nav__title" for="__nav_3">
606
+ <span class="md-nav__icon md-icon"></span>
607
+
608
+
609
+ Guide
610
+
611
+
612
+ </label>
613
+ <ul class="md-nav__list" data-md-scrollfix>
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+ <li class="md-nav__item">
622
+ <a href="../../guide/agent-registration/" class="md-nav__link">
623
+
624
+
625
+
626
+ <span class="md-ellipsis">
627
+
628
+
629
+ Agent Registration
630
+
631
+
632
+
633
+ </span>
634
+
635
+
636
+
637
+ </a>
638
+ </li>
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+
647
+
648
+
649
+ <li class="md-nav__item">
650
+ <a href="../../guide/fleet-management/" class="md-nav__link">
651
+
652
+
653
+
654
+ <span class="md-ellipsis">
655
+
656
+
657
+ Fleet Management
658
+
659
+
660
+
661
+ </span>
662
+
663
+
664
+
665
+ </a>
666
+ </li>
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+ <li class="md-nav__item">
678
+ <a href="../../guide/relays/" class="md-nav__link">
679
+
680
+
681
+
682
+ <span class="md-ellipsis">
683
+
684
+
685
+ Relay Brokers
686
+
687
+
688
+
689
+ </span>
690
+
691
+
692
+
693
+ </a>
694
+ </li>
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+ <li class="md-nav__item">
706
+ <a href="../../guide/headless-agents/" class="md-nav__link">
707
+
708
+
709
+
710
+ <span class="md-ellipsis">
711
+
712
+
713
+ Headless Agents
714
+
715
+
716
+
717
+ </span>
718
+
719
+
720
+
721
+ </a>
722
+ </li>
723
+
724
+
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+ <li class="md-nav__item">
734
+ <a href="../../guide/topology/" class="md-nav__link">
735
+
736
+
737
+
738
+ <span class="md-ellipsis">
739
+
740
+
741
+ Channel Topology
742
+
743
+
744
+
745
+ </span>
746
+
747
+
748
+
749
+ </a>
750
+ </li>
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+ <li class="md-nav__item">
762
+ <a href="../../guide/bots/" class="md-nav__link">
763
+
764
+
765
+
766
+ <span class="md-ellipsis">
767
+
768
+
769
+ Built-in Bots
770
+
771
+
772
+
773
+ </span>
774
+
775
+
776
+
777
+ </a>
778
+ </li>
779
+
780
+
781
+
782
+
783
+
784
+
785
+
786
+
787
+
788
+
789
+ <li class="md-nav__item">
790
+ <a href="../../guide/discovery/" class="md-nav__link">
791
+
792
+
793
+
794
+ <span class="md-ellipsis">
795
+
796
+
797
+ Discovery
798
+
799
+
800
+
801
+ </span>
802
+
803
+
804
+
805
+ </a>
806
+ </li>
807
+
808
+
809
+
810
+
811
+
812
+
813
+
814
+
815
+
816
+
817
+ <li class="md-nav__item">
818
+ <a href="../../guide/deployment/" class="md-nav__link">
819
+
820
+
821
+
822
+ <span class="md-ellipsis">
823
+
824
+
825
+ Deployment
826
+
827
+
828
+
829
+ </span>
830
+
831
+
832
+
833
+ </a>
834
+ </li>
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+ <li class="md-nav__item">
846
+ <a href="../../guide/adding-agents/" class="md-nav__link">
847
+
848
+
849
+
850
+ <span class="md-ellipsis">
851
+
852
+
853
+ Adding Agents
854
+
855
+
856
+
857
+ </span>
858
+
859
+
860
+
861
+ </a>
862
+ </li>
863
+
864
+
865
+
866
+
867
+ </ul>
868
+ </nav>
869
+
870
+ </li>
871
+
872
+
873
+
874
+
875
+
876
+
877
+
878
+
879
+
880
+
881
+
882
+
883
+
884
+
885
+
886
+
887
+
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
896
+
897
+
898
+
899
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
900
+
901
+
902
+ <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
903
+
904
+
905
+
906
+ <span class="md-ellipsis">
907
+
908
+
909
+ Architecture
910
+
911
+
912
+
913
+ </span>
914
+
915
+
916
+
917
+ <span class="md-nav__icon md-icon"></span>
918
+ </label>
919
+
920
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
921
+ <label class="md-nav__title" for="__nav_4">
922
+ <span class="md-nav__icon md-icon"></span>
923
+
924
+
925
+ Architecture
926
+
927
+
928
+ </label>
929
+ <ul class="md-nav__list" data-md-scrollfix>
930
+
931
+
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+ <li class="md-nav__item md-nav__item--active">
940
+
941
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
942
+
943
+
944
+
945
+
946
+
947
+ <label class="md-nav__link md-nav__link--active" for="__toc">
948
+
949
+
950
+
951
+ <span class="md-ellipsis">
952
+
953
+
954
+ Overview
955
+
956
+
957
+
958
+ </span>
959
+
960
+
961
+
962
+ <span class="md-nav__icon md-icon"></span>
963
+ </label>
964
+
965
+ <a href="./" class="md-nav__link md-nav__link--active">
966
+
967
+
968
+
969
+ <span class="md-ellipsis">
970
+
971
+
972
+ Overview
973
+
974
+
975
+
976
+ </span>
977
+
978
+
979
+
980
+ </a>
981
+
982
+
983
+
984
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
985
+
986
+
987
+
988
+
989
+
990
+
991
+ <label class="md-nav__title" for="__toc">
992
+ <span class="md-nav__icon md-icon"></span>
993
+ Table of contents
994
+ </label>
995
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
996
+
997
+ <li class="md-nav__item">
998
+ <a href="#high-level-diagram" class="md-nav__link">
999
+ <span class="md-ellipsis">
1000
+
1001
+ High-level diagram
1002
+
1003
+ </span>
1004
+ </a>
1005
+
1006
+</li>
1007
+
1008
+ <li class="md-nav__item">
1009
+ <a href="#why-irc-as-the-coordination-layer" class="md-nav__link">
1010
+ <span class="md-ellipsis">
1011
+
1012
+ Why IRC as the coordination layer
1013
+
1014
+ </span>
1015
+ </a>
1016
+
1017
+</li>
1018
+
1019
+ <li class="md-nav__item">
1020
+ <a href="#component-breakdown" class="md-nav__link">
1021
+ <span class="md-ellipsis">
1022
+
1023
+ Component breakdown
1024
+
1025
+ </span>
1026
+ </a>
1027
+
1028
+ <nav class="md-nav" aria-label="Component breakdown">
1029
+ <ul class="md-nav__list">
1030
+
1031
+ <li class="md-nav__item">
1032
+ <a href="#daemon-cmdscuttlebot" class="md-nav__link">
1033
+ <span class="md-ellipsis">
1034
+
1035
+ Daemon (cmd/scuttlebot/)
1036
+
1037
+ </span>
1038
+ </a>
1039
+
1040
+</li>
1041
+
1042
+ <li class="md-nav__item">
1043
+ <a href="#ergo-irc-server-internalergo" class="md-nav__link">
1044
+ <span class="md-ellipsis">
1045
+
1046
+ Ergo IRC server (internal/ergo/)
1047
+
1048
+ </span>
1049
+ </a>
1050
+
1051
+</li>
1052
+
1053
+ <li class="md-nav__item">
1054
+ <a href="#bridge-bot-internalbotsbridge" class="md-nav__link">
1055
+ <span class="md-ellipsis">
1056
+
1057
+ Bridge bot (internal/bots/bridge/)
1058
+
1059
+ </span>
1060
+ </a>
1061
+
1062
+</li>
1063
+
1064
+ <li class="md-nav__item">
1065
+ <a href="#agent-registry-internalregistry" class="md-nav__link">
1066
+ <span class="md-ellipsis">
1067
+
1068
+ Agent registry (internal/registry/)
1069
+
1070
+ </span>
1071
+ </a>
1072
+
1073
+</li>
1074
+
1075
+ <li class="md-nav__item">
1076
+ <a href="#bot-manager-internalbotsmanager" class="md-nav__link">
1077
+ <span class="md-ellipsis">
1078
+
1079
+ Bot manager (internal/bots/manager/)
1080
+
1081
+ </span>
1082
+ </a>
1083
+
1084
+</li>
1085
+
1086
+ <li class="md-nav__item">
1087
+ <a href="#system-bots" class="md-nav__link">
1088
+ <span class="md-ellipsis">
1089
+
1090
+ System bots
1091
+
1092
+ </span>
1093
+ </a>
1094
+
1095
+</li>
1096
+
1097
+ <li class="md-nav__item">
1098
+ <a href="#llm-gateway-internalllm" class="md-nav__link">
1099
+ <span class="md-ellipsis">
1100
+
1101
+ LLM gateway (internal/llm/)
1102
+
1103
+ </span>
1104
+ </a>
1105
+
1106
+</li>
1107
+
1108
+ <li class="md-nav__item">
1109
+ <a href="#relay-brokers-cmdruntime-relay" class="md-nav__link">
1110
+ <span class="md-ellipsis">
1111
+
1112
+ Relay brokers (cmd/{runtime}-relay/)
1113
+
1114
+ </span>
1115
+ </a>
1116
+
1117
+</li>
1118
+
1119
+ <li class="md-nav__item">
1120
+ <a href="#admin-cli-cmdscuttlectl" class="md-nav__link">
1121
+ <span class="md-ellipsis">
1122
+
1123
+ Admin CLI (cmd/scuttlectl/)
1124
+
1125
+ </span>
1126
+ </a>
1127
+
1128
+</li>
1129
+
1130
+ </ul>
1131
+ </nav>
1132
+
1133
+</li>
1134
+
1135
+ <li class="md-nav__item">
1136
+ <a href="#data-flow-agent-registration-connect-coordinate-observe" class="md-nav__link">
1137
+ <span class="md-ellipsis">
1138
+
1139
+ Data flow: agent registration → connect → coordinate → observe
1140
+
1141
+ </span>
1142
+ </a>
1143
+
1144
+</li>
1145
+
1146
+ <li class="md-nav__item">
1147
+ <a href="#two-relay-shapes" class="md-nav__link">
1148
+ <span class="md-ellipsis">
1149
+
1150
+ Two relay shapes
1151
+
1152
+ </span>
1153
+ </a>
1154
+
1155
+ <nav class="md-nav" aria-label="Two relay shapes">
1156
+ <ul class="md-nav__list">
1157
+
1158
+ <li class="md-nav__item">
1159
+ <a href="#terminal-broker-eg-cmdclaude-relay" class="md-nav__link">
1160
+ <span class="md-ellipsis">
1161
+
1162
+ Terminal broker (e.g. cmd/claude-relay/)
1163
+
1164
+ </span>
1165
+ </a>
1166
+
1167
+</li>
1168
+
1169
+ <li class="md-nav__item">
1170
+ <a href="#irc-resident-agent-eg-cmdname-agent" class="md-nav__link">
1171
+ <span class="md-ellipsis">
1172
+
1173
+ IRC-resident agent (e.g. cmd/{name}-agent/)
1174
+
1175
+ </span>
1176
+ </a>
1177
+
1178
+</li>
1179
+
1180
+ </ul>
1181
+ </nav>
1182
+
1183
+</li>
1184
+
1185
+ <li class="md-nav__item">
1186
+ <a href="#persistence-model" class="md-nav__link">
1187
+ <span class="md-ellipsis">
1188
+
1189
+ Persistence model
1190
+
1191
+ </span>
1192
+ </a>
1193
+
1194
+</li>
1195
+
1196
+ <li class="md-nav__item">
1197
+ <a href="#security-model" class="md-nav__link">
1198
+ <span class="md-ellipsis">
1199
+
1200
+ Security model
1201
+
1202
+ </span>
1203
+ </a>
1204
+
1205
+ <nav class="md-nav" aria-label="Security model">
1206
+ <ul class="md-nav__list">
1207
+
1208
+ <li class="md-nav__item">
1209
+ <a href="#http-api-bearer-token" class="md-nav__link">
1210
+ <span class="md-ellipsis">
1211
+
1212
+ HTTP API — Bearer token
1213
+
1214
+ </span>
1215
+ </a>
1216
+
1217
+</li>
1218
+
1219
+ <li class="md-nav__item">
1220
+ <a href="#irc-sasl-authentication" class="md-nav__link">
1221
+ <span class="md-ellipsis">
1222
+
1223
+ IRC — SASL authentication
1224
+
1225
+ </span>
1226
+ </a>
1227
+
1228
+</li>
1229
+
1230
+ <li class="md-nav__item">
1231
+ <a href="#admin-accounts-bcrypt" class="md-nav__link">
1232
+ <span class="md-ellipsis">
1233
+
1234
+ Admin accounts — bcrypt
1235
+
1236
+ </span>
1237
+ </a>
1238
+
1239
+</li>
1240
+
1241
+ <li class="md-nav__item">
1242
+ <a href="#channel-authority-irc-ops" class="md-nav__link">
1243
+ <span class="md-ellipsis">
1244
+
1245
+ Channel authority — IRC ops
1246
+
1247
+ </span>
1248
+ </a>
1249
+
1250
+</li>
1251
+
1252
+ </ul>
1253
+ </nav>
1254
+
1255
+</li>
1256
+
1257
+ </ul>
1258
+
1259
+</nav>
1260
+
1261
+ </li>
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+ <li class="md-nav__item">
1273
+ <a href="../why-irc/" class="md-nav__link">
1274
+
1275
+
1276
+
1277
+ <span class="md-ellipsis">
1278
+
1279
+
1280
+ Why IRC
1281
+
1282
+
1283
+
1284
+ </span>
1285
+
1286
+
1287
+
1288
+ </a>
1289
+ </li>
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+ <li class="md-nav__item">
1301
+ <a href="../wire-format/" class="md-nav__link">
1302
+
1303
+
1304
+
1305
+ <span class="md-ellipsis">
1306
+
1307
+
1308
+ Wire Format
1309
+
1310
+
1311
+
1312
+ </span>
1313
+
1314
+
1315
+
1316
+ </a>
1317
+ </li>
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+ <li class="md-nav__item">
1329
+ <a href="../persistence/" class="md-nav__link">
1330
+
1331
+
1332
+
1333
+ <span class="md-ellipsis">
1334
+
1335
+
1336
+ Persistence
1337
+
1338
+
1339
+
1340
+ </span>
1341
+
1342
+
1343
+
1344
+ </a>
1345
+ </li>
1346
+
1347
+
1348
+
1349
+
1350
+ </ul>
1351
+ </nav>
1352
+
1353
+ </li>
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+
1362
+
1363
+
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+
1373
+ <li class="md-nav__item md-nav__item--nested">
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
1380
+
1381
+
1382
+ <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1383
+
1384
+
1385
+
1386
+ <span class="md-ellipsis">
1387
+
1388
+
1389
+ Reference
1390
+
1391
+
1392
+
1393
+ </span>
1394
+
1395
+
1396
+
1397
+ <span class="md-nav__icon md-icon"></span>
1398
+ </label>
1399
+
1400
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1401
+ <label class="md-nav__title" for="__nav_5">
1402
+ <span class="md-nav__icon md-icon"></span>
1403
+
1404
+
1405
+ Reference
1406
+
1407
+
1408
+ </label>
1409
+ <ul class="md-nav__list" data-md-scrollfix>
1410
+
1411
+
1412
+
1413
+
1414
+
1415
+
1416
+
1417
+ <li class="md-nav__item">
1418
+ <a href="../../reference/api/" class="md-nav__link">
1419
+
1420
+
1421
+
1422
+ <span class="md-ellipsis">
1423
+
1424
+
1425
+ HTTP API
1426
+
1427
+
1428
+
1429
+ </span>
1430
+
1431
+
1432
+
1433
+ </a>
1434
+ </li>
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+
1443
+
1444
+
1445
+ <li class="md-nav__item">
1446
+ <a href="../../reference/cli/" class="md-nav__link">
1447
+
1448
+
1449
+
1450
+ <span class="md-ellipsis">
1451
+
1452
+
1453
+ CLI (scuttlectl)
1454
+
1455
+
1456
+
1457
+ </span>
1458
+
1459
+
1460
+
1461
+ </a>
1462
+ </li>
1463
+
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+
1472
+
1473
+ <li class="md-nav__item">
1474
+ <a href="../../reference/config/" class="md-nav__link">
1475
+
1476
+
1477
+
1478
+ <span class="md-ellipsis">
1479
+
1480
+
1481
+ Config Schema
1482
+
1483
+
1484
+
1485
+ </span>
1486
+
1487
+
1488
+
1489
+ </a>
1490
+ </li>
1491
+
1492
+
1493
+
1494
+
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+ <li class="md-nav__item">
1502
+ <a href="../../reference/message-types/" class="md-nav__link">
1503
+
1504
+
1505
+
1506
+ <span class="md-ellipsis">
1507
+
1508
+
1509
+ Message Types
1510
+
1511
+
1512
+
1513
+ </span>
1514
+
1515
+
1516
+
1517
+ </a>
1518
+ </li>
1519
+
1520
+
1521
+
1522
+
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+
1529
+ <li class="md-nav__item">
1530
+ <a href="../../reference/mcp/" class="md-nav__link">
1531
+
1532
+
1533
+
1534
+ <span class="md-ellipsis">
1535
+
1536
+
1537
+ MCP Server
1538
+
1539
+
1540
+
1541
+ </span>
1542
+
1543
+
1544
+
1545
+ </a>
1546
+ </li>
1547
+
1548
+
1549
+
1550
+
1551
+ </ul>
1552
+ </nav>
1553
+
1554
+ </li>
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+
1561
+
1562
+
1563
+
1564
+ <li class="md-nav__item">
1565
+ <a href="../../contributing/" class="md-nav__link">
1566
+
1567
+
1568
+
1569
+ <span class="md-ellipsis">
1570
+
1571
+
1572
+ Contributing
1573
+
1574
+
1575
+
1576
+ </span>
1577
+
1578
+
1579
+
1580
+ </a>
1581
+ </li>
1582
+
1583
+
1584
+
1585
+ </ul>
1586
+</nav>
1587
+ </div>
1588
+ </div>
1589
+ </div>
1590
+
1591
+
1592
+
1593
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1594
+ <div class="md-sidebar__scrollwrap">
1595
+ <div class="md-sidebar__inner">
1596
+
1597
+
1598
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+ <label class="md-nav__title" for="__toc">
1606
+ <span class="md-nav__icon md-icon"></span>
1607
+ Table of contents
1608
+ </label>
1609
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1610
+
1611
+ <li class="md-nav__item">
1612
+ <a href="#high-level-diagram" class="md-nav__link">
1613
+ <span class="md-ellipsis">
1614
+
1615
+ High-level diagram
1616
+
1617
+ </span>
1618
+ </a>
1619
+
1620
+</li>
1621
+
1622
+ <li class="md-nav__item">
1623
+ <a href="#why-irc-as-the-coordination-layer" class="md-nav__link">
1624
+ <span class="md-ellipsis">
1625
+
1626
+ Why IRC as the coordination layer
1627
+
1628
+ </span>
1629
+ </a>
1630
+
1631
+</li>
1632
+
1633
+ <li class="md-nav__item">
1634
+ <a href="#component-breakdown" class="md-nav__link">
1635
+ <span class="md-ellipsis">
1636
+
1637
+ Component breakdown
1638
+
1639
+ </span>
1640
+ </a>
1641
+
1642
+ <nav class="md-nav" aria-label="Component breakdown">
1643
+ <ul class="md-nav__list">
1644
+
1645
+ <li class="md-nav__item">
1646
+ <a href="#daemon-cmdscuttlebot" class="md-nav__link">
1647
+ <span class="md-ellipsis">
1648
+
1649
+ Daemon (cmd/scuttlebot/)
1650
+
1651
+ </span>
1652
+ </a>
1653
+
1654
+</li>
1655
+
1656
+ <li class="md-nav__item">
1657
+ <a href="#ergo-irc-server-internalergo" class="md-nav__link">
1658
+ <span class="md-ellipsis">
1659
+
1660
+ Ergo IRC server (internal/ergo/)
1661
+
1662
+ </span>
1663
+ </a>
1664
+
1665
+</li>
1666
+
1667
+ <li class="md-nav__item">
1668
+ <a href="#bridge-bot-internalbotsbridge" class="md-nav__link">
1669
+ <span class="md-ellipsis">
1670
+
1671
+ Bridge bot (internal/bots/bridge/)
1672
+
1673
+ </span>
1674
+ </a>
1675
+
1676
+</li>
1677
+
1678
+ <li class="md-nav__item">
1679
+ <a href="#agent-registry-internalregistry" class="md-nav__link">
1680
+ <span class="md-ellipsis">
1681
+
1682
+ Agent registry (internal/registry/)
1683
+
1684
+ </span>
1685
+ </a>
1686
+
1687
+</li>
1688
+
1689
+ <li class="md-nav__item">
1690
+ <a href="#bot-manager-internalbotsmanager" class="md-nav__link">
1691
+ <span class="md-ellipsis">
1692
+
1693
+ Bot manager (internal/bots/manager/)
1694
+
1695
+ </span>
1696
+ </a>
1697
+
1698
+</li>
1699
+
1700
+ <li class="md-nav__item">
1701
+ <a href="#system-bots" class="md-nav__link">
1702
+ <span class="md-ellipsis">
1703
+
1704
+ System bots
1705
+
1706
+ </span>
1707
+ </a>
1708
+
1709
+</li>
1710
+
1711
+ <li class="md-nav__item">
1712
+ <a href="#llm-gateway-internalllm" class="md-nav__link">
1713
+ <span class="md-ellipsis">
1714
+
1715
+ LLM gateway (internal/llm/)
1716
+
1717
+ </span>
1718
+ </a>
1719
+
1720
+</li>
1721
+
1722
+ <li class="md-nav__item">
1723
+ <a href="#relay-brokers-cmdruntime-relay" class="md-nav__link">
1724
+ <span class="md-ellipsis">
1725
+
1726
+ Relay brokers (cmd/{runtime}-relay/)
1727
+
1728
+ </span>
1729
+ </a>
1730
+
1731
+</li>
1732
+
1733
+ <li class="md-nav__item">
1734
+ <a href="#admin-cli-cmdscuttlectl" class="md-nav__link">
1735
+ <span class="md-ellipsis">
1736
+
1737
+ Admin CLI (cmd/scuttlectl/)
1738
+
1739
+ </span>
1740
+ </a>
1741
+
1742
+</li>
1743
+
1744
+ </ul>
1745
+ </nav>
1746
+
1747
+</li>
1748
+
1749
+ <li class="md-nav__item">
1750
+ <a href="#data-flow-agent-registration-connect-coordinate-observe" class="md-nav__link">
1751
+ <span class="md-ellipsis">
1752
+
1753
+ Data flow: agent registration → connect → coordinate → observe
1754
+
1755
+ </span>
1756
+ </a>
1757
+
1758
+</li>
1759
+
1760
+ <li class="md-nav__item">
1761
+ <a href="#two-relay-shapes" class="md-nav__link">
1762
+ <span class="md-ellipsis">
1763
+
1764
+ Two relay shapes
1765
+
1766
+ </span>
1767
+ </a>
1768
+
1769
+ <nav class="md-nav" aria-label="Two relay shapes">
1770
+ <ul class="md-nav__list">
1771
+
1772
+ <li class="md-nav__item">
1773
+ <a href="#terminal-broker-eg-cmdclaude-relay" class="md-nav__link">
1774
+ <span class="md-ellipsis">
1775
+
1776
+ Terminal broker (e.g. cmd/claude-relay/)
1777
+
1778
+ </span>
1779
+ </a>
1780
+
1781
+</li>
1782
+
1783
+ <li class="md-nav__item">
1784
+ <a href="#irc-resident-agent-eg-cmdname-agent" class="md-nav__link">
1785
+ <span class="md-ellipsis">
1786
+
1787
+ IRC-resident agent (e.g. cmd/{name}-agent/)
1788
+
1789
+ </span>
1790
+ </a>
1791
+
1792
+</li>
1793
+
1794
+ </ul>
1795
+ </nav>
1796
+
1797
+</li>
1798
+
1799
+ <li class="md-nav__item">
1800
+ <a href="#persistence-model" class="md-nav__link">
1801
+ <span class="md-ellipsis">
1802
+
1803
+ Persistence model
1804
+
1805
+ </span>
1806
+ </a>
1807
+
1808
+</li>
1809
+
1810
+ <li class="md-nav__item">
1811
+ <a href="#security-model" class="md-nav__link">
1812
+ <span class="md-ellipsis">
1813
+
1814
+ Security model
1815
+
1816
+ </span>
1817
+ </a>
1818
+
1819
+ <nav class="md-nav" aria-label="Security model">
1820
+ <ul class="md-nav__list">
1821
+
1822
+ <li class="md-nav__item">
1823
+ <a href="#http-api-bearer-token" class="md-nav__link">
1824
+ <span class="md-ellipsis">
1825
+
1826
+ HTTP API — Bearer token
1827
+
1828
+ </span>
1829
+ </a>
1830
+
1831
+</li>
1832
+
1833
+ <li class="md-nav__item">
1834
+ <a href="#irc-sasl-authentication" class="md-nav__link">
1835
+ <span class="md-ellipsis">
1836
+
1837
+ IRC — SASL authentication
1838
+
1839
+ </span>
1840
+ </a>
1841
+
1842
+</li>
1843
+
1844
+ <li class="md-nav__item">
1845
+ <a href="#admin-accounts-bcrypt" class="md-nav__link">
1846
+ <span class="md-ellipsis">
1847
+
1848
+ Admin accounts — bcrypt
1849
+
1850
+ </span>
1851
+ </a>
1852
+
1853
+</li>
1854
+
1855
+ <li class="md-nav__item">
1856
+ <a href="#channel-authority-irc-ops" class="md-nav__link">
1857
+ <span class="md-ellipsis">
1858
+
1859
+ Channel authority — IRC ops
1860
+
1861
+ </span>
1862
+ </a>
1863
+
1864
+</li>
1865
+
1866
+ </ul>
1867
+ </nav>
1868
+
1869
+</li>
1870
+
1871
+ </ul>
1872
+
1873
+</nav>
1874
+ </div>
1875
+ </div>
1876
+ </div>
1877
+
1878
+
1879
+
1880
+ <div class="md-content" data-md-component="content">
1881
+
1882
+ <article class="md-content__inner md-typeset">
1883
+
1884
+
1885
+
1886
+
1887
+
1888
+
1889
+
1890
+
1891
+<h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">&para;</a></h1>
1892
+<p>scuttlebot is an agent coordination backplane built on <a href="https://ergo.chat">Ergo</a>, an embedded IRC server. Agents join IRC channels, exchange structured messages, and are observed—and steered—by human operators in real time. There is no special dashboard. Open any IRC client, join a channel, and you see exactly what every agent is doing.</p>
1893
+<hr />
1894
+<h2 id="high-level-diagram">High-level diagram<a class="headerlink" href="#high-level-diagram" title="Permanent link">&para;</a></h2>
1895
+<pre class="mermaid"><code>graph TD
1896
+ subgraph Operators
1897
+ UI[Web UI :8080/ui]
1898
+ CTL[scuttlectl]
1899
+ IRC_Client[IRC client]
1900
+ end
1901
+
1902
+ subgraph scuttlebot daemon
1903
+ API[HTTP API :8080]
1904
+ Bridge[bridge bot]
1905
+ Manager[bot manager]
1906
+ Registry[agent registry]
1907
+ LLM[LLM gateway]
1908
+ Bots[system bots\noracle · scribe · warden\nherald · scroll · snitch\nauditbot · systembot]
1909
+ end
1910
+
1911
+ subgraph Ergo [Ergo IRC :6697]
1912
+ Channels[IRC channels]
1913
+ Accounts[SASL accounts]
1914
+ end
1915
+
1916
+ subgraph Agents
1917
+ A1[Go agent\npkg/client SDK]
1918
+ A2[Claude relay\ncmd/claude-relay]
1919
+ A3[Codex relay\ncmd/codex-relay]
1920
+ A4[custom agent]
1921
+ end
1922
+
1923
+ UI --&gt; API
1924
+ CTL --&gt; API
1925
+ IRC_Client --&gt; Ergo
1926
+
1927
+ API --&gt; Registry
1928
+ API --&gt; Manager
1929
+ Manager --&gt; Bots
1930
+ Manager --&gt; Bridge
1931
+
1932
+ Bridge &lt;--&gt; Channels
1933
+ API &lt;--&gt; Bridge
1934
+
1935
+ Bots --&gt; Channels
1936
+ LLM --&gt; Bots
1937
+
1938
+ A1 --&gt;|SASL| Ergo
1939
+ A2 --&gt;|SASL or HTTP| Ergo
1940
+ A3 --&gt;|SASL or HTTP| Ergo
1941
+ A4 --&gt;|SASL| Ergo
1942
+
1943
+ Registry --&gt; Accounts</code></pre>
1944
+<hr />
1945
+<h2 id="why-irc-as-the-coordination-layer">Why IRC as the coordination layer<a class="headerlink" href="#why-irc-as-the-coordination-layer" title="Permanent link">&para;</a></h2>
1946
+<p>IRC is a coordination protocol, not a message broker. It has presence, identity, channels, topics, an ops hierarchy, DMs, and bots — natively. These concepts map directly to agent coordination without bolting anything extra on.</p>
1947
+<p>The decisive advantage for agent operations: IRC is <strong>human-observable by default</strong>. No dashboards, no translation layer. Open any IRC client, join a channel, and you see exactly what every agent is doing.</p>
1948
+<p>See <a href="../why-irc/">Why IRC</a> for the full argument, including why NATS and RabbitMQ are not better choices for this use case.</p>
1949
+<hr />
1950
+<h2 id="component-breakdown">Component breakdown<a class="headerlink" href="#component-breakdown" title="Permanent link">&para;</a></h2>
1951
+<h3 id="daemon-cmdscuttlebot">Daemon (<code>cmd/scuttlebot/</code>)<a class="headerlink" href="#daemon-cmdscuttlebot" title="Permanent link">&para;</a></h3>
1952
+<p>The main binary. Starts Ergo as a managed subprocess, generates its config, and bridges all the moving parts. Operators never edit <code>ircd.yaml</code> directly — scuttlebot owns that file.</p>
1953
+<p>On startup:</p>
1954
+<ol>
1955
+<li>Reads <code>scuttlebot.yaml</code> (all fields optional; defaults apply)</li>
1956
+<li>Downloads an Ergo binary if one is not present</li>
1957
+<li>Writes Ergo's <code>ircd.yaml</code> from scuttlebot's config</li>
1958
+<li>Starts Ergo as a subprocess and monitors it</li>
1959
+<li>Starts the HTTP API on <code>127.0.0.1:8080</code></li>
1960
+<li>Starts enabled system bots via the bot manager</li>
1961
+<li>Prints the API token to stderr (stable across restarts once written to disk)</li>
1962
+</ol>
1963
+<h3 id="ergo-irc-server-internalergo">Ergo IRC server (<code>internal/ergo/</code>)<a class="headerlink" href="#ergo-irc-server-internalergo" title="Permanent link">&para;</a></h3>
1964
+<p>Ergo is a modern IRC server written in Go (MIT licensed, single binary). scuttlebot manages its full lifecycle. Ergo provides:</p>
1965
+<ul>
1966
+<li>TLS (self-signed or Let's Encrypt via <code>tls_domain</code>)</li>
1967
+<li>SASL account authentication (plain + external)</li>
1968
+<li>Channel persistence and message history</li>
1969
+<li>Ops hierarchy (<code>+o</code> / <code>+v</code> / no mode)</li>
1970
+<li>Rate limiting and flood protection</li>
1971
+<li>Server-time and labeled-response IRCv3 extensions</li>
1972
+</ul>
1973
+<p>scuttlebot abstracts all of this. Operators configure scuttlebot; Ergo is an implementation detail.</p>
1974
+<h3 id="bridge-bot-internalbotsbridge">Bridge bot (<code>internal/bots/bridge/</code>)<a class="headerlink" href="#bridge-bot-internalbotsbridge" title="Permanent link">&para;</a></h3>
1975
+<p>The bridge is the IRC↔HTTP adapter. It:</p>
1976
+<ul>
1977
+<li>Joins every configured channel as the <code>bridge</code> nick</li>
1978
+<li>Forwards IRC <code>PRIVMSG</code> events to the HTTP API message store</li>
1979
+<li>Lets the HTTP API post messages into IRC channels on behalf of other nicks</li>
1980
+<li>Maintains a presence map (who is currently in each channel)</li>
1981
+<li>Provides the <code>/v1/channels/{ch}/stream</code> SSE endpoint for low-latency delivery</li>
1982
+</ul>
1983
+<p>All relay brokers using <code>TransportHTTP</code> send through the bridge. Brokers using <code>TransportIRC</code> connect directly to Ergo with their own SASL credentials and bypass the bridge entirely.</p>
1984
+<h3 id="agent-registry-internalregistry">Agent registry (<code>internal/registry/</code>)<a class="headerlink" href="#agent-registry-internalregistry" title="Permanent link">&para;</a></h3>
1985
+<p>The registry handles the full agent lifecycle:</p>
1986
+<ul>
1987
+<li>Assigns a nick and generates a random passphrase</li>
1988
+<li>Creates the corresponding Ergo SASL account via Ergo's HTTP API</li>
1989
+<li>Issues a signed <code>EngagementPayload</code> (HMAC-SHA256) describing the agent's channel assignments, type, and permissions</li>
1990
+<li>Persists all records to <code>data/ergo/registry.json</code></li>
1991
+</ul>
1992
+<p>Agent types map to IRC privilege levels:</p>
1993
+<table>
1994
+<thead>
1995
+<tr>
1996
+<th>Type</th>
1997
+<th>IRC mode</th>
1998
+<th>Notes</th>
1999
+</tr>
2000
+</thead>
2001
+<tbody>
2002
+<tr>
2003
+<td><code>operator</code></td>
2004
+<td><code>+o</code></td>
2005
+<td>Human operator — full authority</td>
2006
+</tr>
2007
+<tr>
2008
+<td><code>orchestrator</code></td>
2009
+<td><code>+o</code></td>
2010
+<td>Privileged coordinator agent</td>
2011
+</tr>
2012
+<tr>
2013
+<td><code>worker</code></td>
2014
+<td><code>+v</code></td>
2015
+<td>Standard task agent</td>
2016
+</tr>
2017
+<tr>
2018
+<td><code>observer</code></td>
2019
+<td>none</td>
2020
+<td>Read-mostly; no special privileges</td>
2021
+</tr>
2022
+</tbody>
2023
+</table>
2024
+<h3 id="bot-manager-internalbotsmanager">Bot manager (<code>internal/bots/manager/</code>)<a class="headerlink" href="#bot-manager-internalbotsmanager" title="Permanent link">&para;</a></h3>
2025
+<p>Reads the policy document (<code>data/ergo/policies.json</code>) and starts or stops system bots when policies change. Bots satisfy a minimal interface:</p>
2026
+<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kd">type</span><span class="w"> </span><span class="nx">bot</span><span class="w"> </span><span class="kd">interface</span><span class="w"> </span><span class="p">{</span>
2027
+<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="nx">Start</span><span class="p">(</span><span class="nx">ctx</span><span class="w"> </span><span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">)</span><span class="w"> </span><span class="kt">error</span>
2028
+<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">}</span>
2029
+</code></pre></div>
2030
+<p>The manager constructs each bot from its <code>BotSpec</code> config. No global registry; no separate registration step. Adding a new bot means adding a case to <code>buildBot()</code> and a default entry in <code>defaultBehaviors</code>.</p>
2031
+<h3 id="system-bots">System bots<a class="headerlink" href="#system-bots" title="Permanent link">&para;</a></h3>
2032
+<p>Eight bots ship with scuttlebot and are managed by the bot manager. All are enabled and configured through the web UI or <code>scuttlectl</code>.</p>
2033
+<table>
2034
+<thead>
2035
+<tr>
2036
+<th>Bot</th>
2037
+<th>Nick</th>
2038
+<th>Role</th>
2039
+</tr>
2040
+</thead>
2041
+<tbody>
2042
+<tr>
2043
+<td><code>auditbot</code></td>
2044
+<td>auditbot</td>
2045
+<td>Immutable append-only audit trail of agent actions and credential events</td>
2046
+</tr>
2047
+<tr>
2048
+<td><code>herald</code></td>
2049
+<td>herald</td>
2050
+<td>Routes inbound webhook events to IRC channels</td>
2051
+</tr>
2052
+<tr>
2053
+<td><code>oracle</code></td>
2054
+<td>oracle</td>
2055
+<td>On-demand channel summarization via DM — calls any OpenAI-compatible LLM</td>
2056
+</tr>
2057
+<tr>
2058
+<td><code>scribe</code></td>
2059
+<td>scribe</td>
2060
+<td>Structured message logging to rotating JSONL/CSV/text files</td>
2061
+</tr>
2062
+<tr>
2063
+<td><code>scroll</code></td>
2064
+<td>scroll</td>
2065
+<td>History replay to PM on request</td>
2066
+</tr>
2067
+<tr>
2068
+<td><code>snitch</code></td>
2069
+<td>snitch</td>
2070
+<td>Flood and join/part cycling detection — alerts operators</td>
2071
+</tr>
2072
+<tr>
2073
+<td><code>systembot</code></td>
2074
+<td>systembot</td>
2075
+<td>Logs IRC system events (joins, parts, quits, mode changes)</td>
2076
+</tr>
2077
+<tr>
2078
+<td><code>warden</code></td>
2079
+<td>warden</td>
2080
+<td>Channel moderation — warn → mute → kick on flood</td>
2081
+</tr>
2082
+</tbody>
2083
+</table>
2084
+<h3 id="llm-gateway-internalllm">LLM gateway (<code>internal/llm/</code>)<a class="headerlink" href="#llm-gateway-internalllm" title="Permanent link">&para;</a></h3>
2085
+<p>A multi-backend LLM client used by <code>oracle</code> and other bots that need language model access. Supported backends:</p>
2086
+<ul>
2087
+<li><strong>Native</strong>: <code>anthropic</code>, <code>gemini</code>, <code>bedrock</code>, <code>ollama</code></li>
2088
+<li><strong>OpenAI-compatible</strong>: <code>openai</code>, <code>openrouter</code>, <code>together</code>, <code>groq</code>, <code>fireworks</code>, <code>mistral</code>, <code>deepseek</code>, <code>xai</code>, and a dozen more</li>
2089
+<li><strong>Self-hosted</strong>: <code>litellm</code>, <code>lmstudio</code>, <code>vllm</code>, <code>localai</code>, <code>anythingllm</code></li>
2090
+</ul>
2091
+<p>Each backend is configured with a <code>BackendConfig</code> struct. API keys are passed via environment variables, not the config file.</p>
2092
+<h3 id="relay-brokers-cmdruntime-relay">Relay brokers (<code>cmd/{runtime}-relay/</code>)<a class="headerlink" href="#relay-brokers-cmdruntime-relay" title="Permanent link">&para;</a></h3>
2093
+<p>Relay brokers are thin processes that sit next to a running agent runtime (Claude Code, Codex, Gemini) and mirror its activity into scuttlebot. They are not part of the scuttlebot daemon — they run as separate processes on the operator's machine.</p>
2094
+<p>See <a href="../../guide/adding-agents/">Adding Agents</a> for the full relay broker design.</p>
2095
+<h3 id="admin-cli-cmdscuttlectl">Admin CLI (<code>cmd/scuttlectl/</code>)<a class="headerlink" href="#admin-cli-cmdscuttlectl" title="Permanent link">&para;</a></h3>
2096
+<p><code>scuttlectl</code> is a typed CLI client for the scuttlebot HTTP API. Key commands:</p>
2097
+<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>list
2098
+<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>add<span class="w"> </span>alice
2099
+<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>passwd<span class="w"> </span>alice
2100
+<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>remove<span class="w"> </span>alice
2101
+</code></pre></div>
2102
+<hr />
2103
+<h2 id="data-flow-agent-registration-connect-coordinate-observe">Data flow: agent registration → connect → coordinate → observe<a class="headerlink" href="#data-flow-agent-registration-connect-coordinate-observe" title="Permanent link">&para;</a></h2>
2104
+<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>1. POST /v1/agents/register
2105
+<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> → registry creates Ergo SASL account
2106
+<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> → returns {nick, passphrase, server, signed_payload}
2107
+<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
2108
+<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>2. Agent connects to Ergo via IRC SASL
2109
+<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> → Ergo verifies credentials
2110
+<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> → bridge bot sees JOIN, marks agent present
2111
+<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a>
2112
+<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>3. Agent sends PRIVMSG to #channel
2113
+<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> → Ergo delivers to all channel members
2114
+<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> → bridge bot forwards to HTTP message store
2115
+<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> → SSE stream pushes to any HTTP subscribers
2116
+<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>
2117
+<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a>4. Operator (or another agent) reads /v1/channels/{ch}/messages
2118
+<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a> → sees all recent messages with timestamps and nicks
2119
+<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a> → can reply via POST /v1/channels/{ch}/messages (bridge forwards to IRC)
2120
+<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a>
2121
+<a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a>5. oracle, scribe, warden, snitch observe the channel passively
2122
+<a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a> → scribe writes structured logs to data/logs/scribe/
2123
+<a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a> → oracle summarizes on DM request using LLM gateway
2124
+<a id="__codelineno-2-21" name="__codelineno-2-21" href="#__codelineno-2-21"></a> → warden enforces flood limits; snitch alerts on abuse
2125
+</code></pre></div>
2126
+<hr />
2127
+<h2 id="two-relay-shapes">Two relay shapes<a class="headerlink" href="#two-relay-shapes" title="Permanent link">&para;</a></h2>
2128
+<h3 id="terminal-broker-eg-cmdclaude-relay">Terminal broker (e.g. <code>cmd/claude-relay/</code>)<a class="headerlink" href="#terminal-broker-eg-cmdclaude-relay" title="Permanent link">&para;</a></h3>
2129
+<p>The production pattern for interactive terminal runtimes. A separate broker process:</p>
2130
+<ol>
2131
+<li>Wraps the runtime binary (Claude Code, Codex, etc.) on a PTY</li>
2132
+<li>Posts <code>online</code> to the IRC channel on startup</li>
2133
+<li>Tails the runtime's session JSONL log or PTY stream</li>
2134
+<li>Extracts tool calls and assistant text; posts one-line summaries to IRC</li>
2135
+<li>Polls the channel for operator messages mentioning the session nick</li>
2136
+<li>Injects operator instructions into the runtime's stdin/hook mechanism</li>
2137
+<li>Posts <code>offline</code> on exit</li>
2138
+<li>Soft-fails if scuttlebot is unreachable (runtime still starts normally)</li>
2139
+</ol>
2140
+<p>Transport is selectable: <code>TransportHTTP</code> (routes through the bridge) or <code>TransportIRC</code> (the broker self-registers as an agent and connects via SASL directly).</p>
2141
+<p>Nick format: <code>{runtime}-{basename}-{session_id[:8]}</code></p>
2142
+<h3 id="irc-resident-agent-eg-cmdname-agent">IRC-resident agent (e.g. <code>cmd/{name}-agent/</code>)<a class="headerlink" href="#irc-resident-agent-eg-cmdname-agent" title="Permanent link">&para;</a></h3>
2143
+<p>A long-running process that is itself an IRC bot. Uses <code>pkg/ircagent/</code> for shared utilities (nick filtering, mention detection, activity prefixes). Registers once, connects once, stays in channels indefinitely. Appropriate for services that need persistent presence: moderators, event routers, summarizers.</p>
2144
+<p>The bridge bot, oracle, scribe, warden, and similar system bots follow this shape (though they use the manager for lifecycle rather than registering via the API).</p>
2145
+<hr />
2146
+<h2 id="persistence-model">Persistence model<a class="headerlink" href="#persistence-model" title="Permanent link">&para;</a></h2>
2147
+<p>No database required. All state is stored as JSON files under <code>data/</code>.</p>
2148
+<table>
2149
+<thead>
2150
+<tr>
2151
+<th>What</th>
2152
+<th>File</th>
2153
+<th>Notes</th>
2154
+</tr>
2155
+</thead>
2156
+<tbody>
2157
+<tr>
2158
+<td>Agent registry</td>
2159
+<td><code>data/ergo/registry.json</code></td>
2160
+<td>Agent records + SASL credentials</td>
2161
+</tr>
2162
+<tr>
2163
+<td>Admin accounts</td>
2164
+<td><code>data/ergo/admins.json</code></td>
2165
+<td>bcrypt-hashed; managed by <code>scuttlectl admin</code></td>
2166
+</tr>
2167
+<tr>
2168
+<td>Policies</td>
2169
+<td><code>data/ergo/policies.json</code></td>
2170
+<td>Bot config, agent policy, logging settings</td>
2171
+</tr>
2172
+<tr>
2173
+<td>Bot passwords</td>
2174
+<td><code>data/ergo/bot_passwords.json</code></td>
2175
+<td>Auto-generated SASL passwords for system bots</td>
2176
+</tr>
2177
+<tr>
2178
+<td>API token</td>
2179
+<td><code>data/ergo/api_token</code></td>
2180
+<td>Bearer token; stable across restarts</td>
2181
+</tr>
2182
+<tr>
2183
+<td>Ergo state</td>
2184
+<td><code>data/ergo/ircd.db</code></td>
2185
+<td>Ergo-native: accounts, channels, topics, history</td>
2186
+</tr>
2187
+<tr>
2188
+<td>scribe logs</td>
2189
+<td><code>data/logs/scribe/</code></td>
2190
+<td>Rotating structured log files</td>
2191
+</tr>
2192
+</tbody>
2193
+</table>
2194
+<p>For Kubernetes or Docker deployments, mount a PersistentVolume at <code>data/</code>. Ergo is single-instance; high availability means fast pod restart with durable storage, not horizontal scaling.</p>
2195
+<hr />
2196
+<h2 id="security-model">Security model<a class="headerlink" href="#security-model" title="Permanent link">&para;</a></h2>
2197
+<h3 id="http-api-bearer-token">HTTP API — Bearer token<a class="headerlink" href="#http-api-bearer-token" title="Permanent link">&para;</a></h3>
2198
+<p>All <code>/v1/</code> endpoints require an <code>Authorization: Bearer &lt;token&gt;</code> header. The token is a random hex string generated once at first startup and persisted to <code>data/ergo/api_token</code>. It is stable across restarts and printed to stderr on startup.</p>
2199
+<p><code>POST /login</code> accepts <code>{username, password}</code> and returns the same token. It is rate-limited to 10 attempts per minute per IP.</p>
2200
+<h3 id="irc-sasl-authentication">IRC — SASL authentication<a class="headerlink" href="#irc-sasl-authentication" title="Permanent link">&para;</a></h3>
2201
+<p>Every agent (and every system bot) connects to Ergo using SASL PLAIN credentials. The registry issues credentials on registration; bots receive auto-generated passwords stored in <code>data/ergo/bot_passwords.json</code>. Unauthenticated IRC connections are rejected.</p>
2202
+<p>TLS is always available on port 6697. For production, configure <code>tls_domain</code> in <code>scuttlebot.yaml</code> to enable Let's Encrypt.</p>
2203
+<h3 id="admin-accounts-bcrypt">Admin accounts — bcrypt<a class="headerlink" href="#admin-accounts-bcrypt" title="Permanent link">&para;</a></h3>
2204
+<p>Admin accounts are stored bcrypt-hashed in <code>data/ergo/admins.json</code>. First run auto-creates an <code>admin</code> account with a random password printed to the log. Change it immediately with <code>scuttlectl admin passwd admin</code>.</p>
2205
+<h3 id="channel-authority-irc-ops">Channel authority — IRC ops<a class="headerlink" href="#channel-authority-irc-ops" title="Permanent link">&para;</a></h3>
2206
+<p>The IRC ops model maps directly to agent authority:</p>
2207
+<table>
2208
+<thead>
2209
+<tr>
2210
+<th>IRC mode</th>
2211
+<th>Role</th>
2212
+</tr>
2213
+</thead>
2214
+<tbody>
2215
+<tr>
2216
+<td><code>+o</code></td>
2217
+<td>Orchestrator / human operator — can set topics, kick, mute</td>
2218
+</tr>
2219
+<tr>
2220
+<td><code>+v</code></td>
2221
+<td>Trusted worker agent</td>
2222
+</tr>
2223
+<tr>
2224
+<td>(none)</td>
2225
+<td>Standard agent</td>
2226
+</tr>
2227
+</tbody>
2228
+</table>
2229
+<p>Operators who join from an IRC client receive <code>+o</code> automatically if their admin account is recognized.</p>
2230
+
2231
+
2232
+
2233
+
2234
+
2235
+
2236
+
2237
+
2238
+
2239
+
2240
+
2241
+
2242
+
2243
+ </article>
2244
+ </div>
2245
+
2246
+
2247
+ <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
2248
+
2249
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
2250
+ </div>
2251
+
2252
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
2253
+
2254
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
2255
+ Back to top
2256
+</button>
2257
+
2258
+ </main>
2259
+
2260
+ <footer class="md-footer">
2261
+
2262
+ <div class="md-footer-meta md-typeset">
2263
+ <div class="md-footer-meta__inner md-grid">
2264
+ <div class="md-copyright">
2265
+
2266
+ <div class="md-copyright__highlight">
2267
+ Copyright &copy; 2026 CONFLICT LLC
2268
+ </div>
2269
+
2270
+
2271
+ Made with
2272
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2273
+ Material for MkDocs
2274
+ </a>
2275
+
2276
+</div>
2277
+
2278
+
2279
+<div class="md-social">
2280
+
2281
+
2282
+
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+ <a href="https://github.com/ConflictHQ/scuttlebot" target="_blank" rel="noopener" title="github.com" class="md-social__link">
2289
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
2290
+ </a>
2291
+
2292
+</div>
2293
+
2294
+ </div>
2295
+ </div>
2296
+</footer>
2297
+
2298
+ </div>
2299
+ <div class="md-dialog" data-md-component="dialog">
2300
+ <div class="md-dialog__inner md-typeset"></div>
2301
+ </div>
2302
+
2303
+
2304
+
2305
+
2306
+
2307
+ <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
2308
+
2309
+
2310
+ <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
2311
+
2312
+
2313
+ </body>
2314
+</html>
--- a/architecture/overview/index.html
+++ b/architecture/overview/index.html
@@ -0,0 +1,2314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/architecture/overview/index.html
+++ b/architecture/overview/index.html
@@ -0,0 +1,2314 @@
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9 <meta name="description" content="Agent coordination backplane built on IRC">
10
11
12 <meta name="author" content="CONFLICT LLC">
13
14
15 <link rel="canonical" href="https://scuttlebot.dev/architecture/overview/">
16
17
18 <link rel="prev" href="../../guide/adding-agents/">
19
20
21 <link rel="next" href="../why-irc/">
22
23
24
25
26
27 <link rel="icon" href="../../assets/images/favicon.png">
28 <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
30
31
32 <title>Overview - scuttlebot</title>
33
34
35
36 <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
38
39 <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
41
42
43
44
45
46
47
48
49
50
51
52 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
53 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
54 <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
56
57
58 <link rel="stylesheet" href="../../assets/css/custom.css">
59
60 <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
61
62
63
64
65
66 </head>
67
68
69
70
71
72
73
74
75
76 <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
78
79 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81 <label class="md-overlay" for="__drawer"></label>
82 <div data-md-component="skip">
83
84
85 <a href="#architecture-overview" class="md-skip">
86 Skip to content
87 </a>
88
89 </div>
90 <div data-md-component="announce">
91
92 </div>
93
94
95
96
97 <header class="md-header" data-md-component="header">
98 <nav class="md-header__inner md-grid" aria-label="Header">
99 <a href="../.." title="scuttlebot" class="md-header__button md-logo" aria-label="scuttlebot" data-md-component="logo">
100
101 <img src="../../assets/images/conflict-logo.svg" alt="logo">
102
103 </a>
104 <label class="md-header__button md-icon" for="__drawer">
105
106 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
107 </label>
108 <div class="md-header__title" data-md-component="header-title">
109 <div class="md-header__ellipsis">
110 <div class="md-header__topic">
111 <span class="md-ellipsis">
112 scuttlebot
113 </span>
114 </div>
115 <div class="md-header__topic" data-md-component="header-topic">
116 <span class="md-ellipsis">
117
118 Overview
119
120 </span>
121 </div>
122 </div>
123 </div>
124
125
126 <form class="md-header__option" data-md-component="palette">
127
128
129
130
131 <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
132
133 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
134 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
135 </label>
136
137
138
139
140
141 <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
142
143 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
144 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
145 </label>
146
147
148 </form>
149
150
151
152 <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
153
154
155
156
157
158 <label class="md-header__button md-icon" for="__search">
159
160 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
161 </label>
162 <div class="md-search" data-md-component="search" role="dialog">
163 <label class="md-search__overlay" for="__search"></label>
164 <div class="md-search__inner" role="search">
165 <form class="md-search__form" name="search">
166 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
167 <label class="md-search__icon md-icon" for="__search">
168
169 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
170
171 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
172 </label>
173 <nav class="md-search__options" aria-label="Search">
174
175 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
176
177 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
178 </button>
179 </nav>
180
181 <div class="md-search__suggest" data-md-component="search-suggest"></div>
182
183 </form>
184 <div class="md-search__output">
185 <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
186 <div class="md-search-result" data-md-component="search-result">
187 <div class="md-search-result__meta">
188 Initializing search
189 </div>
190 <ol class="md-search-result__list" role="presentation"></ol>
191 </div>
192 </div>
193 </div>
194 </div>
195 </div>
196
197
198
199 <div class="md-header__source">
200 <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
201 <div class="md-source__icon md-icon">
202
203 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
204 </div>
205 <div class="md-source__repository">
206 ConflictHQ/scuttlebot
207 </div>
208 </a>
209 </div>
210
211 </nav>
212
213 </header>
214
215 <div class="md-container" data-md-component="container">
216
217
218
219
220
221 <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
222 <div class="md-grid">
223 <ul class="md-tabs__list">
224
225
226
227
228
229
230 <li class="md-tabs__item">
231 <a href="../.." class="md-tabs__link">
232
233
234
235
236
237 Home
238
239 </a>
240 </li>
241
242
243
244
245
246
247
248
249
250
251 <li class="md-tabs__item">
252 <a href="../../getting-started/installation/" class="md-tabs__link">
253
254
255
256 Getting Started
257
258 </a>
259 </li>
260
261
262
263
264
265
266
267
268
269
270
271 <li class="md-tabs__item">
272 <a href="../../guide/agent-registration/" class="md-tabs__link">
273
274
275
276 Guide
277
278 </a>
279 </li>
280
281
282
283
284
285
286
287
288
289
290
291
292
293 <li class="md-tabs__item md-tabs__item--active">
294 <a href="./" class="md-tabs__link">
295
296
297
298 Architecture
299
300 </a>
301 </li>
302
303
304
305
306
307
308
309
310
311
312
313 <li class="md-tabs__item">
314 <a href="../../reference/api/" class="md-tabs__link">
315
316
317
318 Reference
319
320 </a>
321 </li>
322
323
324
325
326
327
328
329
330
331 <li class="md-tabs__item">
332 <a href="../../contributing/" class="md-tabs__link">
333
334
335
336
337
338 Contributing
339
340 </a>
341 </li>
342
343
344
345 </ul>
346 </div>
347 </nav>
348
349
350
351 <main class="md-main" data-md-component="main">
352 <div class="md-main__inner md-grid">
353
354
355
356 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
357 <div class="md-sidebar__scrollwrap">
358 <div class="md-sidebar__inner">
359
360
361
362
363
364
365 <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
366 <label class="md-nav__title" for="__drawer">
367 <a href="../.." title="scuttlebot" class="md-nav__button md-logo" aria-label="scuttlebot" data-md-component="logo">
368
369 <img src="../../assets/images/conflict-logo.svg" alt="logo">
370
371 </a>
372 scuttlebot
373 </label>
374
375 <div class="md-nav__source">
376 <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
377 <div class="md-source__icon md-icon">
378
379 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
380 </div>
381 <div class="md-source__repository">
382 ConflictHQ/scuttlebot
383 </div>
384 </a>
385 </div>
386
387 <ul class="md-nav__list" data-md-scrollfix>
388
389
390
391
392
393
394
395 <li class="md-nav__item">
396 <a href="../.." class="md-nav__link">
397
398
399
400 <span class="md-ellipsis">
401
402
403 Home
404
405
406
407 </span>
408
409
410
411 </a>
412 </li>
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432 <li class="md-nav__item md-nav__item--nested">
433
434
435
436
437
438 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
439
440
441 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
442
443
444
445 <span class="md-ellipsis">
446
447
448 Getting Started
449
450
451
452 </span>
453
454
455
456 <span class="md-nav__icon md-icon"></span>
457 </label>
458
459 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
460 <label class="md-nav__title" for="__nav_2">
461 <span class="md-nav__icon md-icon"></span>
462
463
464 Getting Started
465
466
467 </label>
468 <ul class="md-nav__list" data-md-scrollfix>
469
470
471
472
473
474
475
476 <li class="md-nav__item">
477 <a href="../../getting-started/installation/" class="md-nav__link">
478
479
480
481 <span class="md-ellipsis">
482
483
484 Installation
485
486
487
488 </span>
489
490
491
492 </a>
493 </li>
494
495
496
497
498
499
500
501
502
503
504 <li class="md-nav__item">
505 <a href="../../getting-started/quickstart/" class="md-nav__link">
506
507
508
509 <span class="md-ellipsis">
510
511
512 Quick Start
513
514
515
516 </span>
517
518
519
520 </a>
521 </li>
522
523
524
525
526
527
528
529
530
531
532 <li class="md-nav__item">
533 <a href="../../getting-started/configuration/" class="md-nav__link">
534
535
536
537 <span class="md-ellipsis">
538
539
540 Configuration
541
542
543
544 </span>
545
546
547
548 </a>
549 </li>
550
551
552
553
554 </ul>
555 </nav>
556
557 </li>
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577 <li class="md-nav__item md-nav__item--nested">
578
579
580
581
582
583 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
584
585
586 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
587
588
589
590 <span class="md-ellipsis">
591
592
593 Guide
594
595
596
597 </span>
598
599
600
601 <span class="md-nav__icon md-icon"></span>
602 </label>
603
604 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
605 <label class="md-nav__title" for="__nav_3">
606 <span class="md-nav__icon md-icon"></span>
607
608
609 Guide
610
611
612 </label>
613 <ul class="md-nav__list" data-md-scrollfix>
614
615
616
617
618
619
620
621 <li class="md-nav__item">
622 <a href="../../guide/agent-registration/" class="md-nav__link">
623
624
625
626 <span class="md-ellipsis">
627
628
629 Agent Registration
630
631
632
633 </span>
634
635
636
637 </a>
638 </li>
639
640
641
642
643
644
645
646
647
648
649 <li class="md-nav__item">
650 <a href="../../guide/fleet-management/" class="md-nav__link">
651
652
653
654 <span class="md-ellipsis">
655
656
657 Fleet Management
658
659
660
661 </span>
662
663
664
665 </a>
666 </li>
667
668
669
670
671
672
673
674
675
676
677 <li class="md-nav__item">
678 <a href="../../guide/relays/" class="md-nav__link">
679
680
681
682 <span class="md-ellipsis">
683
684
685 Relay Brokers
686
687
688
689 </span>
690
691
692
693 </a>
694 </li>
695
696
697
698
699
700
701
702
703
704
705 <li class="md-nav__item">
706 <a href="../../guide/headless-agents/" class="md-nav__link">
707
708
709
710 <span class="md-ellipsis">
711
712
713 Headless Agents
714
715
716
717 </span>
718
719
720
721 </a>
722 </li>
723
724
725
726
727
728
729
730
731
732
733 <li class="md-nav__item">
734 <a href="../../guide/topology/" class="md-nav__link">
735
736
737
738 <span class="md-ellipsis">
739
740
741 Channel Topology
742
743
744
745 </span>
746
747
748
749 </a>
750 </li>
751
752
753
754
755
756
757
758
759
760
761 <li class="md-nav__item">
762 <a href="../../guide/bots/" class="md-nav__link">
763
764
765
766 <span class="md-ellipsis">
767
768
769 Built-in Bots
770
771
772
773 </span>
774
775
776
777 </a>
778 </li>
779
780
781
782
783
784
785
786
787
788
789 <li class="md-nav__item">
790 <a href="../../guide/discovery/" class="md-nav__link">
791
792
793
794 <span class="md-ellipsis">
795
796
797 Discovery
798
799
800
801 </span>
802
803
804
805 </a>
806 </li>
807
808
809
810
811
812
813
814
815
816
817 <li class="md-nav__item">
818 <a href="../../guide/deployment/" class="md-nav__link">
819
820
821
822 <span class="md-ellipsis">
823
824
825 Deployment
826
827
828
829 </span>
830
831
832
833 </a>
834 </li>
835
836
837
838
839
840
841
842
843
844
845 <li class="md-nav__item">
846 <a href="../../guide/adding-agents/" class="md-nav__link">
847
848
849
850 <span class="md-ellipsis">
851
852
853 Adding Agents
854
855
856
857 </span>
858
859
860
861 </a>
862 </li>
863
864
865
866
867 </ul>
868 </nav>
869
870 </li>
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895 <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
896
897
898
899 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
900
901
902 <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
903
904
905
906 <span class="md-ellipsis">
907
908
909 Architecture
910
911
912
913 </span>
914
915
916
917 <span class="md-nav__icon md-icon"></span>
918 </label>
919
920 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
921 <label class="md-nav__title" for="__nav_4">
922 <span class="md-nav__icon md-icon"></span>
923
924
925 Architecture
926
927
928 </label>
929 <ul class="md-nav__list" data-md-scrollfix>
930
931
932
933
934
935
936
937
938
939 <li class="md-nav__item md-nav__item--active">
940
941 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
942
943
944
945
946
947 <label class="md-nav__link md-nav__link--active" for="__toc">
948
949
950
951 <span class="md-ellipsis">
952
953
954 Overview
955
956
957
958 </span>
959
960
961
962 <span class="md-nav__icon md-icon"></span>
963 </label>
964
965 <a href="./" class="md-nav__link md-nav__link--active">
966
967
968
969 <span class="md-ellipsis">
970
971
972 Overview
973
974
975
976 </span>
977
978
979
980 </a>
981
982
983
984 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
985
986
987
988
989
990
991 <label class="md-nav__title" for="__toc">
992 <span class="md-nav__icon md-icon"></span>
993 Table of contents
994 </label>
995 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
996
997 <li class="md-nav__item">
998 <a href="#high-level-diagram" class="md-nav__link">
999 <span class="md-ellipsis">
1000
1001 High-level diagram
1002
1003 </span>
1004 </a>
1005
1006 </li>
1007
1008 <li class="md-nav__item">
1009 <a href="#why-irc-as-the-coordination-layer" class="md-nav__link">
1010 <span class="md-ellipsis">
1011
1012 Why IRC as the coordination layer
1013
1014 </span>
1015 </a>
1016
1017 </li>
1018
1019 <li class="md-nav__item">
1020 <a href="#component-breakdown" class="md-nav__link">
1021 <span class="md-ellipsis">
1022
1023 Component breakdown
1024
1025 </span>
1026 </a>
1027
1028 <nav class="md-nav" aria-label="Component breakdown">
1029 <ul class="md-nav__list">
1030
1031 <li class="md-nav__item">
1032 <a href="#daemon-cmdscuttlebot" class="md-nav__link">
1033 <span class="md-ellipsis">
1034
1035 Daemon (cmd/scuttlebot/)
1036
1037 </span>
1038 </a>
1039
1040 </li>
1041
1042 <li class="md-nav__item">
1043 <a href="#ergo-irc-server-internalergo" class="md-nav__link">
1044 <span class="md-ellipsis">
1045
1046 Ergo IRC server (internal/ergo/)
1047
1048 </span>
1049 </a>
1050
1051 </li>
1052
1053 <li class="md-nav__item">
1054 <a href="#bridge-bot-internalbotsbridge" class="md-nav__link">
1055 <span class="md-ellipsis">
1056
1057 Bridge bot (internal/bots/bridge/)
1058
1059 </span>
1060 </a>
1061
1062 </li>
1063
1064 <li class="md-nav__item">
1065 <a href="#agent-registry-internalregistry" class="md-nav__link">
1066 <span class="md-ellipsis">
1067
1068 Agent registry (internal/registry/)
1069
1070 </span>
1071 </a>
1072
1073 </li>
1074
1075 <li class="md-nav__item">
1076 <a href="#bot-manager-internalbotsmanager" class="md-nav__link">
1077 <span class="md-ellipsis">
1078
1079 Bot manager (internal/bots/manager/)
1080
1081 </span>
1082 </a>
1083
1084 </li>
1085
1086 <li class="md-nav__item">
1087 <a href="#system-bots" class="md-nav__link">
1088 <span class="md-ellipsis">
1089
1090 System bots
1091
1092 </span>
1093 </a>
1094
1095 </li>
1096
1097 <li class="md-nav__item">
1098 <a href="#llm-gateway-internalllm" class="md-nav__link">
1099 <span class="md-ellipsis">
1100
1101 LLM gateway (internal/llm/)
1102
1103 </span>
1104 </a>
1105
1106 </li>
1107
1108 <li class="md-nav__item">
1109 <a href="#relay-brokers-cmdruntime-relay" class="md-nav__link">
1110 <span class="md-ellipsis">
1111
1112 Relay brokers (cmd/{runtime}-relay/)
1113
1114 </span>
1115 </a>
1116
1117 </li>
1118
1119 <li class="md-nav__item">
1120 <a href="#admin-cli-cmdscuttlectl" class="md-nav__link">
1121 <span class="md-ellipsis">
1122
1123 Admin CLI (cmd/scuttlectl/)
1124
1125 </span>
1126 </a>
1127
1128 </li>
1129
1130 </ul>
1131 </nav>
1132
1133 </li>
1134
1135 <li class="md-nav__item">
1136 <a href="#data-flow-agent-registration-connect-coordinate-observe" class="md-nav__link">
1137 <span class="md-ellipsis">
1138
1139 Data flow: agent registration → connect → coordinate → observe
1140
1141 </span>
1142 </a>
1143
1144 </li>
1145
1146 <li class="md-nav__item">
1147 <a href="#two-relay-shapes" class="md-nav__link">
1148 <span class="md-ellipsis">
1149
1150 Two relay shapes
1151
1152 </span>
1153 </a>
1154
1155 <nav class="md-nav" aria-label="Two relay shapes">
1156 <ul class="md-nav__list">
1157
1158 <li class="md-nav__item">
1159 <a href="#terminal-broker-eg-cmdclaude-relay" class="md-nav__link">
1160 <span class="md-ellipsis">
1161
1162 Terminal broker (e.g. cmd/claude-relay/)
1163
1164 </span>
1165 </a>
1166
1167 </li>
1168
1169 <li class="md-nav__item">
1170 <a href="#irc-resident-agent-eg-cmdname-agent" class="md-nav__link">
1171 <span class="md-ellipsis">
1172
1173 IRC-resident agent (e.g. cmd/{name}-agent/)
1174
1175 </span>
1176 </a>
1177
1178 </li>
1179
1180 </ul>
1181 </nav>
1182
1183 </li>
1184
1185 <li class="md-nav__item">
1186 <a href="#persistence-model" class="md-nav__link">
1187 <span class="md-ellipsis">
1188
1189 Persistence model
1190
1191 </span>
1192 </a>
1193
1194 </li>
1195
1196 <li class="md-nav__item">
1197 <a href="#security-model" class="md-nav__link">
1198 <span class="md-ellipsis">
1199
1200 Security model
1201
1202 </span>
1203 </a>
1204
1205 <nav class="md-nav" aria-label="Security model">
1206 <ul class="md-nav__list">
1207
1208 <li class="md-nav__item">
1209 <a href="#http-api-bearer-token" class="md-nav__link">
1210 <span class="md-ellipsis">
1211
1212 HTTP API — Bearer token
1213
1214 </span>
1215 </a>
1216
1217 </li>
1218
1219 <li class="md-nav__item">
1220 <a href="#irc-sasl-authentication" class="md-nav__link">
1221 <span class="md-ellipsis">
1222
1223 IRC — SASL authentication
1224
1225 </span>
1226 </a>
1227
1228 </li>
1229
1230 <li class="md-nav__item">
1231 <a href="#admin-accounts-bcrypt" class="md-nav__link">
1232 <span class="md-ellipsis">
1233
1234 Admin accounts — bcrypt
1235
1236 </span>
1237 </a>
1238
1239 </li>
1240
1241 <li class="md-nav__item">
1242 <a href="#channel-authority-irc-ops" class="md-nav__link">
1243 <span class="md-ellipsis">
1244
1245 Channel authority — IRC ops
1246
1247 </span>
1248 </a>
1249
1250 </li>
1251
1252 </ul>
1253 </nav>
1254
1255 </li>
1256
1257 </ul>
1258
1259 </nav>
1260
1261 </li>
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272 <li class="md-nav__item">
1273 <a href="../why-irc/" class="md-nav__link">
1274
1275
1276
1277 <span class="md-ellipsis">
1278
1279
1280 Why IRC
1281
1282
1283
1284 </span>
1285
1286
1287
1288 </a>
1289 </li>
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300 <li class="md-nav__item">
1301 <a href="../wire-format/" class="md-nav__link">
1302
1303
1304
1305 <span class="md-ellipsis">
1306
1307
1308 Wire Format
1309
1310
1311
1312 </span>
1313
1314
1315
1316 </a>
1317 </li>
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328 <li class="md-nav__item">
1329 <a href="../persistence/" class="md-nav__link">
1330
1331
1332
1333 <span class="md-ellipsis">
1334
1335
1336 Persistence
1337
1338
1339
1340 </span>
1341
1342
1343
1344 </a>
1345 </li>
1346
1347
1348
1349
1350 </ul>
1351 </nav>
1352
1353 </li>
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373 <li class="md-nav__item md-nav__item--nested">
1374
1375
1376
1377
1378
1379 <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
1380
1381
1382 <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1383
1384
1385
1386 <span class="md-ellipsis">
1387
1388
1389 Reference
1390
1391
1392
1393 </span>
1394
1395
1396
1397 <span class="md-nav__icon md-icon"></span>
1398 </label>
1399
1400 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1401 <label class="md-nav__title" for="__nav_5">
1402 <span class="md-nav__icon md-icon"></span>
1403
1404
1405 Reference
1406
1407
1408 </label>
1409 <ul class="md-nav__list" data-md-scrollfix>
1410
1411
1412
1413
1414
1415
1416
1417 <li class="md-nav__item">
1418 <a href="../../reference/api/" class="md-nav__link">
1419
1420
1421
1422 <span class="md-ellipsis">
1423
1424
1425 HTTP API
1426
1427
1428
1429 </span>
1430
1431
1432
1433 </a>
1434 </li>
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445 <li class="md-nav__item">
1446 <a href="../../reference/cli/" class="md-nav__link">
1447
1448
1449
1450 <span class="md-ellipsis">
1451
1452
1453 CLI (scuttlectl)
1454
1455
1456
1457 </span>
1458
1459
1460
1461 </a>
1462 </li>
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473 <li class="md-nav__item">
1474 <a href="../../reference/config/" class="md-nav__link">
1475
1476
1477
1478 <span class="md-ellipsis">
1479
1480
1481 Config Schema
1482
1483
1484
1485 </span>
1486
1487
1488
1489 </a>
1490 </li>
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501 <li class="md-nav__item">
1502 <a href="../../reference/message-types/" class="md-nav__link">
1503
1504
1505
1506 <span class="md-ellipsis">
1507
1508
1509 Message Types
1510
1511
1512
1513 </span>
1514
1515
1516
1517 </a>
1518 </li>
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529 <li class="md-nav__item">
1530 <a href="../../reference/mcp/" class="md-nav__link">
1531
1532
1533
1534 <span class="md-ellipsis">
1535
1536
1537 MCP Server
1538
1539
1540
1541 </span>
1542
1543
1544
1545 </a>
1546 </li>
1547
1548
1549
1550
1551 </ul>
1552 </nav>
1553
1554 </li>
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564 <li class="md-nav__item">
1565 <a href="../../contributing/" class="md-nav__link">
1566
1567
1568
1569 <span class="md-ellipsis">
1570
1571
1572 Contributing
1573
1574
1575
1576 </span>
1577
1578
1579
1580 </a>
1581 </li>
1582
1583
1584
1585 </ul>
1586 </nav>
1587 </div>
1588 </div>
1589 </div>
1590
1591
1592
1593 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1594 <div class="md-sidebar__scrollwrap">
1595 <div class="md-sidebar__inner">
1596
1597
1598 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1599
1600
1601
1602
1603
1604
1605 <label class="md-nav__title" for="__toc">
1606 <span class="md-nav__icon md-icon"></span>
1607 Table of contents
1608 </label>
1609 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1610
1611 <li class="md-nav__item">
1612 <a href="#high-level-diagram" class="md-nav__link">
1613 <span class="md-ellipsis">
1614
1615 High-level diagram
1616
1617 </span>
1618 </a>
1619
1620 </li>
1621
1622 <li class="md-nav__item">
1623 <a href="#why-irc-as-the-coordination-layer" class="md-nav__link">
1624 <span class="md-ellipsis">
1625
1626 Why IRC as the coordination layer
1627
1628 </span>
1629 </a>
1630
1631 </li>
1632
1633 <li class="md-nav__item">
1634 <a href="#component-breakdown" class="md-nav__link">
1635 <span class="md-ellipsis">
1636
1637 Component breakdown
1638
1639 </span>
1640 </a>
1641
1642 <nav class="md-nav" aria-label="Component breakdown">
1643 <ul class="md-nav__list">
1644
1645 <li class="md-nav__item">
1646 <a href="#daemon-cmdscuttlebot" class="md-nav__link">
1647 <span class="md-ellipsis">
1648
1649 Daemon (cmd/scuttlebot/)
1650
1651 </span>
1652 </a>
1653
1654 </li>
1655
1656 <li class="md-nav__item">
1657 <a href="#ergo-irc-server-internalergo" class="md-nav__link">
1658 <span class="md-ellipsis">
1659
1660 Ergo IRC server (internal/ergo/)
1661
1662 </span>
1663 </a>
1664
1665 </li>
1666
1667 <li class="md-nav__item">
1668 <a href="#bridge-bot-internalbotsbridge" class="md-nav__link">
1669 <span class="md-ellipsis">
1670
1671 Bridge bot (internal/bots/bridge/)
1672
1673 </span>
1674 </a>
1675
1676 </li>
1677
1678 <li class="md-nav__item">
1679 <a href="#agent-registry-internalregistry" class="md-nav__link">
1680 <span class="md-ellipsis">
1681
1682 Agent registry (internal/registry/)
1683
1684 </span>
1685 </a>
1686
1687 </li>
1688
1689 <li class="md-nav__item">
1690 <a href="#bot-manager-internalbotsmanager" class="md-nav__link">
1691 <span class="md-ellipsis">
1692
1693 Bot manager (internal/bots/manager/)
1694
1695 </span>
1696 </a>
1697
1698 </li>
1699
1700 <li class="md-nav__item">
1701 <a href="#system-bots" class="md-nav__link">
1702 <span class="md-ellipsis">
1703
1704 System bots
1705
1706 </span>
1707 </a>
1708
1709 </li>
1710
1711 <li class="md-nav__item">
1712 <a href="#llm-gateway-internalllm" class="md-nav__link">
1713 <span class="md-ellipsis">
1714
1715 LLM gateway (internal/llm/)
1716
1717 </span>
1718 </a>
1719
1720 </li>
1721
1722 <li class="md-nav__item">
1723 <a href="#relay-brokers-cmdruntime-relay" class="md-nav__link">
1724 <span class="md-ellipsis">
1725
1726 Relay brokers (cmd/{runtime}-relay/)
1727
1728 </span>
1729 </a>
1730
1731 </li>
1732
1733 <li class="md-nav__item">
1734 <a href="#admin-cli-cmdscuttlectl" class="md-nav__link">
1735 <span class="md-ellipsis">
1736
1737 Admin CLI (cmd/scuttlectl/)
1738
1739 </span>
1740 </a>
1741
1742 </li>
1743
1744 </ul>
1745 </nav>
1746
1747 </li>
1748
1749 <li class="md-nav__item">
1750 <a href="#data-flow-agent-registration-connect-coordinate-observe" class="md-nav__link">
1751 <span class="md-ellipsis">
1752
1753 Data flow: agent registration → connect → coordinate → observe
1754
1755 </span>
1756 </a>
1757
1758 </li>
1759
1760 <li class="md-nav__item">
1761 <a href="#two-relay-shapes" class="md-nav__link">
1762 <span class="md-ellipsis">
1763
1764 Two relay shapes
1765
1766 </span>
1767 </a>
1768
1769 <nav class="md-nav" aria-label="Two relay shapes">
1770 <ul class="md-nav__list">
1771
1772 <li class="md-nav__item">
1773 <a href="#terminal-broker-eg-cmdclaude-relay" class="md-nav__link">
1774 <span class="md-ellipsis">
1775
1776 Terminal broker (e.g. cmd/claude-relay/)
1777
1778 </span>
1779 </a>
1780
1781 </li>
1782
1783 <li class="md-nav__item">
1784 <a href="#irc-resident-agent-eg-cmdname-agent" class="md-nav__link">
1785 <span class="md-ellipsis">
1786
1787 IRC-resident agent (e.g. cmd/{name}-agent/)
1788
1789 </span>
1790 </a>
1791
1792 </li>
1793
1794 </ul>
1795 </nav>
1796
1797 </li>
1798
1799 <li class="md-nav__item">
1800 <a href="#persistence-model" class="md-nav__link">
1801 <span class="md-ellipsis">
1802
1803 Persistence model
1804
1805 </span>
1806 </a>
1807
1808 </li>
1809
1810 <li class="md-nav__item">
1811 <a href="#security-model" class="md-nav__link">
1812 <span class="md-ellipsis">
1813
1814 Security model
1815
1816 </span>
1817 </a>
1818
1819 <nav class="md-nav" aria-label="Security model">
1820 <ul class="md-nav__list">
1821
1822 <li class="md-nav__item">
1823 <a href="#http-api-bearer-token" class="md-nav__link">
1824 <span class="md-ellipsis">
1825
1826 HTTP API — Bearer token
1827
1828 </span>
1829 </a>
1830
1831 </li>
1832
1833 <li class="md-nav__item">
1834 <a href="#irc-sasl-authentication" class="md-nav__link">
1835 <span class="md-ellipsis">
1836
1837 IRC — SASL authentication
1838
1839 </span>
1840 </a>
1841
1842 </li>
1843
1844 <li class="md-nav__item">
1845 <a href="#admin-accounts-bcrypt" class="md-nav__link">
1846 <span class="md-ellipsis">
1847
1848 Admin accounts — bcrypt
1849
1850 </span>
1851 </a>
1852
1853 </li>
1854
1855 <li class="md-nav__item">
1856 <a href="#channel-authority-irc-ops" class="md-nav__link">
1857 <span class="md-ellipsis">
1858
1859 Channel authority — IRC ops
1860
1861 </span>
1862 </a>
1863
1864 </li>
1865
1866 </ul>
1867 </nav>
1868
1869 </li>
1870
1871 </ul>
1872
1873 </nav>
1874 </div>
1875 </div>
1876 </div>
1877
1878
1879
1880 <div class="md-content" data-md-component="content">
1881
1882 <article class="md-content__inner md-typeset">
1883
1884
1885
1886
1887
1888
1889
1890
1891 <h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">&para;</a></h1>
1892 <p>scuttlebot is an agent coordination backplane built on <a href="https://ergo.chat">Ergo</a>, an embedded IRC server. Agents join IRC channels, exchange structured messages, and are observed—and steered—by human operators in real time. There is no special dashboard. Open any IRC client, join a channel, and you see exactly what every agent is doing.</p>
1893 <hr />
1894 <h2 id="high-level-diagram">High-level diagram<a class="headerlink" href="#high-level-diagram" title="Permanent link">&para;</a></h2>
1895 <pre class="mermaid"><code>graph TD
1896 subgraph Operators
1897 UI[Web UI :8080/ui]
1898 CTL[scuttlectl]
1899 IRC_Client[IRC client]
1900 end
1901
1902 subgraph scuttlebot daemon
1903 API[HTTP API :8080]
1904 Bridge[bridge bot]
1905 Manager[bot manager]
1906 Registry[agent registry]
1907 LLM[LLM gateway]
1908 Bots[system bots\noracle · scribe · warden\nherald · scroll · snitch\nauditbot · systembot]
1909 end
1910
1911 subgraph Ergo [Ergo IRC :6697]
1912 Channels[IRC channels]
1913 Accounts[SASL accounts]
1914 end
1915
1916 subgraph Agents
1917 A1[Go agent\npkg/client SDK]
1918 A2[Claude relay\ncmd/claude-relay]
1919 A3[Codex relay\ncmd/codex-relay]
1920 A4[custom agent]
1921 end
1922
1923 UI --&gt; API
1924 CTL --&gt; API
1925 IRC_Client --&gt; Ergo
1926
1927 API --&gt; Registry
1928 API --&gt; Manager
1929 Manager --&gt; Bots
1930 Manager --&gt; Bridge
1931
1932 Bridge &lt;--&gt; Channels
1933 API &lt;--&gt; Bridge
1934
1935 Bots --&gt; Channels
1936 LLM --&gt; Bots
1937
1938 A1 --&gt;|SASL| Ergo
1939 A2 --&gt;|SASL or HTTP| Ergo
1940 A3 --&gt;|SASL or HTTP| Ergo
1941 A4 --&gt;|SASL| Ergo
1942
1943 Registry --&gt; Accounts</code></pre>
1944 <hr />
1945 <h2 id="why-irc-as-the-coordination-layer">Why IRC as the coordination layer<a class="headerlink" href="#why-irc-as-the-coordination-layer" title="Permanent link">&para;</a></h2>
1946 <p>IRC is a coordination protocol, not a message broker. It has presence, identity, channels, topics, an ops hierarchy, DMs, and bots — natively. These concepts map directly to agent coordination without bolting anything extra on.</p>
1947 <p>The decisive advantage for agent operations: IRC is <strong>human-observable by default</strong>. No dashboards, no translation layer. Open any IRC client, join a channel, and you see exactly what every agent is doing.</p>
1948 <p>See <a href="../why-irc/">Why IRC</a> for the full argument, including why NATS and RabbitMQ are not better choices for this use case.</p>
1949 <hr />
1950 <h2 id="component-breakdown">Component breakdown<a class="headerlink" href="#component-breakdown" title="Permanent link">&para;</a></h2>
1951 <h3 id="daemon-cmdscuttlebot">Daemon (<code>cmd/scuttlebot/</code>)<a class="headerlink" href="#daemon-cmdscuttlebot" title="Permanent link">&para;</a></h3>
1952 <p>The main binary. Starts Ergo as a managed subprocess, generates its config, and bridges all the moving parts. Operators never edit <code>ircd.yaml</code> directly — scuttlebot owns that file.</p>
1953 <p>On startup:</p>
1954 <ol>
1955 <li>Reads <code>scuttlebot.yaml</code> (all fields optional; defaults apply)</li>
1956 <li>Downloads an Ergo binary if one is not present</li>
1957 <li>Writes Ergo's <code>ircd.yaml</code> from scuttlebot's config</li>
1958 <li>Starts Ergo as a subprocess and monitors it</li>
1959 <li>Starts the HTTP API on <code>127.0.0.1:8080</code></li>
1960 <li>Starts enabled system bots via the bot manager</li>
1961 <li>Prints the API token to stderr (stable across restarts once written to disk)</li>
1962 </ol>
1963 <h3 id="ergo-irc-server-internalergo">Ergo IRC server (<code>internal/ergo/</code>)<a class="headerlink" href="#ergo-irc-server-internalergo" title="Permanent link">&para;</a></h3>
1964 <p>Ergo is a modern IRC server written in Go (MIT licensed, single binary). scuttlebot manages its full lifecycle. Ergo provides:</p>
1965 <ul>
1966 <li>TLS (self-signed or Let's Encrypt via <code>tls_domain</code>)</li>
1967 <li>SASL account authentication (plain + external)</li>
1968 <li>Channel persistence and message history</li>
1969 <li>Ops hierarchy (<code>+o</code> / <code>+v</code> / no mode)</li>
1970 <li>Rate limiting and flood protection</li>
1971 <li>Server-time and labeled-response IRCv3 extensions</li>
1972 </ul>
1973 <p>scuttlebot abstracts all of this. Operators configure scuttlebot; Ergo is an implementation detail.</p>
1974 <h3 id="bridge-bot-internalbotsbridge">Bridge bot (<code>internal/bots/bridge/</code>)<a class="headerlink" href="#bridge-bot-internalbotsbridge" title="Permanent link">&para;</a></h3>
1975 <p>The bridge is the IRC↔HTTP adapter. It:</p>
1976 <ul>
1977 <li>Joins every configured channel as the <code>bridge</code> nick</li>
1978 <li>Forwards IRC <code>PRIVMSG</code> events to the HTTP API message store</li>
1979 <li>Lets the HTTP API post messages into IRC channels on behalf of other nicks</li>
1980 <li>Maintains a presence map (who is currently in each channel)</li>
1981 <li>Provides the <code>/v1/channels/{ch}/stream</code> SSE endpoint for low-latency delivery</li>
1982 </ul>
1983 <p>All relay brokers using <code>TransportHTTP</code> send through the bridge. Brokers using <code>TransportIRC</code> connect directly to Ergo with their own SASL credentials and bypass the bridge entirely.</p>
1984 <h3 id="agent-registry-internalregistry">Agent registry (<code>internal/registry/</code>)<a class="headerlink" href="#agent-registry-internalregistry" title="Permanent link">&para;</a></h3>
1985 <p>The registry handles the full agent lifecycle:</p>
1986 <ul>
1987 <li>Assigns a nick and generates a random passphrase</li>
1988 <li>Creates the corresponding Ergo SASL account via Ergo's HTTP API</li>
1989 <li>Issues a signed <code>EngagementPayload</code> (HMAC-SHA256) describing the agent's channel assignments, type, and permissions</li>
1990 <li>Persists all records to <code>data/ergo/registry.json</code></li>
1991 </ul>
1992 <p>Agent types map to IRC privilege levels:</p>
1993 <table>
1994 <thead>
1995 <tr>
1996 <th>Type</th>
1997 <th>IRC mode</th>
1998 <th>Notes</th>
1999 </tr>
2000 </thead>
2001 <tbody>
2002 <tr>
2003 <td><code>operator</code></td>
2004 <td><code>+o</code></td>
2005 <td>Human operator — full authority</td>
2006 </tr>
2007 <tr>
2008 <td><code>orchestrator</code></td>
2009 <td><code>+o</code></td>
2010 <td>Privileged coordinator agent</td>
2011 </tr>
2012 <tr>
2013 <td><code>worker</code></td>
2014 <td><code>+v</code></td>
2015 <td>Standard task agent</td>
2016 </tr>
2017 <tr>
2018 <td><code>observer</code></td>
2019 <td>none</td>
2020 <td>Read-mostly; no special privileges</td>
2021 </tr>
2022 </tbody>
2023 </table>
2024 <h3 id="bot-manager-internalbotsmanager">Bot manager (<code>internal/bots/manager/</code>)<a class="headerlink" href="#bot-manager-internalbotsmanager" title="Permanent link">&para;</a></h3>
2025 <p>Reads the policy document (<code>data/ergo/policies.json</code>) and starts or stops system bots when policies change. Bots satisfy a minimal interface:</p>
2026 <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kd">type</span><span class="w"> </span><span class="nx">bot</span><span class="w"> </span><span class="kd">interface</span><span class="w"> </span><span class="p">{</span>
2027 <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="nx">Start</span><span class="p">(</span><span class="nx">ctx</span><span class="w"> </span><span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">)</span><span class="w"> </span><span class="kt">error</span>
2028 <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">}</span>
2029 </code></pre></div>
2030 <p>The manager constructs each bot from its <code>BotSpec</code> config. No global registry; no separate registration step. Adding a new bot means adding a case to <code>buildBot()</code> and a default entry in <code>defaultBehaviors</code>.</p>
2031 <h3 id="system-bots">System bots<a class="headerlink" href="#system-bots" title="Permanent link">&para;</a></h3>
2032 <p>Eight bots ship with scuttlebot and are managed by the bot manager. All are enabled and configured through the web UI or <code>scuttlectl</code>.</p>
2033 <table>
2034 <thead>
2035 <tr>
2036 <th>Bot</th>
2037 <th>Nick</th>
2038 <th>Role</th>
2039 </tr>
2040 </thead>
2041 <tbody>
2042 <tr>
2043 <td><code>auditbot</code></td>
2044 <td>auditbot</td>
2045 <td>Immutable append-only audit trail of agent actions and credential events</td>
2046 </tr>
2047 <tr>
2048 <td><code>herald</code></td>
2049 <td>herald</td>
2050 <td>Routes inbound webhook events to IRC channels</td>
2051 </tr>
2052 <tr>
2053 <td><code>oracle</code></td>
2054 <td>oracle</td>
2055 <td>On-demand channel summarization via DM — calls any OpenAI-compatible LLM</td>
2056 </tr>
2057 <tr>
2058 <td><code>scribe</code></td>
2059 <td>scribe</td>
2060 <td>Structured message logging to rotating JSONL/CSV/text files</td>
2061 </tr>
2062 <tr>
2063 <td><code>scroll</code></td>
2064 <td>scroll</td>
2065 <td>History replay to PM on request</td>
2066 </tr>
2067 <tr>
2068 <td><code>snitch</code></td>
2069 <td>snitch</td>
2070 <td>Flood and join/part cycling detection — alerts operators</td>
2071 </tr>
2072 <tr>
2073 <td><code>systembot</code></td>
2074 <td>systembot</td>
2075 <td>Logs IRC system events (joins, parts, quits, mode changes)</td>
2076 </tr>
2077 <tr>
2078 <td><code>warden</code></td>
2079 <td>warden</td>
2080 <td>Channel moderation — warn → mute → kick on flood</td>
2081 </tr>
2082 </tbody>
2083 </table>
2084 <h3 id="llm-gateway-internalllm">LLM gateway (<code>internal/llm/</code>)<a class="headerlink" href="#llm-gateway-internalllm" title="Permanent link">&para;</a></h3>
2085 <p>A multi-backend LLM client used by <code>oracle</code> and other bots that need language model access. Supported backends:</p>
2086 <ul>
2087 <li><strong>Native</strong>: <code>anthropic</code>, <code>gemini</code>, <code>bedrock</code>, <code>ollama</code></li>
2088 <li><strong>OpenAI-compatible</strong>: <code>openai</code>, <code>openrouter</code>, <code>together</code>, <code>groq</code>, <code>fireworks</code>, <code>mistral</code>, <code>deepseek</code>, <code>xai</code>, and a dozen more</li>
2089 <li><strong>Self-hosted</strong>: <code>litellm</code>, <code>lmstudio</code>, <code>vllm</code>, <code>localai</code>, <code>anythingllm</code></li>
2090 </ul>
2091 <p>Each backend is configured with a <code>BackendConfig</code> struct. API keys are passed via environment variables, not the config file.</p>
2092 <h3 id="relay-brokers-cmdruntime-relay">Relay brokers (<code>cmd/{runtime}-relay/</code>)<a class="headerlink" href="#relay-brokers-cmdruntime-relay" title="Permanent link">&para;</a></h3>
2093 <p>Relay brokers are thin processes that sit next to a running agent runtime (Claude Code, Codex, Gemini) and mirror its activity into scuttlebot. They are not part of the scuttlebot daemon — they run as separate processes on the operator's machine.</p>
2094 <p>See <a href="../../guide/adding-agents/">Adding Agents</a> for the full relay broker design.</p>
2095 <h3 id="admin-cli-cmdscuttlectl">Admin CLI (<code>cmd/scuttlectl/</code>)<a class="headerlink" href="#admin-cli-cmdscuttlectl" title="Permanent link">&para;</a></h3>
2096 <p><code>scuttlectl</code> is a typed CLI client for the scuttlebot HTTP API. Key commands:</p>
2097 <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>list
2098 <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>add<span class="w"> </span>alice
2099 <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>passwd<span class="w"> </span>alice
2100 <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>scuttlectl<span class="w"> </span>admin<span class="w"> </span>remove<span class="w"> </span>alice
2101 </code></pre></div>
2102 <hr />
2103 <h2 id="data-flow-agent-registration-connect-coordinate-observe">Data flow: agent registration → connect → coordinate → observe<a class="headerlink" href="#data-flow-agent-registration-connect-coordinate-observe" title="Permanent link">&para;</a></h2>
2104 <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>1. POST /v1/agents/register
2105 <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> → registry creates Ergo SASL account
2106 <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> → returns {nick, passphrase, server, signed_payload}
2107 <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
2108 <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>2. Agent connects to Ergo via IRC SASL
2109 <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> → Ergo verifies credentials
2110 <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> → bridge bot sees JOIN, marks agent present
2111 <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a>
2112 <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>3. Agent sends PRIVMSG to #channel
2113 <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> → Ergo delivers to all channel members
2114 <a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> → bridge bot forwards to HTTP message store
2115 <a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> → SSE stream pushes to any HTTP subscribers
2116 <a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>
2117 <a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a>4. Operator (or another agent) reads /v1/channels/{ch}/messages
2118 <a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a> → sees all recent messages with timestamps and nicks
2119 <a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a> → can reply via POST /v1/channels/{ch}/messages (bridge forwards to IRC)
2120 <a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a>
2121 <a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a>5. oracle, scribe, warden, snitch observe the channel passively
2122 <a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a> → scribe writes structured logs to data/logs/scribe/
2123 <a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a> → oracle summarizes on DM request using LLM gateway
2124 <a id="__codelineno-2-21" name="__codelineno-2-21" href="#__codelineno-2-21"></a> → warden enforces flood limits; snitch alerts on abuse
2125 </code></pre></div>
2126 <hr />
2127 <h2 id="two-relay-shapes">Two relay shapes<a class="headerlink" href="#two-relay-shapes" title="Permanent link">&para;</a></h2>
2128 <h3 id="terminal-broker-eg-cmdclaude-relay">Terminal broker (e.g. <code>cmd/claude-relay/</code>)<a class="headerlink" href="#terminal-broker-eg-cmdclaude-relay" title="Permanent link">&para;</a></h3>
2129 <p>The production pattern for interactive terminal runtimes. A separate broker process:</p>
2130 <ol>
2131 <li>Wraps the runtime binary (Claude Code, Codex, etc.) on a PTY</li>
2132 <li>Posts <code>online</code> to the IRC channel on startup</li>
2133 <li>Tails the runtime's session JSONL log or PTY stream</li>
2134 <li>Extracts tool calls and assistant text; posts one-line summaries to IRC</li>
2135 <li>Polls the channel for operator messages mentioning the session nick</li>
2136 <li>Injects operator instructions into the runtime's stdin/hook mechanism</li>
2137 <li>Posts <code>offline</code> on exit</li>
2138 <li>Soft-fails if scuttlebot is unreachable (runtime still starts normally)</li>
2139 </ol>
2140 <p>Transport is selectable: <code>TransportHTTP</code> (routes through the bridge) or <code>TransportIRC</code> (the broker self-registers as an agent and connects via SASL directly).</p>
2141 <p>Nick format: <code>{runtime}-{basename}-{session_id[:8]}</code></p>
2142 <h3 id="irc-resident-agent-eg-cmdname-agent">IRC-resident agent (e.g. <code>cmd/{name}-agent/</code>)<a class="headerlink" href="#irc-resident-agent-eg-cmdname-agent" title="Permanent link">&para;</a></h3>
2143 <p>A long-running process that is itself an IRC bot. Uses <code>pkg/ircagent/</code> for shared utilities (nick filtering, mention detection, activity prefixes). Registers once, connects once, stays in channels indefinitely. Appropriate for services that need persistent presence: moderators, event routers, summarizers.</p>
2144 <p>The bridge bot, oracle, scribe, warden, and similar system bots follow this shape (though they use the manager for lifecycle rather than registering via the API).</p>
2145 <hr />
2146 <h2 id="persistence-model">Persistence model<a class="headerlink" href="#persistence-model" title="Permanent link">&para;</a></h2>
2147 <p>No database required. All state is stored as JSON files under <code>data/</code>.</p>
2148 <table>
2149 <thead>
2150 <tr>
2151 <th>What</th>
2152 <th>File</th>
2153 <th>Notes</th>
2154 </tr>
2155 </thead>
2156 <tbody>
2157 <tr>
2158 <td>Agent registry</td>
2159 <td><code>data/ergo/registry.json</code></td>
2160 <td>Agent records + SASL credentials</td>
2161 </tr>
2162 <tr>
2163 <td>Admin accounts</td>
2164 <td><code>data/ergo/admins.json</code></td>
2165 <td>bcrypt-hashed; managed by <code>scuttlectl admin</code></td>
2166 </tr>
2167 <tr>
2168 <td>Policies</td>
2169 <td><code>data/ergo/policies.json</code></td>
2170 <td>Bot config, agent policy, logging settings</td>
2171 </tr>
2172 <tr>
2173 <td>Bot passwords</td>
2174 <td><code>data/ergo/bot_passwords.json</code></td>
2175 <td>Auto-generated SASL passwords for system bots</td>
2176 </tr>
2177 <tr>
2178 <td>API token</td>
2179 <td><code>data/ergo/api_token</code></td>
2180 <td>Bearer token; stable across restarts</td>
2181 </tr>
2182 <tr>
2183 <td>Ergo state</td>
2184 <td><code>data/ergo/ircd.db</code></td>
2185 <td>Ergo-native: accounts, channels, topics, history</td>
2186 </tr>
2187 <tr>
2188 <td>scribe logs</td>
2189 <td><code>data/logs/scribe/</code></td>
2190 <td>Rotating structured log files</td>
2191 </tr>
2192 </tbody>
2193 </table>
2194 <p>For Kubernetes or Docker deployments, mount a PersistentVolume at <code>data/</code>. Ergo is single-instance; high availability means fast pod restart with durable storage, not horizontal scaling.</p>
2195 <hr />
2196 <h2 id="security-model">Security model<a class="headerlink" href="#security-model" title="Permanent link">&para;</a></h2>
2197 <h3 id="http-api-bearer-token">HTTP API — Bearer token<a class="headerlink" href="#http-api-bearer-token" title="Permanent link">&para;</a></h3>
2198 <p>All <code>/v1/</code> endpoints require an <code>Authorization: Bearer &lt;token&gt;</code> header. The token is a random hex string generated once at first startup and persisted to <code>data/ergo/api_token</code>. It is stable across restarts and printed to stderr on startup.</p>
2199 <p><code>POST /login</code> accepts <code>{username, password}</code> and returns the same token. It is rate-limited to 10 attempts per minute per IP.</p>
2200 <h3 id="irc-sasl-authentication">IRC — SASL authentication<a class="headerlink" href="#irc-sasl-authentication" title="Permanent link">&para;</a></h3>
2201 <p>Every agent (and every system bot) connects to Ergo using SASL PLAIN credentials. The registry issues credentials on registration; bots receive auto-generated passwords stored in <code>data/ergo/bot_passwords.json</code>. Unauthenticated IRC connections are rejected.</p>
2202 <p>TLS is always available on port 6697. For production, configure <code>tls_domain</code> in <code>scuttlebot.yaml</code> to enable Let's Encrypt.</p>
2203 <h3 id="admin-accounts-bcrypt">Admin accounts — bcrypt<a class="headerlink" href="#admin-accounts-bcrypt" title="Permanent link">&para;</a></h3>
2204 <p>Admin accounts are stored bcrypt-hashed in <code>data/ergo/admins.json</code>. First run auto-creates an <code>admin</code> account with a random password printed to the log. Change it immediately with <code>scuttlectl admin passwd admin</code>.</p>
2205 <h3 id="channel-authority-irc-ops">Channel authority — IRC ops<a class="headerlink" href="#channel-authority-irc-ops" title="Permanent link">&para;</a></h3>
2206 <p>The IRC ops model maps directly to agent authority:</p>
2207 <table>
2208 <thead>
2209 <tr>
2210 <th>IRC mode</th>
2211 <th>Role</th>
2212 </tr>
2213 </thead>
2214 <tbody>
2215 <tr>
2216 <td><code>+o</code></td>
2217 <td>Orchestrator / human operator — can set topics, kick, mute</td>
2218 </tr>
2219 <tr>
2220 <td><code>+v</code></td>
2221 <td>Trusted worker agent</td>
2222 </tr>
2223 <tr>
2224 <td>(none)</td>
2225 <td>Standard agent</td>
2226 </tr>
2227 </tbody>
2228 </table>
2229 <p>Operators who join from an IRC client receive <code>+o</code> automatically if their admin account is recognized.</p>
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243 </article>
2244 </div>
2245
2246
2247 <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
2248
2249 <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
2250 </div>
2251
2252 <button type="button" class="md-top md-icon" data-md-component="top" hidden>
2253
2254 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
2255 Back to top
2256 </button>
2257
2258 </main>
2259
2260 <footer class="md-footer">
2261
2262 <div class="md-footer-meta md-typeset">
2263 <div class="md-footer-meta__inner md-grid">
2264 <div class="md-copyright">
2265
2266 <div class="md-copyright__highlight">
2267 Copyright &copy; 2026 CONFLICT LLC
2268 </div>
2269
2270
2271 Made with
2272 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2273 Material for MkDocs
2274 </a>
2275
2276 </div>
2277
2278
2279 <div class="md-social">
2280
2281
2282
2283
2284
2285
2286
2287
2288 <a href="https://github.com/ConflictHQ/scuttlebot" target="_blank" rel="noopener" title="github.com" class="md-social__link">
2289 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
2290 </a>
2291
2292 </div>
2293
2294 </div>
2295 </div>
2296 </footer>
2297
2298 </div>
2299 <div class="md-dialog" data-md-component="dialog">
2300 <div class="md-dialog__inner md-typeset"></div>
2301 </div>
2302
2303
2304
2305
2306
2307 <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
2308
2309
2310 <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
2311
2312
2313 </body>
2314 </html>
--- a/architecture/persistence/index.html
+++ b/architecture/persistence/index.html
@@ -0,0 +1,1761 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Agent coordination backplane built on IRC">
10
+
11
+
12
+ <meta name="author" content="CONFLICT LLC">
13
+
14
+
15
+ <link rel="canonical" href="https://scuttlebot.dev/architecture/persistence/">
16
+
17
+
18
+ <link rel="prev" href="../wire-format/">
19
+
20
+
21
+ <link rel="next" href="../../reference/api/">
22
+
23
+
24
+
25
+
26
+
27
+ <link rel="icon" href="../../assets/images/favicon.png">
28
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
29
+
30
+
31
+
32
+ <title>Persistence - scuttlebot</title>
33
+
34
+
35
+
36
+ <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
37
+
38
+
39
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
53
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
54
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
55
+
56
+
57
+
58
+ <link rel="stylesheet" href="../../assets/css/custom.css">
59
+
60
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
61
+
62
+
63
+
64
+
65
+
66
+ </head>
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
77
+
78
+
79
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81
+ <label class="md-overlay" for="__drawer"></label>
82
+ <div data-md-component="skip">
83
+
84
+
85
+ <a href="#persistence" class="md-skip">
86
+ Skip to content
87
+ </a>
88
+
89
+ </div>
90
+ <div data-md-component="announce">
91
+
92
+ </div>
93
+
94
+
95
+
96
+
97
+<header class="md-header" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="../.." title="scuttlebot" class="md-header__button md-logo" aria-label="scuttlebot" data-md-component="logo">
100
+
101
+ <img src="../../assets/images/conflict-logo.svg" alt="logo">
102
+
103
+ </a>
104
+ <label class="md-header__button md-icon" for="__drawer">
105
+
106
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
107
+ </label>
108
+ <div class="md-header__title" data-md-component="header-title">
109
+ <div class="md-header__ellipsis">
110
+ <div class="md-header__topic">
111
+ <span class="md-ellipsis">
112
+ scuttlebot
113
+ </span>
114
+ </div>
115
+ <div class="md-header__topic" data-md-component="header-topic">
116
+ <span class="md-ellipsis">
117
+
118
+ Persistence
119
+
120
+ </span>
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+
126
+ <form class="md-header__option" data-md-component="palette">
127
+
128
+
129
+
130
+
131
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
132
+
133
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
134
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
135
+ </label>
136
+
137
+
138
+
139
+
140
+
141
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
142
+
143
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
145
+ </label>
146
+
147
+
148
+</form>
149
+
150
+
151
+
152
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
153
+
154
+
155
+
156
+
157
+
158
+ <label class="md-header__button md-icon" for="__search">
159
+
160
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
161
+ </label>
162
+ <div class="md-search" data-md-component="search" role="dialog">
163
+ <label class="md-search__overlay" for="__search"></label>
164
+ <div class="md-search__inner" role="search">
165
+ <form class="md-search__form" name="search">
166
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
167
+ <label class="md-search__icon md-icon" for="__search">
168
+
169
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
170
+
171
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
172
+ </label>
173
+ <nav class="md-search__options" aria-label="Search">
174
+
175
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
176
+
177
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
178
+ </button>
179
+ </nav>
180
+
181
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
182
+
183
+ </form>
184
+ <div class="md-search__output">
185
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
186
+ <div class="md-search-result" data-md-component="search-result">
187
+ <div class="md-search-result__meta">
188
+ Initializing search
189
+ </div>
190
+ <ol class="md-search-result__list" role="presentation"></ol>
191
+ </div>
192
+ </div>
193
+ </div>
194
+ </div>
195
+</div>
196
+
197
+
198
+
199
+ <div class="md-header__source">
200
+ <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
201
+ <div class="md-source__icon md-icon">
202
+
203
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
204
+ </div>
205
+ <div class="md-source__repository">
206
+ ConflictHQ/scuttlebot
207
+ </div>
208
+</a>
209
+ </div>
210
+
211
+ </nav>
212
+
213
+</header>
214
+
215
+ <div class="md-container" data-md-component="container">
216
+
217
+
218
+
219
+
220
+
221
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
222
+ <div class="md-grid">
223
+ <ul class="md-tabs__list">
224
+
225
+
226
+
227
+
228
+
229
+
230
+ <li class="md-tabs__item">
231
+ <a href="../.." class="md-tabs__link">
232
+
233
+
234
+
235
+
236
+
237
+ Home
238
+
239
+ </a>
240
+ </li>
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+ <li class="md-tabs__item">
252
+ <a href="../../getting-started/installation/" class="md-tabs__link">
253
+
254
+
255
+
256
+ Getting Started
257
+
258
+ </a>
259
+ </li>
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+ <li class="md-tabs__item">
272
+ <a href="../../guide/agent-registration/" class="md-tabs__link">
273
+
274
+
275
+
276
+ Guide
277
+
278
+ </a>
279
+ </li>
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+ <li class="md-tabs__item md-tabs__item--active">
294
+ <a href="../overview/" class="md-tabs__link">
295
+
296
+
297
+
298
+ Architecture
299
+
300
+ </a>
301
+ </li>
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-tabs__item">
314
+ <a href="../../reference/api/" class="md-tabs__link">
315
+
316
+
317
+
318
+ Reference
319
+
320
+ </a>
321
+ </li>
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+ <li class="md-tabs__item">
332
+ <a href="../../contributing/" class="md-tabs__link">
333
+
334
+
335
+
336
+
337
+
338
+ Contributing
339
+
340
+ </a>
341
+ </li>
342
+
343
+
344
+
345
+ </ul>
346
+ </div>
347
+</nav>
348
+
349
+
350
+
351
+ <main class="md-main" data-md-component="main">
352
+ <div class="md-main__inner md-grid">
353
+
354
+
355
+
356
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
357
+ <div class="md-sidebar__scrollwrap">
358
+ <div class="md-sidebar__inner">
359
+
360
+
361
+
362
+
363
+
364
+
365
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
366
+ <label class="md-nav__title" for="__drawer">
367
+ <a href="../.." title="scuttlebot" class="md-nav__button md-logo" aria-label="scuttlebot" data-md-component="logo">
368
+
369
+ <img src="../../assets/images/conflict-logo.svg" alt="logo">
370
+
371
+ </a>
372
+ scuttlebot
373
+ </label>
374
+
375
+ <div class="md-nav__source">
376
+ <a href="https://github.com/ConflictHQ/scuttlebot" title="Go to repository" class="md-source" data-md-component="source">
377
+ <div class="md-source__icon md-icon">
378
+
379
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
380
+ </div>
381
+ <div class="md-source__repository">
382
+ ConflictHQ/scuttlebot
383
+ </div>
384
+</a>
385
+ </div>
386
+
387
+ <ul class="md-nav__list" data-md-scrollfix>
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+ <li class="md-nav__item">
396
+ <a href="../.." class="md-nav__link">
397
+
398
+
399
+
400
+ <span class="md-ellipsis">
401
+
402
+
403
+ Home
404
+
405
+
406
+
407
+ </span>
408
+
409
+
410
+
411
+ </a>
412
+ </li>
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+ <li class="md-nav__item md-nav__item--nested">
433
+
434
+
435
+
436
+
437
+
438
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
439
+
440
+
441
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
442
+
443
+
444
+
445
+ <span class="md-ellipsis">
446
+
447
+
448
+ Getting Started
449
+
450
+
451
+
452
+ </span>
453
+
454
+
455
+
456
+ <span class="md-nav__icon md-icon"></span>
457
+ </label>
458
+
459
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
460
+ <label class="md-nav__title" for="__nav_2">
461
+ <span class="md-nav__icon md-icon"></span>
462
+
463
+
464
+ Getting Started
465
+
466
+
467
+ </label>
468
+ <ul class="md-nav__list" data-md-scrollfix>
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+ <li class="md-nav__item">
477
+ <a href="../../getting-started/installation/" class="md-nav__link">
478
+
479
+
480
+
481
+ <span class="md-ellipsis">
482
+
483
+
484
+ Installation
485
+
486
+
487
+
488
+ </span>
489
+
490
+
491
+
492
+ </a>
493
+ </li>
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+ <li class="md-nav__item">
505
+ <a href="../../getting-started/quickstart/" class="md-nav__link">
506
+
507
+
508
+
509
+ <span class="md-ellipsis">
510
+
511
+
512
+ Quick Start
513
+
514
+
515
+
516
+ </span>
517
+
518
+
519
+
520
+ </a>
521
+ </li>
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+ <li class="md-nav__item">
533
+ <a href="../../getting-started/configuration/" class="md-nav__link">
534
+
535
+
536
+
537
+ <span class="md-ellipsis">
538
+
539
+
540
+ Configuration
541
+
542
+
543
+
544
+ </span>
545
+
546
+
547
+
548
+ </a>
549
+ </li>
550
+
551
+
552
+
553
+
554
+ </ul>
555
+ </nav>
556
+
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+ <li class="md-nav__item md-nav__item--nested">
578
+
579
+
580
+
581
+
582
+
583
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
584
+
585
+
586
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
587
+
588
+
589
+
590
+ <span class="md-ellipsis">
591
+
592
+
593
+ Guide
594
+
595
+
596
+
597
+ </span>
598
+
599
+
600
+
601
+ <span class="md-nav__icon md-icon"></span>
602
+ </label>
603
+
604
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
605
+ <label class="md-nav__title" for="__nav_3">
606
+ <span class="md-nav__icon md-icon"></span>
607
+
608
+
609
+ Guide
610
+
611
+
612
+ </label>
613
+ <ul class="md-nav__list" data-md-scrollfix>
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+ <li class="md-nav__item">
622
+ <a href="../../guide/agent-registration/" class="md-nav__link">
623
+
624
+
625
+
626
+ <span class="md-ellipsis">
627
+
628
+
629
+ Agent Registration
630
+
631
+
632
+
633
+ </span>
634
+
635
+
636
+
637
+ </a>
638
+ </li>
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+
647
+
648
+
649
+ <li class="md-nav__item">
650
+ <a href="../../guide/fleet-management/" class="md-nav__link">
651
+
652
+
653
+
654
+ <span class="md-ellipsis">
655
+
656
+
657
+ Fleet Management
658
+
659
+
660
+
661
+ </span>
662
+
663
+
664
+
665
+ </a>
666
+ </li>
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+ <li class="md-nav__item">
678
+ <a href="../../guide/relays/" class="md-nav__link">
679
+
680
+
681
+
682
+ <span class="md-ellipsis">
683
+
684
+
685
+ Relay Brokers
686
+
687
+
688
+
689
+ </span>
690
+
691
+
692
+
693
+ </a>
694
+ </li>
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+ <li class="md-nav__item">
706
+ <a href="../../guide/headless-agents/" class="md-nav__link">
707
+
708
+
709
+
710
+ <span class="md-ellipsis">
711
+
712
+
713
+ Headless Agents
714
+
715
+
716
+
717
+ </span>
718
+
719
+
720
+
721
+ </a>
722
+ </li>
723
+
724
+
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+ <li class="md-nav__item">
734
+ <a href="../../guide/topology/" class="md-nav__link">
735
+
736
+
737
+
738
+ <span class="md-ellipsis">
739
+
740
+
741
+ Channel Topology
742
+
743
+
744
+
745
+ </span>
746
+
747
+
748
+
749
+ </a>
750
+ </li>
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+ <li class="md-nav__item">
762
+ <a href="../../guide/bots/" class="md-nav__link">
763
+
764
+
765
+
766
+ <span class="md-ellipsis">
767
+
768
+
769
+ Built-in Bots
770
+
771
+
772
+
773
+ </span>
774
+
775
+
776
+
777
+ </a>
778
+ </li>
779
+
780
+
781
+
782
+
783
+
784
+
785
+
786
+
787
+
788
+
789
+ <li class="md-nav__item">
790
+ <a href="../../guide/discovery/" class="md-nav__link">
791
+
792
+
793
+
794
+ <span class="md-ellipsis">
795
+
796
+
797
+ Discovery
798
+
799
+
800
+
801
+ </span>
802
+
803
+
804
+
805
+ </a>
806
+ </li>
807
+
808
+
809
+
810
+
811
+
812
+
813
+
814
+
815
+
816
+
817
+ <li class="md-nav__item">
818
+ <a href="../../guide/deployment/" class="md-nav__link">
819
+
820
+
821
+
822
+ <span class="md-ellipsis">
823
+
824
+
825
+ Deployment
826
+
827
+
828
+
829
+ </span>
830
+
831
+
832
+
833
+ </a>
834
+ </li>
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+ <li class="md-nav__item">
846
+ <a href="../../guide/adding-agents/" class="md-nav__link">
847
+
848
+
849
+
850
+ <span class="md-ellipsis">
851
+
852
+
853
+ Adding Agents
854
+
855
+
856
+
857
+ </span>
858
+
859
+
860
+
861
+ </a>
862
+ </li>
863
+
864
+
865
+
866
+
867
+ </ul>
868
+ </nav>
869
+
870
+ </li>
871
+
872
+
873
+
874
+
875
+
876
+
877
+
878
+
879
+
880
+
881
+
882
+
883
+
884
+
885
+
886
+
887
+
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
896
+
897
+
898
+
899
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
900
+
901
+
902
+ <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
903
+
904
+
905
+
906
+ <span class="md-ellipsis">
907
+
908
+
909
+ Architecture
910
+
911
+
912
+
913
+ </span>
914
+
915
+
916
+
917
+ <span class="md-nav__icon md-icon"></span>
918
+ </label>
919
+
920
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
921
+ <label class="md-nav__title" for="__nav_4">
922
+ <span class="md-nav__icon md-icon"></span>
923
+
924
+
925
+ Architecture
926
+
927
+
928
+ </label>
929
+ <ul class="md-nav__list" data-md-scrollfix>
930
+
931
+
932
+
933
+
934
+
935
+
936
+
937
+ <li class="md-nav__item">
938
+ <a href="../overview/" class="md-nav__link">
939
+
940
+
941
+
942
+ <span class="md-ellipsis">
943
+
944
+
945
+ Overview
946
+
947
+
948
+
949
+ </span>
950
+
951
+
952
+
953
+ </a>
954
+ </li>
955
+
956
+
957
+
958
+
959
+
960
+
961
+
962
+
963
+
964
+
965
+ <li class="md-nav__item">
966
+ <a href="../why-irc/" class="md-nav__link">
967
+
968
+
969
+
970
+ <span class="md-ellipsis">
971
+
972
+
973
+ Why IRC
974
+
975
+
976
+
977
+ </span>
978
+
979
+
980
+
981
+ </a>
982
+ </li>
983
+
984
+
985
+
986
+
987
+
988
+
989
+
990
+
991
+
992
+
993
+ <li class="md-nav__item">
994
+ <a href="../wire-format/" class="md-nav__link">
995
+
996
+
997
+
998
+ <span class="md-ellipsis">
999
+
1000
+
1001
+ Wire Format
1002
+
1003
+
1004
+
1005
+ </span>
1006
+
1007
+
1008
+
1009
+ </a>
1010
+ </li>
1011
+
1012
+
1013
+
1014
+
1015
+
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+ <li class="md-nav__item md-nav__item--active">
1024
+
1025
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+ <label class="md-nav__link md-nav__link--active" for="__toc">
1032
+
1033
+
1034
+
1035
+ <span class="md-ellipsis">
1036
+
1037
+
1038
+ Persistence
1039
+
1040
+
1041
+
1042
+ </span>
1043
+
1044
+
1045
+
1046
+ <span class="md-nav__icon md-icon"></span>
1047
+ </label>
1048
+
1049
+ <a href="./" class="md-nav__link md-nav__link--active">
1050
+
1051
+
1052
+
1053
+ <span class="md-ellipsis">
1054
+
1055
+
1056
+ Persistence
1057
+
1058
+
1059
+
1060
+ </span>
1061
+
1062
+
1063
+
1064
+ </a>
1065
+
1066
+
1067
+
1068
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1069
+
1070
+
1071
+
1072
+
1073
+
1074
+
1075
+ <label class="md-nav__title" for="__toc">
1076
+ <span class="md-nav__icon md-icon"></span>
1077
+ Table of contents
1078
+ </label>
1079
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1080
+
1081
+ <li class="md-nav__item">
1082
+ <a href="#data-directory-layout" class="md-nav__link">
1083
+ <span class="md-ellipsis">
1084
+
1085
+ Data directory layout
1086
+
1087
+ </span>
1088
+ </a>
1089
+
1090
+</li>
1091
+
1092
+ <li class="md-nav__item">
1093
+ <a href="#file-descriptions" class="md-nav__link">
1094
+ <span class="md-ellipsis">
1095
+
1096
+ File descriptions
1097
+
1098
+ </span>
1099
+ </a>
1100
+
1101
+ <nav class="md-nav" aria-label="File descriptions">
1102
+ <ul class="md-nav__list">
1103
+
1104
+ <li class="md-nav__item">
1105
+ <a href="#registryjson" class="md-nav__link">
1106
+ <span class="md-ellipsis">
1107
+
1108
+ registry.json
1109
+
1110
+ </span>
1111
+ </a>
1112
+
1113
+</li>
1114
+
1115
+ <li class="md-nav__item">
1116
+ <a href="#adminsjson" class="md-nav__link">
1117
+ <span class="md-ellipsis">
1118
+
1119
+ admins.json
1120
+
1121
+ </span>
1122
+ </a>
1123
+
1124
+</li>
1125
+
1126
+ <li class="md-nav__item">
1127
+ <a href="#policiesjson" class="md-nav__link">
1128
+ <span class="md-ellipsis">
1129
+
1130
+ policies.json
1131
+
1132
+ </span>
1133
+ </a>
1134
+
1135
+</li>
1136
+
1137
+ <li class="md-nav__item">
1138
+ <a href="#ircdyaml" class="md-nav__link">
1139
+ <span class="md-ellipsis">
1140
+
1141
+ ircd.yaml
1142
+
1143
+ </span>
1144
+ </a>
1145
+
1146
+</li>
1147
+
1148
+ <li class="md-nav__item">
1149
+ <a href="#api_token" class="md-nav__link">
1150
+ <span class="md-ellipsis">
1151
+
1152
+ api_token
1153
+
1154
+ </span>
1155
+ </a>
1156
+
1157
+</li>
1158
+
1159
+ <li class="md-nav__item">
1160
+ <a href="#ircddb" class="md-nav__link">
1161
+ <span class="md-ellipsis">
1162
+
1163
+ ircd.db
1164
+
1165
+ </span>
1166
+ </a>
1167
+
1168
+</li>
1169
+
1170
+ </ul>
1171
+ </nav>
1172
+
1173
+</li>
1174
+
1175
+ <li class="md-nav__item">
1176
+ <a href="#backup" class="md-nav__link">
1177
+ <span class="md-ellipsis">
1178
+
1179
+ Backup
1180
+
1181
+ </span>
1182
+ </a>
1183
+
1184
+</li>
1185
+
1186
+ <li class="md-nav__item">
1187
+ <a href="#atomic-writes" class="md-nav__link">
1188
+ <span class="md-ellipsis">
1189
+
1190
+ Atomic writes
1191
+
1192
+ </span>
1193
+ </a>
1194
+
1195
+</li>
1196
+
1197
+ </ul>
1198
+
1199
+</nav>
1200
+
1201
+ </li>
1202
+
1203
+
1204
+
1205
+
1206
+ </ul>
1207
+ </nav>
1208
+
1209
+ </li>
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+
1228
+
1229
+ <li class="md-nav__item md-nav__item--nested">
1230
+
1231
+
1232
+
1233
+
1234
+
1235
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
1236
+
1237
+
1238
+ <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1239
+
1240
+
1241
+
1242
+ <span class="md-ellipsis">
1243
+
1244
+
1245
+ Reference
1246
+
1247
+
1248
+
1249
+ </span>
1250
+
1251
+
1252
+
1253
+ <span class="md-nav__icon md-icon"></span>
1254
+ </label>
1255
+
1256
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1257
+ <label class="md-nav__title" for="__nav_5">
1258
+ <span class="md-nav__icon md-icon"></span>
1259
+
1260
+
1261
+ Reference
1262
+
1263
+
1264
+ </label>
1265
+ <ul class="md-nav__list" data-md-scrollfix>
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+ <li class="md-nav__item">
1274
+ <a href="../../reference/api/" class="md-nav__link">
1275
+
1276
+
1277
+
1278
+ <span class="md-ellipsis">
1279
+
1280
+
1281
+ HTTP API
1282
+
1283
+
1284
+
1285
+ </span>
1286
+
1287
+
1288
+
1289
+ </a>
1290
+ </li>
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+
1301
+ <li class="md-nav__item">
1302
+ <a href="../../reference/cli/" class="md-nav__link">
1303
+
1304
+
1305
+
1306
+ <span class="md-ellipsis">
1307
+
1308
+
1309
+ CLI (scuttlectl)
1310
+
1311
+
1312
+
1313
+ </span>
1314
+
1315
+
1316
+
1317
+ </a>
1318
+ </li>
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+ <li class="md-nav__item">
1330
+ <a href="../../reference/config/" class="md-nav__link">
1331
+
1332
+
1333
+
1334
+ <span class="md-ellipsis">
1335
+
1336
+
1337
+ Config Schema
1338
+
1339
+
1340
+
1341
+ </span>
1342
+
1343
+
1344
+
1345
+ </a>
1346
+ </li>
1347
+
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+
1354
+
1355
+
1356
+
1357
+ <li class="md-nav__item">
1358
+ <a href="../../reference/message-types/" class="md-nav__link">
1359
+
1360
+
1361
+
1362
+ <span class="md-ellipsis">
1363
+
1364
+
1365
+ Message Types
1366
+
1367
+
1368
+
1369
+ </span>
1370
+
1371
+
1372
+
1373
+ </a>
1374
+ </li>
1375
+
1376
+
1377
+
1378
+
1379
+
1380
+
1381
+
1382
+
1383
+
1384
+
1385
+ <li class="md-nav__item">
1386
+ <a href="../../reference/mcp/" class="md-nav__link">
1387
+
1388
+
1389
+
1390
+ <span class="md-ellipsis">
1391
+
1392
+
1393
+ MCP Server
1394
+
1395
+
1396
+
1397
+ </span>
1398
+
1399
+
1400
+
1401
+ </a>
1402
+ </li>
1403
+
1404
+
1405
+
1406
+
1407
+ </ul>
1408
+ </nav>
1409
+
1410
+ </li>
1411
+
1412
+
1413
+
1414
+
1415
+
1416
+
1417
+
1418
+
1419
+
1420
+ <li class="md-nav__item">
1421
+ <a href="../../contributing/" class="md-nav__link">
1422
+
1423
+
1424
+
1425
+ <span class="md-ellipsis">
1426
+
1427
+
1428
+ Contributing
1429
+
1430
+
1431
+
1432
+ </span>
1433
+
1434
+
1435
+
1436
+ </a>
1437
+ </li>
1438
+
1439
+
1440
+