A personal Electron + React IDE built around git worktrees as first-class citizens. Designed for developers who work on multiple features in parallel and want a unified dashboard for managing worktrees, running code, reviewing diffs, and interacting with AI — all in one window.
Early Development — This project is in active early development. Expect breaking changes, missing features, and rough edges. Built for a specific personal workflow first, open-sourced for others who share similar needs.
Working on multiple features in parallel with standard git is painful:
- Stashing/switching branches loses context
- Multiple terminal windows for different features
- No unified view of what's running where
- AI coding tools (like Claude Code) don't integrate with worktree workflows
Grove treats worktrees as the unit of work. Each worktree gets its own file tree, terminal, AI session, and run configuration — all visible in a single window.
- Branch → Worktree hierarchy in the sidebar
- Create new branches with auto-worktree setup
- Checkout existing branches into worktrees
- Auto-runs setup hooks (
pnpm install,.envcopy) - Status badges: clean/dirty, ahead/behind counts
- Monaco Editor with auto-save (2s debounce)
- File tree with language-specific icons
- Tab management with dirty indicators
- Diff viewer with Monaco DiffEditor (side-by-side)
- Stage/unstage individual files
- Auto-generate commit messages from changes
- Commit, push, pull — all from the UI
- Real-time status polling (5s interval)
- Per-worktree shell via
node-pty+xterm.js - Persistent sessions — survives tab switches
- Run detection — auto-detects project type and run command
- Auto-opens browser for web projects
- Structured chat panel — not a raw terminal
- Split view: Result (top) + Activity (bottom, collapsible)
- Result renders from the top (natural reading order)
- Activity feed shows tool calls in real-time with animated indicator
- Markdown rendering with syntax-highlighted code blocks
- Uses Claude Code CLI with
--output-format stream-json - Each worktree gets its own conversation context
- Runs with your existing Claude subscription (no API key needed)
| Layer | Choice |
|---|---|
| Framework | Electron + Vite |
| Frontend | React + TypeScript |
| Editor | Monaco Editor |
| Git | simple-git |
| Terminal | node-pty + xterm.js |
| AI | Claude Code CLI |
| State | Zustand (snapshot-driven) |
| Styling | Tailwind CSS v4 |
| Validation | Zod |
Main Process (Electron)
├── RepoController — Owns state, pushes snapshots
├── GitService — simple-git wrapper
├── WorktreeService — Create/delete/setup worktrees
├── FileService — Read/write/watch files
├── TerminalService — node-pty shell per worktree
├── ClaudeCodeService — Claude CLI via node-pty (terminal mode)
├── ClaudeChatService — Claude CLI stream-json (chat mode)
├── RunDetector — Auto-detect project run commands
└── PortService — Port allocation
Renderer (React)
├── Zustand store — Immutable snapshot from main
├── Monaco Editor — Code + diff viewing
├── xterm.js — Terminal display
├── Chat UI — Structured Claude Code interaction
└── Tailwind components — Layout, sidebar, panels
Key pattern: Main process owns ALL state. Pushes immutable AppSnapshot to renderer via IPC. Renderer never mutates — calls IPC methods, receives new snapshot.
# Clone
git clone <repo-url>
cd grove
# Install
pnpm install
# Dev
pnpm dev- Node.js 20+
- pnpm 10+
- Claude Code CLI installed (
claudecommand available) - macOS (primary target, may work on Linux)
Optimized for 14" MacBook (1512x982):
+--------------------------------------------+
| Activity | Editor / Diff | Claude Chat |
| Bar | | (always on) |
| (40px) | | |
| | | [result] |
| | +-- Terminal --+ | |
| | | $ shell | | [activity] |
| | +--------------+ | [input] |
+--------------------------------------------+
| Status Bar |
+--------------------------------------------+
| Shortcut | Action |
|---|---|
Cmd+1 |
Toggle file tree |
Cmd+2 |
Toggle branch/worktree sidebar |
Cmd+3 |
Toggle diff view |
Cmd+J |
Toggle terminal |
Cmd+B |
Cycle sidebar panels |
Cmd+Shift+N |
New branch dialog |
Cmd+Shift+D |
Open diff view |
This is a personal tool built for a specific workflow. Features are added as needed. If you find it useful, great — but expect:
- No guaranteed API stability
- Opinionated defaults (e.g.,
pnpmpreferred, macOS focused) - Features driven by personal needs first
MIT