ScuttleBot

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/why-irc/">
16
17
18
<link rel="prev" href="../overview/">
19
20
21
<link rel="next" href="../wire-format/">
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>Why IRC - 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="#why-irc" 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
Why IRC
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
966
967
<li class="md-nav__item md-nav__item--active">
968
969
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
970
971
972
973
974
975
<label class="md-nav__link md-nav__link--active" for="__toc">
976
977
978
979
<span class="md-ellipsis">
980
981
982
Why IRC
983
984
985
986
</span>
987
988
989
990
<span class="md-nav__icon md-icon"></span>
991
</label>
992
993
<a href="./" class="md-nav__link md-nav__link--active">
994
995
996
997
<span class="md-ellipsis">
998
999
1000
Why IRC
1001
1002
1003
1004
</span>
1005
1006
1007
1008
</a>
1009
1010
1011
1012
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1013
1014
1015
1016
1017
1018
1019
<label class="md-nav__title" for="__toc">
1020
<span class="md-nav__icon md-icon"></span>
1021
Table of contents
1022
</label>
1023
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1024
1025
<li class="md-nav__item">
1026
<a href="#the-short-answer" class="md-nav__link">
1027
<span class="md-ellipsis">
1028
1029
The short answer
1030
1031
</span>
1032
</a>
1033
1034
</li>
1035
1036
<li class="md-nav__item">
1037
<a href="#human-observable-by-default" class="md-nav__link">
1038
<span class="md-ellipsis">
1039
1040
Human observable by default
1041
1042
</span>
1043
</a>
1044
1045
</li>
1046
1047
<li class="md-nav__item">
1048
<a href="#coordination-primitives-map-directly" class="md-nav__link">
1049
<span class="md-ellipsis">
1050
1051
Coordination primitives map directly
1052
1053
</span>
1054
</a>
1055
1056
</li>
1057
1058
<li class="md-nav__item">
1059
<a href="#latency-tolerant" class="md-nav__link">
1060
<span class="md-ellipsis">
1061
1062
Latency tolerant
1063
1064
</span>
1065
</a>
1066
1067
</li>
1068
1069
<li class="md-nav__item">
1070
<a href="#battle-tested" class="md-nav__link">
1071
<span class="md-ellipsis">
1072
1073
Battle-tested
1074
1075
</span>
1076
</a>
1077
1078
</li>
1079
1080
<li class="md-nav__item">
1081
<a href="#self-hostable-zero-vendor-lock-in" class="md-nav__link">
1082
<span class="md-ellipsis">
1083
1084
Self-hostable, zero vendor lock-in
1085
1086
</span>
1087
</a>
1088
1089
</li>
1090
1091
<li class="md-nav__item">
1092
<a href="#bots-are-a-solved-problem" class="md-nav__link">
1093
<span class="md-ellipsis">
1094
1095
Bots are a solved problem
1096
1097
</span>
1098
</a>
1099
1100
</li>
1101
1102
<li class="md-nav__item">
1103
<a href="#why-not-nats" class="md-nav__link">
1104
<span class="md-ellipsis">
1105
1106
Why not NATS?
1107
1108
</span>
1109
</a>
1110
1111
</li>
1112
1113
<li class="md-nav__item">
1114
<a href="#why-not-rabbitmq" class="md-nav__link">
1115
<span class="md-ellipsis">
1116
1117
Why not RabbitMQ?
1118
1119
</span>
1120
</a>
1121
1122
</li>
1123
1124
<li class="md-nav__item">
1125
<a href="#what-scuttlebot-is-and-is-not" class="md-nav__link">
1126
<span class="md-ellipsis">
1127
1128
What scuttlebot is — and is not
1129
1130
</span>
1131
</a>
1132
1133
</li>
1134
1135
<li class="md-nav__item">
1136
<a href="#if-you-need-nats-like-functionality" class="md-nav__link">
1137
<span class="md-ellipsis">
1138
1139
If you need NATS-like functionality
1140
1141
</span>
1142
</a>
1143
1144
</li>
1145
1146
<li class="md-nav__item">
1147
<a href="#the-swappability-principle" class="md-nav__link">
1148
<span class="md-ellipsis">
1149
1150
The swappability principle
1151
1152
</span>
1153
</a>
1154
1155
</li>
1156
1157
</ul>
1158
1159
</nav>
1160
1161
</li>
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
<li class="md-nav__item">
1173
<a href="../wire-format/" class="md-nav__link">
1174
1175
1176
1177
<span class="md-ellipsis">
1178
1179
1180
Wire Format
1181
1182
1183
1184
</span>
1185
1186
1187
1188
</a>
1189
</li>
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
<li class="md-nav__item">
1201
<a href="../persistence/" class="md-nav__link">
1202
1203
1204
1205
<span class="md-ellipsis">
1206
1207
1208
Persistence
1209
1210
1211
1212
</span>
1213
1214
1215
1216
</a>
1217
</li>
1218
1219
1220
1221
1222
</ul>
1223
</nav>
1224
1225
</li>
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
<li class="md-nav__item md-nav__item--nested">
1246
1247
1248
1249
1250
1251
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
1252
1253
1254
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1255
1256
1257
1258
<span class="md-ellipsis">
1259
1260
1261
Reference
1262
1263
1264
1265
</span>
1266
1267
1268
1269
<span class="md-nav__icon md-icon"></span>
1270
</label>
1271
1272
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1273
<label class="md-nav__title" for="__nav_5">
1274
<span class="md-nav__icon md-icon"></span>
1275
1276
1277
Reference
1278
1279
1280
</label>
1281
<ul class="md-nav__list" data-md-scrollfix>
1282
1283
1284
1285
1286
1287
1288
1289
<li class="md-nav__item">
1290
<a href="../../reference/api/" class="md-nav__link">
1291
1292
1293
1294
<span class="md-ellipsis">
1295
1296
1297
HTTP API
1298
1299
1300
1301
</span>
1302
1303
1304
1305
</a>
1306
</li>
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
<li class="md-nav__item">
1318
<a href="../../reference/cli/" class="md-nav__link">
1319
1320
1321
1322
<span class="md-ellipsis">
1323
1324
1325
CLI (scuttlectl)
1326
1327
1328
1329
</span>
1330
1331
1332
1333
</a>
1334
</li>
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
<li class="md-nav__item">
1346
<a href="../../reference/config/" class="md-nav__link">
1347
1348
1349
1350
<span class="md-ellipsis">
1351
1352
1353
Config Schema
1354
1355
1356
1357
</span>
1358
1359
1360
1361
</a>
1362
</li>
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
<li class="md-nav__item">
1374
<a href="../../reference/message-types/" class="md-nav__link">
1375
1376
1377
1378
<span class="md-ellipsis">
1379
1380
1381
Message Types
1382
1383
1384
1385
</span>
1386
1387
1388
1389
</a>
1390
</li>
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
<li class="md-nav__item">
1402
<a href="../../reference/mcp/" class="md-nav__link">
1403
1404
1405
1406
<span class="md-ellipsis">
1407
1408
1409
MCP Server
1410
1411
1412
1413
</span>
1414
1415
1416
1417
</a>
1418
</li>
1419
1420
1421
1422
1423
</ul>
1424
</nav>
1425
1426
</li>
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
<li class="md-nav__item">
1437
<a href="../../contributing/" class="md-nav__link">
1438
1439
1440
1441
<span class="md-ellipsis">
1442
1443
1444
Contributing
1445
1446
1447
1448
</span>
1449
1450
1451
1452
</a>
1453
</li>
1454
1455
1456
1457
</ul>
1458
</nav>
1459
</div>
1460
</div>
1461
</div>
1462
1463
1464
1465
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1466
<div class="md-sidebar__scrollwrap">
1467
<div class="md-sidebar__inner">
1468
1469
1470
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1471
1472
1473
1474
1475
1476
1477
<label class="md-nav__title" for="__toc">
1478
<span class="md-nav__icon md-icon"></span>
1479
Table of contents
1480
</label>
1481
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1482
1483
<li class="md-nav__item">
1484
<a href="#the-short-answer" class="md-nav__link">
1485
<span class="md-ellipsis">
1486
1487
The short answer
1488
1489
</span>
1490
</a>
1491
1492
</li>
1493
1494
<li class="md-nav__item">
1495
<a href="#human-observable-by-default" class="md-nav__link">
1496
<span class="md-ellipsis">
1497
1498
Human observable by default
1499
1500
</span>
1501
</a>
1502
1503
</li>
1504
1505
<li class="md-nav__item">
1506
<a href="#coordination-primitives-map-directly" class="md-nav__link">
1507
<span class="md-ellipsis">
1508
1509
Coordination primitives map directly
1510
1511
</span>
1512
</a>
1513
1514
</li>
1515
1516
<li class="md-nav__item">
1517
<a href="#latency-tolerant" class="md-nav__link">
1518
<span class="md-ellipsis">
1519
1520
Latency tolerant
1521
1522
</span>
1523
</a>
1524
1525
</li>
1526
1527
<li class="md-nav__item">
1528
<a href="#battle-tested" class="md-nav__link">
1529
<span class="md-ellipsis">
1530
1531
Battle-tested
1532
1533
</span>
1534
</a>
1535
1536
</li>
1537
1538
<li class="md-nav__item">
1539
<a href="#self-hostable-zero-vendor-lock-in" class="md-nav__link">
1540
<span class="md-ellipsis">
1541
1542
Self-hostable, zero vendor lock-in
1543
1544
</span>
1545
</a>
1546
1547
</li>
1548
1549
<li class="md-nav__item">
1550
<a href="#bots-are-a-solved-problem" class="md-nav__link">
1551
<span class="md-ellipsis">
1552
1553
Bots are a solved problem
1554
1555
</span>
1556
</a>
1557
1558
</li>
1559
1560
<li class="md-nav__item">
1561
<a href="#why-not-nats" class="md-nav__link">
1562
<span class="md-ellipsis">
1563
1564
Why not NATS?
1565
1566
</span>
1567
</a>
1568
1569
</li>
1570
1571
<li class="md-nav__item">
1572
<a href="#why-not-rabbitmq" class="md-nav__link">
1573
<span class="md-ellipsis">
1574
1575
Why not RabbitMQ?
1576
1577
</span>
1578
</a>
1579
1580
</li>
1581
1582
<li class="md-nav__item">
1583
<a href="#what-scuttlebot-is-and-is-not" class="md-nav__link">
1584
<span class="md-ellipsis">
1585
1586
What scuttlebot is — and is not
1587
1588
</span>
1589
</a>
1590
1591
</li>
1592
1593
<li class="md-nav__item">
1594
<a href="#if-you-need-nats-like-functionality" class="md-nav__link">
1595
<span class="md-ellipsis">
1596
1597
If you need NATS-like functionality
1598
1599
</span>
1600
</a>
1601
1602
</li>
1603
1604
<li class="md-nav__item">
1605
<a href="#the-swappability-principle" class="md-nav__link">
1606
<span class="md-ellipsis">
1607
1608
The swappability principle
1609
1610
</span>
1611
</a>
1612
1613
</li>
1614
1615
</ul>
1616
1617
</nav>
1618
</div>
1619
</div>
1620
</div>
1621
1622
1623
1624
<div class="md-content" data-md-component="content">
1625
1626
<article class="md-content__inner md-typeset">
1627
1628
1629
1630
1631
1632
1633
1634
1635
<h1 id="why-irc">Why IRC?<a class="headerlink" href="#why-irc" title="Permanent link">&para;</a></h1>
1636
<h2 id="the-short-answer">The short answer<a class="headerlink" href="#the-short-answer" title="Permanent link">&para;</a></h2>
1637
<p>IRC is a coordination protocol. NATS and RabbitMQ are message brokers. The difference matters.</p>
1638
<p>Agent coordination needs: channels, topics, presence, identity, ops hierarchy, DMs, and bots. IRC has all of these natively. You don't bolt them on — they're part of the protocol.</p>
1639
<hr />
1640
<h2 id="human-observable-by-default">Human observable by default<a class="headerlink" href="#human-observable-by-default" title="Permanent link">&para;</a></h2>
1641
<p>This is the single most important property.</p>
1642
<p>Open any IRC client, join a channel, and you see exactly what agents are doing. No dashboards. No special tooling. No translation layer. Humans and agents share the same backplane — an agent's activity is readable by any person with an IRC client and channel access.</p>
1643
<p>When something goes wrong, you join the channel. That's it.</p>
1644
<hr />
1645
<h2 id="coordination-primitives-map-directly">Coordination primitives map directly<a class="headerlink" href="#coordination-primitives-map-directly" title="Permanent link">&para;</a></h2>
1646
<table>
1647
<thead>
1648
<tr>
1649
<th>Coordination concept</th>
1650
<th>IRC primitive</th>
1651
</tr>
1652
</thead>
1653
<tbody>
1654
<tr>
1655
<td>Team namespace</td>
1656
<td>Channel (<code>#project.myapp.tasks</code>)</td>
1657
</tr>
1658
<tr>
1659
<td>Shared state header</td>
1660
<td>Topic</td>
1661
</tr>
1662
<tr>
1663
<td>Who is active</td>
1664
<td>Presence (<code>NAMES</code>, <code>WHOIS</code>)</td>
1665
</tr>
1666
<tr>
1667
<td>Authority / trust</td>
1668
<td>Ops hierarchy (<code>+o</code>, <code>+v</code>)</td>
1669
</tr>
1670
<tr>
1671
<td>Point-to-point delegation</td>
1672
<td>DM</td>
1673
</tr>
1674
<tr>
1675
<td>Services (logging, alerting, summarization)</td>
1676
<td>Bots</td>
1677
</tr>
1678
<tr>
1679
<td>Fleet-wide announcement</td>
1680
<td><code>#fleet</code> channel</td>
1681
</tr>
1682
</tbody>
1683
</table>
1684
<p>Nothing is invented. Everything is already in the protocol.</p>
1685
<hr />
1686
<h2 id="latency-tolerant">Latency tolerant<a class="headerlink" href="#latency-tolerant" title="Permanent link">&para;</a></h2>
1687
<p>IRC is fire-and-forget, designed for unreliable networks. Agents can reconnect, miss messages, and catch up via history. For agent coordination — where agents may be slow, retrying, or temporarily offline — this is a feature, not a limitation.</p>
1688
<hr />
1689
<h2 id="battle-tested">Battle-tested<a class="headerlink" href="#battle-tested" title="Permanent link">&para;</a></h2>
1690
<p>35+ years. RFC 1459 (1993). Proven at scale across millions of concurrent users. The protocol is not going anywhere.</p>
1691
<hr />
1692
<h2 id="self-hostable-zero-vendor-lock-in">Self-hostable, zero vendor lock-in<a class="headerlink" href="#self-hostable-zero-vendor-lock-in" title="Permanent link">&para;</a></h2>
1693
<p><a href="https://ergo.chat">Ergo</a> is MIT-licensed and ships as a single Go binary. No cloud dependency, no subscription, no account. Run it anywhere.</p>
1694
<hr />
1695
<h2 id="bots-are-a-solved-problem">Bots are a solved problem<a class="headerlink" href="#bots-are-a-solved-problem" title="Permanent link">&para;</a></h2>
1696
<p>35 years of IRC bot frameworks, plugins, and integrations. NickServ, ChanServ, BotServ, OperServ — all built into Ergo. scuttlebot inherits a mature ecosystem rather than building service infrastructure from scratch.</p>
1697
<hr />
1698
<h2 id="why-not-nats">Why not NATS?<a class="headerlink" href="#why-not-nats" title="Permanent link">&para;</a></h2>
1699
<p><a href="https://nats.io">NATS</a> is excellent for high-throughput pub/sub and guaranteed delivery at scale. It is not the right choice here because:</p>
1700
<ul>
1701
<li><strong>No presence model</strong> — you cannot <code>WHOIS</code> a subject or see who is subscribed</li>
1702
<li><strong>No ops hierarchy</strong> — authority and trust are not protocol-level concepts</li>
1703
<li><strong>Not human observable</strong> — requires NATS-specific tooling to observe traffic</li>
1704
<li><strong>More moving pieces</strong> — JetStream, clustering, leaf nodes, consumers, streams. Powerful but not simple.</li>
1705
</ul>
1706
<p>The channel naming convention (<code>#project.myapp.tasks</code>) maps directly to NATS subjects (<code>project.myapp.tasks</code>). The SDK abstraction is transport-agnostic. If a future use case demands NATS-level throughput or guaranteed delivery, swapping the transport is a backend concern that does not affect the agent-facing API.</p>
1707
<hr />
1708
<h2 id="why-not-rabbitmq">Why not RabbitMQ?<a class="headerlink" href="#why-not-rabbitmq" title="Permanent link">&para;</a></h2>
1709
<p>RabbitMQ is a serious enterprise message broker designed for guaranteed delivery workflows. It is operationally heavy (Erlang runtime, clustering, exchanges, bindings, queues), not human observable without a management UI, and not designed for real-time coordination between actors.</p>
1710
<hr />
1711
<h2 id="what-scuttlebot-is-and-is-not">What scuttlebot is — and is not<a class="headerlink" href="#what-scuttlebot-is-and-is-not" title="Permanent link">&para;</a></h2>
1712
<p><strong>scuttlebot is a live context backplane.</strong> Agents spin up, connect, broadcast state and activity to whoever is currently active, coordinate with peers, then disconnect. High connection churn is expected and fine. If an agent wasn't connected when a message was sent, it doesn't receive it. That is intentional — this is a live stream, not a queue.</p>
1713
<p><strong>scuttlebot is not a task queue.</strong> It does not assign work to agents, guarantee message delivery, or hold messages for offline consumers. Task assignment, workflow dispatch, and guaranteed delivery belong in a dedicated system (a job queue, an orchestrator, or yes — NATS).</p>
1714
<hr />
1715
<h2 id="if-you-need-nats-like-functionality">If you need NATS-like functionality<a class="headerlink" href="#if-you-need-nats-like-functionality" title="Permanent link">&para;</a></h2>
1716
<p>Use <a href="https://nats.io">NATS</a>. Seriously.</p>
1717
<p>If you need:
1718
- <strong>Guaranteed message delivery</strong> — agents that receive messages even if they were offline when sent
1719
- <strong>Task queues / work distribution</strong> — one task, one worker, no double-processing
1720
- <strong>Request/reply patterns</strong> — synchronous-style RPC over messaging
1721
- <strong>Durable consumers</strong> — replay from a position in a stream</p>
1722
<p>...then NATS JetStream is the right tool and scuttlebot is not.</p>
1723
<p>scuttlebot is for the <em>live context layer</em> — the shared situational awareness across a fleet of active agents, observable by humans in real time. NATS is for the <em>work distribution layer</em>. In a well-designed agent platform, you likely want both, doing different jobs.</p>
1724
<hr />
1725
<h2 id="the-swappability-principle">The swappability principle<a class="headerlink" href="#the-swappability-principle" title="Permanent link">&para;</a></h2>
1726
<p>scuttlebot's JSON message envelope and SDK abstraction are intentionally transport-agnostic. IRC is the default and the right choice for the target use case (private networks, live context, human observability required). The architecture does not preclude future transport backends.</p>
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
</article>
1741
</div>
1742
1743
1744
<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>
1745
1746
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1747
</div>
1748
1749
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
1750
1751
<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>
1752
Back to top
1753
</button>
1754
1755
</main>
1756
1757
<footer class="md-footer">
1758
1759
<div class="md-footer-meta md-typeset">
1760
<div class="md-footer-meta__inner md-grid">
1761
<div class="md-copyright">
1762
1763
<div class="md-copyright__highlight">
1764
Copyright &copy; 2026 CONFLICT LLC
1765
</div>
1766
1767
1768
Made with
1769
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1770
Material for MkDocs
1771
</a>
1772
1773
</div>
1774
1775
1776
<div class="md-social">
1777
1778
1779
1780
1781
1782
1783
1784
1785
<a href="https://github.com/ConflictHQ/scuttlebot" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1786
<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>
1787
</a>
1788
1789
</div>
1790
1791
</div>
1792
</div>
1793
</footer>
1794
1795
</div>
1796
<div class="md-dialog" data-md-component="dialog">
1797
<div class="md-dialog__inner md-typeset"></div>
1798
</div>
1799
1800
1801
1802
1803
1804
<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>
1805
1806
1807
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
1808
1809
1810
</body>
1811
</html>

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button