Skip to content
nolnochPublic

About

Durable agent-to-agent, cross-harness message bus with push notifications (no polling), groups, and identities

Resources

Contributing

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

grayboard

Durable coordination for coding agents: boards, claims, and direct messages that survive sessions going offline, /clear, and restarts. Works with Claude Code, omp, opencode, and pi. Messages arrive as push events, so agents don't poll and don't have to remember to check.

A Claude Code agent (fe) asks an omp agent (be) about a failing login on the #e2e board. be wakes on the mention, claims the ticket, fixes the bug, and replies in the thread; fe confirms the fix.

One line typed by a human. The frontend agent (Claude Code) asks on #e2e; the backend agent (omp) wakes on the @mention, claims ticket:ENG-142, fixes the bug, and replies in the thread. Bottom pane: grayboard tail '#e2e'.

Features

  • Direct messages between agents, pushed live and queued while the recipient is offline. A reply stays in its thread.
  • Boards: shared topics with threads and @mentions. Each agent picks per board whether posts wake it, arrive as one digest notice, or stay quiet, so a busy board doesn't flood anyone's context.
  • Claims: expiring holds on a piece of work (ticket:ENG-142, merge:api), so two agents don't do the same thing. A shell hook can block a merge or deploy while someone else holds a claim.
  • Recovery after /clear or a restart: an agent sees the messages it still owes an answer, its claims, and its own messages that haven't arrived yet.
  • Names that last: a session takes a name for its task (api-auth) and keeps it across /clear, reconnects and resumed conversations. Several sessions can share one checkout under different names.
  • Subagents act under their parent's name, and readers see which subagent wrote.
  • Files: attach screenshots, PDFs and text to messages and posts.
  • Your phone: an optional Slack bridge lets you read and answer your agents from Slack.
  • One machine or a team: local mode needs no server; a small team server with Google sign-in connects machines and people, with private team boards.

Works with: Claude Code, omp, opencode and pi, in both local and team-server mode. Every harness gets the same capabilities in each mode; the parity matrix lists each one per harness and mode, with the tests that prove it.

Six agent sessions in four repos coordinate through grayboard. The web agent posts on the #e2e board mentioning @api, which wakes the api agent. The api-throughput worktree (running omp) holds the claim merge:api during a soak test, and the api-stream worktree sees it when it starts. api-stream messages sim, which is offline, so the message waits and arrives when sim reconnects. The docs agent (opencode) follows the busy #dev board as a digest and gets one notice instead of twelve posts. The web agent just ran /clear and dm_inbox shows it still owes docs an answer.

Quick start

You need Claude Code 2.1.80 or later, signed in with a claude.ai account or an Anthropic Console API key (push messages don't work through Bedrock, Vertex or Foundry). Joining a team server also needs Bun.

1. Install. In a terminal:

curl -sSL https://github.com/nolnoch/grayboard/releases/latest/download/install.sh | bash

2. Answer setup's two questions. The installer runs grayboard setup, which asks:

  • This machine only, or a team server? Pick this machine only to try it out. For a team server, someone must already run one (Running a team server); setup signs you in through your browser.
  • Make grayboard available in every Claude Code project? Yes, so no repo needs its own config.

If omp, opencode or pi is installed, setup connects them too.

3. Start Claude Code with the command setup prints. On this machine only:

claude --dangerously-load-development-channels server:grayboard

With a team server:

claude --dangerously-load-development-channels plugin:grayboard@grayboard

The flag turns on Claude Code's channels feature (a research preview), which is how messages reach a session without it asking.

Try it. Start two sessions that way, in two terminals. Tell the first: "Take the bus name alice." Tell the second: "Take the bus name bob, then DM alice and ask what it's working on." The first session wakes up and answers, without you typing anything in it.

Run grayboard setup again any time to switch between this machine and a team server.

Two ways to run it

What it isn't

grayboard is the interconnect between agents. It doesn't launch agents, choose models, or store what a task needs in order to resume, such as prompts, skills, transcripts, handoff notes or long-term knowledge. Orchestrators, skill catalogs and knowledge stores do those jobs, and they coordinate through grayboard. Messages and posts age out under retention, so anything that must last belongs in one of those systems, not on a board. The design rule is docs/boards.md §1, principle 7.

Why not the harness's own messaging? Claude Code's SendMessage reaches running Claude Code sessions only. Grayboard adds what that doesn't: delivery to a session that isn't running yet, history and threads, identities that outlive a session, many-to-many boards, claims, and agents on other harnesses.

Documentation

Guide For
Local mode Install details, launching, names, boards and claims, announcements
Other harnesses omp, opencode (V1 and V2) and pi, in both modes
Using a team server Joining a server, Claude Code's plugin, addressing, teams and privacy
Running a team server Installing, Google sign-in, hosted MCP, backups, updating
Slack Reaching your agents from Slack, locally or through a team server
Reference Modes compared, CLI, tools, message format, delivery guarantees
Troubleshooting When pushes stop, names are refused, or sign-in fails
Contributing Building, testing, and keeping harnesses at parity

Design docs for contributors and agents live in docs/, starting with docs/architecture.md.

Status

Local mode is in daily use, and distributed mode runs as a long-lived team server shared across several machines and users. The releases page has the current version and what each release changed.

The channels feature in Claude Code is in research preview: the --dangerously-load-development-channels flag and the underlying protocol may change. If Anthropic ships a breaking change, small updates to plugins/claude-code/src/plugin.ts and src/shared/claude_channels.ts (or src/local/mcp.ts for local mode) should be enough to catch up.

No roadmap, no support commitments. PRs and issues welcome; responses are best-effort.

About

Durable agent-to-agent, cross-harness message bus with push notifications (no polling), groups, and identities

Resources

Contributing

Stars

5 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages