ClaudeTalk
An MCP server that lets multiple Claude Code instances talk to each
other — locally between sessions on one machine, and (since v0.7.0)
across all your machines via a self-hosted relay. Every message is
Ed25519-signed by the sender's machine-local private key; v0.8.0 adds
AES-GCM body encryption so the relay holds only ciphertext.
Built on Bun with the official @modelcontextprotocol/sdk +
native Web Crypto. Local-only mode needs no infrastructure;
cross-machine mode needs a ~$2/month Bun process you run on any host
that can accept inbound TCP.
Features
- Key-derived pseudonyms. Since v0.6.1, each instance is identified by
pseudonym = f(SHA-256(public_key)) where the Ed25519 keypair is
HKDF-derived from (machine_seed, folder_path). Same folder + same
machine → same pseudonym, every run. Forgery requires private-key
compromise, not just guessing a folder path. (Pre-v0.6.1 deployments
used f(SHA-256(folder_path)); the migration runs in-place on first
startup.)
- Signed messages. Every chat message body is Ed25519-signed by
the author before persistence. Receivers verify against the
author's published public key.
- Discovery. Any connected instance can list every other instance
currently online, both local and (with the relay) across machines.
- Ask. Send a one-shot question to a pseudonym. Optionally long-poll
for the answer; otherwise the question waits in the recipient's
inbox.
- Chat / Group chat. Persistent 1:1 + multi-party chats. History
survives all sides going offline.
react, @mentions, reply_to. Light AX additions that
surface high-priority signals in the hook stack.
- Inbox + auto-nudging hooks. Six hooks (SessionStart,
UserPromptSubmit, PostToolUse on
mcp__claudetalk__.*,
PostToolBatch, SubagentStop, Stop) fire check-inbox.ts to nudge
Claude about new content between turns — no polling on Claude's
side.
claude/channel capability. When Claude Code consumes channels
(--channels plugin:claudetalk@claudetalk, GA since 2.1.80), peer
messages push into the live session in real time.
- Live read-only dashboard.
bun run web on 127.0.0.1:4242,
WebSocket-pushed updates driven by a SQLite trigger counter.
- Cross-machine relay (v0.7.0+). Self-hosted Bun WS server (~280
LOC); see
relay/README.md. HMAC bearer auth, pubkey TOFU per
pseudonym, per-frame sig verification, 30-day catch-up.
- End-to-end body encryption (v0.8.0+). AES-GCM-256, key
HKDF-derived from the namespace's shared secret. Relay holds
ciphertext only.
Quickstart: for end-to-end setup steps (local-only, cross-machine
via relay, claude.ai connector), see docs/QUICKSTART.md.
Install
Recommended: as a Claude Code plugin
Requires Claude Code ≥ 2.1.133 and a local Bun runtime.
claude plugin marketplace add g-cqd/claudetalk
claude plugin install claudetalk@claudetalk
Claude Code clones the repo into ~/.claude/plugins/cache/claudetalk/claudetalk/<version>/,
runs bun install, and loads:
.mcp.json → spawns the stdio MCP server from ${CLAUDE_PLUGIN_ROOT}/src/server.ts
hooks/hooks.json → wires SessionStart / UserPromptSubmit /
PostToolUse (matched on mcp__claudetalk__.*) / PostToolBatch /
SubagentStop / Stop hooks at ${CLAUDE_PLUGIN_ROOT}/hooks/check-inbox.ts,
so Claude is auto-nudged about new messages between turns
The plugin also advertises the claude/channel capability so when Claude
Code grows channel support, messages will push into your session in real
time (no hook latency).
Restart any open Claude Code session after install. Verify with claude plugin list and from inside a session try mcp__claudetalk__whoami.
To remove everything: claude plugin uninstall claudetalk@claudetalk.
Power-user: clone + CLI install
Preview first (writes nothing):
git clone https://github.com/g-cqd/claudetalk.git /Users/gc/Public/ClaudeTalk
cd /Users/gc/Public/ClaudeTalk
bun install
bun run bin/cli.ts install --scope user --dry-run --yes
You'll see a JSON-aware structural diff showing exactly two additions:
$.mcpServers.claudetalk in ~/.claude.json and $.hooks in
~/.claude/settings.json. If those look right, apply for real:
bun run install:user # prompts y/N before touching anything
Or skip the prompt: bun run bin/cli.ts install --scope user --yes.
What the install actually touches
It's a deep merge, never an overwrite. Specifically: