This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+4 more
Affected surfaces
Summary
AI summary/api/repo/switch no longer mutates server state, retiring process‑global repo handling.
Full changelog
Claude Command Center v3.0.0
CCC's first release since the OSS launch — and a big one. Multi-engine
spawning, multi-repo navigation, a real history search, side-by-side
conversations, an in-UI terminal, and a launchd service install. Plus
performance work that cuts the cold scan on large repos from ~135s to
~6.6s, and the breaking API change that finally retires process-global
repo state.
Highlights
Multi-engine spawning — Claude is no longer the only engine. The
spawn picker now offers Codex (codex exec) and Gemini CLI
alongside Claude. Codex spawns are fire-and-watch (no resume), Gemini
gets full discovery / transcript viewing / token usage / spawn / resume
parity with Claude, and both surface as first-class kanban cards with
their own engine chip and tinted row.
Multi-repo, finally — A vertical repo sidebar on the left edge
shows one icon per known repo (running CCC servers up top, switchable
repos below). The topbar repo picker lists peer CCC servers in a
"Running" section so you can hop between them without spawning. An
"All repos" sidebar view aggregates every conversation across every
folder you've ever Claude-Code'd in, GitHub issues from every repo
flow into the issues section in one list, and you can drag a session
row onto another repo's group header to pin it cross-repo.
Search every conversation you've ever had — A new 🔎 History button
(shortcut /) opens a BM25-keyword search drawer over your
~/.claude-index/index.db. Multi-word queries auto-OR-rewrite so a
single missing word doesn't zero the result set; explicit FTS5 syntax
still works. The same index now augments the sidebar search box inline
— typing fires a 180ms-debounced background query that surfaces
matching sessions from other repos as synthetic "history" rows.
Side-by-side conversations — Drag any session row onto the right or
bottom edge of the open conversation to split the pane. Each pane has
its own composer, send button, and SSE stream. Click × to close.
Below 900px the split collapses to single-pane. (As shipped today, the
drop event finally fires — it had a one-word dropEffect bug since
2026-04-27 that quietly cancelled every drop. See the Fixed section.)
In-UI terminal — A new ⌨ Terminal button (Cmd/Ctrl+\``) opens a one-shot terminal at the bottom of the page. cdis parsed server-side so cwd survives between commands; the path is clamped to the selected repo. Cancel kills the whole process group, so a runawaymake -jdoesn't leave orphans. Not a real PTY —vim/topwill hang. **This is the most security-sensitive surface in CCC**: do **not** run withCCC_BIND_HOST=0.0.0.0` on an untrusted network.
Worktree-per-spawn — A 🌿 worktree toggle next to the new-session
input launches the session in a fresh git worktree on a feat/<slug>
branch, isolated from main. Available in the kanban modal, the inline
list-view spawn bar, and via worktree: true on POST /api/sessions/spawn. The Worktrees modal now also surfaces open PRs
without a worktree, and tags worktree rows with their PR badge.
Cost & PR visibility on every card — Sessions show a $0.34 cost
chip in the input strip (Anthropic list-price equivalent, hover for
per-category breakdown), and a state-aware ↗/✓/× PR #N chip in the
kanban signal slot. PR state cache busts immediately when CCC's own
merge button runs, with a 60s ceiling for web-UI merges.
Breaking changes
/api/repo/switch no longer mutates server state. The endpoint
returns 410 Gone for validated paths. Process-global repo state has
been retired — every repo-scoped endpoint now requires explicit
repo_path, cwd, or a session-derived context.
Migration:
- API clients that called
/api/repo/switchto "set the active repo"
must passrepo_path(or a session id whose cwd resolves to a repo)
on every repo-scoped call instead. CCC_WATCH_REPOis ignored.- The UI repo picker now performs a one-off, per-call switch on the
active server rather than persisting state — this is the new
intended behavior and matches the API.
See commit 67b3f7d for the full surface change.
Notable fixes
-
Drag-to-split conversation pane has never worked. The drop
overlay setdropEffect = 'copy'on dragover, but every drag source
seteffectAllowed = 'move'on dragstart. Per HTML5 DnD spec the
browser silently cancels mismatched effect drops, so thedrop
event literally never fired. One-word fix; nine-day delay (a332249). -
/api/conversationscold scan: ~135s → ~6.6s on large repos.
Hoisted the per-rowgit rev-parsecache out of the loop, persisted
_conv_meta_cacheto disk across restarts, added a 30-day activity
filter (override with?include_old=1or
CCC_MAX_CONV_AGE_DAYS), and added a concurrency guard so the
10s browser poll can't pile up duplicate cold scans. -
Archived sessions now actually get killed.
_kill_session_by_id
was looking up the wrong field name (session_idvs Claude's
sessionId) and only signaling the first matched PID, so headless
agents survived archive. Now signals every PID associated with the
session id, andps-validates each before signaling so recycled
PIDs can't take out unrelated processes. -
Idle-session reaper. A background thread SIGTERMs any
claude
session whose JSONL has had no user/assistant/result event in 24h.
Activity is measured vialast_meaningful_ts, so/renameand
long-running agents that are still emitting messages don't count
as idle. -
Conv-pane sticky header tracks the current scrolled-past message
and auto-sizes to fit it, instead of pinning the first user message
at a manually-resizable height. -
Title-summarizer / morning-braindump JSONLs no longer pollute the
project conversation store. Both throwawayclaude -pcallers
are pinned to a stable scratch cwd; the store self-GCs after 7 days
(override withCCC_SCRATCH_GC_DAYS).
Install / upgrade
git pull
./run.sh # try it (foreground)
./run.sh --install-service # keep it (launchd, starts at login)
Existing service installs: re-run ./run.sh --install-service to
update the plist with the new version. Logs at
~/.claude/command-center/logs/service.{out,err}.log.
The full bullet list is in CHANGELOG.md.
Breaking Changes
- /api/repo/switch no longer mutates server state; returns 410 Gone. All repo‑scoped endpoints now require explicit `repo_path`, `cwd`, or a session‑derived context. Migration: pass `repo_path` (or a session id whose cwd resolves to a repo) on every call, ignore `CCC_WATCH_REPO`, and use per‑call switching via the UI.
- Process‑global repository state has been retired.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About CCC
All releases →Related context
Related tools
Earlier breaking changes
- v5.0.1 Removes horizontal-drag gesture that collapsed conversation pane.
Beta — feedback welcome: [email protected]