cc-thingz
Things to make Claude Code even better — hooks, skills, and commands, organized as a marketplace of independent plugins. This is an unapologetically opinionated set.
TUI for reviewing diffs, files, and documents with inline annotations. Outputs structured annotations to stdout on quit, making it easy to pipe results into AI agents, scripts, or other tools.
> /plugin marketplace add umputun/revdiff> /plugin install revdiff@revdiff
What's inside
TUI for reviewing diffs, files, and documents with inline annotations. Outputs structured annotations to stdout on quit, making it easy to pipe results into AI agents, scripts, or other tools.
Built for a specific use case: reviewing code changes, plans, and documents without leaving a terminal-based AI coding session (e.g., Claude Code). Just enough UI to navigate diffs and files, annotate specific lines, and return the results to the calling process - no more, no less.
--word-diff or toggle with Wv↪ continuation markers, toggle with w; optional --wrap-indent N for hanging-indent continuations (handy for markdown lists)--page-overlap N carries the bottom N lines of the screen to the top of the next one on PgUp/PgDn, so the seam between screens keeps context; the carryover is approximate on wrapped or annotated lines, which occupy several rows but are a single cursor stop« / » markers at the edges to signal hidden content off-screen┃ segment on pane right borders indicates the visible portion of long diffs, file trees, and markdown TOCs; thumb size and position track scroll progress automaticallyLold → new and renders only the real line changes instead of a full delete-and-addHEAD → @-, HEAD~N → @ plus N+1 dashes); --all-files supportedB/ search within diff with n/N match navigation@): browse all annotations across files, jump to any annotation?) showing all keybindings organized by sectioni) showing launch scope (mode, VCS, ref, filters, file/status counts, aggregate +/- line stats), the optional --description prose, and the commit log subject + body for every commit in the current ref range (git/hg/jj) — useful for restoring narrative context when reviewing PR-style diffs--all-files (git ls-files or jj file list), filter with --include and --exclude--only files outside a VCS repo (or not in any diff) are shown as context-only with full annotation support--stdin, optionally naming it with --stdin-name. When the piped content sniffs as a git unified diff, revdiff parses it as a real multi-file diff (review gh pr diff or git format-patch -1 --stdout output directly); otherwise the input is shown as a single context-only buffer.~/.config/revdiff/history/ on quit as a safety net--dump-keys
git, hg, or jj (used to generate diffs; optional when using --only or --stdin)jj file annotate -T, so the blame gutter does not work. Versions before 0.23 also reject the commit-log template behind the commit-info popup.Homebrew (macOS/Linux):
brew install umputun/apps/revdiff
Arch Linux (AUR):
paru -S revdiff
Debian/Ubuntu (.deb):
# download the latest .deb for your architecture from GitHub Releases
sudo dpkg -i revdiff_*.deb
RPM-based (Fedora, RHEL, etc.):
# download the latest .rpm for your architecture from GitHub Releases
sudo rpm -i revdiff_*.rpm
Go:
go install github.com/umputun/revdiff/app/revdiff@latest
Installs the revdiff binary into GOBIN (defaults to $(go env GOPATH)/bin). Add that directory to your PATH.
Binary releases: download from GitHub Releases (deb, rpm, archives for linux/darwin amd64/arm64).
revdiff ships with a Claude Code plugin for interactive code review directly from a Claude session. The plugin launches revdiff as a terminal overlay, captures annotations, and feeds them back to Claude for processing.
The plugin requires one of the following terminals since Claude Code itself cannot display interactive TUI applications - the overlay runs revdiff in a separate terminal layer on top of the current session:
| Terminal | Overlay method | Detection |
|---|---|---|
| agterm | agtermctl session overlay open … --block (full-pane overlay, blocks until quit) | $AGTERM_SESSION_ID env var |
| tmux | display-popup (blocks until quit) | $TMUX env var |
| Zellij | zellij run --floating | $ZELLIJ env var |
| herdr | herdr tab create + herdr pane run (new tab), or a zoomed herdr pane split with REVDIFF_HERDR_PANE=1 | $HERDR_ENV env var |
| kitty | kitty @ launch --type=overlay | $KITTY_LISTEN_ON env var |
| wezterm | wezterm cli split-pane | $WEZTERM_PANE env var |
| Kaku | kaku cli split-pane (same API as wezterm) | $WEZTERM_PANE env var |
| cmux | cmux new-split + cmux send | $CMUX_SURFACE_ID, __CFBundleIdentifier=com.cmuxterm.app, or GHOSTTY_RESOURCES_DIR / GHOSTTY_BIN_DIR containing cmux.app |
| ghostty | AppleScript split + zoom (macOS only) | $TERM_PROGRAM + AppleScript probe |
| iTerm2 | osascript split pane (macOS only) | $ITERM_SESSION_ID env var |
| Emacs vterm | New frame via emacsclient | $INSIDE_EMACS env var |
Priority: agterm → tmux → Zellij → herdr → kitty → wezterm/Kaku → cmux → ghostty → iTerm2 → Emacs vterm (first detected wins). If none are available, the plugin exits with an error.
Note: cmux is detected before ghostty when
$CMUX_SURFACE_IDis set,__CFBundleIdentifier=com.cmuxterm.app, orGHOSTTY_RESOURCES_DIR/GHOSTTY_BIN_DIRcontainscmux.app. The cmux block uses the cmux CLI (new-split+send --surface) instead of Ghostty's AppleScript API.
Note: iTerm2 uses a split pane (vertical or horizontal, auto-detected from terminal dimensions) rather than a full-screen overlay. The iTerm2 AppleScript API does not expose a zoom command, so the split view shares screen space with the invoking session.
Note: Ghostty and iTerm2 launchers use
osascript(Apple Events), which is blocked by Claude Code's sandbox. If you use these terminals with sandbox enabled, add the launcher toexcludedCommandsin your Claude Codesettings.json:{ "permissions": { "excludedCommands": ["*/launch-revdiff.sh*"] } }Terminals that use CLI tools instead of AppleScript (agterm, tmux, Zellij, herdr, kitty, wezterm, Kaku, cmux) are not affected.
Disconnect-resilient tmux window mode: set
REVDIFF_TMUX_WINDOW=1in the launcher's environment to open revdiff in a persistent, server-owned tmux window instead of a client-owneddisplay-popup. A dropped SSH or tmux client tears down a popup and kills the review, but a server-owned window survives the disconnect — reattach and the live review is still there. This is a launcher environment variable, not a revdiff flag.
Pane-scoped overlay (herdr): Set
REVDIFF_HERDR_PANE=1in the launcher's environment to open revdiff in a zoomed split of the agent's own herdr pane instead of a new fullscreen tab, so the agent pane stays one keypress away. It needs a herdr whose CLI carriespane split,pane getandpane close; an unsupported CLI or a refused split falls back to the tab overlay; a split that succeeds but returns no usable pane id fails closed with a warning rather than opening a second surface, and may leave a stray pane to close by hand. This is a launcher environment variable, not a revdiff flag.
Pane-scoped overlay (agterm): set
REVDIFF_AGTERM_PANE=1in the launcher's environment to open revdiff in the agent's own split pane instead of over the whole session, leaving the sibling pane live and visible. It applies only when that session is split — the session-wide overlay stands otherwise, and the launcher retries session-wide if agterm refuses the pane. The review gets pane width rather than session width, which is why it is opt-in. This is a launcher environment variable, not a revdiff flag.
Install:
# add marketplace and install
/plugin marketplace add umputun/revdiff
/plugin install revdiff@revdiff
Use with /revdiff command:
/revdiff -- smart detection: uncommitted, last commit, or branch diff
/revdiff HEAD~1 HEAD -- review last commit
/revdiff main -- review current branch against main
/revdiff --staged -- review staged changes only
/revdiff HEAD~3 HEAD -- review last 3 commits
Use with free text (no slash command needed):
"review diff" -- smart detection, same as /revdiff
"review diff HEAD~1 HEAD" -- last commit
"review diff against main" -- branch diff
"review changes from last 2 days" -- Claude resolves the ref automatically
"revdiff for staged changes" -- staged only
When no ref is provided, the plugin auto-detects the VCS (git, hg, or jj) and inspects the current repo state to pick what to review:
Things to make Claude Code even better — hooks, skills, and commands, organized as a marketplace of independent plugins. This is an unapologetically opinionated set.
FAQ
revdiff is a Claude Code plugin with 2 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes revdiff-plan, revdiff. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it