@@ -0,0 +1,42 @@ |
| 1 | +# claudex |
| 2 | + |
| 3 | +*(noun) : the systematic cataloguing of fugal subjects across concurrent movements, as practiced by the lesser-known Viennese archivist Theodor Klaudeks, whose index of Bruckner's unfinished symphonies was itself famously never finished* |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +Desktop GUI for browsing and running [Claude Code](https://docs.anthropic.com/en/docs/claude-code) sessions in parallel. Reads `~/.claude/projects/` directly, groups sessions into logical projects via git-root detection, and lets you open multiple interactive Claude terminals side-by-side without losing context when you switch between them. |
| 8 | + |
| 9 | +## What it does |
| 10 | + |
| 11 | +- **Thread browser** — tree-structured sidebar of every Claude Code session on your machine, organized by project. Sessions from different working directories that share a git root merge into one project node. |
| 12 | +- **Embedded terminal mode** — spawns `claude --resume <id>` inside a real PTY rendered by xterm.js. Full CLI parity: slash commands, permission prompts, vim mode, ctrl-r history, ANSI rendering. Terminals persist across session switches (codex-style parallel threads). |
| 13 | +- **Card viewer mode** — parsed message timeline with syntax-highlighted code blocks, tool-use cards, thinking blocks. Toggle between terminal and cards per session. |
| 14 | +- **Archive recovery** — reconstructs deleted session history from `~/.claude/history.jsonl` so nothing is truly lost after a Claude Code major-version wipe. |
| 15 | +- **Optional claude-mem enrichment** — if [claude-mem](https://github.com/anthropics/claude-mem) is installed, uses its AI-refined titles. Falls back to a local sanitizer that strips XML noise, code blocks, and IDE wrappers from the first message. |
| 16 | + |
| 17 | +## Stack |
| 18 | + |
| 19 | +| Layer | Tech | |
| 20 | +|-------|------| |
| 21 | +| Shell | [Tauri 2](https://tauri.app/) (macOS, WKWebView) | |
| 22 | +| Backend | Rust — FS walking, JSONL parsing, PTY management via `portable-pty`, summary caching with bincode, file watching via `notify` | |
| 23 | +| Frontend | React 19, TypeScript, Tailwind v4, Zustand, xterm.js 6, react-virtuoso | |
| 24 | +| IPC | Tauri commands + per-PTY event channels. Binary data (terminal stdout) is base64-encoded; chunks are write-combined on the Rust side at ~16 ms intervals to avoid IPC storms. | |
| 25 | + |
| 26 | +## Build |
| 27 | + |
| 28 | +Requires Rust 1.77+, Node 20+, pnpm. |
| 29 | + |
| 30 | +```bash |
| 31 | +pnpm install |
| 32 | +pnpm tauri dev # dev mode with hot reload |
| 33 | +pnpm tauri build # production .app bundle |
| 34 | +``` |
| 35 | + |
| 36 | +## Status |
| 37 | + |
| 38 | +Early. Works on macOS. Expect rough edges. |
| 39 | + |
| 40 | +## License |
| 41 | + |
| 42 | +Not yet decided. |