A diff that keeps up with your hands
Virtualized, syntax-highlighted, unified or side by side. Move with j k, jump files with n p, mark viewed with v, comment with c. Lock files and generated code fold themselves away.
Local-first pull request review for macOS
Every pull request checked out on your own machine. A diff that keeps up with your keyboard. Reviews that survive force-pushes. And an AI that can read your code — but is never allowed to run it.
Free & local · Apple Silicon · Works with the gh login you already have. No account, no telemetry.
1213export async deliver (event:WebhookEvent ) {14const key =idempotencyKey (event)14for (let i =0 ; i <3 ; i++) {15for (const delayof backoff ({ max:5 })) {15const res =await post (event.url, event.body)16const res =await post (event.url, event.body, { headers: {'Idempotency-Key': key } })17if (res.status ===409 )return 'duplicate'18if (res.ok)return 'delivered'19await sleep (delay)}
2021throw new DeliveryError (event.id)}
3132test ('a 409 counts as delivered once',async () => {server.33reply (409 )34expect (await deliver (event)).toBe ('duplicate')})
What's inside
Virtualized, syntax-highlighted, unified or side by side. Move with j k, jump files with n p, mark viewed with v, comment with c. Lock files and generated code fold themselves away.
Each PR is fetched into its own git worktree. Jump to definitions in your editor, grep the whole repo, read the files around the change.
Comments stay local until you submit. If the author pushes meanwhile, Pruse finds your lines again by content and moves them.
From GitHub Dark to Rosé Pine Dawn. Pick one per light and dark mode; the diff colors follow.
Select lines, press a, and ask Claude Code about them. Answers appear only for you — turn one into a draft if it's worth saying, in your own words.
Merge, squash or rebase from the Conversation tab. Pruse tells GitHub exactly which commit you looked at — if someone pushed after you, the merge is refused instead of shipping code nobody reviewed.
Description, checks, reviews and threads in one calm column. Reply, resolve, and jump from any thread to its line in the diff.
Every worktree's changes at a glance. Switch branches, fetch, fast-forward, stage, commit, push and open a PR — with a description the AI can draft for you to edit. Nothing that could lose work: no resets, no force-pushes.
Re-review
Submitting a review pins the exact commit you saw. When the author pushes again — even a rebase — Pruse shows Changed since your review and diffs just that.
The commit you reviewed is pinned in your clone, so rewriting the branch can't make it disappear.
Your old changes are replayed onto the new base first. What the base brought in stays out of your way.
Files you already ticked keep their check — unless their content actually changed.
Principles
Pruse drives the Claude Code you already have, but on its own terms. The agent can read and search the checkout. It can't execute commands, write files or reach the network — enforced from outside, in layers.
The session is created with Read, Grep and Glob. There's no shell, no editor, no web fetch to misuse.
No project settings, hooks, instructions or MCP servers — a malicious PR can't configure the agent that reads it.
Anything that isn't a read inside the checkout is denied — and shown to you, so you see what it tried.
Pruse advertises no terminal and no file writing to the agent. There's nothing to ask for.
gh loginFrom the terminal
$ Opening acme/payments#482 in Pruse… $ pruse inbox REVIEW REQUESTED #482 Idempotent retries for webhooks maya +214 −37 #479 Split ledger writes by tenant theo +88 −12 $ pruse diff # your own uncommitted changes
Free, for Apple Silicon Macs. Everything runs on your machine.
Download Pruse.zipUnzip and drag Pruse.app into Applications.
Pruse isn't notarized by Apple yet, so the first time, right-click it → Open → Open. Or in Terminal:
xattr -dr com.apple.quarantine /Applications/Pruse.appOptional: the pruse command, to open any repo or PR from your terminal.
ln -sf /Applications/Pruse.app/Contents/Resources/app/bin/pruse ~/.local/bin/pruseNeeds git and the GitHub CLI, logged in (gh auth login). Claude Code is optional — without it, Pruse is simply a great diff.
Should a
409still record the attempt? Otherwise the dashboard shows it as never sent.