all writing

Why I Built nittle

I got tired of reviewing my agent's work in a PR and copying every comment back by hand, so I built a local diff viewer that sends the review straight to the agent. Five months and two renames later, it's nittle.

5 min read

nittle in dark mode reviewing a working tree: a file tree on the left and a TypeScript diff with flagged changes and a moved-code marker
On this page

I started building nittle in June 2026 because of one loop I couldn’t stand anymore. An agent would finish a change, I’d open a PR so I had somewhere decent to read it, leave my comments there, and then copy every single one of those comments back into the agent by hand. File, line, what I wanted different. Again for the next comment. Again for the next round.

What I actually wanted was smaller than a PR. Find the line, highlight it, put my review on it, and have a reliable way to send all of that back to the agent that wrote it.

A 75-second walkthrough of a review round in nittle.

The Loop

The first version was called loupe, and it did one thing. It opened your local diff in the browser, let you comment on lines, and compiled those comments into a prompt you pasted into the agent. I had Opus 4.8 build it in a single unattended session and wrote that up at the time. In that post I called it a throwaway I’d never maintain. That aged poorly.

Copying comments as a prompt was the seed. Once I had it, I kept running into the next annoyance and fixing it. Pasting got old, so the agent got a local MCP server and could pull the review itself. Then I wanted it to answer me on the comment instead of in the terminal, so it got threads. Then I wanted to know which comments it thought it had handled, so it could mark them addressed and ask me to look again.

It changed when I review, too. I see and comment on agent changes before the PR process even starts now. By the time a teammate opens the PR, I’ve already been through several rounds with the agent, and they’re reading something I’ve already pushed back on instead of the first draft.

What It Does Now

As of v0.34.0, the core is still the PR shape. You comment on a line, a range or a whole file, and tag it nit, issue, question or praise. A comment can carry a suggested change, and the agent gets the original and suggested text as structured data rather than prose it has to interpret.

nittle in light mode with a comment on a rate-limit return in src/server.ts and a suggested change that adds a Retry-After header, rendered as a diff
A suggested change rides along with the comment, rendered as a diff.

Return Feedback sends the review back three ways: over the local MCP server, by paste, or on stdout with nittle --wait, which works with any agent that can run a shell command. The agent replies in the thread, marks comments addressed and requests a re-review. Only I resolve. Comments from earlier rounds carry over, and the ones whose code moved out from under them show up as orphaned instead of silently vanishing.

nittle in dark mode with a comment on an added line in src/server.ts saying prefer a trusted proxy header, x-forwarded-for is spoofable
A line comment, before it goes back to the agent.

For a big change, the triage tells me where to start. The scorecard bands size, tests, public API, dependencies and hotspots from fixed rules, so the same diff gets the same score every time. There’s no model involved, and that’s on purpose. I want the thing telling me where to look to be boring and predictable.

nittle's review scorecard: size low, tests high with five untested files listed, public API high, dependencies and hotspots medium, flags high
The scorecard. Same diff, same score, every time.

Review order puts dependencies first and each source file right before its test. Lockfiles and generated files collapse, and moved code gets linked to where it came from, even when it moved to another file.

nittle's review order sidebar: package.json first, then source files grouped by folder, then tests, then generated files and lockfiles
Review order: dependencies first, each source file before its test.

Go to definition, references and hover work inside the diff for TypeScript, JavaScript, C#, Python, Go, Rust, Vue and Svelte, as long as you’ve installed the language server.

nittle showing hover docs for createLimiter on an added line, pulled from the TypeScript language server
Hover docs on an added line, from the TypeScript language server.

The rest is the stuff that makes it a daily tool. Vim keys with counts and chords, so 10j and gd do what you’d hope. nittle browse reviews a whole tree instead of a diff. nittle setup wires it into Claude Code, Codex, Cursor, Gemini CLI, VS Code, Windsurf, OpenCode, Zed and Copilot CLI. Reviews are plain JSON in ~/.nittle. It’s one MIT licensed binary for macOS, Linux and Windows, and the only thing it needs is git.

On macOS and Linux:

curl -fsSL https://nittle.dev/install | sh

On Windows, with PowerShell 7:

pwsh -c "irm https://nittle.dev/install.ps1 | iex"

Where Review Is Going

I firmly believe we should still review the code agents write. How we review it, though, my opinion on that is changing fast, and I think review itself is going to change with it.

What I want is to drop into a codebase and quickly find the pieces that matter: the workflows, the inputs, the outputs, the transformations in between. Then put my own style on what the agent did. Line comments are where nittle started, but they’re not where I think review ends up.

I don’t know what that tool looks like yet. The scorecard, the review order and code navigation are my first guesses at it, and I hope nittle keeps moving in that direction.

The Names

It’s had three names in five months, which is kinda a lot for something this small.

loupe was the first, and it collided with too much. The npm name belongs to chaijs/loupe, another agent-review CLI already uses it, and GNOME’s image viewer is called Loupe.

diffle came next, diff plus -le. It held up until moritzwilksch/diffle launched on Show HN with the same name, and every search turned into “which diffle?”

nittle is nit plus -le, a tool for nitpicking diffs. The rename doesn’t leave anything behind. The first run of nittle moves an old diffle install over in one pass: reviews, the install dir, PATH, agent plugins and MCP configs.

Coming from diffle?

Run any nittle command once and it migrates your old install. The migration guide covers what moves and how to retry.

The Changelog

The highlights, pulled from the full changelog.

  1. v0.1.0 Jun 2, 2026 loupe

    First release. Comment on a local diff in the browser and compile the comments into a prompt to paste. Built by Opus 4.8 in one session.

  2. v0.6.0 Jun 9, 2026

    Comment tags (nit, issue, question, praise), word-level diff highlights and the first keyboard shortcuts.

  3. v0.9.0 Jun 24, 2026

    Browse mode, for reviewing a whole codebase instead of a diff.

  4. v0.12.0 Aug 29, 2026

    Durable review records and a local MCP server. The agent can read the review itself, so no more pasting.

  5. v0.13.0 Sep 1, 2026

    Threaded replies, live review sync while the agent works, and reopening a review after approval.

  6. v0.17.0 Sep 22, 2026 diffle

    Renamed to diffle. Rebuilt on Svelte and shipped as a single self-contained binary with install scripts and self-update.

  7. v0.24.0 Sep 29, 2026

    setup wires it into your coding agents and asks before it writes anything.

  8. v0.28.0 Oct 9, 2026

    The deterministic scorecard, review order, moved-code detection and a since-last-review diff.

  9. v0.29.0 Oct 19, 2026 nittle

    Renamed to nittle, with a one-pass migration. Vim keymap with counts and chords, --wait, show for single commits, and go to definition through language servers.

  10. v0.30.0 Oct 20, 2026

    Suggested changes in comments, search across every changed file, and Python, Go, Rust, Vue and Svelte language servers.

  11. v0.34.0 Oct 30, 2026

    Current release. Mostly accuracy fixes and launch prep, including the walkthrough above.

It’s on GitHub, the docs are at nittle.dev, and I’d genuinely like to hear how other people are reviewing what their agents write, because I haven’t figured it out yet.

written by

Cody Williamson

Senior Software Engineer