An fzf-powered session picker for resuming local agent sessions.
ccsession lists local agent sessions (Claude Code by default, with optional
OpenCode, Grok, and Codex backends), lets you fuzzy-find across all of your
projects with a live preview pane, and resumes the one you pick in its original
working directory.
- Cross-project listing — every session from every project in one view, sorted by last activity.
- Three search modes — fuzzy (default), directory-only, and full-text grep over JSONL transcripts, with configurable mode-switch keys.
- Live preview — last 30 messages of the highlighted session, with timestamps and roles. In grep mode the matched query is highlighted in the preview so you can spot the hit at a glance.
- Faithful resume —
chdirs back to the session's originalcwdbefore exec'ing the selected agent's resume command, so paths and tooling Just Work. - Single static binary — written in Go with no cgo; bundles a pure-Go SQLite reader (for OpenCode support) and a small TOML parser for the optional config file.
| Tool | Required for |
|---|---|
fzf >= 0.58.0 |
interactive picker |
claude (Claude Code CLI) |
resuming sessions |
opencode |
listing & resuming OpenCode sessions (only with --source=opencode) |
grok (Grok Build TUI) |
listing & resuming Grok sessions (only with --source=grok) |
codex (Codex CLI) |
listing & resuming Codex sessions (only with --source=codex) |
ccsession depends on newer fzf actions such as transform, rebind,
unbind, disable-search, and change-nth. The newest of those,
change-nth, landed in fzf 0.58.0, so older versions may start but the mode
switch bindings will not work correctly.
go install github.com/sorafujitani/ccsession/cmd/ccsession@latestRequires Go 1.25 or newer (the pure-Go SQLite reader for OpenCode support needs it; see #52).
Version metadata is recovered from runtime/debug.ReadBuildInfo, so
ccsession --version works for go install builds as well.
Grab the ccsession_<ver>_<os>_<arch>.tar.gz for your platform from the
Releases page, extract
it, and drop the binary somewhere on your PATH:
tar xzf ccsession_0.1.0_darwin_arm64.tar.gz
install -m 0755 ccsession ~/.local/bin/If macOS Gatekeeper complains:
xattr -d com.apple.quarantine ~/.local/bin/ccsessionnix run github:sorafujitani/ccsession # one-off
nix profile install github:sorafujitani/ccsession # install into a profilebrew install sorafujitani/tap/ccsessionThe formula lives in
sorafujitani/homebrew-tap
and GoReleaser refreshes it on every tagged release. fzf is installed as a
dependency; the claude CLI must be installed separately. opencode, grok,
and codex are needed only with their matching --source backends — they back
optional features (unlike fzf, which is always required), so they are
intentionally left out of the formula's depends_on.
ccsession # list -> fzf -> resume
ccsession --grok # use Grok sessions from ~/.grok/sessions
ccsession --codex # use Codex sessions from ~/.codex/sessions
ccsession list [--grep Q] [--regex] # emit TSV rows to stdout
ccsession preview [--query Q] [--regex] <id> # render the preview pane (Q highlighted)
ccsession resume <id> # chdir to the session's cwd, exec the selected agent
ccsession --version
ccsession --help| Key | Mode |
|---|---|
Ctrl-G |
grep — refilters by user/assistant content on every keystroke; matches are highlighted in the preview |
Ctrl-O |
dir — fuzzy match restricted to the directory column |
Ctrl-F |
fuzzy — default; matches across time / dir / label |
Enter |
resume the selected session |
Esc |
cancel |
The three mode-switch keys are the defaults and can be overridden (see below).
If a mode-switch key clashes with your terminal, shell, or muscle memory, you can remap any of the three. Keys are resolved in this order (first wins):
CLI flags > environment variables > config file > defaults
The on-screen header is regenerated from the resolved keys, so the hint always matches what is active.
# CLI flags (highest precedence)
ccsession --bind-grep ctrl-r --bind-fuzzy alt-f
# environment variables
export CCSESSION_BIND_GREP=ctrl-r
export CCSESSION_BIND_DIR=ctrl-o
export CCSESSION_BIND_FUZZY=alt-fConfig file at ~/.config/ccsession/config.toml (lowest precedence before
defaults; honors XDG_CONFIG_HOME). ccsession only reads this file — it
never creates it, so create it yourself only if you want file-based overrides:
[keybindings]
grep = "ctrl-r"
dir = "ctrl-o"
fuzzy = "alt-f"Any key you leave unset falls through to the next source. A key name must be
lower-case fzf syntax (ctrl-r, alt-f, f1, …); the three keys must be
distinct and must not be a reserved fzf event name (enter, change, …), or
ccsession exits with an error instead of starting the picker.
ccsession listreads the selected backend (~/.claude/projects/*/by default, or--source=opencode/--source=grok/--source=codex) and prints one TSV row per session (id,epoch, relative time, cwd basename, label).fzfconsumes the TSV. The three key bindings swap fzf's matcher between fuzzy mode, directory-only mode, and grep mode (which reloads viaccsession list --grep <query>on every keystroke). The current query is also forwarded to the preview asccsession preview --query <query> <id>, which highlights its matches in the rendered messages.- On
Enter,ccsession resume <id>resolves the session's originalcwd,chdirs into it, andexecves the selected agent's resume command so the resumed process fully replaces the picker.
Backend-specific homes can be overridden with GROK_HOME for Grok and
CODEX_HOME for Codex. Codex defaults to ~/.codex, reading sessions from
its sessions subdirectory.
nix develop # Go + fzf + gopls + goreleaser
go build ./cmd/ccsession
go test ./...goreleaser release --snapshot --clean --skip=publish
ls dist/nix build
./result/bin/ccsession --versionBug reports and pull requests are welcome at https://github.com/sorafujitani/ccsession. For larger changes, please open an issue first to discuss what you'd like to change.