diffotator opens a Fork-style diff viewer in your browser. Comment on any line, hit send, and the notes land in your Claude Code session as instructions it acts on.
Split diff, folded context, and a comment threaded under the line it's about.
A desktop git client reads a diff beautifully and can't tell your agent anything. A browser review tool can talk to your agent and tends to read badly. This is both halves.
Not just the changed lines. Walk commits, open any file at any revision, and comment on code the diff never touched.
Labels follow Conventional Comments, with a blocking flag and optional suggested code. They arrive as markdown your agent acts on.
A Stop hook opens the review when a turn leaves real changes — so review happens even when you forget to ask for it. Silent otherwise.
One Node process, no dependencies, no config, no service. It reads git and exits when you're done.
The commit graph, and a merge shown against its first parent — what it brought in.
An agent run leaves you fifty changed files. The loop is v to mark a file reviewed and jump to the next unviewed one, c when something looks wrong, repeat. The header tracks how far you've got.
| Key | Does |
|---|---|
| v | Mark viewed and jump to the next unviewed file |
| j k | Next / previous file |
| n p | Next / previous change within the file |
| ↑ ↓ | Move the line cursor |
| c | Comment on the focused line |
| ⌘F | Find in file — the browser's own Find can't see a windowed diff |
| ⌘↵ | Save the comment, or send the review |
The CLI blocks until you submit. Whatever it prints on stdout becomes your agent's next input — so a slash command is the whole integration.
# Code review feedback
Reviewed `checkout` — origin/main...HEAD. 1 comment.
> **1 blocking comment** — these must be resolved.
## `src/checkout/pricing.ts`
### src/checkout/pricing.ts:23 — issue (blocking)
*L23*
```ts
return roundMinor(subtotal + tax - orderDiscount);
```
Order discount is applied after tax here, but the doc comment says the
authority treats it as a post-tax adjustment — pin that with a test.
| You press | Agent gets on stdout |
|---|---|
| Send feedback | The markdown above — grouped by file, blocking comments called out first |
| Approve | The user approved. |
| Close or Ctrl-C | Review session closed without feedback. |
diffotator hook --install adds a Stop hook, so a review opens whenever a turn
leaves real changes. Blocking comments return
{"decision":"block","reason":…} — the agent is sent back to work with your review
as the reason. It stays silent on a clean tree, on small turns, and on a tree you already
reviewed.
Browser diff viewers usually inline the entire review into one HTML document — we measured one session at 17 MB. diffotator sends nothing up front and fetches one file at a time.
Node's standard library and git. No bundle to download, nothing to audit.
Rows are windowed — only what's on screen exists in the DOM.
One git diff per file, on demand. A 54-file list resolves in about 300 ms.
git diff -U1000000 per file, so expanding
folded context costs nothing.Most diff viewers are written against a straight line of ordinary commits. Each of these was a real bug during development, and each one has a test.
| Shape | What goes wrong if you don't handle it |
|---|---|
| Root commit | sha^! has no parent to exclude — the diff comes out reversed |
| Merge commit | sha^! excludes every parent, so the merge shows zero files |
| Rename | numstat compresses the path to {old => new} — renames read +0/−0 |
| CRLF file | a stray carriage return renders at the end of every line |
| File ending in a newline | a phantom empty last line |
| Binary | a blank pane instead of saying "binary" |
| Untracked | missing from the file tree — exactly the files an agent just wrote |
Commits resolve to an explicit two-dot pair against the first parent, or the repo's empty tree at a root. That's also what makes a merge show what it merged in.
| diffotator | Desktop git client | Browser review tool | |
|---|---|---|---|
| Browse commits, branches, stashes | Yes | Yes | Diff only |
| Open any file at any revision | Yes | Yes | No |
| Comment on a line | Yes | No | Yes |
| Comment on untouched code | Yes | No | No |
| Feedback reaches your agent | Yes | No | Yes |
| Commit, push, rebase, resolve conflicts | No | Yes | No |
It's a reviewer, not a git client replacement. Keep using Fork for the things Fork is for.
One command in any git repository.