Electron + React desktop client for the Soothe daemon. Implements RFC-505 (Soothe Desktop Client Architecture) and IG-465 (Soothe Desktop MVP).
Status: MVP. Connects to a user-managed
soothed, opens multiple loops as tabs, streams reasoning/tool/diff events, supports inline clarification, slash command palette, and image attachments.
- Node.js β₯ 20
- pnpm (recommended) or npm
- A running
soothedreachable atws://127.0.0.1:8765(configurable in Settings)
Install the daemon and start it once before launching the desktop app:
# in the soothe monorepo root
pip install -e packages/soothe-daemon
soothed startnpm install # (or pnpm install)
npm run dev # electron-vite dev with HMRThe window opens at startup. If the daemon isn't reachable, the EmptyState shows a copy-pasteable soothed start snippet and a Retry button.
Note: The
dev/build/packagescripts prefixNODE_OPTIONS=to clear any shell-levelNODE_OPTIONS(e.g.--no-deprecation). Electron's launcher rejects most flags for hardening, even in dev. If you runelectron-vitedirectly, doNODE_OPTIONS= electron-vite dev.
pnpm build # bundle main + preload + renderer to out/
pnpm package # bundle, then electron-builder for current platform
pnpm package:mac # macOS DMG (arm64 + x64)Output: release/ directory.
pnpm test # vitest run
pnpm typecheck # tsc --noEmit for renderer + main
pnpm lintUnit tests cover state slices, the event-renderer registry, IPC payload contracts, and composer keymap.
Briefly:
- Main process owns all WebSocket connections via
@mirasoth/soothe-client. OneClientper open tab. - Renderer is a typed IPC consumer with no socket state of its own.
- Event registry keys React renderers off the daemon's
soothe.<domain>.<component>.<action>event types (RFC-403); unknown types render a debug fallback.
src/
βββ shared/ # IPC channel definitions, payload types
βββ main/ # Electron main: window, IPC handlers, WSManager
βββ preload/ # contextBridge β window.soothe API
βββ renderer/ # React UI
βββ app/ # App shell, Sidebar, TabBar, TabView
βββ features/ # chat, composer, clarification, settings, command-palette
βββ event-renderers/ # registry + per-event-family cards
βββ state/ # zustand store + slices
βββ lib/ # ipc accessor, markdown, diff, attachments
βββ ui/ # shadcn primitives