Skip to content

CCC

v3.0.0 Breaking

This release includes 2 breaking changes for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

agents claude claude-code web developer-tools headless
+4 more
kanban llm-tools local-first python

Affected surfaces

auth breaking_upgrade

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/switch to "set the active repo"
    must pass repo_path (or a session id whose cwd resolves to a repo)
    on every repo-scoped call instead.
  • CCC_WATCH_REPO is 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 set dropEffect = 'copy' on dragover, but every drag source
    set effectAllowed = 'move' on dragstart. Per HTML5 DnD spec the
    browser silently cancels mismatched effect drops, so the drop
    event literally never fired. One-word fix; nine-day delay (a332249).

  • /api/conversations cold scan: ~135s → ~6.6s on large repos.
    Hoisted the per-row git rev-parse cache out of the loop, persisted
    _conv_meta_cache to disk across restarts, added a 30-day activity
    filter (override with ?include_old=1 or
    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_id vs Claude's
    sessionId) and only signaling the first matched PID, so headless
    agents survived archive. Now signals every PID associated with the
    session id, and ps-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 via last_meaningful_ts, so /rename and
    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 throwaway claude -p callers
    are pinned to a stable scratch cwd; the store self-GCs after 7 days
    (override with CCC_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

Track CCC

Get notified when new releases ship.

Sign up free

Related context

Earlier breaking changes

  • v5.0.1 Removes horizontal-drag gesture that collapsed conversation pane.

Beta — feedback welcome: [email protected]