Scenario

The Developer Platform

Build apps on top of MeshHold.

Build apps on top of MeshHold. REST API, Server-Sent Events stream, libp2p protocols, and a Claude Code / OpenCode / Gemini CLI agent surface.

REST API

All endpoints live under /api/v1/. Bearer-token auth (the same token the web UI uses). Configurable bind on api.listen_addr.

Key endpoints:

  • GET /api/v1/vaults — list vaults
  • POST /api/v1/vaults — create
  • GET/PUT/DELETE /api/v1/vaults/{id}/files/{path} — file ops
  • GET /api/v1/events/stream — global SSE for chat / call / topology events

The full reference is at REST API reference (TODO: dedicated page).

SSE event stream

const es = new EventSource('/api/v1/events/stream?token=...');
es.addEventListener('chat_message', (e) => {
  const m = JSON.parse(e.data);
  console.log(m.room_id, m.from, m.text);
});

libp2p protocol IDs

Protocol Purpose
/meshhold/hello/1.0 Initial handshake + topology gossip
/meshhold/blocks/1.0 Block fetch/push
/meshhold/chat/1.0 Chat-room gossipsub
/meshhold/call/1.0 WebCodecs media transport
/meshhold/tunnel/1.0 TCP/UDP tunnel sub-streams
/meshhold/plugin/agent/1.0 HTTP/1.1-over-libp2p proxy for AI agents

MCP / Claude Code integration

MeshHold embeds Claude Code as a vault-analog. Each instance has its own encrypted state, syncs across nodes, and proxies over libp2p.

meshhold agent create --type claude --name "Claude 1"
meshhold agent workspace add <instance-id> ~/projects/foo
meshhold agent share <instance-id>

See the Claude rollout devlog for details, and the comparison with Paseo, Happy Coder, CloudCLI and VibeTunnel for how this surface lines up against the dedicated mobile agent clients.

OpenCode driver

The same agent surface drives OpenCode through its native HTTP/SSE serve mode. Pick the driver in the Add-Instance UI; provider OAuth flows are in Settings → Providers.

Gemini CLI driver

Google's Gemini CLI is driven over ACP (the Agent Client Protocol — newline-delimited JSON-RPC 2.0 over stdio), spawned as gemini --acp. Every instance is fully isolated: its own ~/.gemini (a per-instance HOME override), its own long-running process, and its own API key stored in that instance's ~/.gemini/.env — so several accounts coexist on one node. Streaming updates and tool-call approvals (session/request_permission maps to the same Allow / Deny cards as the other drivers) flow through the one agent surface. Add a Gemini API key under Settings → Providers.

MCP for gemini is not yet wired. Gemini's ACP mode blocks session creation while an MCP server is configured, so the MCP tab is hidden for gemini pending an ACP-native fix. Claude and OpenCode support MCP normally.

All three drivers sit behind a single SessionBackend interface, so the REST surface and the Web UI are identical regardless of which CLI backs an instance.