-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
891 lines (864 loc) · 57.5 KB
/
Copy pathindex.html
File metadata and controls
891 lines (864 loc) · 57.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Coddy Agent - general-purpose agent in one Go binary</title>
<meta name="description" content="Coddy Agent is a distroless-friendly agent harness: one Go binary with a terminal console, ACP for editors, an embedded web UI, a Telegram gateway, a cron scheduler, a swarm relay and remote control, plus rules, skills, subagents, hooks, MCP and your own API keys." />
<meta name="theme-color" content="#9333ea" />
<link rel="canonical" href="https://coddy.dev/" />
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" />
<meta name="author" content="Coddy Project" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Coddy Agent" />
<meta property="og:locale" content="en_US" />
<meta property="og:title" content="Coddy Agent - general-purpose agent in one Go binary" />
<meta property="og:description" content="One static Go binary for software agents: ReAct, subagents, hooks, terminal console, ACP, web UI, Telegram gateway, scheduler, swarm relay, remote control, memory, Cursor-style rules, Docker-ready, your API keys." />
<meta property="og:url" content="https://coddy.dev/" />
<meta property="og:image" content="https://coddy.dev/assets/og-image.png" />
<meta property="og:image:width" content="1280" />
<meta property="og:image:height" content="640" />
<meta property="og:image:alt" content="Coddy Agent - distroless-friendly coding agent harness" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Coddy Agent - general-purpose agent in one Go binary" />
<meta name="twitter:description" content="One static Go binary for software agents: ReAct, subagents, hooks, terminal console, ACP, web UI, Telegram gateway, scheduler, swarm relay, memory, on-prem models." />
<meta name="twitter:image" content="https://coddy.dev/assets/og-image.png" />
<link rel="icon" href="assets/coddy-favicon.svg" type="image/svg+xml" />
<link rel="icon" href="assets/favicon-32.png" sizes="32x32" type="image/png" />
<link rel="icon" href="assets/favicon.ico" sizes="any" />
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png" />
<link rel="sitemap" type="application/xml" title="Sitemap" href="/sitemap.xml" />
<link rel="stylesheet" href="styles.css?v=26" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://coddy.dev/#organization",
"name": "Coddy Project",
"url": "https://coddy.dev/",
"logo": {
"@type": "ImageObject",
"url": "https://coddy.dev/assets/apple-touch-icon.png",
"width": 180,
"height": 180
},
"sameAs": [
"https://github.com/coddy-project",
"https://github.com/coddy-project/coddy-agent"
]
},
{
"@type": "WebSite",
"@id": "https://coddy.dev/#website",
"url": "https://coddy.dev/",
"name": "Coddy Agent",
"description": "Official site of Coddy Agent: install commands, demos, features, and documentation links.",
"inLanguage": "en",
"publisher": {
"@id": "https://coddy.dev/#organization"
},
"hasPart": {
"@type": "WebPage",
"@id": "https://coddy.dev/compare/#webpage",
"url": "https://coddy.dev/compare/",
"name": "Coddy vs other agent harnesses - 2026 comparison",
"description": "Coddy compared with nineteen other AI agent harnesses across delivery, surfaces, extensibility, context handling and the trust model."
}
},
{
"@type": [
"SoftwareApplication",
"SoftwareSourceCode"
],
"@id": "https://coddy.dev/#software",
"name": "Coddy Agent",
"alternateName": "Coddy",
"url": "https://coddy.dev/",
"description": "Coddy Agent is an open-source, general-purpose AI agent in one static Go binary: a ReAct loop with filesystem and shell tools, MCP, project rules, skills, subagents, hooks, background tasks, a cron scheduler, and long-term memory, driven from a terminal console, an embedded web UI, an OpenAI-compatible HTTP API, the Agent Client Protocol (ACP) for editors, or a Telegram gateway, with a swarm relay that lists and reaches a fleet of nodes and remote control of a running server. Works with any OpenAI-compatible provider or Anthropic using your own API keys, including local models, and runs in distroless containers.",
"applicationCategory": "DeveloperApplication",
"applicationSubCategory": "AI agent",
"operatingSystem": "Linux, macOS, Windows",
"programmingLanguage": "Go",
"runtimePlatform": "Go 1.25",
"codeRepository": "https://github.com/coddy-project/coddy-agent",
"downloadUrl": "https://github.com/coddy-project/coddy-agent/releases/latest",
"installUrl": "https://coddy.dev/#install",
"softwareHelp": {
"@type": "CreativeWork",
"name": "Coddy Agent documentation",
"url": "https://github.com/coddy-project/coddy-agent/tree/main/docs"
},
"releaseNotes": "https://github.com/coddy-project/coddy-agent/releases",
"sameAs": "https://github.com/coddy-project/coddy-agent",
"license": "https://github.com/coddy-project/coddy-agent/blob/main/LICENSE",
"isAccessibleForFree": true,
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"image": "https://coddy.dev/assets/og-image.png",
"screenshot": [
"https://coddy.dev/assets/demo/poster-webui.jpg",
"https://coddy.dev/assets/demo/poster-tui.jpg",
"https://coddy.dev/assets/demo/poster-zed.jpg"
],
"featureList": [
"ReAct loop with filesystem and shell tools",
"Terminal console TUI, embedded web UI, OpenAI-compatible HTTP API",
"Agent Client Protocol (ACP) server for Zed, Obsidian, VS Code",
"Telegram gateway",
"MCP servers, Cursor-style rules, skills, hooks, AGENTS.md",
"Subagents, background tasks, cron scheduler, long-term memory, context compaction",
"Swarm relay for a fleet of nodes, remote control of a running server, coddy serve daemon",
"Config check and dry run before start, hot reload of config.yaml",
"Any OpenAI-compatible provider or Anthropic, local models via Ollama, llama.cpp, vLLM",
"Single static binary, Docker images for amd64 and arm64, distroless and scratch images"
],
"keywords": "AI agent, coding agent, agent harness, Go, single binary, ACP, MCP, self-hosted, Ollama, OpenAI-compatible, Telegram bot, distroless",
"author": {
"@id": "https://coddy.dev/#organization"
},
"publisher": {
"@id": "https://coddy.dev/#organization"
}
},
{
"@type": "FAQPage",
"@id": "https://coddy.dev/#faq",
"mainEntity": [
{
"@type": "Question",
"name": "What is Coddy Agent?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Coddy Agent is an open-source, general-purpose AI agent that ships as one static Go binary under the MIT license. It runs a ReAct loop with filesystem and shell tools, MCP servers, project rules, skills, subagents, hooks, background tasks, a cron scheduler, and long-term memory, and the same agent is available from a terminal, a browser, an editor over ACP, or Telegram, on one machine or across a swarm of them."
}
},
{
"@type": "Question",
"name": "Which LLM providers and models does Coddy work with?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Any OpenAI-compatible API plus Anthropic: OpenAI, Anthropic, Ollama, llama.cpp, vLLM, NeuralDeep, or your own gateway, always with your own keys and endpoints. ChatGPT sign-in works through the Codex backend. Models are declared in config.yaml and switched per session."
}
},
{
"@type": "Question",
"name": "How do I install Coddy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Linux and macOS: curl -fsSL https://coddy.dev/install.sh | bash. Windows: irm https://coddy.dev/install.ps1 | iex. The script downloads the latest release binary, puts it on your PATH, and creates ~/.coddy/config.yaml from the example. On Linux you can instead install the .deb or .rpm published with every release (apt-get install ./coddy_X.Y.Z_linux_amd64.deb, dnf install ./coddy_X.Y.Z_linux_amd64.rpm), and on macOS the Homebrew cask straight from the release (brew install --cask https://github.com/coddy-project/coddy-agent/releases/latest/download/coddy.rb); both register Coddy with your package manager and add the man page and shell completions. Docker: docker run -d --name coddy -p 12345:12345 -e OPENAI_API_KEY -v \"$PWD/workspace:/workspace\" -v \"$PWD/coddy_home:/home/user/.coddy\" ghcr.io/coddy-project/coddy-agent:latest opens the web UI on localhost:12345, and the Docker tab of the install block also carries a docker-compose.yaml to copy; the multi-arch images (amd64, arm64) are published to the GitHub Container Registry, not Docker Hub. coddy update -y upgrades an existing install."
}
},
{
"@type": "Question",
"name": "Can Coddy run on-premises with local models?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Point a model entry at a local OpenAI-compatible server such as Ollama, llama.cpp, or vLLM and no prompt leaves your network. The binary is static, so it also runs in distroless or from-scratch containers with a read-only root filesystem, one agent per task."
}
},
{
"@type": "Question",
"name": "Which editors and clients can host Coddy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "coddy acp speaks the Agent Client Protocol over stdio, so Zed, Obsidian, VS Code, or your own script get sessions, modes, permissions, streaming updates, and skills as slash commands. coddy serve runs everything else in one process - the OpenAI-compatible REST API with the embedded web UI, the Telegram gateway, the swarm relay, the cron scheduler - and starts whichever of them config.yaml enables. They share one set of sessions, so a conversation started in a chat is live in the web UI and can be continued in either."
}
},
{
"@type": "Question",
"name": "How do I run Coddy on more than one machine?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Run coddy serve on each machine and enable the swarm relay on one of them: it lists every node's sessions in one place, routes to nodes across rings, and pulls in machines that can only dial out through a reverse tunnel. The console, coddy acp, and the web UI can also drive a single remote server with --remote, and coddy serve --daemon keeps a server running in the background with status, stop, and restart."
}
},
{
"@type": "Question",
"name": "How is Coddy different from other coding agents?",
"acceptedAnswer": {
"@type": "Answer",
"text": "It is provider-agnostic and self-hosted by design: one MIT-licensed binary with no runtime dependencies, your own keys or local models, and one set of sessions shared by the terminal, web UI, editor, Telegram, and scheduler. It reads Cursor-style rules, skills, and AGENTS.md from the repository, so it fits projects already set up for other agents. A side-by-side comparison with nineteen other harnesses is published at coddy.dev/compare/."
}
}
]
}
]
}
</script>
</head>
<body>
<div class="nav-scrim" id="nav-scrim" hidden></div>
<header class="site-header">
<div class="site-header-inner shell-width">
<a class="logo" href="/" aria-label="Coddy agent home">
<img class="logo-wordmark" src="assets/coddy-logo-wordmark.svg" width="188" height="56" alt="Coddy agent" />
</a>
<nav class="nav-drawer" id="site-nav" aria-label="Site menu" aria-hidden="true">
<a class="nav-drawer-link" href="#install">Install</a>
<a class="nav-drawer-link" href="#demos">Demo</a>
<a class="nav-drawer-link" href="#features">Features</a>
<a class="nav-drawer-link" href="/compare/">Compare</a>
<a class="nav-drawer-link" href="https://github.com/coddy-project/coddy-agent/tree/main/docs" target="_blank" rel="noopener noreferrer">Docs</a>
<a
class="release-pill nav-release"
id="release-pill"
href="https://github.com/coddy-project/coddy-agent/releases/latest"
target="_blank"
rel="noopener noreferrer"
title="Latest release on GitHub"
>
<svg class="release-pill-icon" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" focusable="false"><path fill="currentColor" d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"/></svg>
<span class="visually-hidden">GitHub, latest release </span>
<span class="release-pill-version" id="release-pill-version">v1.0.1</span>
</a>
</nav>
<button
type="button"
class="nav-burger"
aria-expanded="false"
aria-controls="site-nav"
aria-label="Open menu"
>
<span class="nav-burger-bar" aria-hidden="true"></span>
<span class="nav-burger-bar" aria-hidden="true"></span>
<span class="nav-burger-bar" aria-hidden="true"></span>
</button>
</div>
</header>
<main class="shell">
<section class="hero">
<h1>Run a general-purpose agent<br class="hero-br" /> from one static binary</h1>
<p class="tagline">
Coddy is an agent harness: a ReAct loop with filesystem and shell tools, MCP, project rules, skills,
subagents, hooks, background tasks, and long-term memory.
Drive it from a terminal, a browser, your editor over ACP, or Telegram; run it as a service with a
cron scheduler, a swarm relay for a fleet of nodes, and remote control from anywhere.
Built for containers and your own API keys.
</p>
<div class="hero-skills" role="list" aria-label="Capabilities">
<span class="skill-chip" role="listitem">/go-binary</span>
<span class="skill-chip" role="listitem">/console-tui</span>
<span class="skill-chip" role="listitem">/acp-harness</span>
<span class="skill-chip" role="listitem">/subagents</span>
<span class="skill-chip" role="listitem">/swarm</span>
<span class="skill-chip" role="listitem">/distroless-ready</span>
<span class="skill-chip" role="listitem">/on-prem-llms</span>
</div>
</section>
<section id="install">
<div class="glass install-block">
<div class="install-block-head">
<h2>Quick install</h2>
<div class="tabs" role="tablist" aria-label="Install platform">
<button type="button" class="tab active" data-tab="linux" role="tab" aria-selected="true" aria-controls="panel-linux" id="tab-linux">Linux</button>
<button type="button" class="tab" data-tab="mac" role="tab" aria-selected="false" aria-controls="panel-mac" id="tab-mac">macOS</button>
<button type="button" class="tab" data-tab="win" role="tab" aria-selected="false" aria-controls="panel-win" id="tab-win">Windows</button>
<button type="button" class="tab" data-tab="docker" role="tab" aria-selected="false" aria-controls="panel-docker" id="tab-docker">Docker</button>
</div>
</div>
<div class="code-wrap active" id="panel-linux" role="tabpanel" aria-labelledby="tab-linux">
<div class="method active" data-method="linux-script">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-linux" aria-label="Copy install command">Copy</button>
<pre><code id="cmd-linux"><span class="cmd">curl -fsSL https://coddy.dev/install.sh | bash</span></code></pre>
</div>
</div>
<div class="method" data-method="linux-deb">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-deb" aria-label="Copy deb install commands">Copy</button>
<pre><code id="cmd-deb"><span class="cmd">curl -fsSLO https://github.com/coddy-project/coddy-agent/releases/latest/download/coddy_<span class="pkg-version">X.Y.Z</span>_linux_amd64.deb</span>
<span class="cmd">sudo apt-get install ./coddy_<span class="pkg-version">X.Y.Z</span>_linux_amd64.deb</span></code></pre>
</div>
</div>
<div class="method" data-method="linux-rpm">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-rpm" aria-label="Copy rpm install commands">Copy</button>
<pre><code id="cmd-rpm"><span class="cmd">curl -fsSLO https://github.com/coddy-project/coddy-agent/releases/latest/download/coddy_<span class="pkg-version">X.Y.Z</span>_linux_amd64.rpm</span>
<span class="cmd">sudo dnf install ./coddy_<span class="pkg-version">X.Y.Z</span>_linux_amd64.rpm</span></code></pre>
</div>
</div>
<div class="install-bar">
<div class="methods" role="tablist" aria-label="Linux install method">
<button type="button" class="method-tab active" data-method="linux-script" role="tab" aria-selected="true">Script</button>
<button type="button" class="method-tab" data-method="linux-deb" role="tab" aria-selected="false">Debian / Ubuntu</button>
<button type="button" class="method-tab" data-method="linux-rpm" role="tab" aria-selected="false">Fedora / RHEL</button>
</div>
<a class="install-view method active" data-method="linux-script" href="https://github.com/coddy-project/coddy-project.github.io/blob/main/install.sh" target="_blank" rel="noopener noreferrer">View install script <span aria-hidden="true">↗</span></a>
<a class="install-view method" data-method="linux-deb" href="https://github.com/coddy-project/coddy-agent/releases/latest" target="_blank" rel="noopener noreferrer">Release assets <span aria-hidden="true">↗</span></a>
<a class="install-view method" data-method="linux-rpm" href="https://github.com/coddy-project/coddy-agent/releases/latest" target="_blank" rel="noopener noreferrer">Release assets <span aria-hidden="true">↗</span></a>
</div>
<p class="install-note method active" data-method="linux-script">
Puts the latest release binary on your PATH and creates <code>~/.coddy/config.yaml</code> from the example when it is missing.
</p>
<p class="install-note method" data-method="linux-deb">
Swap <code>amd64</code> for <code>arm64</code> on 64-bit ARM, or pick a file from the <a href="https://github.com/coddy-project/coddy-agent/releases/latest" target="_blank" rel="noopener noreferrer">latest release</a>. The package brings <code>/usr/bin/coddy</code>, <code>man coddy</code> and the shell completions, no service and no system account, and <code>coddy update</code> defers to the package manager.
</p>
<p class="install-note method" data-method="linux-rpm">
openSUSE takes the same file with <code>zypper</code>. Swap <code>amd64</code> for <code>arm64</code> on 64-bit ARM, or pick a file from the <a href="https://github.com/coddy-project/coddy-agent/releases/latest" target="_blank" rel="noopener noreferrer">latest release</a>. The package brings <code>/usr/bin/coddy</code>, <code>man coddy</code> and the shell completions, no service and no system account, and <code>coddy update</code> defers to the package manager.
</p>
</div>
<div class="code-wrap" id="panel-mac" role="tabpanel" aria-labelledby="tab-mac">
<div class="method active" data-method="mac-script">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-mac" aria-label="Copy install command">Copy</button>
<pre><code id="cmd-mac"><span class="cmd">curl -fsSL https://coddy.dev/install.sh | bash</span></code></pre>
</div>
</div>
<div class="method" data-method="mac-brew">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-brew" aria-label="Copy Homebrew install command">Copy</button>
<pre><code id="cmd-brew"><span class="cmd">brew install --cask https://github.com/coddy-project/coddy-agent/releases/latest/download/coddy.rb</span></code></pre>
</div>
</div>
<div class="install-bar">
<div class="methods" role="tablist" aria-label="macOS install method">
<button type="button" class="method-tab active" data-method="mac-script" role="tab" aria-selected="true">Script</button>
<button type="button" class="method-tab" data-method="mac-brew" role="tab" aria-selected="false">Homebrew</button>
</div>
<a class="install-view method active" data-method="mac-script" href="https://github.com/coddy-project/coddy-project.github.io/blob/main/install.sh" target="_blank" rel="noopener noreferrer">View install script <span aria-hidden="true">↗</span></a>
<a class="install-view method" data-method="mac-brew" href="https://coddy.dev/docs/getting-started/homebrew" target="_blank" rel="noopener noreferrer">About the cask <span aria-hidden="true">↗</span></a>
</div>
<p class="install-note method active" data-method="mac-script">
Puts the latest release binary on your PATH and creates <code>~/.coddy/config.yaml</code> from the example when it is missing.
</p>
<p class="install-note method" data-method="mac-brew">
Every release publishes the cask beside its archives. It adds <code>man coddy</code> and the shell completions, and <code>coddy update</code> hands over to <code>brew upgrade --cask coddy</code>. If macOS blocks the first run, clear the quarantine flag with <code>xattr -d com.apple.quarantine "$(which coddy)"</code>.
</p>
</div>
<div class="code-wrap" id="panel-win" role="tabpanel" aria-labelledby="tab-win">
<div class="method active">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-win" aria-label="Copy install command">Copy</button>
<pre><code id="cmd-win"><span class="cmd">irm https://coddy.dev/install.ps1 | iex</span></code></pre>
</div>
</div>
<div class="install-bar">
<a class="install-view" href="https://github.com/coddy-project/coddy-project.github.io/blob/main/install.ps1" target="_blank" rel="noopener noreferrer">View install script <span aria-hidden="true">↗</span></a>
</div>
<p class="install-note active">
Run it in PowerShell. Puts the latest release binary on your PATH and creates <code>~/.coddy/config.yaml</code> from the example when it is missing.
</p>
</div>
<div class="code-wrap" id="panel-docker" role="tabpanel" aria-labelledby="tab-docker">
<div class="method active" data-method="docker-run">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-docker" aria-label="Copy docker command">Copy</button>
<pre><code id="cmd-docker"><span class="cmd">docker run -d --name coddy \</span>
-p 12345:12345 \
-e OPENAI_API_KEY \
-v "$PWD/workspace:/workspace" \
-v "$PWD/coddy_home:/home/user/.coddy" \
ghcr.io/coddy-project/coddy-agent:latest</code></pre>
</div>
</div>
<div class="method" data-method="docker-compose">
<div class="install-code">
<button type="button" class="install-copy" data-copy-for="cmd-compose" aria-label="Copy compose file">Copy</button>
<pre><code id="cmd-compose">services:
coddy:
image: ghcr.io/coddy-project/coddy-agent:latest
command: serve -H 0.0.0.0 -P 12345
ports:
- "12345:12345"
working_dir: /workspace
environment:
CODDY_HOME: /home/user/.coddy
CODDY_CWD: /workspace
CODDY_CONFIG: /home/user/.coddy/config.yaml
OPENAI_API_KEY: ${OPENAI_API_KEY-}
volumes:
- ./workspace:/workspace
- ./coddy_home:/home/user/.coddy
healthcheck:
test: ["CMD", "/bin/coddy", "--version"]
interval: 5s
timeout: 3s
retries: 20</code></pre>
</div>
</div>
<div class="install-bar">
<div class="methods" role="tablist" aria-label="Docker install method">
<button type="button" class="method-tab active" data-method="docker-run" role="tab" aria-selected="true">docker run</button>
<button type="button" class="method-tab" data-method="docker-compose" role="tab" aria-selected="false">Compose</button>
</div>
<a class="install-view method active" data-method="docker-run" href="https://coddy.dev/docs/getting-started/docker" target="_blank" rel="noopener noreferrer">Docker guide <span aria-hidden="true">↗</span></a>
<a class="install-view method" data-method="docker-compose" href="https://github.com/coddy-project/coddy-agent/blob/main/docker-compose.yml" target="_blank" rel="noopener noreferrer">Compose file in the repo <span aria-hidden="true">↗</span></a>
</div>
<p class="install-note method active" data-method="docker-run">
Opens the web UI on <a href="http://localhost:12345" target="_blank" rel="noopener noreferrer">localhost:12345</a>. The agent works in the mounted <code>/workspace</code>; sessions, skills and config live in the second mount. The image is built for <code>amd64</code> and <code>arm64</code> and published to the GitHub Container Registry, no login needed to pull. Pin a release instead of <code>latest</code>, for example <code>ghcr.io/coddy-project/coddy-agent:<span class="pkg-version">X.Y.Z</span></code>.
</p>
<p class="install-note method" data-method="docker-compose">
Save it as <code>docker-compose.yaml</code> and run <code>docker compose up -d</code>. In the repository: <a href="https://github.com/coddy-project/coddy-agent/blob/main/Dockerfile" target="_blank" rel="noopener noreferrer">Dockerfile</a>, <a href="https://github.com/coddy-project/coddy-agent/blob/main/docker-compose.yml" target="_blank" rel="noopener noreferrer">docker-compose.yml</a> for the published image and <a href="https://github.com/coddy-project/coddy-agent/blob/main/docker-compose.dev.yml" target="_blank" rel="noopener noreferrer">docker-compose.dev.yml</a> to build from source with your own tags.
</p>
</div>
<div class="install-next" id="install-next">
<p class="install-next-title">Then set a provider key in <code>~/.coddy/config.yaml</code> and run</p>
<dl class="install-cmds">
<dt><code>coddy</code></dt>
<dd>the terminal console</dd>
<dt><code>coddy serve</code></dt>
<dd>the web UI</dd>
<dt><code>coddy acp</code></dt>
<dd>an editor client over ACP</dd>
<dt><code>coddy update -y</code></dt>
<dd>upgrade later</dd>
</dl>
</div>
</div>
<p class="hint install-alt">
Other install methods and details:
<a href="https://coddy.dev/docs/getting-started/install" target="_blank" rel="noopener noreferrer">docs/install.md</a>
· Homebrew by name is still on its way, see
<a href="https://coddy.dev/docs/getting-started/homebrew" target="_blank" rel="noopener noreferrer">docs/homebrew.md</a>
</p>
</section>
<section id="demos">
<h2>See it in action</h2>
<div class="glass showcase">
<div class="showcase-tabs" role="tablist" aria-label="Coddy surfaces">
<button type="button" class="showcase-tab active" role="tab" aria-selected="true" aria-controls="shot-webui" id="tab-webui" data-shot="shot-webui">Web UI</button>
<button type="button" class="showcase-tab" role="tab" aria-selected="false" tabindex="-1" aria-controls="shot-terminal" id="tab-terminal" data-shot="shot-terminal">Terminal</button>
<button type="button" class="showcase-tab" role="tab" aria-selected="false" tabindex="-1" aria-controls="shot-acp" id="tab-acp" data-shot="shot-acp">Editor (ACP)</button>
</div>
<div class="showcase-panel" id="shot-webui" role="tabpanel" aria-labelledby="tab-webui" tabindex="0">
<button
type="button"
class="demo-player"
data-video="assets/demo/coddy-webui-demo.mp4"
aria-label="Play demo: Coddy web UI, 2:22"
>
<img src="assets/demo/poster-webui.jpg" width="1280" height="720" alt="Coddy web UI start screen with the model menu open" loading="eager" fetchpriority="high" />
<span class="demo-play" aria-hidden="true"></span>
<span class="demo-duration" aria-hidden="true">2:22</span>
</button>
<p class="showcase-caption">
The same agent served by <code>coddy serve</code>: streamed tool calls, a permission card with a real diff,
session history, seven themes, and an environment switch that points the UI at a remote server.
</p>
</div>
<div class="showcase-panel" id="shot-terminal" role="tabpanel" aria-labelledby="tab-terminal" tabindex="0" hidden>
<button
type="button"
class="demo-player"
data-video="assets/demo/coddy-tui-demo.mp4"
aria-label="Play demo: Coddy console TUI, 3:46"
>
<img src="assets/demo/poster-tui.jpg" width="1280" height="720" alt="Coddy console TUI with the model selector open" loading="lazy" />
<span class="demo-play" aria-hidden="true"></span>
<span class="demo-duration" aria-hidden="true">3:46</span>
</button>
<p class="showcase-caption">
Bare <code>coddy</code> in a terminal: pick a model with <code>Ctrl+L</code>, approve edits and commands
as the agent works, resume with <code>coddy -c</code>, drive a remote server with <code>--remote</code>.
</p>
</div>
<div class="showcase-panel" id="shot-acp" role="tabpanel" aria-labelledby="tab-acp" tabindex="0" hidden>
<button
type="button"
class="demo-player"
data-video="assets/demo/coddy-zed-acp-demo.mp4"
aria-label="Play demo: Coddy inside Zed over ACP, 2:57"
>
<img src="assets/demo/poster-zed.jpg" width="1280" height="720" alt="Zed with the Coddy thread open in the agent panel" loading="lazy" />
<span class="demo-play" aria-hidden="true"></span>
<span class="demo-duration" aria-hidden="true">2:57</span>
</button>
<p class="showcase-caption">
Zed launches <code>coddy acp</code> for the workspace, and coddy's own modes, models and permission
policy show up in the editor's agent panel; its skills arrive as slash commands. One entry in Zed's
<code>settings.json</code>:
</p>
<pre class="showcase-code"><code>"agent_servers": {
"Coddy": { "type": "custom", "command": "coddy", "args": ["acp"] }
}</code></pre>
</div>
</div>
</section>
<section id="about">
<h2>What is Coddy</h2>
<p>
Coddy started as a coding agent and grew into a <strong>general-purpose harness</strong>:
Cursor-style rules and skills on disk, <code>agent</code>, <code>plan</code> and <code>ask</code> modes, tool
permissions, streaming output, and sessions you can resume from a terminal, an IDE, a browser, Telegram, or
automation - the same <code>$CODDY_HOME</code> bundle whichever surface opens it.
</p>
<p>
Ship it as a single binary in <strong>distroless</strong> or <strong>from-scratch</strong> images, or run a
<strong>fleet of containers</strong> with your orchestrator defining CPU, memory, and mounts - one agent per
task, full control of each instance, and one swarm relay that lists and reaches every node.
</p>
</section>
<section id="features">
<h2>Features</h2>
<div class="feature-group">
<h3 class="feature-group-title">Agent core</h3>
<div class="features">
<a class="glass feature feature-link" href="https://coddy.dev/docs/contributing/react-agent" target="_blank" rel="noopener noreferrer">
<h4>ReAct loop</h4>
<p>Reasoning, tool calls, and observations in a loop, with runaway-loop guards on repeated output and repeated tool calls.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/subagents" target="_blank" rel="noopener noreferrer">
<h4>Subagents</h4>
<p><code>spawn_agent</code> delegates a bounded task to a child agent with its own context and session. Markdown definitions that can only narrow the parent's tools.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/hooks" target="_blank" rel="noopener noreferrer">
<h4>Hooks</h4>
<p>Your own commands at every lifecycle point, in Claude Code's <code>hooks.json</code> shape. A hook can deny, approve or rewrite a tool call before it runs.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/background-tasks" target="_blank" rel="noopener noreferrer">
<h4>Background tasks</h4>
<p>Long commands run detached with <code>background: true</code>. A Tasks panel tracks them against the model's own estimate; the agent collects output later.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/compaction" target="_blank" rel="noopener noreferrer">
<h4>Compaction</h4>
<p><code>/compact</code> plus automatic summarization at a context threshold. The recent turns stay verbatim and the full transcript stays on disk.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/memory" target="_blank" rel="noopener noreferrer">
<h4>Long-term memory</h4>
<p>Optional memory copilot that recalls across sessions, with per-session memory routes on the HTTP surface.</p>
</a>
</div>
</div>
<div class="feature-group">
<h3 class="feature-group-title">Where you run it</h3>
<div class="features">
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/console" target="_blank" rel="noopener noreferrer">
<h4>Console</h4>
<p>Bare <code>coddy</code> on a terminal. Streaming transcript, tool boxes, permission modals, <code>!!</code> for a local shell the model never sees, <code>coddy -c</code> to resume, <code>coddy -p</code> for one-shot output.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/web-ui" target="_blank" rel="noopener noreferrer">
<h4>Web UI</h4>
<p>Embedded SPA at <code>/</code> with the <code>http,ui</code> tags. Chat, sessions, plan documents, Tasks and scheduler drawers, the swarm map, live settings.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/reference/acp-protocol" target="_blank" rel="noopener noreferrer">
<h4>ACP</h4>
<p><code>coddy acp</code> over stdio. Sessions, modes, permissions, and streaming updates for Zed, Obsidian, VS Code, or your own script.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/reference/http-api" target="_blank" rel="noopener noreferrer">
<h4>HTTP API</h4>
<p>OpenAI-compatible gateway on <code>coddy serve</code>. <code>POST /v1/responses</code>, models, Swagger at <code>/docs/</code>.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/gateway" target="_blank" rel="noopener noreferrer">
<h4>Telegram gateway</h4>
<p>Bot adapter with per-user sessions, group isolation modes, admin ACL, and native rich messages. Extensible to other messengers.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/sessions" target="_blank" rel="noopener noreferrer">
<h4>Sessions</h4>
<p>Bundles on disk under <code>$CODDY_HOME</code>, resumed from any surface. Edit a message to branch the conversation, <code>/export</code> to Markdown, HTML or JSON.</p>
</a>
</div>
</div>
<div class="feature-group">
<h3 class="feature-group-title">Operate it</h3>
<div class="features">
<a class="glass feature feature-link" href="https://coddy.dev/docs/operate/serve" target="_blank" rel="noopener noreferrer">
<h4>coddy serve</h4>
<p>One process for every subsystem <code>config.yaml</code> enables. <code>--daemon</code> keeps it in the background with <code>status</code>, <code>stop</code> and <code>restart</code>, and an edited config reaches it without a restart.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/operate/swarm" target="_blank" rel="noopener noreferrer">
<h4>Swarm</h4>
<p>A relay lists and reaches many nodes, mounts their sessions into one list and routes across rings. Nodes that can only dial out join through a reverse tunnel.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/operate/remote" target="_blank" rel="noopener noreferrer">
<h4>Remote control</h4>
<p>Point the console or <code>coddy acp</code> at a running server with <code>--remote</code>, or switch the web UI between local and remote from the composer.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/operate/scheduler" target="_blank" rel="noopener noreferrer">
<h4>Scheduler</h4>
<p>Cron jobs with a UI drawer and agent tools, so recurring work runs without a session open.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/getting-started/configuration" target="_blank" rel="noopener noreferrer">
<h4>Config check and dry run</h4>
<p><code>coddy -t</code> validates <code>config.yaml</code> against the embedded schema with <code>file:line:col</code> and a fix line. <code>--dry-run</code> probes paths, providers, models, ports, MCP servers and remotes before anything starts.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/getting-started/docker" target="_blank" rel="noopener noreferrer">
<h4>Docker and distroless</h4>
<p>Published images on <code>ghcr.io</code> for amd64 and arm64, or drop the static binary into a scratch image with a read-only rootfs.</p>
</a>
</div>
</div>
<div class="feature-group">
<h3 class="feature-group-title">Project context and control</h3>
<div class="features">
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/rules" target="_blank" rel="noopener noreferrer">
<h4>Rules</h4>
<p>Auto-discovers <code>.cursor/rules</code>, <code>.coddy/rules</code>, <code>.agents/rules</code>, <code>.claude/rules</code>, <code>.codex/rules</code>, and nested <code>AGENTS.md</code> under the session cwd.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/skills" target="_blank" rel="noopener noreferrer">
<h4>Skills</h4>
<p>Slash commands from <code>SKILL.md</code> packs in <code>skills.dirs</code>. Install from registries with <code>npx skills</code> or from Settings → Skills.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/mcp" target="_blank" rel="noopener noreferrer">
<h4>MCP servers</h4>
<p>Connect MCP servers over stdio, streamable HTTP and SSE, from config, <code>mcp.json</code> files or the editor. Their tool definitions merge into the agent and plan loops.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/features/modes" target="_blank" rel="noopener noreferrer">
<h4>Three modes</h4>
<p><code>agent</code> runs the full toolset, <code>plan</code> writes plan documents only, <code>ask</code> is read-only research with web search.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/operate/security" target="_blank" rel="noopener noreferrer">
<h4>Permissions and trust</h4>
<p>Edits and commands ask before they run, and a grant can widen to a whole program. Project-local MCP servers, hooks and subagent files need an explicit approval first.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/reference/config#agent-self-configuration" target="_blank" rel="noopener noreferrer">
<h4>Self-configuration</h4>
<p>The agent edits its own YAML through staged <code>config_set</code> commands. Nothing lands until a commit you approve, which validates and hot-reloads.</p>
</a>
</div>
</div>
<div class="feature-group">
<h3 class="feature-group-title">Models, tools and appearance</h3>
<div class="features">
<a class="glass feature feature-link" href="https://coddy.dev/docs/getting-started/configuration" target="_blank" rel="noopener noreferrer">
<h4>Any provider</h4>
<p>OpenAI, Anthropic, Ollama, NeuralDeep, any OpenAI-compatible API, plus ChatGPT sign-in through the Codex backend. Your keys, your endpoints.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/web-ui#per-session-reasoning-level" target="_blank" rel="noopener noreferrer">
<h4>Reasoning levels</h4>
<p>A composer dropdown picks the effort for reasoning models, mapped to OpenAI <code>reasoning_effort</code> or Anthropic thinking budgets.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/web-ui#composer-file-attachments-multimodal" target="_blank" rel="noopener noreferrer">
<h4>Multimodal</h4>
<p>Attach images and files in the composer when the model supports it. Assets are saved to the session directory and injected into the agent context.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/console" target="_blank" rel="noopener noreferrer">
<h4>Usage and limits</h4>
<p>The quota behind the current model in the console footer and the web UI, for providers that publish one. A turn that hits a limit can wait for the reset and resume by itself.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/getting-started/configuration#ssh-remote-execution" target="_blank" rel="noopener noreferrer">
<h4>SSH commands</h4>
<p><code>ssh_run_command</code> reaches remote hosts over pure-Go SSH, authenticating from your SSH agent or <code>~/.ssh</code> keys.</p>
</a>
<a class="glass feature feature-link" href="https://coddy.dev/docs/surfaces/web-ui" target="_blank" rel="noopener noreferrer">
<h4>Themes and language</h4>
<p>Seven web UI themes and an English or Russian interface, switched in Settings → Appearance without touching the config.</p>
</a>
</div>
</div>
</section>
<section id="compare">
<h2>How Coddy compares</h2>
<div class="glass compare-teaser">
<h3>Coddy vs the 2026 agent harnesses</h3>
<p>
Twenty harnesses read side by side in September 2026 - Claude Code, Codex CLI, OpenCode, Pi, OMP,
DeepSeek Harness, OpenClaw, Hermes, Goose, Aider, Cline, OpenHands, Crush, Reasonix, CodeWhale, Grok Build,
Antigravity CLI, Koda, Drift and Coddy - across delivery, surfaces, extensibility, context handling and the
trust model.
</p>
<ul>
<li><b>Six of twenty</b> ship as one static file with no runtime. Only Coddy also carries a web UI, a scheduler, memory and a messenger gateway inside it.</li>
<li><b>Nobody else</b> in the set lets the agent stage edits to its own YAML with validation, a snapshot and a rollback.</li>
<li><b>Where it loses:</b> no kernel sandbox like Codex CLI, no LSP or DAP like OMP, no workspace checkpoints like Reasonix.</li>
</ul>
<p>
<a href="/compare/">Read the full comparison with all five tables</a>
</p>
</div>
</section>
<section id="faq">
<h2>Questions</h2>
<div class="faq-list">
<div class="faq-item">
<h3>What is Coddy Agent?</h3>
<p>Coddy Agent is an open-source, general-purpose AI agent that ships as one static Go binary under the MIT license. It runs a ReAct loop with filesystem and shell tools, MCP servers, project rules, skills, subagents, hooks, background tasks, a cron scheduler, and long-term memory, and the same agent is available from a terminal, a browser, an editor over ACP, or Telegram, on one machine or across a swarm of them.</p>
</div>
<div class="faq-item">
<h3>Which LLM providers and models does Coddy work with?</h3>
<p>Any OpenAI-compatible API plus Anthropic: OpenAI, Anthropic, Ollama, llama.cpp, vLLM, NeuralDeep, or your own gateway, always with your own keys and endpoints. ChatGPT sign-in works through the Codex backend. Models are declared in <code>config.yaml</code> and switched per session.</p>
</div>
<div class="faq-item">
<h3>How do I install Coddy?</h3>
<p>Linux and macOS: <code>curl -fsSL https://coddy.dev/install.sh | bash</code>. Windows: <code>irm https://coddy.dev/install.ps1 | iex</code>. The script downloads the latest release binary, puts it on your PATH, and creates <code>~/.coddy/config.yaml</code> from the example. On Linux you can instead install the <code>.deb</code> or <code>.rpm</code> published with every release (<code>apt-get install ./coddy_X.Y.Z_linux_amd64.deb</code>, <code>dnf install ./coddy_X.Y.Z_linux_amd64.rpm</code>), and on macOS the Homebrew cask straight from the release (<code>brew install --cask https://github.com/coddy-project/coddy-agent/releases/latest/download/coddy.rb</code>); both register Coddy with your package manager and add the man page and shell completions. Docker: <code>docker run -d --name coddy -p 12345:12345 -e OPENAI_API_KEY -v "$PWD/workspace:/workspace" -v "$PWD/coddy_home:/home/user/.coddy" ghcr.io/coddy-project/coddy-agent:latest</code> opens the web UI on <code>localhost:12345</code>, and the Docker tab of the install block also carries a <code>docker-compose.yaml</code> to copy; the multi-arch images (amd64, arm64) are published to the GitHub Container Registry, not Docker Hub. <code>coddy update -y</code> upgrades an existing install.</p>
</div>
<div class="faq-item">
<h3>Can Coddy run on-premises with local models?</h3>
<p>Yes. Point a model entry at a local OpenAI-compatible server such as Ollama, llama.cpp, or vLLM and no prompt leaves your network. The binary is static, so it also runs in distroless or from-scratch containers with a read-only root filesystem, one agent per task.</p>
</div>
<div class="faq-item">
<h3>Which editors and clients can host Coddy?</h3>
<p><code>coddy acp</code> speaks the Agent Client Protocol over stdio, so Zed, Obsidian, VS Code, or your own script get sessions, modes, permissions, streaming updates, and skills as slash commands. <code>coddy serve</code> runs everything else in one process - the OpenAI-compatible REST API with the embedded web UI, the Telegram gateway, the swarm relay, the cron scheduler - and starts whichever of them <code>config.yaml</code> enables. They share one set of sessions, so a conversation started in a chat is live in the web UI and can be continued in either.</p>
</div>
<div class="faq-item">
<h3>How do I run Coddy on more than one machine?</h3>
<p>Run <code>coddy serve</code> on each machine and enable the swarm relay on one of them: it lists every node's sessions in one place, routes to nodes across rings, and pulls in machines that can only dial out through a reverse tunnel. The console, <code>coddy acp</code>, and the web UI can also drive a single remote server with <code>--remote</code>, and <code>coddy serve --daemon</code> keeps a server running in the background with <code>status</code>, <code>stop</code>, and <code>restart</code>.</p>
</div>
<div class="faq-item">
<h3>How is Coddy different from other coding agents?</h3>
<p>It is provider-agnostic and self-hosted by design: one MIT-licensed binary with no runtime dependencies, your own keys or local models, and one set of sessions shared by the terminal, web UI, editor, Telegram, and scheduler. It reads Cursor-style rules, skills, and <code>AGENTS.md</code> from the repository, so it fits projects already set up for other agents. A side-by-side comparison with nineteen other harnesses is published at <a href="/compare/">coddy.dev/compare/</a>.</p>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="shell-width">
<p class="footer-links">
<a href="https://github.com/coddy-project/coddy-agent" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="https://github.com/coddy-project/coddy-agent/tree/main/docs" target="_blank" rel="noopener noreferrer">Docs</a>
<a href="https://github.com/coddy-project/coddy-agent/releases" target="_blank" rel="noopener noreferrer">Releases</a>
<a href="https://github.com/coddy-project/coddy-agent/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">MIT License</a>
<a href="/llms.txt">llms.txt</a>
</p>
<p>
Coddy Project ·
<a href="https://github.com/coddy-project" target="_blank" rel="noopener noreferrer">github.com/coddy-project</a>
</p>
</div>
</footer>
<script>
(function () {
function wireTablist(tabs, activate) {
tabs.forEach(function (btn, index) {
btn.addEventListener("click", function () {
activate(btn);
});
btn.addEventListener("keydown", function (e) {
var step = e.key === "ArrowRight" ? 1 : e.key === "ArrowLeft" ? -1 : 0;
if (!step) return;
e.preventDefault();
var next = tabs[(index + step + tabs.length) % tabs.length];
activate(next);
next.focus();
});
});
}
var installTabs = Array.prototype.slice.call(document.querySelectorAll(".tab"));
var installPanels = {};
installTabs.forEach(function (t) {
var id = t.getAttribute("data-tab");
installPanels[id] = document.getElementById("panel-" + id);
});
function activateInstallTab(btn) {
var id = btn.getAttribute("data-tab");
installTabs.forEach(function (t) {
var on = t === btn;
t.classList.toggle("active", on);
t.setAttribute("aria-selected", on ? "true" : "false");
});
Object.keys(installPanels).forEach(function (k) {
installPanels[k].classList.toggle("active", k === id);
});
// The "then run" block describes the installed binary; the container
// already runs `coddy serve`, so the Docker tab hides it.
var installNext = document.getElementById("install-next");
if (installNext) installNext.hidden = id === "docker";
}
wireTablist(installTabs, activateInstallTab);
// Open the tab for the visitor's own platform. The markup ships with
// Linux selected, which is also the answer when nothing matches.
function detectInstallTab() {
var hints = [
navigator.userAgentData && navigator.userAgentData.platform,
navigator.platform,
navigator.userAgent,
].filter(Boolean).join(" ");
if (/mac|iphone|ipad/i.test(hints)) return "mac";
if (/windows|win32|win64/i.test(hints)) return "win";
return "linux";
}
var detectedTab = document.getElementById("tab-" + detectInstallTab());
if (detectedTab && !detectedTab.classList.contains("active")) activateInstallTab(detectedTab);
// Inside a platform panel the segmented control under the command
// swaps the command block and its note: every element carrying
// data-method in that panel follows the selected tab.
Array.prototype.slice.call(document.querySelectorAll(".methods")).forEach(function (group) {
var panel = group.closest(".code-wrap");
var methodTabs = Array.prototype.slice.call(group.querySelectorAll(".method-tab"));
wireTablist(methodTabs, function (btn) {
var id = btn.getAttribute("data-method");
methodTabs.forEach(function (t) {
var on = t === btn;
t.classList.toggle("active", on);
t.setAttribute("aria-selected", on ? "true" : "false");
});
Array.prototype.slice.call(panel.querySelectorAll(".method")).forEach(function (el) {
el.classList.toggle("active", el.getAttribute("data-method") === id);
});
});
});
var showcaseTabs = Array.prototype.slice.call(document.querySelectorAll(".showcase-tab"));
wireTablist(showcaseTabs, function (btn) {
var id = btn.getAttribute("data-shot");
showcaseTabs.forEach(function (t) {
var on = t === btn;
t.classList.toggle("active", on);
t.setAttribute("aria-selected", on ? "true" : "false");
t.tabIndex = on ? 0 : -1;
var panel = document.getElementById(t.getAttribute("data-shot"));
if (!panel) return;
if (!on) {
var playing = panel.querySelector("video");
if (playing && !playing.paused) playing.pause();
}
panel.hidden = !on;
});
void id;
});
function copyInstallText(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
return navigator.clipboard.writeText(text);
}
return new Promise(function (resolve, reject) {
var ta = document.createElement("textarea");
ta.value = text;
ta.style.position = "fixed";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.focus();
ta.select();
try {
document.execCommand("copy") ? resolve() : reject();
} catch (e) {
reject(e);
} finally {
document.body.removeChild(ta);
}
});
}
document.querySelectorAll(".demo-player").forEach(function (btn) {
btn.addEventListener("click", function () {
if (btn.dataset.loaded) return;
btn.dataset.loaded = "1";
var poster = btn.querySelector("img");
var video = document.createElement("video");
video.className = "demo-video";
video.controls = true;
video.autoplay = true;
video.playsInline = true;
video.setAttribute("playsinline", "");
video.preload = "auto";
if (poster) video.poster = poster.currentSrc || poster.src;
video.src = btn.getAttribute("data-video");
btn.replaceWith(video);
var p = video.play();
if (p && p.catch) p.catch(function () {});
});
});
document.querySelectorAll(".install-copy").forEach(function (btn) {
btn.addEventListener("click", function () {
var id = btn.getAttribute("data-copy-for");
var code = id ? document.getElementById(id) : null;
var text = code ? code.textContent.replace(/\s+$/, "") : "";
if (!text) return;
copyInstallText(text)
.then(function () {
btn.textContent = "Copied";
btn.classList.add("install-copy--done");
window.setTimeout(function () {
btn.textContent = "Copy";
btn.classList.remove("install-copy--done");
}, 900);
})
.catch(function () {});
});
});
})();
</script>
<script src="/nav.js?v=2" defer></script>
</body>
</html>