Skip to content

Reviewing

Every operation is a named action: a menu item with a macOS-native key equivalent, rebindable through the keys map in configuration. The mouse works everywhere, but nothing requires it. The window's toolbar carries the common ones for mouse days, and ⇧⌘H returns to the home screen; sheets confirm with ⌘↩ (Return types a newline in the body).

Default Action
⌘↓ / ⌘↑ next / previous change
⌥⌘↓ / ⌥⌘↑ next / previous hunk
⇧⌘↓ / ⇧⌘↑ next / previous file
⌘F find in the diff (the native find bar)
⌥⌘T unified ↔ split view
⌥⌘C full-file context: the whole file with the hunks overlaid
⌥⌘← fold / unfold the current hunk
⇧⌥⌘← / ⇧⌥⌘→ collapse / expand all hunks
⌥⌘S cycle syntax coloring: syntax + tints → tints only → plain
⌥⌘W wrap long lines
⌃⌘S toggle the changed-files sidebar

Syntax highlighting runs one tree-sitter pass per side per hunk, so multi-line constructs color correctly on both the old and the new side of a change. Fourteen languages ship built in.

In split view the two sides sit in parallel panels; the panel your caret is in decides which side a comment targets.

Comments

Default Action
⌘↩ comment on the caret's line or the selection
⌘E edit the draft under the caret
⌘⌫ delete the draft under the caret
⇧⌘X dismiss ↔ restore (kept, never submitted while dismissed)
⌥⌘↩ suggest a change: the selection's code prefilled in a ```suggestion fence
⌘R reply — to the host thread or the draft conversation at the caret
⌘L the review navigator: every draft and thread, Return jumps
⌃⌘E edit the current file locally (see below)

A selection must map onto one side, GitHub-style: a changed block anchors RIGHT (the deletions are simply not part of that side), a deletions-only selection anchors LEFT. Drafts show as in the gutter with the note inline; existing host threads show as .

Dismissed is not deleted: the verdict travels with the review — it is the information the other side of a conversation needs most — but a dismissed comment is never submitted.

Editing locally

⌃⌘E opens the file under the caret in your editor, in a local checkout of the branch under review — at the caret's line when that line exists in the file (a deletion opens the file without one).

The checkout comes from the clone you point at in configuration: if the branch is already checked out there — in the clone itself or a worktree you made — that one is used and left alone; otherwise prchum creates a worktree of its own beside its state, fetching the request's head when the branch is not local yet. Only the worktrees prchum created are ever removed, and only when the request has merged, closed, or vanished.

A git comparison needs no clone: it already is a checkout, so the file opens right there.

Submitting

⇧⌘↩ opens the submit sheet on a pull-request session; ⌥⌘A opens it with Approve preselected and ⌥⌘R with Request changes — the sheet still confirms either way. It shows the counts, the event picker (Comment / Approve / Request changes), the summary, and an explicit warning for orphaned comments, which are never submitted. Nothing is sent before this confirmation.

Submission is retry-safe: the app records exactly what the host accepted, even when a later step fails, so a retry sends only what is still pending — never a duplicate.

Exporting

⇧⌘E writes your notes to a file: Markdown grouped by file, or — with a .json name — a self-contained review-exchange document (see Sources) embedding the patch.

From the terminal

Prchum is meant to be reached for the way git diff is, so it takes the same shapes of argument:

prchum                  # what git diff would show
prchum --staged         # what git diff --staged would show
prchum main             # this branch against main
prchum v1..v2           # a range
prchum change.diff      # a patch or exchange file
prchum 418              # request 418 of this repository's origin
prchum owner/repo#418   # an explicit repository

git prchum does the same, because git treats any git-* on the PATH as a subcommand — and it runs from the repository's top level, so it means the same thing in a subdirectory as it does at the root.

To make it the command you reach for, give git an alias:

git config --global alias.d '!git prchum'

Then git d opens what git diff would have printed, and git d main compares against a branch.

Both commands have man pages: man prchum, man git-prchum, and git prchum --help, which git answers from the same page.

On macOS the command is installed from Prchum → Install Command-Line Tool…, or with make install-cli from a checkout. On Linux the packages install it.

It used to be called pr

Which was a mistake: pr is POSIX's paginator, it has a man page, and /usr/local/bin comes before /usr/bin on the default PATH — so installing it there quietly shadowed a standard tool. If you have the old one, rm /usr/local/bin/pr puts things back.