LOCAL-FIRST · NO ACCOUNT · NO CLOUD · MIT
git diff, reimagined as a review workspace.
diffing is a drop-in replacement for
git diff that opens your changes in an
interactive, local-first browser UI — review,
comment, and hand off to your AI agent without
leaving the terminal.
Auto-detects your terminal: TTY → opens the web UI · pipe/redirect → prints a unified patch.
- package
- diffing
- version
- 0.2.1
- license
- MIT
- bin
- diffing → ./dist/cli.mjs
- default theme
- nord
- ui font
- Geist Mono
- code font
- JetBrains Mono
- themes
- 52
- mcp tools
- 10
- git flags
- 60+ / 12 categories
- default host
- 127.0.0.1
- quotes
- 31
It feels like a tool, not a webpage. Every interaction is scored: 11 synthesized Web-Audio cues, 10 haptic presets, a terminal startup animation, and a vim status bar. Toggle AUDIO and HAPTICS in the status strip.
Sound presets — exact synth from
useHaptics.tsx
Haptic presets — navigator.vibrate
One of 31 curated developer quotes greets you on launch.
try: diffing ·
diffing --help ·
diffing await-review ·
diffing plan submit ·
diffing mcp ·
diffing update (↑/↓
history · Tab complete ·
clear)
52 built-in themes with instant switching, live preview, and dark/light variants. Nord is the default. Press g t to open the theme picker in the app — search, filter by dark/light, arrow-key navigate, Enter to apply, Esc to close.
① Drop-in for git diff
Same revisions, options, and pathspecs. 60+
git-compatible flags across 12 categories. Swap
git diff → diffing and
review in the browser.
② Two output modes, auto-detected
TTY launches the local web server; a pipe or
redirect prints a standard unified patch to stdout.
Force either with --web or
--terminal.
③ Built for human + agent review
Inline comments, plan review, and an AI handoff
protocol over a local HTTP/SSE server and an MCP
server — all on 127.0.0.1, nothing
leaves your machine.
diffing update self-upgrades via npm (or pnpm
if present): npm install -g diffing@latest.
Skills install (for AI assistants)
A GitHub-grade review UI, served from localhost.
- Split and unified diff views (toggle with m); syntax highlighting via Shiki.
-
Inline comments anchored to
+/-lines or whole files, with threaded replies. -
"Apply suggestion" — pull a
```suggestion```block straight into the file and auto-resolve the comment. - Image diff previews for PNG, JPEG, GIF, WebP, SVG, BMP, ICO, AVIF.
- Per-file "viewed" tracking, hunk revert, and per-hunk git-blame history.
- Open any file in your editor (VS Code, Zed, Vim, Neovim, or system default).
- All session state (sidebar, active file, scroll, viewed flags) is reconstructed from the server — no localStorage in the real app.
Native Rust-powered code search across four scopes.
- Files (fuzzy), Text (grep, with regex), Symbols (17 patterns across JS/TS, Go, Rust, Python), All (unified).
- Symbol kinds detected: functions, classes, interfaces, types, enums, variables, structs, impl blocks, traits, methods.
-
Frecency-ranked results backed by SQLite
(
frecency.db,history.db) under the per-repo storage dir; the engine keeps its own filesystem watcher so the index stays fresh during review. - "Changed only" filter restricts results to files in the active diff.
- Graceful degradation: if the native binary isn't available on your platform, search reports unavailable — the server never crashes.
scopes: files · text · symbols · all · symbol patterns: 17 · default 60 results · max 200
Every browser tab updates live.
Edit a file, drop a comment, or have your agent reply — the change streams to every open tab over Server-Sent Events, with a 15-second heartbeat keeping the connection warm.
- Single SSE endpoint:
GET /api/live. -
Named events:
heartbeat(every 15 s),change(working-tree changes, 200 ms debounce),comments(120 ms debounce),plans(120 ms debounce),agent-status,plan-review-status. -
Filesystem watcher on the repo root (recursive,
200 ms debounce; skips
.git,node_modules,dist,.changeset) and on the storage dir forcomments.json/plans.json.
heartbeat 15s · change 200ms · comments/plans 120ms
Hand the review to your AI agent — locally.
Click "Send to agent" in the UI with a verdict (Approve / Request Edits / Reject) and an optional note. Your agent — running in the same repo — picks up the comments, replies inline, applies fixes, and resolves threads. No port to configure: discovery is automatic via a per-repo lockfile.
CLI subcommands (agent-facing, port-agnostic)
-
diffing await-review·diffing reply <id> --body <text>·diffing resolve <id>·diffing comments [--open] [--json]·diffing url -
diffing await-reviewlong-polls until you send your comments (default timeout 570 s). -
Exit codes:
0ok ·2await-timeout ·3no server ·4not found ·5usage.
MCP server — diffing mcp
{ "mcpServers": { "diffing": { "command": "diffing", "args": ["mcp"] } } }
Exposes 10 tools:
await_review, list_comments,
reply_to_comment, resolve_comment,
submit_plan, await_plan_review,
list_plans, get_plan,
reply_to_plan_comment,
resolve_plan_comment.
Skills
npx skills add ahmedragab20/diffing installs
diffing skills into your AI coding assistant.
subcommands · 10 MCP tools · await default 570s · exit 0/2/3/4/5
Get sign-off before you write code.
Submit a markdown implementation plan and block until a human approves, rejects, or requests changes. Comment on specific plan lines or sections; the agent replies and resolves — then proceeds, revises and resubmits, or stops.
-
diffing plan submit <file> [--title T] [--wait]·diffing plan await·diffing plan list·diffing plan show [<id>]·diffing plan reply <id> --body <text>·diffing plan resolve <id>
verdicts: pending · approved · changes-requested · rejected · plan await default 570s
Your code never leaves your machine.
-
Binds to 127.0.0.1 by default (pass
0.0.0.0only to expose to the LAN deliberately). -
Path-traversal protection:
..and null bytes are rejected, paths are URL-decoded and validated to stay inside the repo root; escape attempts return 403. -
Attachments are isolated to the per-repo
attachments/directory. -
No account, no telemetry, no cloud. Project data lives
under
~/.diffing/<repo-name>-<8-char-hash>/; global settings at~/.config/diffing/settings.json. Projects inactive for 14+ days are auto-pruned.
bind 127.0.0.1 · 403 on traversal · auto-prune 14d
| Key | Action |
|---|
Multi-key sequences use an 800 ms buffer. A vim-style status bar shows NORMAL / INSERT depending on whether a text field is focused; all shortcuts are disabled while typing in an input/textarea/contenteditable.