Smart Project Archiving and Instant Session Resolution
If you’ve used Claude Code across dozens of repositories, your Scope panel probably has ghosts — project entries for directories you deleted months ago. And if you’ve ever noticed a brief delay when launching a new CLI session from the dashboard, that was polling. Both problems are solved in v0.37.0.
Archived project detection
claude-view now probes each project directory on startup. If the directory no longer exists on disk, the project is marked as archived and moves to a collapsed section at the bottom of the Scope panel. Your active projects stay front and center.
This works through a new project_dir_status table that tracks directory existence. The startup backfill runs asynchronously — it doesn’t block the server from serving requests. Projects are also rechecked when new sessions arrive, so if you delete a directory mid-session, the next scan catches it.
For users with worktree-heavy workflows, we also fixed git root inference. Previously, sessions inside a worktree could fail to resolve back to the parent repository. The path resolution now walks up the directory tree to find the real .git root.
Zero-poll session resolution
When you click “New Session” in the dashboard, claude-view creates a tmux session, waits for Claude to boot, then returns the session identity. Previously, this “wait” was a poll loop: check for a pid.json file every 50ms, up to 100 times.
The new “born waiter” pattern replaces polling with event-driven resolution. An FSEvents watcher registers before the tmux session is created, then races against the fallback poll. In production on macOS, the watcher fires within a millisecond of Claude writing its pid.json. The poll path still exists for environments without filesystem events (CI, containers), but it almost never wins the race.
We instrumented the entire create-session path with lifecycle debug logging to verify the timing. The waterfall shows: API handler starts at T+0ms, tmux spawns at T+2ms, pane PID resolves at T+3ms, and the born event fires at T+63ms (Claude’s boot time). Zero wasted poll cycles.
Single-writer architecture
A recurring bug pattern in real-time dashboards: a button triggers a fetch that creates an entity, while simultaneously an SSE stream delivers the same entity from the server. Two paths, same data, guaranteed desync.
v0.37.0 enforces a single-writer rule: buttons own the fetch, parent components react to the callback, and SSE streams only sync existing state — they never create new entities. This eliminated a class of phantom duplicate entries that appeared briefly before reconciliation cleaned them up.
Update now
npx claude-view@latestTry launching a new CLI session from the dashboard — the resolution is noticeably faster. And if you have deleted project directories, check your Scope panel for the new Archived section.