An Electron desktop app that orchestrates multiple interactive Claude Code sessions across projects — one workspace, one unified UI, one click to switch between live sessions in different repos.
Status: Early spike. The MVP goal is an Obsidian-style UX where a sidebar lists your projects and the main pane shows a live interactive
claudesession for whichever project is selected. This repo is the initial spike proving the core PTY + xterm.js + Electron pipeline works.
If you work across several repos every day, the usual alternatives all hurt:
- Multiple Windows Terminal tabs — labels get lost, no project context, alt+tab hell
- Multiple VS Code windows — terminal is a side panel, claude is not first-class
claude -pheadless — loses interactive context, can't follow up, one-shot only
Choda Deck treats a project as the unit of navigation and the interactive claude session as first-class content. Sidebar holds the project list, main pane hosts live PTY-backed terminals, keyboard-switch between them with zero friction.
| Layer | Choice | Why |
|---|---|---|
| Shell | Electron | Mature, rich ecosystem, proven for terminal apps (VS Code, Hyper) |
| Renderer framework | React + TypeScript | Familiar, large ecosystem, matches primary dev stack |
| Build tooling | electron-vite + Vite 7 | Fast HMR, out-of-the-box main/preload/renderer pipeline |
| Terminal renderer | xterm.js | Industry standard, used by VS Code, Hyper, Theia |
| PTY layer | node-pty | Official Microsoft fork, ConPTY on Windows, prebuilt binaries |
pnpm install
pnpm run devRequires Node 20+, pnpm 10+, and a working claude CLI on PATH (Windows: claude.cmd via npm global).
Windows is the only officially supported platform right now. Mac/Linux targets remain in electron-builder.yml but are untested — PRs welcome.
pnpm install
pnpm run build:winOutputs land in dist/:
choda-deck-<version>-setup.exe— NSIS installer (per-machine, asks for install directory)choda-deck-<version>-portable.exe— single-file portable build
The installer is unsigned — Windows SmartScreen will show "Windows protected your PC" on first run. Click More info → Run anyway. Code signing is a future task.
If you tweak build/icon.svg, regenerate the icon set:
pnpm run iconsThis rewrites build/icon.png, build/icon.ico, and resources/icon.png via scripts/build-icons.mjs (uses sharp + png-to-ico).
After install, Choda Deck stores everything in %APPDATA%\Choda Deck\:
choda-deck.db— SQLite source of truth (tasks, conversations, sessions)projects.json— project/workspace registrybackups/— automatic daily SQLite backups
Uninstalling via Add/Remove Programs removes the app binaries but leaves user data intact. Delete %APPDATA%\Choda Deck\ manually for a clean wipe.
On first launch, Choda Deck checks ~/.claude.json and registers its bundled MCP server as choda-tasks (or updates the path on reinstall). If ~/.claude.json is absent the app silently skips — it never creates the file.
Unregister from Settings → Claude Code MCP → Unregister (the NSIS uninstaller cannot edit JSON, so this button is the clean exit path).
A plain-Node PTY validation that doesn't involve Electron at all — useful when diagnosing native module or PTY issues:
node scripts/spike-pty.mjsSpawns claude.cmd in a target cwd, captures ANSI output, sends Ctrl+C, and reports whether the interactive TUI rendered correctly.
- Spike — prove Electron + xterm.js + node-pty + claude interactive mode work on Windows
- MVP — sidebar with N hardcoded projects, click to switch, session persists across switches
- Config — JSON file for project list, add/remove via UI
- Status indicators — show whether each session is idle / working / waiting for input
- Command palette — quick jump to project by name
- Layout persistence — restore workspace on relaunch
- Theming — light / dark / custom
- Cross-platform — macOS, Linux builds
- Plugins / extensibility
MIT — see LICENSE.