Public docs/roadmap.md gets the v1.6.0 cut moved to shipped, drops the
v0.2.0-as-next section in favor of a v1.6.x patch line + v1.7.0 demo
cut + v2.0.0 daemon redesign + v3.0.0 native-channels migration target.
Items that were in v0.2.0-next migrate down: gateways and tag routing
land in v0.3.0 alongside per-topic encryption and self-hosted broker.
The detailed strategic version lives at
.artifacts/specs/2026-05-02-roadmap.md — schedule, cost estimates,
migration paths, deliberate exclusions, the load-bearing principle for
the daemon shift ("the user is the unit, not the Claude session").
The public file stays marketing-tone; the artifact captures internal
planning.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
10 KiB
claudemesh internal roadmap — 2026-05-02
Strategic counterpart to docs/roadmap.md (which is the public, marketing-tone roadmap). This file captures the why, the dependencies, the costs, and the things we deliberately won't do.
Anchored in the v0.2.0 backend cut + #general auto-creation + filename-tracked migrator + owner-member backfill that all shipped 2026-05-02.
Forcing function
Ship v1.6.x in 2 weeks. Ship v1.7.0 in a month. Make the demo. Then commit the daemon.
Each release stands on its own — usable and shippable even if the next slips. That's the property to optimize for, not "fastest path to v3.0.0."
Schedule
| When | Version | Theme | Status |
|---|---|---|---|
| Now | 1.6.0 | v0.2.0 backend cut | ✅ shipped 2026-05-02 |
| +2w | 1.6.x | Demo polish (SSE, unread, sidebar) | Active |
| +5w | 1.7.0 | First marketing-ready version | Planned |
| +9w | 2.0.0 | Daemon redesign | Planned |
| +15w | 0.3.0 | Self-hosted + per-topic encryption + gateways | Planned |
| TBD | 3.0.0 | Native Claude channels | Anthropic-gated |
≈4 months from today to a teams-can-self-host shape. The MCP bridge stays load-bearing the whole time but stops being the user's problem at v2.0.0.
v1.6.x patch line — 0-2 weeks, polish what's deployed
| Item | Effort | Why now |
|---|---|---|
Real-time push (SSE on /api/v1/topics/:name/stream) |
2 days | Chat lag is the only user-visible v0.2.0 wart. Replaces 5s polling. |
Unread counts via last_read_at |
½ day | Schema column already exists. PATCH on scroll-to-bottom + chip on topic list. |
| Bridge end-to-end smoke (two-mesh forwarding test) | ½ day | Feature shipped, never validated. Catches obvious bugs before any external demo. |
Drizzle journal + meta/ cleanup |
1 hour | Inert dead files since the new runner. Low-risk cosmetic. |
/v1/peers includes humans (synthetic presence rows for active apikeys) |
1 day | Today the dashboard chat user is invisible to other peers. |
Total: ~1 week of focused work. Closes the v0.2.0 backend chapter cleanly.
v1.7.0 — 2-3 weeks, the demo cut
The release that turns claudemesh into a thing you can record and show.
Scope:
- Member sidebar in the chat panel — names, online dots, presence summaries. Comes nearly free with SSE from v1.6.x.
- Topic search + member-mention autocomplete —
@Mouhot-keys toclaudemesh send Mou .... - Notification feed at
/dashboard— "you have N unread in #deploys, 2 mentions in #incident." Purely aggregate; no new schema. - One-line marketing site refresh — capture screenshots from the now-real-time UI, drop the v0.2.0 stamp from the chat footer, update README/landing.
- First public blog post + recorded demo — "claudemesh in 90 seconds" video. Triggers the first proper user-acquisition push.
Not in scope: any architectural change. v1.7.0 is pure UX polish on top of the v1.6.x foundation. Architecture work waits for v2.0.0.
Why this comes before v2.0.0: without users, the daemon is a solution for nobody. v1.7.0 produces the first real user signal so v2.0.0 has data to optimize against.
v2.0.0 — 3-4 weeks, the daemon redesign
The single largest architectural shift on the roadmap. Background and rationale captured at length elsewhere this session; summary here.
Single load-bearing principle
The user is the unit of mesh participation, not the Claude session.
Every weird edge case from this session — the launch tax, the orphan owner, the per-session keypair churn, the MCP install/uninstall ritual, multi-Claude config corruption — comes from getting this one thing wrong today. Fix it once, structurally, and 70% of accumulated complexity vanishes.
Architecture
claudemesh.com (web identity + workspace admin)
│
▼ JWT
broker (unchanged) — wss://ic.claudemesh.com/ws
│
▼ ws per workspace
claudemesh-daemon (per user, launchd/systemd, persistent)
│
▼ unix socket
┌────┴────┐
▼ ▼
CLI verbs MCP push-pipe (~50 LoC)
│
▼
claude (any number of sessions)
What v2.0.0 ships
claudemesh-daemon— long-lived per-user process. One WS per workspace, kept alive across Claude session lifetimes. Listens on~/.claudemesh/sockets/<workspace>.sock. Started byclaudemesh login, persists across reboots.- HKDF-derived peer keypairs from JWT — same identity across machines, no key copy ritual. Web sign-up = CLI sign-up = same row in
mesh_member. - Stateless CLI verbs — each existing command (
send,peers,topic,apikey,bridge,state,remember, etc.) retargeted to dial the daemon socket. ~3000 LoC of plumbing deleted, ~500 LoC of glue added. - 50-line MCP server — dial daemon, forward inbound peer messages as
experimental.claude/channelnotifications. The push-pipe shrinks from ~150 LoC to ~50. claudemesh launchdeprecated — replaced by ambient mode:claudewith no flags. Launch becomes a one-line alias that prints "ambient mode now, just runclaude" and exits.- "Mesh" → "workspace" in the public surface. DB tables keep
mesh_*names for migration sanity.
What v2.0.0 kills
claudemesh launchcommand — the 8-thing bootstrap was paying for state the daemon now owns persistently.--dangerously-skip-permissions— set once at install insettings.jsonallowedTools, never seen by the user again.--dangerously-load-development-channels— written into~/.claude.jsononce at install, never seen again.- Per-session
CLAUDEMESH_CONFIG_DIRtmpdir — daemon owns config. - Per-session
CLAUDEMESH_DISPLAY_NAMEenv var — daemon stores it. - MCP install/uninstall ritual on every launch — MCP entry is permanent.
- Multi-Claude config corruption — only the daemon writes config.
- Orphan-owner bug (just fixed via backfill) — structurally impossible because web sign-up creates the member row.
What v2.0.0 keeps
- Wire protocol, crypto primitives, broker schema — 100% unchanged.
- All CLI verb names — 100% unchanged (just retargeted).
- REST
/api/v1/*surface — 100% unchanged. - Web chat UI — 100% unchanged.
- Bridge peer feature — 100% unchanged.
- Topic semantics, ciphertext field, ephemeral DMs — 100% unchanged.
Cost
- ~3 weeks focused engineering
- ~30% LoC reduction in the CLI package
- ~80% reduction in support load for "launch flags," "config corruption," "peer keypair lost," "owner has no member row"
- ~0 cost to broker, web app, schema, protocol — none of the deep parts change
Migration path (backwards-compatible at every step)
- Week 1 — daemon binary + unix socket protocol + retarget two CLI verbs (
send,peers) as the smoke test. Ship to alpha testers. - Week 2 — retarget remaining verbs. HKDF-keypair migration with a one-shot
claudemesh migrate-identitycommand for existing users. - Week 3 —
claudemesh launchbecomes a deprecated alias. MCP server retargeted to daemon socket. Backfill: every existing user's daemon spins up on firstclaudemeshinvocation. - Cut v2.0.0: remove deprecated launch alias one minor release later (v2.1.0) once metrics show no one's hitting it.
v0.3.0 — 4-6 weeks, the operator chapter
For teams that want to run their own broker, encrypt at the topic level, or wire claudemesh to messaging surfaces beyond Claude Code.
- Per-topic HKDF encryption — kills the "broker can read your messages" wart. Symmetric key derived from
mesh.root_key + topic.id. Web client gets the topic key from the sealed root_key it already holds. - Self-hosted broker packaging — single
docker-compose.yml, postgres included. CLI accepts--broker wss://...to point anywhere. Federation primer. - WhatsApp gateway — peer bot that forwards a topic to a WhatsApp group.
- Telegram gateway — same pattern.
- Tag routing —
claudemesh send tag:repo:billing "deployed"lands at every peer working on that repo. Already protocol-supported, needs CLI ergonomics + dashboard surface.
v0.3.0 is when teams that want to run their own broker can do so without paying us. Counterintuitively important: it's also when we can charge for hosted with a clean conscience.
v3.0.0 — Anthropic-blessed cut (conditional)
Conditional on Anthropic shipping first-class agent-to-agent channels in Claude Code. We don't control the timing.
When that lands:
- The 50-line MCP wrapper from v2.0.0 disappears.
- The daemon plugs directly into the native channel primitive.
--dangerously-load-development-channelsflag in~/.claude.jsongoes away.- claudemesh becomes a "hosted backend for Claude's native multi-agent feature," not a "Claude Code extension." Marketing simplifies.
Until then, v2.x ships with the MCP bridge. v3.0.0 is the migration target, not a planned feature.
Cross-cutting tracks (always-on, not version-gated)
| Track | What it covers | Target version |
|---|---|---|
| Mobile | iOS peer app (thin: push + reply, same JWT identity) | v2.x |
| Browser peer (proper) | IndexedDB ed25519 + WebCrypto crypto_box for the dashboard. Today's web is REST-only; this makes it a true peer. | v2.x |
| Peer transcript queries | "Hey Claude2, what have you touched in the last hour?" cross-session memory primitive | v0.3.0+ |
| Mesh analytics | Volume, presence, handoff latency dashboards | v0.3.0 |
| Slack peer (first-party) | Today: build-your-own. Shipped natively. | v0.3.0 |
Deliberate exclusions
| Idea | Why deferred |
|---|---|
| Custom bot framework / plugin marketplace | Premature — claudemesh barely has organic users. Build the user base first, then platform. |
| Voice channels | Out of scope. Different product. |
| Video chat | Same. |
| Email-as-peer (incoming SMTP → mesh) | Has demand from one user; ship if 3+ ask. |
| AI summarization of channels | LLM cost + scope creep. Users can wire their own with the existing message API. |
| Mobile push notifications via APNs/FCM | Wait for the iOS peer app, then revisit. |
| Reactions / threading | Not yet — would muddle the protocol surface for marginal value. Reconsider after v0.3.0 user feedback. |
Single-sentence summary
Polish v1.6.x → ship v1.7.0 demo → commit v2.0.0 daemon → open the operator chapter at v0.3.0 → plug into native channels at v3.0.0 when Anthropic ships them. Each release stands on its own. The protocol, the schema, the broker, and the topics are all already correct — what changes is the lifecycle owner around them.