zooid 0.6.1 โ 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +36 -444
- package/dist/bin.js +1797 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk-N5POSZX5.js +31000 -0
- package/dist/chunk-N5POSZX5.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +4 -3790
- package/dist/index.js.map +1 -0
- package/dist/web/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/dist/web/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/dist/web/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/dist/web/assets/index-BT_v3DKu.js +295 -0
- package/dist/web/assets/index-DJTghnF-.css +1 -0
- package/dist/web/assets/index-JZMMlqDP.js +118066 -0
- package/dist/web/assets/reaction-picker-emoji-Kh7emgFa.js +716 -0
- package/dist/web/favicon.svg +1 -0
- package/dist/web/index.html +14 -0
- package/package.json +42 -22
- package/src/bin.ts +112 -0
- package/src/bootstrap/admin.test.ts +69 -0
- package/src/bootstrap/admin.ts +37 -0
- package/src/bootstrap/configs.test.ts +24 -0
- package/src/bootstrap/configs.ts +64 -0
- package/src/bootstrap/data-layout.test.ts +25 -0
- package/src/bootstrap/data-layout.ts +20 -0
- package/src/bootstrap/derive.test.ts +74 -0
- package/src/bootstrap/derive.ts +40 -0
- package/src/bootstrap/paths.test.ts +22 -0
- package/src/bootstrap/paths.ts +27 -0
- package/src/bootstrap/tokens.test.ts +44 -0
- package/src/bootstrap/tokens.ts +43 -0
- package/src/build-registry.context.test.ts +61 -0
- package/src/build-registry.test.ts +59 -0
- package/src/build-registry.ts +142 -0
- package/src/build-registry.zod043.test.ts +64 -0
- package/src/commands/dev-cascade.test.ts +38 -0
- package/src/commands/dev-cascade.ts +35 -0
- package/src/commands/dev-data-layout.test.ts +55 -0
- package/src/commands/dev.ts +308 -0
- package/src/commands/init/generators.test.ts +97 -0
- package/src/commands/init/generators.ts +119 -0
- package/src/commands/init/prompts.ts +123 -0
- package/src/commands/init/registry.test.ts +33 -0
- package/src/commands/init/registry.ts +75 -0
- package/src/commands/init/sniff.test.ts +41 -0
- package/src/commands/init/sniff.ts +30 -0
- package/src/commands/init.test.ts +131 -0
- package/src/commands/init.ts +158 -0
- package/src/commands/logs.test.ts +105 -0
- package/src/commands/logs.ts +108 -0
- package/src/commands/start.ts +28 -0
- package/src/commands/status.test.ts +73 -0
- package/src/commands/status.ts +100 -0
- package/src/daemon/start-daemon.test.ts +67 -0
- package/src/daemon/start-daemon.ts +243 -0
- package/src/index.ts +2 -0
- package/src/observability/capture-agent.ts +58 -0
- package/src/observability/capture-tuwunel.test.ts +57 -0
- package/src/observability/capture-tuwunel.ts +24 -0
- package/src/observability/file-sink.test.ts +68 -0
- package/src/observability/file-sink.ts +78 -0
- package/src/observability/observability.integration.test.ts +162 -0
- package/src/observability/paths.test.ts +104 -0
- package/src/observability/paths.ts +94 -0
- package/src/services/tuwunel.test.ts +64 -0
- package/src/services/tuwunel.ts +91 -0
- package/src/web/resolve.test.ts +50 -0
- package/src/web/resolve.ts +31 -0
- package/src/web/static.test.ts +51 -0
- package/src/web/static.ts +61 -0
- package/src/web/watch.ts +103 -0
- package/dist/chunk-67ZRMVHO.js +0 -174
- package/dist/chunk-AR456MHY.js +0 -29
- package/dist/chunk-VBGU2NST.js +0 -139
- package/dist/client-4VMFEFDX.js +0 -22
- package/dist/config-2KK5GX42.js +0 -27
- package/dist/template-T5IB4YWC.js +0 -92
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,479 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
<h1 align="center">๐ชธ Zooid</h1>
|
|
3
|
-
<p align="center"><strong>Pub/sub for AI agents and humans. Deploy in one command. Free forever.</strong></p>
|
|
4
|
-
<p align="center">
|
|
5
|
-
<a href="#quickstart">Quickstart</a> ยท
|
|
6
|
-
<a href="https://app.zooid.dev">Deploy on Cloud</a> ยท
|
|
7
|
-
<a href="https://zooid.dev/docs">Docs</a> ยท
|
|
8
|
-
<a href="https://directory.zooid.dev/api/discover">Browse Servers</a> ยท
|
|
9
|
-
<a href="#why-zooid">Why Zooid</a> ยท
|
|
10
|
-
<a href="https://dsc.gg/zooid">Discord</a>
|
|
11
|
-
</p>
|
|
12
|
-
</p>
|
|
1
|
+
# ๐ชธ Zooid
|
|
13
2
|
|
|
14
|
-
|
|
3
|
+
> Open-source tool for defining and running AI agents alongside you and your team. Any model, any CLI.
|
|
15
4
|
|
|
16
|
-
Zooid is an open-source
|
|
5
|
+
Zooid is an open-source tool for defining and running AI agents alongside you and your team. It bridges [ACP](https://agentclientprotocol.com)-compatible agents (Claude Code, [opencode](https://opencode.ai), Codex, โฆ) onto [Matrix](https://matrix.org) so your team and your agents share the same chat rooms โ no separate "AI dashboard," no vendor lock-in. Deploy with `zooid init`, run with `zooid dev`.
|
|
17
6
|
|
|
18
|
-
|
|
7
|
+
**Full docs: [zooid.dev/docs](https://zooid.dev/docs)**
|
|
19
8
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
That's it. You now have a globally distributed pub/sub server running on Cloudflare's edge network at zero cost.
|
|
25
|
-
|
|
26
|
-
---
|
|
9
|
+
- **Protocol-first.** Matrix for transport (E2E encryption, federation), ACP for the agent contract. Pre-built images for Claude Code, opencode, and Codex; any other ACP-compatible harness (Cline, Gemini, or your own) connects too.
|
|
10
|
+
- **Containerized runtime.** Podman or Docker. Each agent runs in its own long-lived container with mounts, env, and capabilities declared in `zooid.yaml`.
|
|
11
|
+
- **Workforce as code.** Declare agents declaratively; review team-structure changes in pull requests, not a web UI.
|
|
12
|
+
- **Multi-agent collaboration.** Agents are standard Matrix users, so an architect bot can `@`-mention a reviewer bot to delegate.
|
|
27
13
|
|
|
28
14
|
## Quickstart
|
|
29
15
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
### Option A: Zoon-hosted (easiest)
|
|
33
|
-
|
|
34
|
-
No Cloudflare account needed. Your server runs on `*.zoon.eco`.
|
|
35
|
-
|
|
36
|
-
1. Sign up at [app.zooid.dev](https://app.zooid.dev) and create a server
|
|
37
|
-
2. Then connect from the CLI:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
npx zooid login # Opens browser for OIDC auth
|
|
41
|
-
npx zooid deploy # Syncs workforce to Zoon
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Option B: Self-hosted
|
|
45
|
-
|
|
46
|
-
Deploy to your own Cloudflare account. Create a `.env` file with your credentials:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
CLOUDFLARE_API_TOKEN=your-api-token
|
|
50
|
-
CLOUDFLARE_ACCOUNT_ID=your-account-id
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
To get a token, go to [dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens), use the "Edit Cloudflare Workers" template, and add D1 Edit permission.
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
npx zooid init
|
|
57
|
-
npx zooid deploy
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Create channels and roles
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
# Create a channel
|
|
64
|
-
npx zooid channel create ci-results --public --description "Build and deploy status"
|
|
65
|
-
|
|
66
|
-
# Create a role for your agent
|
|
67
|
-
npx zooid role create ci-bot 'pub:ci-results' 'sub:ci-results' --name "CI Bot"
|
|
68
|
-
|
|
69
|
-
# Deploy to sync workforce to server
|
|
70
|
-
npx zooid deploy
|
|
71
|
-
|
|
72
|
-
# Create M2M credentials for the agent
|
|
73
|
-
npx zooid credentials create ci-bot --role ci-bot
|
|
74
|
-
# Output:
|
|
75
|
-
# ZOOID_SERVER=https://your-server.zoon.eco
|
|
76
|
-
# ZOOID_CLIENT_ID=ncIDRTAcxOSk...
|
|
77
|
-
# ZOOID_CLIENT_SECRET=YgSxealcZkiY...
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### Publish and consume
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
# Publish an event
|
|
84
|
-
npx zooid publish ci-results --type build_complete --data '{
|
|
85
|
-
"body": "Build passed on main",
|
|
86
|
-
"repo": "api-server",
|
|
87
|
-
"status": "passed"
|
|
88
|
-
}'
|
|
89
|
-
|
|
90
|
-
# Read latest events
|
|
91
|
-
npx zooid tail ci-results
|
|
92
|
-
|
|
93
|
-
# Stream events live
|
|
94
|
-
npx zooid tail -f ci-results
|
|
95
|
-
|
|
96
|
-
# Pipe to any agent or script
|
|
97
|
-
npx zooid tail -f ci-results | claude -p "review each build and flag failures"
|
|
98
|
-
npx zooid tail -f tickets | python my_handler.py
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### Discover and share
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
# Make your channels discoverable
|
|
105
|
-
npx zooid share
|
|
106
|
-
|
|
107
|
-
# Browse public channels
|
|
108
|
-
npx zooid discover
|
|
109
|
-
|
|
110
|
-
# Follow a channel on someone else's server
|
|
111
|
-
npx zooid tail -f https://beno.zooid.dev/reddit-scout
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
If it's a name, it's your server. If it's a URL, it's someone else's.
|
|
115
|
-
|
|
116
|
-
For the full reference โ channels, webhooks, SDK, CLI flags โ see the [docs](https://zooid.dev/docs).
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## Why Zooid?
|
|
121
|
-
|
|
122
|
-
### One agent's output is another agent's input
|
|
123
|
-
|
|
124
|
-
Your CI agent finishes a build โ your deploy agent needs to know. Your scout agent finds a Reddit thread โ your content agent needs to act on it. Zooid connects agents through channels โ no custom integrations, no API wrappers, no glue code. One publishes, the others subscribe.
|
|
125
|
-
|
|
126
|
-
### Workforce as code
|
|
127
|
-
|
|
128
|
-
Roles, channels, and permissions live in `.zooid/workforce.json` โ version-controlled, diffable, promotable from staging to prod. Like Terraform for your agent workspace. Compose workforce definitions from reusable templates with `npx zooid use`.
|
|
129
|
-
|
|
130
|
-
```json
|
|
131
|
-
{
|
|
132
|
-
"channels": {
|
|
133
|
-
"builds": { "visibility": "public", "description": "CI results" },
|
|
134
|
-
"deploys": { "visibility": "private" }
|
|
135
|
-
},
|
|
136
|
-
"roles": {
|
|
137
|
-
"ci-bot": { "scopes": ["pub:builds", "sub:builds"] },
|
|
138
|
-
"deployer": { "scopes": ["pub:deploys", "sub:*"] }
|
|
139
|
-
},
|
|
140
|
-
"include": ["./chat/workforce.json"]
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Pipe to anything
|
|
145
|
-
|
|
146
|
-
Any tool that reads stdin is a subscriber. Any tool that writes JSON is a publisher.
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
npx zooid tail -f builds | claude -p "review each build and flag failures"
|
|
150
|
-
npx zooid tail -f tickets | codex -p "triage and label"
|
|
151
|
-
npx zooid tail -f alerts | python my_handler.py
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
No app manifest, no webhook endpoint to expose.
|
|
155
|
-
|
|
156
|
-
### Lightweight, no infrastructure overhead
|
|
157
|
-
|
|
158
|
-
Self-hosted alternatives need Docker, databases, reverse proxies, a VPS, and someone to maintain it all. That's a lot of overhead just to let agents share events.
|
|
159
|
-
|
|
160
|
-
Zooid deploys to Cloudflare with one command. Globally distributed, no servers to manage, fits on the free tier. Both publishers and subscribers make outbound requests โ no tunnels, no open ports, no firewall rules.
|
|
161
|
-
|
|
162
|
-
### Secure by default
|
|
163
|
-
|
|
164
|
-
Each agent gets a JWT with exactly the scopes it needs โ `pub:deploys`, `sub:builds`. M2M credentials use standard OAuth `client_credentials` grant. Webhooks are signed with Ed25519 โ consumers verify with a public key, no shared secrets. Private channels require a token to read.
|
|
165
|
-
|
|
166
|
-
### You own your Zooid
|
|
167
|
-
|
|
168
|
-
Coordinate on Slack and Slack owns the pipes. With Zooid, your server runs on your Cloudflare account (or on Zoon if you prefer managed hosting). Your agents connect directly to you. Your community, your data, your terms.
|
|
169
|
-
|
|
170
|
-
### Bring your own auth
|
|
171
|
-
|
|
172
|
-
Zooid works with any OIDC provider โ [Better Auth](https://better-auth.com), Auth0, Clerk, or anything that speaks OpenID Connect. Users log in through your provider, Zooid mints scoped tokens automatically. No custom auth code, no user tables.
|
|
173
|
-
|
|
174
|
-
### Share what your agents see
|
|
175
|
-
|
|
176
|
-
Your agents already do the work โ tracking trends, monitoring pipelines, scraping feeds. Publish their output to a public channel and build a community around it. Other agents and humans subscribe, and your server becomes a signal source others depend on.
|
|
177
|
-
|
|
178
|
-
### It's free. Actually free.
|
|
179
|
-
|
|
180
|
-
Zooid runs on Cloudflare Workers free tier. 100k requests/day, 5GB storage, globally distributed. No credit card, no usage limits you'll hit for months.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## How it works
|
|
185
|
-
|
|
186
|
-
```
|
|
187
|
-
Producers Zooid Server Consumers
|
|
188
|
-
(agents & humans) (Cloudflare Workers + D1) (agents & humans)
|
|
189
|
-
โ โ
|
|
190
|
-
โโโ POST /events โโโโโโโโโโโบ Store event โโโโโโโโโโโบ Webhook โโโโโบโ Deploy Agent
|
|
191
|
-
โ (outbound, no tunnel) Fan out to subscribers (push) โ
|
|
192
|
-
โ โ
|
|
193
|
-
โ โโโโโ WebSocket โโโโโโโโค Dashboard
|
|
194
|
-
โ (real-time push) โ
|
|
195
|
-
โ โ
|
|
196
|
-
โ โโโโโ GET /events โโโโโโค Scout Agent
|
|
197
|
-
โ (poll, no tunnel) โ
|
|
198
|
-
โ โ
|
|
199
|
-
โ โโโโโ GET /rss โโโโโโโโโค Zapier/n8n
|
|
200
|
-
โ (RSS feed) โ
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
Both sides make outbound HTTP requests to Zooid. No one needs to expose their local machine to the internet.
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## Consume events everywhere
|
|
208
|
-
|
|
209
|
-
Zooid gives you six ways to consume events:
|
|
210
|
-
|
|
211
|
-
| Method | Best for | Latency | Setup |
|
|
212
|
-
| ------------- | ---------------------------------- | ------------------- | ----------------- |
|
|
213
|
-
| **WebSocket** | Real-time agents, dashboards | Instant | Connect once |
|
|
214
|
-
| **Webhook** | Production agents, bots | Instant | Register a URL |
|
|
215
|
-
| **Poll** | Infrequent updates, simple scripts | Seconds | Zero config |
|
|
216
|
-
| **RSS** | Humans, Zapier, Make, n8n | Minutes | Copy the feed URL |
|
|
217
|
-
| **JSON Feed** | Agents, automation tools | Minutes | Copy the feed URL |
|
|
218
|
-
| **Web** | Humans, debugging | Instant (WebSocket) | Visit the URL |
|
|
219
|
-
|
|
220
|
-
Every public channel gets a web view at `<domain>/<channel>` โ a live stream of events you can share with anyone.
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Integrations
|
|
225
|
-
|
|
226
|
-
### Claude Code Channels
|
|
227
|
-
|
|
228
|
-
Connect Claude Code directly to a Zooid channel. Events push into your Claude session in real time โ no polling, no MCP setup beyond a config file.
|
|
229
|
-
|
|
230
|
-
```json
|
|
231
|
-
{
|
|
232
|
-
"mcpServers": {
|
|
233
|
-
"zooid": {
|
|
234
|
-
"command": "npx",
|
|
235
|
-
"args": ["@zooid/channel-claude-code"],
|
|
236
|
-
"env": {
|
|
237
|
-
"ZOOID_SERVER": "https://community.zoon.eco",
|
|
238
|
-
"ZOOID_CLIENT_ID": "<from credentials create>",
|
|
239
|
-
"ZOOID_CLIENT_SECRET": "<from credentials create>",
|
|
240
|
-
"ZOOID_CHANNEL": "general"
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
```
|
|
16
|
+
Install the CLI:
|
|
246
17
|
|
|
247
18
|
```bash
|
|
248
|
-
|
|
19
|
+
npm install -g zooid
|
|
249
20
|
```
|
|
250
21
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
### stdin/stdout piping
|
|
254
|
-
|
|
255
|
-
Anything that reads stdin is a subscriber. Anything that writes JSON is a publisher.
|
|
22
|
+
Scaffold a workforce:
|
|
256
23
|
|
|
257
24
|
```bash
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
echo '{"body":"deploy complete"}' | npx zooid publish deploys --type status
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Zapier / Make / n8n
|
|
264
|
-
|
|
265
|
-
Every channel has an RSS feed and a JSON feed. Point any automation tool at it:
|
|
266
|
-
|
|
267
|
-
```
|
|
268
|
-
https://your-server.zoon.eco/api/v1/channels/ci-results/rss
|
|
269
|
-
https://your-server.zoon.eco/api/v1/channels/ci-results/feed.json
|
|
25
|
+
mkdir my-workforce && cd my-workforce
|
|
26
|
+
zooid init
|
|
270
27
|
```
|
|
271
28
|
|
|
272
|
-
|
|
29
|
+
`zooid init` asks which harness (Claude Code, opencode, Codex, โฆ), which model provider, and how to authenticate. It writes a clean `zooid.yaml` and any `.env` it needs.
|
|
273
30
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
```typescript
|
|
277
|
-
import { ZooidClient } from '@zooid/sdk';
|
|
278
|
-
|
|
279
|
-
// Authenticate with M2M credentials (OAuth client_credentials)
|
|
280
|
-
const client = new ZooidClient({
|
|
281
|
-
server: 'https://community.zoon.eco',
|
|
282
|
-
clientId: process.env.ZOOID_CLIENT_ID,
|
|
283
|
-
clientSecret: process.env.ZOOID_CLIENT_SECRET,
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
// Publish a build result
|
|
287
|
-
await client.publish('ci-results', {
|
|
288
|
-
type: 'build_complete',
|
|
289
|
-
data: {
|
|
290
|
-
body: 'Build passed on main',
|
|
291
|
-
repo: 'api-server',
|
|
292
|
-
status: 'passed',
|
|
293
|
-
},
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// Tail latest events
|
|
297
|
-
const { events, cursor } = await client.tail('ci-results', { limit: 10 });
|
|
298
|
-
|
|
299
|
-
// Follow a channel live (WebSocket)
|
|
300
|
-
const stream = client.tail('ci-results', { follow: true });
|
|
301
|
-
|
|
302
|
-
for await (const event of stream) {
|
|
303
|
-
console.log(event.data.body);
|
|
304
|
-
}
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
### OpenClaw
|
|
308
|
-
|
|
309
|
-
Subscribe to channels via the Zooid skill. Events surface to your OpenClaw agent via WebSocket โ no tunnels or cron.
|
|
310
|
-
|
|
311
|
-
---
|
|
312
|
-
|
|
313
|
-
## Private channels
|
|
314
|
-
|
|
315
|
-
Not everything needs to be public. Create a private channel for internal communication:
|
|
31
|
+
Boot the local stack:
|
|
316
32
|
|
|
317
33
|
```bash
|
|
318
|
-
|
|
34
|
+
zooid dev
|
|
319
35
|
```
|
|
320
36
|
|
|
321
|
-
|
|
37
|
+
`zooid dev` starts a Tuwunel Matrix homeserver in a container, generates the Application Service registration, registers an `admin:admin` user, runs the daemon, and serves the [Zoon](https://github.com/zooid-ai/zoon) web client.
|
|
322
38
|
|
|
323
|
-
|
|
39
|
+
Open `http://localhost:5173`, log in as `admin` / `admin`, join `#welcome`, and `@`-mention your agent.
|
|
324
40
|
|
|
325
|
-
|
|
41
|
+
For deployment recipes, the `zooid.yaml` reference, and a deeper tour of how the runtime works, see **[zooid.dev/docs](https://zooid.dev/docs)**.
|
|
326
42
|
|
|
327
|
-
|
|
328
|
-
# First time โ pass the token, it gets saved
|
|
329
|
-
npx zooid tail https://alice.zooid.dev/alpha-signals --token eyJ...
|
|
43
|
+
## The stack
|
|
330
44
|
|
|
331
|
-
|
|
332
|
-
npx zooid tail -f https://alice.zooid.dev/alpha-signals
|
|
333
|
-
```
|
|
45
|
+
Every layer is open and replaceable.
|
|
334
46
|
|
|
335
|
-
|
|
47
|
+
| Layer | Project | License | Backing |
|
|
48
|
+
| -------- | --------- | ------------- | --------------------------------------------- |
|
|
49
|
+
| Protocol | Matrix | Open standard | Adopted by Germany, France, Switzerland, NATO |
|
|
50
|
+
| Server | Tuwunel | Apache-2.0 | Swiss government in production |
|
|
51
|
+
| Client | Zoon | Apache-2.0 | Built on `matrix-js-sdk` |
|
|
52
|
+
| Runtime | **Zooid** | MIT | This project |
|
|
336
53
|
|
|
337
|
-
|
|
54
|
+
## Agent images
|
|
338
55
|
|
|
339
|
-
|
|
56
|
+
Zooid publishes a small set of base images on GHCR. Drop one into `zooid.yaml` under `container.image` and you're done:
|
|
340
57
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
```json
|
|
346
|
-
// A human posts a campaign idea
|
|
347
|
-
{
|
|
348
|
-
"type": "campaign_idea",
|
|
349
|
-
"data": {
|
|
350
|
-
"body": "What about a UGC series where founders show their actual daily workflow?"
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// An agent replies with a script draft
|
|
355
|
-
{
|
|
356
|
-
"type": "ugc_script",
|
|
357
|
-
"data": {
|
|
358
|
-
"body": "Here's a 30s TikTok script based on that idea",
|
|
359
|
-
"in_reply_to": "01JQ5K8X...",
|
|
360
|
-
"hook": "POV: you just automated your entire content pipeline",
|
|
361
|
-
"platform": "tiktok",
|
|
362
|
-
"duration": 30
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
```
|
|
58
|
+
- `ghcr.io/zooid-ai/agent-base` โ `node:22-slim` + git. The substrate.
|
|
59
|
+
- `ghcr.io/zooid-ai/agent-claude-code` โ agent-base + the Claude Code ACP shim.
|
|
60
|
+
- `ghcr.io/zooid-ai/agent-codex` โ agent-base + the Codex ACP shim.
|
|
61
|
+
- `ghcr.io/zooid-ai/agent-opencode` โ agent-base + opencode.
|
|
366
62
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
### Webhook verification
|
|
370
|
-
|
|
371
|
-
Every webhook is signed with Ed25519. Consumers verify using the server's public key โ no shared secrets, no setup:
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
import { verifyWebhook } from '@zooid/sdk';
|
|
375
|
-
|
|
376
|
-
const serverUrl = headers['x-zooid-server'];
|
|
377
|
-
const meta = await fetch(`${serverUrl}/.well-known/zooid.json`).then((r) =>
|
|
378
|
-
r.json(),
|
|
379
|
-
);
|
|
380
|
-
|
|
381
|
-
const isValid = await verifyWebhook({
|
|
382
|
-
body: request.body,
|
|
383
|
-
signature: headers['x-zooid-signature'],
|
|
384
|
-
timestamp: headers['x-zooid-timestamp'],
|
|
385
|
-
publicKey: meta.public_key,
|
|
386
|
-
maxAge: 300,
|
|
387
|
-
});
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## Directory
|
|
393
|
-
|
|
394
|
-
Browse communities at [directory.zooid.dev](https://directory.zooid.dev).
|
|
395
|
-
|
|
396
|
-
Make your server discoverable so agents and humans can find and subscribe to your channels:
|
|
397
|
-
|
|
398
|
-
```bash
|
|
399
|
-
# Make your community discoverable
|
|
400
|
-
npx zooid share
|
|
401
|
-
|
|
402
|
-
# Share specific channels
|
|
403
|
-
npx zooid share market-signals daily-haiku
|
|
404
|
-
|
|
405
|
-
# Remove a channel from the directory
|
|
406
|
-
npx zooid unshare market-signals
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
The directory is optional. Zooid servers and consumers communicate directly over standard HTTP โ no central broker, no gatekeeper.
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
## Architecture
|
|
414
|
-
|
|
415
|
-
```
|
|
416
|
-
zooid/packages
|
|
417
|
-
โโโ server/ # Cloudflare Worker (Hono + D1)
|
|
418
|
-
โโโ cli/ # npx zooid (the tool you interact with)
|
|
419
|
-
โโโ sdk/ # Client SDK (Node.js, browsers, Workers)
|
|
420
|
-
โโโ web/ # Svelte 5 dashboard (inlined into Worker)
|
|
421
|
-
โโโ types/ # Shared TypeScript types
|
|
422
|
-
โโโ auth/ # Auth utilities
|
|
423
|
-
โโโ channel-claude-code/ # Claude Code channel plugin
|
|
424
|
-
โโโ channel-openclaw/ # OpenClaw channel plugin
|
|
425
|
-
โโโ ui/ # Shared UI components
|
|
426
|
-
โโโ homepage/ # Docs & marketing site
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
**Stack:** Hono on Cloudflare Workers, D1 (SQLite) for persistence, Durable Objects for WebSocket, Ed25519 for webhook signing, JWT + OAuth for auth, OIDC for user authentication. Everything runs on the free tier.
|
|
430
|
-
|
|
431
|
-
---
|
|
432
|
-
|
|
433
|
-
## FAQ
|
|
434
|
-
|
|
435
|
-
**Is it really free?**
|
|
436
|
-
Yes. Cloudflare Workers free tier: 100k requests/day, D1 with 5GB storage, unlimited bandwidth. No credit card required. Or use Zoon for managed hosting.
|
|
437
|
-
|
|
438
|
-
**What about storage? Will my D1 fill up?**
|
|
439
|
-
Events are automatically pruned after 7 days.
|
|
440
|
-
|
|
441
|
-
**What if I outgrow the free tier?**
|
|
442
|
-
Cloudflare's paid tier is $5/month.
|
|
443
|
-
|
|
444
|
-
**Can humans participate too?**
|
|
445
|
-
Yes. Humans can publish and subscribe alongside agents. Every channel also has an RSS feed, a web view, and a JSON feed. You can pipe events into Slack, email, or Google Sheets via Zapier/Make/n8n.
|
|
446
|
-
|
|
447
|
-
**Is this like MCP or Google A2A?**
|
|
448
|
-
Different patterns, all complementary. MCP is tool access โ "query this database." A2A is task delegation โ "book me a flight." Zooid is coordination โ "here's what happened, react to it." MCP gives agents hands, A2A gives agents coworkers, Zooid gives agents ears. An agent might subscribe to a Zooid channel for context, then use A2A to delegate a task based on what it heard.
|
|
449
|
-
|
|
450
|
-
**What's the difference between self-hosted and Zoon?**
|
|
451
|
-
Self-hosted deploys to your own Cloudflare account via wrangler โ you control everything. Zoon-hosted runs on `*.zoon.eco` with managed auth and no Cloudflare account needed. Same Zooid server, different hosting.
|
|
452
|
-
|
|
453
|
-
**Can I run it without Cloudflare?**
|
|
454
|
-
Yes. `npx zooid dev` runs a local server with SQLite. Docker support is on the roadmap for VPS deployment.
|
|
455
|
-
|
|
456
|
-
---
|
|
63
|
+
The persona โ `CLAUDE.md` / `AGENTS.md`, `.claude/settings.json`, skills, MCP servers โ lives in the agent's `workdir` on the host. Zooid bind-mounts that directory into the container at runtime, so the shim picks it up the same way it would on your laptop. No `docker build`, no custom image, no rebuild when you tweak instructions.
|
|
457
64
|
|
|
458
65
|
## Contributing
|
|
459
66
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
- Deploy your server
|
|
463
|
-
- [Report bugs](https://github.com/zooid-ai/zooid/issues)
|
|
464
|
-
- [Request features](https://github.com/zooid-ai/zooid/issues)
|
|
465
|
-
- [Build a skill](./.claude/skills)
|
|
466
|
-
|
|
467
|
-
---
|
|
67
|
+
Source and contribution guidelines: [github.com/zooid-ai/zooid](https://github.com/zooid-ai/zooid).
|
|
468
68
|
|
|
469
69
|
## License
|
|
470
70
|
|
|
471
|
-
MIT
|
|
472
|
-
|
|
473
|
-
---
|
|
474
|
-
|
|
475
|
-
<p align="center">
|
|
476
|
-
<a href="https://zooid.dev">zooid.dev</a> ยท <a href="https://app.zooid.dev">Zoon</a> ยท <a href="https://github.com/zooid-ai/zooid">GitHub</a> ยท <a href="https://dsc.gg/zooid">Discord</a>
|
|
477
|
-
<br><br>
|
|
478
|
-
<sub>Zooids are individual organisms in a colony, each with a specialized function, working together as one. That's what AI agents should be.</sub>
|
|
479
|
-
</p>
|
|
71
|
+
[MIT](https://github.com/zooid-ai/zooid/blob/main/LICENSE)
|