find & resume Claude Code chats from anywhere
wwid indexes every Claude Code conversation
on your machine and lets you fuzzy-search them by name, PR, project, or first
prompt — then re-opens the one you pick with claude --resume, in its original
folder.
It is read-only by default — it only reads Claude's transcript files under
~/.claude/projects/ — with one opt-in exception, wwid --rename, which names
un-named chats (and backs them up first). See Renaming below.
brew install FunnyGhost/tap/wwidThat single command also installs the fzf and Python dependencies. For the
latest commit on main instead of the last release:
brew install --HEAD FunnyGhost/tap/wwid| Tool | Why | Provided by |
|---|---|---|
python3 |
runs the script (stdlib only) | the formula (python@3.13) |
fzf |
the interactive picker | the formula |
| Claude Code | resume target + --rename titles |
brew install --cask claude-code |
fzf and Python are pulled in automatically. Claude Code is the one thing you
need yourself — wwid tells you if it's missing.
wwid # fuzzy picker over all chats; Enter resumes the one you pick
wwid <query> # same picker, pre-filtered by <query>
wwid pr <num|url> # find chat(s) linked to a PR; resume if there's exactly one
wwid list # plain text table (good for scripts / grep)
wwid --rename # name every chat you never named, from its content
wwid -h | --help # usage- Type to fuzzy-filter across every visible column and the (hidden) full first prompt.
- Enter resumes the highlighted chat —
wwidcds into the chat's original folder, then hands off toclaude --resume <id>. - Esc cancels without doing anything.
| Column | Meaning |
|---|---|
NAME |
your /rename name → else the auto AI title → else 1st prompt |
AGE |
time since the chat was last active |
CTX |
approx % of the context window used at the last turn |
MSGS |
total user + assistant messages |
PR |
pull request(s) linked to the chat (auto-linked on gh pr create) |
PROJECT |
the folder the chat ran in |
FIRST PROMPT |
the first meaningful thing you typed |
wwid is read-only except for this one command. It gives a short
(4–5 word) content-based name to every chat you never named yourself:
- Skips any chat that already has a
/renamename, and any chat that's currently running. - Generates each title with a cheap, side-effect-free
claude -pcall (Haiku, no saved session, no MCP, no tools). - Writes the name by appending a
custom-titlerecord — exactly what/renamedoes — so it sticks and shows in Claude's/resumepicker too. - Backs up every file it touches to
~/.claude/.wwid-rename-backup-<ts>/before writing, and asks for confirmation first.
wwid --rename --dry-run # preview the new names, write nothing
wwid --rename # do it (prompts before writing)
wwid --rename --yes # do it without the confirmation promptTo undo: restore the matching files from the backup folder (the title is the last line of each touched transcript).
Claude Code stores each conversation as a .jsonl file (one JSON record per
line) under ~/.claude/projects/<encoded-folder>/<session-id>.jsonl. wwid
reads a few record types from each file:
Record type |
Used for |
|---|---|
custom-title |
your manually set name |
ai-title |
the auto-generated name |
pr-link |
linked PR number / URL / repo |
user |
the first real prompt + cwd |
assistant |
message count + token usage (CTX) |
A full scan of all transcripts takes a fraction of a second, so wwid reads
them live on every run — no cache or index file to maintain.
The script itself (bin/wwid) is a single, heavily commented Python file with
zero third-party dependencies — open it to read how each piece works.
git clone https://github.com/FunnyGhost/wwid.git
./wwid/bin/wwid --help # run it straight from the checkout
brew install --HEAD FunnyGhost/tap/wwid # or install your working mainThe formula lives in FunnyGhost/homebrew-tap.
To cut a release: tag it, gh release create vX.Y.Z, then bump url + sha256
in the tap's Formula/wwid.rb.
MIT — see LICENSE. © Catalin Ciubotaru.

