Difit
A lightweight command-line tool that spins up a local web server to display Git commit diffs in a GitHub-like Files changed view
Install / Use
/learn @yoshiko-pg/DifitREADME

difit is a CLI tool that lets you view and review local git diffs with a GitHub-style viewer. In addition to clean visuals, comments can be copied as prompts for AI. The local code review tool for the AI era!
⚡ Quick Start
Try it first
npx difit # View the latest commit diff in WebUI
Install and use
npm install -g difit
difit # View the latest commit diff in WebUI
Enable use from AI agents
npx skills add yoshiko-pg/difit # Add the Skills to your agent
Installed skills include:
difit: ask the user for a review through difit after code changesdifit-review: review a specific diff or PR and launch difit with findings or explanations preloaded as comments
🚀 Usage
Basic Usage
difit <target> # View single commit diff
difit <target> [compare-with] # Compare two commits/branches
Single commit review
difit # HEAD (latest) commit
difit 6f4a9b7 # Specific commit
difit feature # Latest commit on feature branch
Compare two commits
difit @ main # Compare with main branch (@ is alias for HEAD)
difit feature main # Compare branches
difit . origin/main # Compare working directory with remote main
Special Arguments
difit supports special keywords for common diff scenarios:
difit . # All uncommitted changes (staging area + unstaged)
difit staged # Staging area changes
difit working # Unstaged changes only
GitHub PR
difit --pr https://github.com/owner/repo/pull/123
--pr mode fetches patches by running gh pr diff --patch under the hood.
It also imports unresolved inline review threads from the PR so they appear as startup comments in difit.
Authentication is handled by GitHub CLI:
- Login once (recommended):
gh auth login - Token-based auth (CI/non-interactive): set
GH_TOKENorGITHUB_TOKEN
GitHub Enterprise Server
For Enterprise Server PRs, authenticate GitHub CLI against your Enterprise host:
gh auth login --hostname YOUR-ENTERPRISE-SERVER- Or set
GH_HOST=YOUR-ENTERPRISE-SERVERwithGH_TOKEN/GITHUB_TOKEN
Initial Comments
You can inject initial review comments when launching difit:
difit --comment '{"type":"thread","filePath":"src/example.ts","position":{"side":"new","line":10},"body":"The background for this change is..."}'
--comment is repeatable and accepts either a single JSON object or a JSON array. Supported types:
thread: create a new thread at the specified diff positionreply: add a reply to the latest existing thread at the same diff position
If the same comment already exists, difit skips importing it.
Stdin
By using a pipe to pass unified diffs via stdin, you can view diffs from any tool with difit.
# View diffs from other tools
diff -u file1.txt file2.txt | difit
# Review saved patches
cat changes.patch | difit
# Compare against merge base
git diff --merge-base main feature | difit
# Review an entire existing file as newly added
git diff -- /dev/null path/to/file | difit
# Explicit stdin mode
git diff --cached | difit -
Stdin mode is selected with intent-first rules:
-explicitly enables stdin mode- If positional arguments (
<target>/[compare-with]),--pr, or--tuiare provided, difit treats the command as Git/PR/TUI mode and does not auto-read stdin - Auto stdin detection applies only when no explicit mode is selected and stdin is a pipe/file/socket
⚙️ CLI Options
| Flag | Default | Description |
| --------------------- | --------- | -------------------------------------------------------------------------- |
| <target> | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
| [compare-with] | - | Optional second commit to compare with (shows diff between the two) |
| --pr <url> | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
| --comment <json> | - | Inject initial comments (repeatable; accepts a JSON object or array) |
| --port | 4966 | Preferred port; falls back to +1 if occupied |
| --host | 127.0.0.1 | Host address to bind server to (use 0.0.0.0 for external access) |
| --no-open | false | Don't automatically open browser |
| --mode | split | Display mode: unified or split |
| --tui | false | Use terminal UI mode instead of WebUI |
| --clean | false | Clear all existing comments and viewed files on startup |
| --include-untracked | false | Automatically include untracked files in diff (only with . or working) |
| --keep-alive | false | Keep server running after browser disconnects (stop manually with Ctrl+C) |
💬 Comment System
difit includes a review comment system that makes it easy to provide feedback to AI coding agents:
- Add Comments: Click the comment button on any diff line or drag to select a range
- Edit Comments: Edit existing comments with the edit button
- Generate Prompts: Comments include a "Copy Prompt" button that formats the context for AI coding agents
- Copy All: Use "Copy All Prompt" to copy all comments in a structured format
- Persistent Storage: Comments are saved in browser localStorage per commit
Comment Prompt Format
src/components/Button.tsx:L42 # This line is automatically added
Make this variable name more descriptive
For range selections:
src/components/Button.tsx:L42-L48 # This line is automatically added
This section is unnecessary
🤖 Calling from Agents
You can install the following Skills to work with difit from AI agents.
npx skills add yoshiko-pg/difit
Installed skills include:
difit: ask the user for a review through difit after code changesdifit-review: review a specific diff or PR and launch difit with findings or explanations preloaded as comments
After code edits or automated review, the agent can start the difit server with the appropriate skill.
🎨 Syntax Highlighting Languages
- JavaScript/TypeScript:
.js,.jsx,.ts,.tsx - Web Technologies: HTML, CSS, JSON, XML, Markdown
- Shell Scripts:
.sh,.bash,.zsh,.fish - Backend Languages: PHP, SQL, Ruby, Java, Scala, Perl, Elixir
- Systems Languages: C, C++, C#, Rust, Go
- Mobile Languages: Swift, Kotlin, Dart
- Infrastructure as Code: Terraform (HCL)
- Others: Python, Protobuf, YAML, Solidity, Vim script
🔍 Auto-collapsed Files
difit automatically identifies and collapses certain files to keep your view clean:
- Deleted files: Removed files are auto-collapsed since they don't require close review
- Generated files: Auto-generated code is collapsed by default. This includes:
- Lock files (
package-lock.json,go.mod,Cargo.lock,Gemfile.lock, etc.) - Minified files (
*.min.js,*.min.css) - Source maps (
*.map) - Generated code:
- Orval (
*.msw.ts,*.zod.ts,*.api.ts) - Dart (
*.g.dart,*.freezed.dart) - C# (
*.g.cs,*.designer.cs) - Protobuf (
*.pb.go,*.pb.cc,*.pb.h)
- Orval (
- Frameworks:
- Ruby on Rails (
db/schema.rb) - Laravel (
_ide_helper.php) - Gradle (
gradle.lockfile) - Python (
uv.lock,pdm.lock)
- Ruby on Rails (
- Generic generated files (
*.generated.cs,*.generated.ts,*.generated.js) - Content-based detection:
- Files containing
@generatedmarker - Files containing
DO NOT EDITheader - Language-specific generated headers (Go, Python, etc.)
- Files containing
- Lock files (
🛠️ Development
# Install dependencies
pnpm install
# Start development server (with hot reload)
# This runs both Vite dev server and CLI with NODE_ENV=development
pnpm run dev
# Build and start production server
pnpm run start <target>
# Build for production
pnpm run build
# Run tests
pnpm test
# Run typecheck, lint, and format
pnpm run check
pnpm run format
Development Workflow
pnpm run dev: Starts both Vite dev server (with hot reload) and CLI server simultaneouslypnpm run start <target>: Builds everything and starts production server (for testing final build)- Development mode: Uses Vite's dev server for hot reload and fast development
- Production mode: Serves built static files (used by npx and production builds)
🏗️ Architecture
- CLI: Commander.js for argument parsing with comprehensive validation
- Backend: Express server with simple-git for diff processing
- GitHub Integration: GitHub CLI (
gh pr diff --patch) for PR patch retrieval - Frontend: React 18 + TypeScript + Vite
- Styling: Tailwind CSS v4 with GitHub-like dark theme
- Syntax Highlighting: Prism.js with dynamic language loading
- Testing: Vitest for unit tests with co-located test files
- Quality: oxlint, oxfmt, lefthook pre-commit hooks
📋 Requirements
- Node.js ≥ 21.0.0
- Git repository with commits to review
- GitHub CLI (
gh) for--prmode
📄 License
MIT
