Multi-agent orchestration platform: Run Claude, Codex, Copilot, and future AI agents like a kanban team β locally, with full cost + audit trails.
π¦ PM β π§ Worker β πͺ Reviewer β π© Human β a real workflow, not a chat window.
Agents: Claude Code Β· Codex CLI Β· Copilot CLI Β· More coming
AgentBoard works as a Claude Code plugin or standalone server supporting Claude Code, Copilot CLI, and future agents.
Install the plugin inside any Claude Code session:
/plugin marketplace add edgeetech/agentboard
/plugin install agentboard@agent-board-local
/reload-plugins
/agentboard:open # boots local server + opens UI in your browserRequires: Node β₯ 22 or Bun β₯ 1.x Β· npm (or bun) on PATH Β· claude CLI β₯ 2.0.0 Β· ANTHROPIC_API_KEY env or active OAuth (claude /login) Β· Windows / macOS / Linux.
First run installs core deps automatically. The plugin marketplace ships only source β on the first
/agentboard:open(or session-start hook) after install/upgrade, AgentBoard runsnpm install(prefersbun installif present) inside the cachedagent-board-core/directory. Expect a one-time ~20 s pause. If install fails (nonpm/bunonPATH, no network), the server exits with code 4 and prints the manual command to run.
πΆ Copilot CLI User? β See AGENTS.md Β§ Copilot CLI Setup
Or run standalone server:
git clone https://github.com/edgeetech/agentboard.git
cd plugins/claude-code/agent-board-core
npm install
node --experimental-sqlite --experimental-strip-types --no-warnings server.ts
# Open http://localhost:3000π€ Not sure? β See AGENTS.md Β§ 2. Supported Agents
The board on the left, a task detail with runs + cost + acceptance criteria on the right. Click to enlarge.
Multi-agent AI is powerful, but the day-to-day is messy:
- πΈ No idea what each run cost until the bill arrives.
- π΅οΈ Can't see why an agent did what it did β logs scattered.
- π "Just one more retry" turns into runaway loop.
- βοΈ Only options are cloud SaaS dashboards that ship your prompts off-box.
AgentBoard fixes that. Local kanban board, one SQLite per project, real-time cost per run, hard ceiling on rework loops, human approval gate before anything ships.
| π¦π§πͺπ© Four roles, one flow | PM enriches β Worker codes β Reviewer verifies β Human approves. Pick WF1 (full loop) or WF2 (skip Reviewer). |
| πΉοΈ Auto or semi-auto mode | Auto β agents drive transitions end-to-end. Semi β you drive status changes, agents only annotate (comments + ACs). Switch per project, any time. |
| π§Ύ Acceptance Criteria, enforced | PM writes 3β7 testable ACs. Reviewer must check them. Server rejects finishes that skip the audit. |
| π° Real-time cost per run | Every run parses SDK usage events and stamps cost_usd from latest Opus / Sonnet / Haiku pricing. Project header shows all-time, 7d, 30d totals. |
| π€ Multi-agent execution | Run tasks with Claude agents (default), Codex CLI, or Copilot CLI (for capability mix). Set per-project or override per-task. |
| π§ Inner phase machine | Each run drives an FSM: DISCOVERY β REFINEMENT β PLANNING β EXECUTING β VERIFICATION β DONE (plus `cancel |
| πͺͺ Project-scoped skills | Server scans <repo>/**/.claude/skills/* (folder skills with SKILL.md and flat <name>.md) on project create / repo change / manual rescan. Disk is source of truth; UI edits write back. 6 read-only built-ins (code-review, unit-tests, tech-spec, refactor, api-client, release-notes) merged into the same catalog. Agents resolve by name via mcp__abrun__use_skill with fuzzy suggestions on miss. |
| π― Concern packs | Pluggable concern lists steer PM/Worker/Reviewer prompts. Built-in packs: well-engineered, beautiful-product, long-lived. Custom packs per project via concerns_json. |
| π Bounded rework loop | Max 3 reviewer rejects per task. After that, task stalls with "Retry from Worker" button β no runaway agents. |
| π Automatic retry with backoff | Failed runs automatically re-enqueue with exponential backoff (1s β 2s β 4s, capped at 5min, max 3 attempts). Retry history logged in retry_state per run. Configurable via max_retry_attempts / max_retry_backoff_ms. |
| π External tracker sync | Connect Linear, GitHub Issues, or GitLab to a project. Background poller creates agentboard tasks from incoming issues, marks tasks done when issues hit terminal state. Config via tracker_config table; REST API at /api/projects/{code}/tracker. |
| π‘οΈ Workspace path safety | Per-task workspaces validated against path traversal (../) and symlink attacks before creation. Artifact caches (.cache, node_modules/.cache, .vite, .turbo, etc.) cleaned between runs. Shell lifecycle hooks (afterCreate, beforeRun, afterRun, beforeRemove) with 30s timeout. |
| π Local-only by design | Binds 127.0.0.1, DNS-rebind guard, Bearer + per-run rotated tokens, whitelisted child env. AWS / GitHub / SSH secrets in your shell are not passed to spawned agents. |
| πͺ Step into any run | Each run gets --session-id. One click copies claude --resume <id> so you can jump into the live transcript from your terminal. |
| π¨ 9 themes, light + dark | AgentBoard, EdgeeTech, Primer, Monochrome, Neon, Warm Tones, Muted Pastels, Deep Jewel, Vibrant. |
Server: Node β₯ 22, vanilla node:http, node:sqlite (built-in). The HTTP server uses only Node.js standard library; the overall plugin package includes a small set of production dependencies (Claude SDK, Commander, LiquidJS, Pino) for agent execution and background services.
Nine screens in one image β board, task creation, run detail with cost + ACs, comment audit trail, roles, skills, themes, sessions index, session timeline.
Click to enlarge β or browse individual screenshots in docs/images/.
AgentBoard routes tasks to the right executor β Claude SDK, Codex CLI, Copilot CLI, or future agents β based on project/task configuration. See AGENTS.md Β§ Executor Lifecycle for full details.
Building on top of AgentBoard? All board reads/writes go through the local HTTP API at
http://localhost:<port>(port + bearer token in~/.agentboard/config.json). The canonical endpoint reference β tasks, projects, costs, tracker, skills, runs, logs, sessions β is AGENTS.md β Reference: HTTP API Endpoints. Agent role prompts (PM / Worker / Reviewer) point at the same table; do not open the SQLite DBs under~/.agentboard/projects/*.dbdirectly.
Your AI agent platform
β (stdio MCP β read-only board + approve/reject)
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AgentBoard core server (Node, 127.0.0.1) β
β β’ REST + JSON-RPC HTTP MCP (abrun β for agents) β
β β’ Per-project SQLite (WAL, schema v5) β
β β’ Multi-executor routing: Claude SDK + Codex + Copilot β
β β’ Inner phase machine (DISCOVERYββ¦βDONE) per run β
β β’ Skill scanner: <repo>/**/.claude/skills/* + 6 built-ins β
β β’ RetryManager: exponential backoff, max 3 attempts β
β β’ TrackerPoller: Linear / GitHub / GitLab background sync β
β β’ Reaper: 15min heartbeat timeout β
ββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββ΄βββββββββββββ
βΌ βΌ
PM agent Worker agent (and Reviewer in WF1)
ββ writes ACs ββ edits files
no commits, no branches
State machine:
todo ββΆ agent_working ββΆ agent_review ββΆ human_approval ββΆ done
ββββ rework loop, max 3 βββββ
Two workflows, picked per project at creation:
- WF1 β
Todo β Working β Review β Approval β Done(full loop with Reviewer). See AGENTS.md Β§ Workflows - WF2 β
Todo β Working β Approval β Done(skip Reviewer step)
Two dispatch modes, switchable any time:
- π€ Auto (default) β agents claim runs, change status, hand off. You only step in at Human Approval.
- πΉοΈ Semi β you stay in the driver's seat. Agents are blocked from status/assignee changes; they may only add comments and acceptance criteria. Server returns
semi-automated mode: agents may not change status/assignee β add comments only; user drives transitionsif a run tries.
If using AgentBoard as a Claude Code plugin, these slash commands are available:
| Command | Does |
|---|---|
/agentboard:open |
Boots (or reuses) local server, opens UI in default browser. |
/agentboard:stop |
SIGTERMs the server. Children in flight finish on their own. |
/agentboard:doctor |
Health checklist: Node/Bun version, claude CLI, auth, data dir, DB schema, pricing freshness, available updates. |
/agentboard:update |
Checks GitHub main for newer plugin version, prints upgrade commands. |
/agentboard:delete-project |
Interactive: pick project β confirm β DB moved to ~/.agentboard/trash/ (manual restore possible). |
Using Copilot CLI or standalone server? See AGENTS.md Β§ Getting Help for how to interact with AgentBoard.
- 127.0.0.1 only. Server refuses any
Hostheader that isn't127.0.0.1:<port>orlocalhost:<port>(DNS-rebind guard, returns 421). - Bearer + per-run tokens. 32-byte hex token in
~/.agentboard/config.json(0600 on Unix, ACL'd on Windows). Each run gets arun_tokenissued exactly once atclaim_run. - Whitelisted child env. Spawned agents receive only
PATH,HOME,USER,LANG,TZ, Claude auth vars, and Windows OS basics. AWS, GitHub, SSH, GCP, cloud-SDK secrets dropped. - CSP nonce + HttpOnly cookie on the UI. No inline scripts without nonce.
- No telemetry. Nothing leaves your machine. Logs at
~/.agentboard/logs/<run_id>.ndjsonare full Claude transcripts β treat data dir as sensitive.
Outside the repo, untouched by plugin upgrades:
~/.agentboard/ (%USERPROFILE%\.agentboard on Windows)
projects/<code>.db one SQLite per project (WAL, schema v5)
logs/<run_id>.ndjson Claude SDK structured events
logs/<run_id>.err.log captured stderr
run-configs/<id>.json tmp MCP config per run (deleted on exit)
trash/<code>-<timestamp>.db deleted projects (manual restore possible)
config.json port, pid, token, server_id, active project
server.lock single-instance lock
Per-project DB tables (schema v5):
| Table | Purpose |
|---|---|
project |
Project config β workflow, repo path, agent provider, concerns_json, scan_ignore_json, allow_git |
task |
Tasks with status, assignees, acceptance criteria, discovery_mode |
task_history |
Full audit trail of every status transition |
task_attachment |
Files or URLs attached to a task |
task_debt |
Per-task debt items recorded during a run (tech debt, follow-ups) |
agent_run |
Agent runs with cost, session-id, attempt count, phase, phase_state_json, phase_history_json |
agent_activity |
Live event log (phase transitions, tool calls) β backs the SSE stream |
retry_state |
Retry history per run (backoff delay, error, next attempt) |
tracker_config |
External tracker connections per project |
tracker_issue |
Synced issues from external trackers |
skill |
Skills discovered in <repo>/**/.claude/skills/* (folder + flat) |
skill_scan |
Scan run history (status, started/finished, errors) |
meta |
DB schema version (currently 5) |
| Layer | Stack |
|---|---|
| Server | Node β₯ 22, vanilla node:http, node:sqlite (built-in). TypeScript executed directly via --experimental-strip-types (no JS emit). Production deps: commander Β· liquidjs Β· pino Β· zod. |
| Agent runners | Claude SDK (@anthropic-ai/claude-agent-sdk) β in-process, streaming. Codex CLI β subprocess. Copilot SDK (@github/copilot-sdk) β in-process, mirrors Claude runner contract. Multi-executor routing based on project/task configuration. |
| UI | React 18 Β· Vite Β· TanStack Query Β· Zustand Β· @dnd-kit Β· react-i18next |
| MCP | Two surfaces β abrun (HTTP, for spawned agents) and agentboard (stdio, for your interactive session). Names differ deliberately so --strict-mcp-config filters cleanly. |
| Pricing | Opus 4.7 / Sonnet 4.6 / Haiku 4.5 + Copilot Pro, versioned. Unknown model β $0 + uncosted flag β never silently wrong numbers. See AGENTS.md Β§ Supported Agents for per-agent pricing. |
| Tests | Vitest Β· 231 tests across 27 files (state machine, phase machine, phase repo, postflight phase gate, retry, tracker, workspace safety/manager, supervisor, turn timeout, rate limiter, prompt builder, event bus, executor resolution, cost computation, skill repo, skill scanner, skill scan worker, api-skills, api-mcp use_skill, concerns, discovery modes, codex config, copilot runner, run hooks, folder rules, string distance, project triggers). Run via npm test. Quality gate: npm run check (typecheck && lint && format:check). |
Connect a Linear, GitHub Issues, or GitLab project to auto-populate agentboard tasks:
# POST /api/projects/{code}/tracker
{
"kind": "github",
"api_key_env_var": "GITHUB_TOKEN",
"project_slug": "owner/repo",
"active_states": ["open"],
"terminal_states": ["closed", "merged"],
"poll_interval_ms": 300000
}
# Enable / disable polling
POST /api/projects/{code}/tracker/enable
POST /api/projects/{code}/tracker/disable
# Force an immediate sync
POST /api/projects/{code}/tracker/sync
# List synced issues
GET /api/projects/{code}/tracker/issuesThe background TrackerPoller starts 5 s after boot, checks each configured project on its own schedule, and syncs new/updated issues as agentboard tasks. Deleted or terminal issues are resolved automatically.
Failed agent runs (non-completed status or unhandled exception) are automatically retried with exponential backoff:
| Attempt | Delay |
|---|---|
| 1 β 2 | 1 s |
| 2 β 3 | 2 s |
| 3 (max) | permanent failure |
Configure per-project in the project config or via env:
{ "max_retry_attempts": 3, "max_retry_backoff_ms": 300000 }Each retry creates a new agent_run row with an incremented attempt counter, and a retry_state row recording the delay and error message. The run.failed SSE event carries { permanent: true } on the last attempt.
Spawned agents run with --strict-mcp-config, so only the per-run abrun HTTP MCP is loaded by default. Two opt-in knobs:
- Inherit
~/.claude.jsonMCPs β set"inherit_user_mcps": truein~/.agentboard/config.json(or scope it:["mcp-atlassian"]). - Custom MCPs β drop a
mcpServersblock in~/.agentboard/mcps.json, merged into the per-run config.
The Skill tool is in every role's allowlist, so agents can invoke your installed skills (caveman, ctx-*, etc.) via Skill(name).
Each run is spawned with --session-id <uuid>. The task detail panel has an Open in CLI button per run that copies:
claude --resume <session-id>
Paste in a terminal at the project repo and you're inside the agent's session. If the run is still live, the button reads Join in CLI and warns you that resume may fork the session.
- π‘οΈ Per-run rate limiting on MCP mutations
- π±
/agentboard repriceskill β recompute historical run costs when Anthropic prices change - π Auto-discover plugin-registered MCPs (today, mirror them into
~/.claude.jsonormcps.json) - π³ Skill-scan UI tree view (deferred β table view ships today)
Issues, PRs, feedback welcome at github.com/edgeetech/agentboard.
For internals β state machine rules, dispatch logic, sharp edges β see CLAUDE.md.
Elastic License 2.0. You may self-host and modify freely. You may not offer AgentBoard as a managed service to third parties.
Crafted at EdgeeTech Limited Β· github.com/edgeetech/agentboard
β If AgentBoard helps you ship cleaner agent workflows, drop a star β helps others find it.

