A 3-pane code review system for Claude Code that makes reviewing AI-generated code efficient and systematic.
- 3-Pane Layout: Side-by-side diff viewer, Claude chat, and comment editor
- Pre-populated Comments: File list automatically generated in diff order
- Batch Feedback: Collect all review comments before Claude addresses them
- Smart Overview: High-level summary skipping trivial changes
- Systematic Fixes: Prioritized issue resolution with progress tracking
- Centralized Sessions: Sessions stored in
~/.diff-feedback/sessions/(no repo clutter)
# Install latest version
claude plugin install diff-feedback@github.com/Ginger-Labs/diff-feedback
# Or install specific version
claude plugin install diff-feedback@github.com/Ginger-Labs/diff-feedback#v1.0.0Before first use, verify you have required dependencies:
# Run dependency checker (optional)
bash ~/.claude/plugins/cache/github.com/Ginger-Labs/diff-feedback/*/install.shRequired:
git(usually pre-installed)nvim- Install with:brew install neovim
Recommended:
git-delta- Install with:brew install git-delta(provides rich diff viewing, falls back toless -Rif not installed)
- Restart Claude Code to activate the plugin (may be required)
- Verify with
/help- should see/diff-feedback:overview,/diff-feedback:address,/diff-feedback:refresh,/diff-feedback:start - The launcher script is available directly after installation - no alias needed!
$ claude
> "Implement dark mode with Redux"
[Claude generates code with multiple files]$ diff-feedback
# Or for branch comparison:
$ diff-feedback --base stagingThis opens a 3-pane layout:
┌─────────────────────┬─────────────────────┐
│ │ Claude Code │
│ Diff Viewer │ (Ask questions) │
│ (delta) │ │
│ ├─────────────────────┤
│ │ Comment Editor │
│ │ (nvim) │
└─────────────────────┴─────────────────────┘
- Left pane: Read the diff
- Top-right: Ask Claude questions (
/diff-feedback:overviewfor summary) - Bottom-right: Write review comments in nvim
> /diff-feedback:addressClaude reads all comments, creates todos, and fixes issues systematically.
# Review uncommitted changes
diff-feedback
# Review branch vs base branch
diff-feedback --base main
# Review specific files only
diff-feedback src/components/*.tsxOptional: Get high-level overview
> /diff-feedback:overviewOutput:
Overview (8 files changed):
Core Implementation:
- store/theme/slice.ts (NEW): Redux slice for theme state
• Three-way theme mode with system detection
• Persists to localStorage
[Skips trivial changes like imports]
Architectural Notes:
- Chose Redux over Context (accessed by 20+ components)
> /diff-feedback:addressClaude will:
- Parse comments by file and line
- Prioritize: HIGH (bugs) → MEDIUM (quality) → LOW (style)
- Create todos with TodoWrite
- Fix issues one by one
- Provide summary and next steps
After addressing comments, refresh the review to see remaining changes:
> /diff-feedback:refreshThis command:
- Archives your current comments (with timestamp)
- Regenerates the comment template with the NEW diff
- Refreshes the diff viewer pane
- Shows remaining changes
Use this to continue reviewing after fixing some (but not all) issues.
Comments are automatically saved to ~/.diff-feedback/sessions/[repo-id]/comments.txt:
# Code Review Comments
<!-- Session: 2025-12-29-143022 | Created: 2025-12-29 14:30:22 -->
<!-- Branch: main | Base: staging | Files: 12 changed -->
## File: services/app/src/components/ThemeToggle.tsx
Line 42:
- Missing dependency in useEffect array
Line 67-73:
- Need error handling for theme fetch failure
## File: services/app/src/store/theme/slice.ts
General:
- Consider memoizing the theme selector
## General Comments
- Extract theme utilities to shared file
- Add tests for theme toggleFiles are pre-populated in the same order they appear in the diff for easy navigation.
# 1. Claude implements a feature
$ claude
> "Add user preferences panel"
[Claude generates code]
# 2. Launch review
$ diff-feedback --base staging
# 3. (Optional) Get overview
> /diff-feedback:overview
Claude: "Overview (12 files):
- PreferencesPanel.tsx (NEW): User settings UI with form validation
- preferencesSlice.ts (NEW): Redux state management
[...]"
# 4. Review diff and add comments in nvim
# (Files already listed in same order as diff)
## File: PreferencesPanel.tsx
Line 42:
- Missing error handling for save button
## File: preferencesSlice.ts
General:
- Add JSDoc to exported selectors
# 5. Save and exit nvim, then address comments
> /diff-feedback:address
Claude: "Found 5 comments across 3 files.
Creating todos:
- [HIGH] Add error handling - PreferencesPanel.tsx:42
- [LOW] Add JSDoc - preferencesSlice.ts
Fixing error handling in PreferencesPanel.tsx:42...
✓ Fixed. Added try-catch with user feedback.
[...]
Summary: ✓ Addressed 5 comments across 3 files
Next steps:
1. Review: git diff
2. Test: yarn test
3. Commit when ready"Required:
- git
- nvim
- One of the following terminal emulators:
- WezTerm - Full native support
- iTerm2 - Full native support (AppleScript)
- Kitty - Native support (requires
allow_remote_control yesin kitty.conf) - Terminal.app - Uses tmux wrapper (requires
brew install tmux) - Alacritty - Uses tmux wrapper (requires
brew install tmux) - tmux - Universal fallback
Recommended:
- delta (brew install git-delta) - Rich diff viewing
- Fallback: Uses
less -Rif delta not installed
- Fallback: Uses
Terminal Support Matrix:
| Terminal | Native Splitting | Setup Required |
|---|---|---|
| WezTerm | ✅ Yes | None |
| iTerm2 | ✅ Yes | None |
| Kitty | ✅ Yes | Add allow_remote_control yes to kitty.conf |
| Terminal.app | ❌ No (uses tmux) | brew install tmux |
| Alacritty | ❌ No (uses tmux) | brew install tmux |
| tmux | ✅ Yes | None |
- Session storage:
~/.diff-feedback/sessions/[repo-id]/comments.txt - One session per repo (identified by sanitized repo path)
- Metadata embedded in comment file header (HTML comments)
- Diff generated on-the-fly (not stored)
- No clutter in your repositories
Solution: diff-feedback requires one of the supported terminals: WezTerm, iTerm2, Kitty, Terminal.app (with tmux), Alacritty (with tmux), or tmux. If using Terminal.app or Alacritty, install tmux first: brew install tmux
Solution: Add allow_remote_control yes to your ~/.config/kitty/kitty.conf file and restart Kitty.
Solution: Run diff-feedback first to start a review before using /diff-feedback:address.
Solution: Make some changes first, or check your branch comparison is correct.
The plugin falls back to less -R automatically. For better diff viewing:
brew install git-deltaSolution: Restart Claude Code after plugin installation.
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Test locally (see below)
- Submit a pull request
# Use --plugin-dir flag for development
claude --plugin-dir /path/to/diff-feedback
# Or test installation from local directory
claude plugin install --local /path/to/diff-feedback
# Test in a git repository
cd your-project
bash ~/.claude/plugins/cache/*/diff-feedback/*/scripts/diff-feedback.shMIT License - see LICENSE file for details.
Created by Jeff Woodhull
- Built for Claude Code
- Inspired by code review workflows in professional development
- Uses delta for rich diffs