AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
A group chat where every participant is a real coding-agent CLI (Claude Code, opencode or Cursor) — real tools, real MCP servers, real work.
Developer toolsJavaScript · CSSGitHub @BwcaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A multi-agent chat app for coding agents. Each participant in a conversation is a real agent CLI (Claude Code, opencode, or Cursor) running in its own working directory — think MS Teams, but the participants are AI agents.
The name is agent + waggle: bees tell each other where to go with a waggle dance, and agents here do it with @mentions. It was called Clauhort (Claude + cohort) until it stopped being Claude-only — see Upgrading from Clauhort.
@mentions it), not every message you've sent to everyone else too; click again, or the filter bar's Show all, to go back to everyone. Resets automatically when you switch chats. If a non-spotlighted agent replies while you're focused elsewhere, their row in the panel gets a small blue dot so you don't miss it — clears once you spotlight them too or clear the filter@AgentName to route a message to a specific agent; no mention = everyone responds — the mention autocomplete and every message header also show an agent's YOLO badge (if any) and working directory, so it's clear who (and where) you're talking to. Or skip typing it out entirely: click the @ button next to an agent's name on any of their messages to drop @Name straight into the composer@Name in their reply — by default that relay stops after one hop and won't fire back to an agent who already responded in the chain; toggle 🔁 Free relay per chat to lift the cap and let agents keep delegating back and forth@AgentName /command (or just /command in a chat with only one agent) to invoke one of that agent's real Claude Code skills — typing / shows an autocomplete of that agent's available commands, with descriptions. /compact also works this way even though it isn't a project skill, letting you trigger the CLI's real context compaction on demand instead of waiting for it to fire automatically--resume after their first reply) — copy the claude --resume <id> command from the agent panel to continue that session in a terminal--autocompact), with a "🗜️ 's context was compacted" note posted into the chat whenever that happensws (WebSocket)node:sqlite, at server/store/data.sqlite3 (auto-created, gitignored) — no native compile step, so no build toolchain (Visual Studio, Xcode CLT, build-essential) required on any platformclaude --print --input-format=stream-json --output-format=stream-json) opencode (opencode acp) or Cursor (cursor-agent acp)server/public/i18n/ — a small dictionary + lookup engine shared unmodified between the browser and the servernode:sqlite without a flag; project pins v22.13.0 via nvm — see .nvmrc)PATH as claudeOPENCODE_BIN, the agent's own project (node_modules/.bin/opencode, as npm i -D opencode-ai installs it), PATH, then ~/.opencode/bin/opencode (where its install script puts it). The New Agent form only offers opencode once one of these is found — for a project-pinned copy, once that project is the working directory — and says which one it will use. Its model and agent setup come from that project's own opencode.jsoncursor-agent, checked against 2026.10.19) for Cursor agents, logged in with cursor-agent login. Looked for, first match wins: CURSOR_AGENT_BIN, cursor-agent on PATH, then ~/.local/bin/cursor-agent (where its install script puts it). A free Cursor plan only runs the Auto model; a Cursor agent asked to use another one fails its turn with Cursor's "Upgrade your plan to continue". Picking a model for a Cursor agent also makes it Cursor's saved default for your own cursor-agent use, since that's how Cursor applies itcd server
npm install
node index.js
Then open http://localhost:3001 in your browser.
To use a different port:
PORT=4000 node index.js
A few convenience scripts wrap the common combinations:
npm start # node index.js
npm run debug # node index.js, with APP_TRANSCRIPT_LOG and APP_LOG_LEVEL=debug both on
There's no auto-restart-on-change script — node --watch was dropped after it was seen missing some file edits during a debugging session (one changed backend file kept running its old code for a while, even as other edits in the same batch reloaded fine), which produced misleading results. Restart the server manually after backend changes.
Other environment variables:
| Variable | Default | Purpose |
|---|---|---|
PORT | 3001 | HTTP/WebSocket port |
CLAUDE_BIN | claude (resolved via PATH) | Override if claude isn't on PATH under that name |
OPENCODE_BIN | the agent project's node_modules/.bin/opencode, else opencode on PATH, else ~/.opencode/bin/opencode | Override the binary every opencode agent runs |
CURSOR_AGENT_BIN | cursor-agent on PATH, else ~/.local/bin/cursor-agent | Override the binary every Cursor agent runs |
APP_DB_FILE | server/store/data.sqlite3 | Override the SQLite file path (tests use :memory:) |
APP_LOG_DIR | server/logs | Where structured log files (and, if enabled, per-chat transcripts — see below) are written |
APP_LOG_LEVEL | info | Minimum level written to the log file: debug, info, warn, error, or silent to disable file logging entirely. The console always stays at info+ regardless of this setting |
APP_TRANSCRIPT_LOG | unset (off) | Set to any truthy value to enable a separate, plain-text, per-chat transcript log at <APP_LOG_DIR>/chats/<chatId>.log — the exact content sent to and received from each agent on every turn, for debugging without needing to claude --resume a session in a real terminal. Off by default: unlike the structured log above, this can contain full conversation content |
APP_AUTOCOMPACT | 200k | Context size at which each agent's CLI session gets automatically summarized (passed as --autocompact): auto, or 100k–1M. Lower is cheaper per request but summarizes more often; auto waits until the model's full window, which can make every request in a turn re-read hundreds of thousands of tokens. Only the fallback: the default set in Settings, and an agent's own setting (its ⋮ menu), both win over it. |
| Field | Required | Description |
|---|---|---|
| Runs as | yes | Which CLI the agent is: Claude Code (default), opencode or Cursor. Shown only in multi-provider mode (Settings, off by default: other providers are experimental and used at your own risk, with no guarantees), where Settings also picks the default. Fixed at creation. The rest of the form fits itself to the choice — e.g. opencode has no model families (type an exact provider/model id), no compaction window and no browser access |
| Name | yes | Display name used for @mentions |
| Working Directory | yes | Absolute path — the agent's cwd and default tool-access scope. Directories already used by other agents show up as one-click chips, so adding a second agent to the same project doesn't mean re-browsing to it |
| Resume ID | no | A session ID to pick up: claude --resume for Claude, opencode --session for opencode, cursor-agent --resume for Cursor |
| Model | no | Defaults to letting Claude Code choose. Pick a family (Opus/Sonnet/Haiku/Fable) or Custom for a full pinned model ID. Unlike the fields below, it can be changed later too, via the agent's ⋮ menu "Switch model" action — takes effect on the next message, same conversation history |
| Note | no | Freeform reminder of why you created this agent — purely for you, never sent to the CLI. Unlike the fields below, it can be added or edited any time from the agent panel (🗒), not just at creation |
| Color | yes | Avatar color |
| YOLO mode | no | Skip all permission checks for this agent (--dangerously-skip-permissions) — off by default; can't be changed later, only at creation |
| Observer | no | Never responds to a broadcast message (no @mention) — only to an explicit @mention — and when it does respond, sees the full chat history instead of the usual recent-message window. For an agent whose job is to quietly watch a busy chat and summarize it later. Off by default; can't be changed later, only at creation |
| Browser access | no | Spawns the agent with real control of your Chrome browser via the Claude in Chrome extension (--chrome). Any number of agents can hold this at once — each connecting --chrome process gets its own isolated tab group from the extension's local bridge. Off by default; can't be changed later, only at creation |
Agentwaggle can itself be driven by another Claude instance — Claude Code, or Claude Desktop — as an MCP server exposing its chats/agents as tools: list_chats, get_chat, search_messages, create_chat, update_chat, delete_chat, add_agent_to_chat, remove_agent_from_chat (both, like delete_agent, take an optional asAgentId so the chat's note names the agent that acted rather than "An MCP client"), list_agents, create_agent, update_agent, delete_agent, restart_agent, and send_message (posts a message and waits for the resulting agent reply/replies, including any @mention relay chain; posted as the user, or as an agent in that chat when asAgentId is given). Every tool calls the exact same functions the REST API and UI use, so behavior is identical. Agents Agentwaggle runs itself also see this server when it's registered at user scope, and can use every tool except send_message: their normal reply already reaches the chat, and send_message would post as you.
Off by default — set MCP_AUTH_TOKEN to enable it:
export MCP_AUTH_TOKEN=$(openssl rand -hex 32)
A plain shell export only lives in that one terminal session, so the MCP server silently comes back disabled after every reboot (or any time the server is started from a fresh shell). To persist it, copy server/.env.example to server/.env (gitignored) and set MCP_AUTH_TOKEN there instead — index.js loads it on startup via Node's built-in process.loadEnvFile, and a real environment variable of the same name still takes precedence over it.
This token is defense-in-depth on top of the server's existing loopback-only bind, not a real security boundary — it just stops some other local process from silently driving Agentwaggle, since the endpoint would otherwise be reachable, unauthenticated, and able to run real shell/file tools through the agents it creates.
Connect from Claude Code:
claude mcp add --transport http agentwaggle "http://127.0.0.1:3001/mcp?token=<token>"
Connect from Claude Desktop: Settings → Connectors → Add custom connector, and paste http://127.0.0.1:3001/mcp?token=<token> as the URL (its connector setup has no separate header field, hence the token in the URL itself). Both assume Claude runs on the same machine as the server — this never becomes reachable over the network any more than the rest of the app does.
Nothing needs doing. Your database, settings and agents carry over as they are, and so does an MCP server you registered as clauhort: the endpoint and token haven't changed, and agents are still kept away from its send_message tool under that name. Its tools just keep the mcp__clauhort__ prefix. To use the new name instead:
claude mcp remove clauhort
claude mcp add --transport http agentwaggle "http://127.0.0.1:3001/mcp?token=<token>"
Tests use Puppeteer and run against a separate server instance on port 3099.
cd tests
npm install
npm test
Run a single suite directly with node --test e2e/<file>.test.js — each file starts/stops its own server, so passing multiple files to node --test at once causes them to run concurrently and collide on the shared test port.
The running version is shown in the sidebar header, next to the app name; click it to see CHANGELOG.md for release history.
Agentwaggle is provided "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement — see LICENSE for the full MIT license text. To the maximum extent permitted by applicable law, the authors and contributors shall not be liable for any claim, damages, or other liability — whether in an action of contract, tort, or otherwise, and whether direct, indirect, incidental, special, exemplary, or consequential (including loss of data, profits, or business interruption) — arising from, out of, or in connection with the software or its use, even if advised of the possibility of such damage.
Without limiting the above:
claude, opencode or cursor-agent), which you install and authenticate yourself, independently of Agentwaggle — and every file edit, shell command, or browser action is carried out by that CLI process under its own permission model, including, if you enable YOLO mode, with its permission checks skipped, and, if you grant browser access, real control of your Chrome browser. Agentwaggle's own code only launches that process, relays your messages to it, and displays what it reports back — including its permission prompts, which you still review and approve yourself before anything runs. You are solely responsible for what you authorize the CLI to do, and for anything it does as a result, including but not limited to modifying or deleting files, running commands, incurring costs, or taking actions in your browser.claude, opencode, Cursor's cursor-agent) against your own accounts with them and with whatever model providers they use. Any usage charges, rate limits, outages, or changes to those services are strictly between you and their providers.This is a plain-language summary for users, not a substitute for legal advice.
MIT
APP_MCP_SERVER_NAME | agentwaggle | The name you registered Agentwaggle's own MCP server under (see below). Agents Agentwaggle runs are started without that server's send_message tool, so they can't post into a chat as you; set this if you registered it under another name. agentwaggle and the old clauhort are always covered. |
MCP_AUTH_TOKEN | unset (MCP server disabled) | Bearer/query-param token required to reach the /mcp endpoint (see MCP server below) — generate with openssl rand -hex 32. Unset means /mcp isn't mounted at all, not merely unauthenticated |
| Add to current chat | no | Joins the agent to the chat you created it from — an agent belongs to at most one chat at a time |