The clients/ directory is an npm workspaces monorepo (~61,500 lines) unified by the Gateway Adapter pattern: all clients use identical components and stores, differing only in the transport adapter.

Web

Stack: Vite + React 19 + Tailwind CSS v4 The browser speaks ACP JSON-RPC 2.0 directly to the gateway over WebSocket via WebGatewayAdapter. No intermediate backend, no BFF, no SSR.
  • 70+ shared React components
  • Exponential backoff reconnection
  • Automatic session replay on reconnect
  • Light and dark mode themes
cd clients/web
bun run dev  # http://localhost:5173

Desktop (Tauri)

Stack: Tauri v2 + React + Rust SDK The Rust backend owns the ACP WebSocket connection via the Rust SDK on tokio. The React frontend communicates through Tauri IPC via TauriGatewayAdapter. Features:
  • Chronicle Local Sync: Bidirectional sub-second file sync between agent workspace and local directory
  • Teleport: Switch execution environment mid-session while preserving workspace state
cd clients
bun run dev:desktop

Desktop (GPUI)

Stack: GPUI 0.2 (Zed editor framework), ~4,045 lines of Rust GPU-accelerated native client. No Tauri, no IPC, no WebView — the Rust SDK runs in the same process that renders at 60fps. macOS-only.

OpenCode

Full-featured open-source agent client with 5 modes:
  • Rich TUI (OpenTUI/Solid.js)
  • CLI
  • Web (React 19)
  • Desktop (Tauri v2)
  • ACP Server (stdio for editor integration)
Brings its own tool layer (glob, grep, read, write, edit, bash, webfetch, websearch), MCP integration, and LSP support.

TUI

Terminal interface with session management, streaming chat, permission dialogs, and file viewer overlays.

CLI

Scriptable command-line interface:
dim sessions list
dim turn run --session sess_abc123 "Fix the failing test"
dim files read --session sess_abc123 src/main.ts

Gateway Adapter Pattern

All clients share:
  • Shared React components (clients/shared/) — 70+ components, Zustand stores, hooks
  • Gateway Adapter interface — abstracts transport (WebSocket, Tauri IPC, stdio)
  • Identical rendering — every ACP event renders the same across all clients