Revue
DocumentationReviewing the diff

Reviewing the diff

How a pull request opens in Revue, how to read its changes file by file or commit by commit, and how to keep track of what you've already seen.

Open a pull request and you land on its Files tab: every changed file in one scroll, with the file list on the left and the review threads on the right. Mark files viewed as you go, jump between changes with the keyboard, and switch to just the commits that are new since your last review whenever the author pushes fixes.

The pull request header#

The header takes two lines. The first:

  • Its state (Open, Draft, Merged or Closed; a draft's has a dashed outline and the draft icon), any ticket keys from the title as chips (see Jira), and the title.
  • The pencil: Edit the title, description, reviewers, labels… (see Reviews, approvals, merging and editing).
  • The number (#12): opens the pull request on its service. o does the same.
  • The star: adds it to your favorites (see The pull request list, tabs and search).
  • New commits: appears when the author pushed after you opened the pull request. Click it to load them (see When new commits arrive).
  • Open in your tools: buttons to open the pull request's code in your editor, terminal or file manager, and to create a worktree of its branch in your local clone. See Clones, worktrees and opening in your tools.
  • Copy link and Copy Revue link (a link that opens the pull request in Revue, or on the web for someone without it).
  • Refresh (Ctrl+R).
  • Review: opens the submit dialog, with your draft count (Ctrl+Enter).

On the right of the first line, next to the buttons, is the review summary: Approved, Changes requested or Review required, followed by the avatar of everyone who reviewed or was asked to. The mark on each avatar says where they stand: ✓ approved (grey when it was on an earlier commit), ✗ asked for changes, a clock when you're waiting for their review, a speech bubble when they only commented. Hover an avatar to see their name, what they said and when, whether it was on an earlier commit, how many reviews they gave and the first line of the last one.

The second line shows where it is: the service's icon and the repository (click it to open it on the base branch, see Repositories and branches), the author, and the branch it comes from → the branch it merges into. Click a branch name to browse the repository on it (middle click: in a new tab); the copy button next to the first copies its name. Then come the lines added and removed, and on the right:

  • Checks: how many passed out of all, and how many failed; hover it for the state, click it to open the Checks tab.
  • Conflicts: the pull request doesn't merge cleanly. Hover it to see which files and lines conflict with the base branch; click it to jump to the first.
  • When it was last updated.

The second line also shows its labels (up to five, then +2: hover it for the rest), followed by Labels (Add labels when it has none). Click it for the repository's labels, the pull request's first and ticked; click one to put it on or take it off. Each click is sent right away, with no dialog to save, and the pull request reloads. Type to narrow the list and press Enter to toggle the first match. If the service refuses, the list says why and the labels go back to what they were. GitHub, Forgejo, Codeberg and Gitea only: Bitbucket has no labels.

On macOS, use Cmd where this page says Ctrl, except Ctrl+↑ / Ctrl+↓.

Advanced: a pending review on GitHub

If you started a review on GitHub's website (or a reply went into one) and didn't submit it, its comments are hidden from everyone else. Revue shows a banner, You have a pending review on GitHub with 3 comments, with:

  • Submit…: submit it, together with your drafts in Revue;
  • Discard: delete its comments from GitHub without publishing them;
  • Open on GitHub.

The tabs of a pull request#

Press a number key to switch tabs. The numbers follow the tabs' positions from left to right.

TabWhat's in it
FilesThe changes, described on this page. Shows the number of changed files.
ConversationThe description, comments, reviews and threads in one timeline. A red badge counts unresolved threads. See Comments, threads and drafts.
CommitsThe pull request's commits. See The Commits tab.
FeedbackEvery review thread in full, the ones waiting on your reply first, with the reviewers' summaries. Shows how many are waiting. See Comments, threads and drafts.
CodeThe source at the pull request's head, to browse and search. See Browsing code.
ChecksCI runs and statuses on the head commit, with green and red counts; the earlier commits' and earlier runs too. See Reviews, approvals, merging and editing.
Slack threadsSlack threads that link to the pull request (only with Slack connected). See Slack.
StackThe stack of pull requests this one is part of (only when it's in one). See Stacked pull requests.

On a pull request you opened, Feedback comes first (then Files, Conversation, Commits, Code, Checks), and if threads are waiting on your reply it opens on Feedback. On everyone else's, the order is as in the table, so 1 is Files.

Hold Alt (Cmd on macOS) to see each tab's number and the shortcuts of the buttons on screen.

In a separate window#

Conversation, Feedback and Code can each open in a window of their own, to read them beside the diff, on another screen for example. On one of those tabs, click the window button at the right end of the tab bar, or press Shift+W. The threads panel does the same with the button in its header or Alt+T (Option+T on macOS).

The window shows the same pull request, not a copy: a reply, a resolved thread or a refresh shows in both windows at once, and clicking a thread there shows it in the diff here. Meanwhile the main window leaves it out: the threads panel isn't beside the diff, and the tab says it's in a separate window, with Show the window and Bring it back here.

To bring it back, close its window, click Back to the main window in its title bar, or press the same shortcut again. The threads panel's button in the diff toolbar, and t, bring the panel back too. Closing the pull request's tab closes its windows.

Not in the browser version, which has the one window.

The Files tab#

The bar above the diff holds everything that changes what you see:

  • Range: All changes, Since your review, Since last visit, and the commit picker. See Choosing what to review.
  • The file count, and for a range, which commits it spans (a1b2c3d…e4f5g6h · 4 files).
  • Viewed progress: 3/12 viewed with a bar that fills as you mark files viewed. It turns green when you're done.
  • Previous / next change (p / n).
  • Fold all files (z), Unfold all files (Shift+Z) and Fold viewed files, unfold the rest (Shift+V).
  • Review one file at a time (f).
  • Hide whitespace-only changes (w).
  • Split view / Unified view (s).
  • Show / Hide threads panel (t), and on the left, Show / Hide changed files (b).

Split and unified#

Split shows the old and new file side by side; Unified shows removed and added lines in one column. Either way, Revue highlights the exact words that changed within a line, and long lines wrap. When a line is split over several lines (or several are joined into one), only what really changed is highlighted, not the moved line breaks and indentation.

Press s to switch for the pull request you're in. Settings → Diff → Diff style sets what pull requests open with (Split by default).

Moving around the diff#

KeyDoes
j / kNext / previous file.
n / p, or Ctrl+↓ / Ctrl+↑Next / previous change. At the last one, a note says pressing again wraps around.
] / [Next / previous unresolved thread.
vMark the current file viewed and go to the next one (or unmark it).
cComment on the selected lines.
Ctrl+FFind in the diff.
Ctrl+PGo to a changed file.

Ctrl+Alt+Shift+↓ / ↑ also step through changes, as in JetBrains IDEs. Single-letter keys don't work while you're typing in a text field.

Folding files and showing more lines#

Click a file's header to fold or unfold it. The header shows the file's path (renames as old → new), comment counts (orange for open threads, green for resolved ones), +12 −3, and a tag like Added, Deleted, Renamed or Renamed + modified. On the right:

  • Open in the code editor: your code editor at the file's first change (not on a deleted file).
  • Show all lines: the whole file instead of just the changed parts. You can also expand the hidden lines between two changes from the diff itself.
  • Comment on this file: a comment on the file as a whole.
  • Viewed: the checkbox for this file.
  • The copy button copies the file's path.

Right-click a line for Reveal in code (the Code tab at that line), Reveal in code editor (your code editor at that file and line, in the same folder Open in editor opens) and, when you right-click a name, Go to definition of …. See Browsing code and Language servers.

Press e to open your code editor at the line you're on: the first of the selected lines, else the line you last clicked, else the top line on screen. A conversation's header has the same button as a file's, opening its file at its line. In the Code tab, right-click the code for Reveal in code editor (the open file at the cursor); the header's Open in editor opens it there too.

Selecting lines to comment on#

Click a line number, then Shift+click another, or drag along the line numbers, and a bar offers Comment (c). Dragging from the + button that appears on a line starts the comment right away. See Comments, threads and drafts for writing, drafts and suggestions.

One file at a time#

Press f (or Review one file at a time) to show a single file. A bar shows File 3 of 12 with Previous (k), Next (j) and Mark viewed (v), which marks the file and moves to the next one.

Next change (n, Ctrl+↓) past a file's last change opens the next file with changes at its first one; Previous change (p, Ctrl+↑) before a file's first change opens the previous one at its last. Files with no changed lines (a rename, a binary file) are passed over.

Your choice is remembered for each pull request. Settings → Diff → Layout sets the default (One scroll or File by file).

Hiding whitespace changes#

Press w to hide changes that only touch whitespace (indentation, trailing spaces). This applies to every pull request until you press it again.

The changed-files panel#

The panel on the left lists the changed files, in the same order as the diff. Click a file to jump to it; click a file that's already open on screen to fold it.

Each row shows the file's status (added, removed, renamed, modified) and type icons, its name, your drafts on it (pencil), its threads (speech bubble, orange while any are open), and a Mark viewed checkbox on hover. Viewed files fade. The files on screen in the diff are highlighted, and an eye marks the one you're reading.

Above the list:

  • Filter files…: type part of a path.
  • Go to changed file (Ctrl+P): a quick-open list of the changed files.
  • Find in files (Ctrl+Shift+F): search the changed files or the whole repository (see Browsing code).
  • Show as list / Show as folder tree.
  • Collapse all folders / Expand all folders (in the tree).
  • Show ignored files: lists files you've told Revue to ignore (see Generated and ignored files).
  • Follow the diff's scroll: keeps the list scrolled to the files you're reading. Click again to stop.

Right-click a file for Mark as viewed / Mark as not viewed and Reveal in code. Right-click a folder to mark every file in it at once.

Drag the panel's edge to resize it; Revue remembers the width. Settings → Diff → Changed files picks the folder tree or a flat list as the default.

Advanced: panel defaults
SettingDefaultChanged by
Files panel shownOnb (remembered for every pull request)
Folder treeOnSettings → Diff → Changed files (the panel's button switches it for the pull request on screen)
Follow the diff's scrollOnThe panel's button (remembered)
Show ignored filesOffThe panel's button (remembered)
Threads panel shownOnSettings → Diff → Threads panel; t for the pull request on screen

When a pull request opens, folders whose files are all viewed start collapsed. Folder chains with a single subfolder show as one row (src/ui).

The threads panel#

The panel on the right lists the pull request's review threads. Its All tab shows every thread; Visible shows the ones on the files on screen in the diff. Show resolved and Show from others narrow it down further. Press t to show or hide it, and Alt+T (Option+T on macOS) to open it in a separate window (see In a separate window). Settings → Diff sets which tab it opens on and whether resolved threads and others' threads show. Replying, resolving and drafts are on Comments, threads and drafts.

Viewed files#

Mark a file viewed when you're done with it: its header's Viewed checkbox, the checkbox in the file list, or v. A viewed file folds away and its header turns faintly green; the progress bar counts it.

Viewed files stay folded the next time you open the pull request. If the file changes after you marked it (new commits, a force push), it's unviewed again and opens, so you never skip a change.

Use Fold viewed files, unfold the rest (Shift+V) to put the diff back to "only what's left to review".

Per service: where viewed marks are kept
  • GitHub: on All changes, marks sync with GitHub's own "Viewed" checkboxes, both ways. GitHub clears a mark when its file changes. If syncing fails, Revue says Couldn't sync viewed state and keeps your mark.
  • Bitbucket Cloud and Forgejo: there's no API for viewed files, so marks stay in Revue.
  • Commit ranges (any service): a mark made while looking at a range belongs to that range's version of the file. It's kept in Revue only.

Revue keeps each mark together with a fingerprint of the file's diff, in the pull request's file under prs/ in Revue's config folder, so marks sync between your computers along with that folder. See Files, sync and settings for one computer.

Choosing what to review#

By default you see All changes: the pull request's whole diff against its base branch. The chips and the commit picker in the range bar narrow it down:

ChoiceKeyShows
All changesaEverything the pull request changes.
Since your reviewrWhat changed since the commit you last reviewed. The chip says how many commits are new, up to date, force-pushed, or new commits not loaded when you reviewed commits that aren't loaded here yet. Shown once you've reviewed the pull request.
Since last visitlWhat changed since you last opened this pull request in Revue, with the number of new commits. Shown when there's something new.
A single commit, / .One commit's changes. , steps to the older commit, . to the newer.
A range of commitsSeveral commits together. Pick them in the commit picker or the Commits tab.

The commit picker#

Click Commits · 7 in the range bar to open the picker. It lists the commits newest first, with an eye on the one you last reviewed and a blue edge on the ones after it.

  1. Click a commit to pick it.
  2. Shift+click another to pick everything between them.
  3. Click Apply selection (or press Enter) to load it. A double click picks and loads one commit in one go.

Closing the picker without applying keeps the range you had.

Merge commits and the base branch#

When you look at a range, Revue hides files that only changed because the base branch was merged in. The range bar says +3 base; hover it for how many files were hidden. A warning sign in the bar means the branch was force-pushed (hover it for how many times).

When the pull request has merge commits, a merge button appears in the bar: Ignore merge commits hides them from the picker and from , / ., and leaves out what they brought in. It applies to every pull request until you switch it back.

Comments in a range#

Threads stay with their code. When you look at an older commit or a range, Revue places each thread on the same line in that version of the file, when the line exists there. Threads that can't sit on a line (outdated, on a whole file, or written on other commits) are shown at the top of their file instead of disappearing.

Comments you write on a range land too: when you submit, Revue carries them forward to the pull request's latest commit. See Comments, threads and drafts.

Going to a thread whose file isn't in the current range (for example with Show in diff → on the Feedback tab) switches to All changes, or to the commit it was written on. If that commit was force-pushed away, Revue shows it anyway, with a banner: Commit … was force-pushed away: it's no longer part of this PR. Shown for the comments written on it. and a Back to all changes button.

Advanced: how the ranges are worked out
  • Since your review starts at the commit of your last review: an approval, a change request, or comments of your own. On GitHub, replying in a conversation doesn't move it, though GitHub records each reply as a review. Hover the chip to see which review and commit it starts at.
  • Since last visit starts at the head commit Revue recorded the last time you opened the pull request. It's saved per pull request, so it follows you between computers that sync Revue's config folder.
  • A range is diffed against the merge base, so Revue keeps only files the pull request itself touches (or that someone commented on). That's what +N base counts.
  • Forgejo: its API doesn't return patches for commit ranges, so Revue diffs the two versions of each file itself.
  • Switching to a range that isn't cached dims the old diff under Loading changes… until the new one arrives.
  • When a range has nothing in it: Nothing new in this range — you're all caught up. or No file changes in this range.

Guide: Review only what changed since your last review#

The author pushed fixes after your review. Look at just those:

  1. Open the pull request. In the list, New commits on its row tells you there's something new.
  2. Press r, or click Since your review · 2 new in the range bar.
  3. Read the changes. Press n to go from change to change, j for the next file.
  4. Press v on each file you're done with: it folds away and the next one comes up.
  5. Check your earlier threads: press ] to jump to the next one still open, and resolve or reply.
  6. Press Ctrl+Enter to submit your review.

Guide: Step through a pull request commit by commit#

  1. Open the pull request and press ,. The oldest commit's changes show.
  2. Read it, then press . for the next commit.
  3. Press , to go back one.
  4. Press a to return to all changes.

Finding text in the diff#

Press Ctrl+F on the Files tab to open Find in diff…. Every match in the diff is highlighted, and the bar says 3 of 17.

  • Enter / Shift+Enter, or the arrows, go to the next / previous match.
  • Esc or Close closes it.

Matches in folded files count too. Typing jumps to the first match in an open file, so it won't unfold your viewed files; stepping onto a match in a folded file opens it (it stays viewed).

On the Conversation tab, Ctrl+F searches the conversation instead, and on the Code tab the open file.

Images, Markdown and other files#

Some files show a preview under their header, above the diff:

FilePreview
Images (PNG, JPEG, GIF, WebP, BMP, ICO, SVG)Before and After side by side, at the same scale. Small images are scaled up so you can see them; pixel art stays sharp.
Fonts (TTF, OTF, TTC)A sample sentence in the font itself.
MarkdownThe rendered page, folded until you click Show rendered.
PDFs, videos, audio, archives, web fontsA card with what Revue can tell about it and Open, which downloads it and opens it in your system's app.

The preview's own buttons choose:

  • where it goes: Show image previews above the code or beside the code (beside needs room; otherwise it's above);
  • the backdrop behind transparent pixels: checkerboard, light or dark;
  • for SVGs, which also have a text diff: Show preview or Source only.

Revue remembers these choices. Files over 25 MB aren't previewed.

Generated and ignored files#

Lock files, generated code, snapshots and the like are rarely worth reading line by line. Revue keeps them out of the way:

  • They start folded in the diff, and unfolding one shows a note instead of its lines: This file matches your ignored files (package-lock.json): its changes are hidden. Click Show changes to see them anyway.
  • The changed-files panel hides them; its Show ignored files button lists them again.
  • Find in Files skips them unless you tick Include ignored files.
  • n / p skip over them.

The patterns live in Settings → Ignored files, one per line, gitignore-style: a name matches in any folder, a path with / matches from the repository root, and * and ** are wildcards. Out of the box the list covers lock files of the common package managers and generated and built files; Reset to default brings it back.

Advanced: default ignored files

The defaults include, among others: package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, bun.lock, deno.lock, Cargo.lock, go.sum, poetry.lock, uv.lock, Pipfile.lock, composer.lock, Gemfile.lock, mix.lock and packages.lock.json, plus generated and built files and game engines' metadata. The full list is in Settings → Ignored files.

"Show changes" lasts until you close the pull request's tab.

The Commits tab#

The Commits tab lists the pull request's commits, newest first. Each row shows its number, author, ticket keys, headline, time, lines added and removed, and a CI dot. Your last review marks the commit you reviewed, and HEAD the latest.

  • Click a commit to review just that commit (the Files tab opens on it).
  • Shift+click another to review the range between them.
  • Click the short hash to copy the full one (SHA copied).
  • Right-click a commit to copy its link, its message, its full or short hash, or open it in the browser.
  • The refresh button at the top reloads only the commits.

When new commits arrive#

Revue never changes the code under you while you read. Every 90 seconds it checks the pull request on screen:

  • New comments, reviews, threads, reactions, state and CI show up right away.
  • New commits light up a New commits pill in the header. Click it (or press Ctrl+R) to load them.

While checks run, the pull request on screen is checked every 20 seconds, so CI results arrive quickly.

Refresh (Ctrl+R or F5) reloads everything. When it's done, a short note says what changed: Up to date, or something like 2 new commits, 3 new comments, checks finished. The Conversation, Commits and Checks tabs also have their own refresh button that reloads only that tab.

Troubleshooting: a pull request doesn't load

If a pull request can't be loaded, Revue shows which one it is, its address, the error, and Retry, Open on GitHub (or the service it's on) and Copy link.

If only part of it loads, a note lists what's missing: Some of this PR didn't load: followed by the parts.

If none of your accounts can open it, signing in to the right service under Settings → Accounts fixes it. See Troubleshooting and FAQ.

Focus mode#

Press F11 for focus mode: only the code under review and its comments, in a column of readable width. b and t still bring back the side panels, and - / = make the column narrower or wider. See Themes, fonts, focus mode and languages.