Pull requests, tasks and parallel agents · on your Mac

You're the reviewer.
Pruse keeps up with you.

Every pull request from all your repositories on one board, and a diff that keeps up with your keyboard. Investigate with Claude Code, turn what it finds into a plan you edit, and hand it back step by step, each in its own worktree. It never runs anyone else's code.

Free & local · Apple Silicon · Works with the gh login you already have. No account, no telemetry.

Go to…⌘K
OpenIdempotent retries for webhooks#482
Conversation 6Files 4Commits Changed since your review Review 2
Filter files  /
src/webhooks
M retry.ts +18
A backoff.ts +64
M handler.ts +41
test
M retry.test.ts +22
All changesSince your review 2 new commits · rebased ✦ Ask
src/webhooks/retry.ts+18
12export async deliver(event: WebhookEvent) {13  const key = idempotencyKey(event)14  for (let i = 0; i < 3; i++) {14  for (const delay of backoff({ max: 5 })) {15    const res = await post(event.url, event.body)15    const res = await post(event.url, event.body, { headers: { 'Idempotency-Key': key } })16    if (res.status === 409) return 'duplicate'17    if (res.ok) return 'delivered'18    await sleep(delay)19  }
youDraftline 16 · not posted yet

Should a 409 still record the attempt? Otherwise the dashboard shows it as never sent.

20  throw new DeliveryError(event.id)21}
test/retry.test.ts+22
31test('a 409 counts as delivered once', async () => {32  server.reply(409)33  expect(await deliver(event)).toBe('duplicate')34})
Try a theme Tokyo Night

Review

Everything a careful reviewer wants.
Nothing that reviews for you.

Every repository, one board

Open Pruse and see what needs you across all your repositories — as cards that say, in a sentence, where each PR stands. Filter, hide drafts, or arrange them on your own board: columns you name, cards you drag, kept on your Mac.

✦

Brief me

A private briefing before you dive in: what the PR does, where to start, the spots worth a close look — and, on a re-review, which open threads look addressed and which don't. It prepares you; the verdict stays yours.

A diff that keeps up with your hands

Virtualized, syntax-highlighted, unified or side by side, whitespace hidden if you like — and images shown before and after. Move with j k, jump files with n p, mark viewed with v and glide to the next file, comment with c.

✎

Drafts that survive new pushes

Comments stay local until you submit. If the author pushes meanwhile, Pruse finds your lines again by content and moves them.

❝

The whole conversation

Description, checks, reviews and threads in one calm column — outdated threads right where they were said. Reply, resolve, and jump from any thread to its line.

Merges that can't surprise you

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.

Re-review

Force-pushed? Rebased?
See only what's new.

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.

What happened
What you read
All changes251lines · 4 files
Since your review3lines · 1 file
Survives force-pushes

The commit you reviewed is pinned in your clone, so rewriting the branch can't make it disappear.

Rebase-aware

Your old changes are replayed onto the new base first. What the base brought in stays out of your way.

Viewed stays viewed

Files you already ticked keep their check — unless their content actually changed.

Parallel work

Agents write in worktrees.
You review as they go.

Give Claude Code a task in its own worktree, keep reviewing, and come back when it needs you. Ask it to put its plan into Pruse: edit the steps beside the chat, start each one, and watch it tick them off. Its changes land in a live diff; committing stays yours.

Worktrees where you keep them

New ones go next to your existing ones — .claude/worktrees/ if you use claude -w. Your checkout hooks run as usual.

Claude Code, your way

Its own tools and your settings. Manual, Accept edits, Plan or Auto; plans shown in full before you approve. Paste screenshots, keep typing while it works (messages queue), and resume any session. Your plan's 5-hour and weekly limits sit in the title bar.

Your dev servers, one click

Scripts from every folder of a monorepo, saved commands, Run all. Logs and the real port for each; running a script in one worktree moves it off the others.

Git that can't lose work

Discard with Undo, stash & switch branches, amend or undo only what isn't pushed, hooks shown live as they run. Commit messages and PR descriptions follow your repo's template and rules.

Your commands

Type / for your repo's commands and skills, Claude Code's own and your plugins' — with their arguments.

Every repo, one keystroke

A rail with every repository you work in — your own labels and colors, badges for agents, reviews and running servers. ⌘1–⌘9, or ⌘K for any repo, worktree or PR. Local repos without GitHub work too.

Tells you when it matters

An agent needs you or finished, a dev server crashed, a review is requested, news on your PR. On your Mac — and on your phone through ntfy when you're away.

A real terminal

Your own shell in every worktree — colors, nvim with its icons, anything interactive. Several per worktree, and they keep running while you look elsewhere.

Tasks

Plan the work.
Hand it over when you're ready.

Write down what needs doing — or have Claude put its plan here — link what comes after what, and give a task to Claude Code in a new branch and worktree, or let the next one start by itself once you've checked the last.

A list or a board

Drag between To do, In progress, In review and Done. The order is your priority.

Linked by you

“Do this after that.” Cards show what they wait for; nothing is picked for you.

Saved per card

Where it runs, the branch, the mode and the first message — /commands too. Start now, or by itself when the one before is reviewed or its agent is done.

Live on every card

Working, needs you or finished, steps ticked off as Claude goes, the branch and what changed — straight from its worktree.

Principles

Other people's code never runs.
Your worktrees are yours.

Pull request checkouts are untrusted: there, the agent can only read and search, and Pruse runs nothing — enforced from outside, in layers. In your own worktrees, Claude Code works as you know it, and asks before every change unless you choose a mode that doesn't.

  1. 01

    Only three tools exist

    The session is created with Read, Grep and Glob. There's no shell, no editor, no web fetch to misuse.

  2. 02

    Nothing loads from the repo

    No project settings, hooks, instructions or MCP servers — a malicious PR can't configure the agent that reads it.

  3. 03

    Every other request is refused

    Anything that isn't a read inside the checkout is denied — and shown to you, so you see what it tried.

  4. 04

    No doors on the client

    Pruse advertises no terminal and no file writing to the agent. There's nothing to ask for.

0servers of ours your code touches
0comments posted without your click
1token, from your existing gh login

From the terminal

One command away
from any repo.

~/code/payments
$ 
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

Get Pruse
for your Mac.

Free, for Apple Silicon Macs. Signed and notarized by Apple. Everything runs on your machine.

Download Pruse.zip

Apple Silicon · macOS

1

Unzip and drag Pruse.app into Applications.

2

Optional: the pruse command, to open any repo or PR from your terminal.

ln -sf /Applications/Pruse.app/Contents/Resources/app/bin/pruse ~/.local/bin/pruse

Needs git. For pull requests, the GitHub CLI, logged in (gh auth login) — local repositories work without it. Claude Code is optional — without it, Pruse is simply a great diff.