A terminal UI for browsing and checking out GitHub PRs.
- gh CLI (authenticated via
gh auth login). sup reads its token and talks to the GitHub API directly;ghitself only runs for checkout and merges into repos that use a merge queue.
curl -sSL https://raw.githubusercontent.com/superultrainc/sup/main/install.sh | bashOr with Go (requires manual shell setup):
go install github.com/superultrainc/sup@latestIf using go install, add this to your ~/.zshrc or ~/.bashrc for auto-cd after checkout:
sup() {
local sel dir rc
sel=$(mktemp) || return
SUP_SELECTION_FILE="$sel" command sup "$@"
rc=$?
dir=$(cat "$sel" 2>/dev/null)
rm -f "$sel"
[[ -n "$dir" ]] && cd "$dir"
return $rc
}sup # Show PRs from your GitHub organizations (auto-detected)
sup --mine # Show PRs you're involved in (authored, reviewing, mentioned)
sup 42 # Open PR #42 of the repo you're in
sup acme/web#42 # Open a PR by owner/repo#number
sup web 42 # Repo name or unique part of it (from listed PRs)
sup https://github.com/acme/web/pull/42 # Open a PR by URLTab completion (zsh) suggests PRs from the last listing; sup web <tab> lists just that repo's PRs. install.sh sets it up; otherwise add this to ~/.zshrc after compinit:
source <(sup --zsh-completion)Zero config required - sup automatically detects your GitHub organizations.
Select a PR and press Enter to open it. To check it out locally, pick "Checkout PR" from the ctrl+k palette.
PRs are listed most recently updated first, with drafts at the bottom.
Repo, author/reviewer, status, and free text combine — each one narrows the list further.
p/Psteps through the repos present in the loaded PRs; the cycle passes through an unfiltered position to clear it.#namein the filter box (/) matches a repo exactly.Escclears every active filter at once.
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
g |
Go to top |
G |
Go to bottom |
space |
Preview pane: the list narrows to the left and the selected PR's Conversation tab shows on the right. ctrl+d / ctrl+u or the mouse wheel scroll it, clicking it opens the full PR view. Needs a terminal at least 100 columns wide |
/ |
Filter PRs (prefix # repo, @ reviewer, ! author) |
s / S |
Cycle status filter (forward / back) |
p / P |
Cycle repo filter (forward / back) |
a |
Filter to your PRs |
r |
Filter to your review requests |
o |
Open PR in browser |
O |
Open all PRs needing review in browser |
c |
Copy PR link to clipboard |
v |
Full PR view: conversation (description, checks, reviews, comments) and a syntax-highlighted diff with review threads inline |
d |
Open the PR view on its diff (Files changed tab) |
m |
Merge PR: pick squash / merge commit / rebase, delete the branch, or enable auto-merge |
A |
Approve PR (with y/n confirm) |
D |
Request changes — opens $EDITOR for body |
M |
Comment on PR — opens $EDITOR for body |
W |
Convert PR to a draft, or mark a draft ready for review (with y/n confirm) |
X |
Close PR (with y/n confirm) |
? |
Toggle full help overlay |
ctrl+k |
Command palette: type to find any action, enter runs it (works in the PR view too) |
q / Esc |
Quit |
Terminals don't pass Cmd to TUI apps, so to use Cmd+K map it to ctrl+k in your terminal. Ghostty: keybind = cmd+k=text:\x0b. kitty: map cmd+k send_text all \x0b.
v opens a full-screen view of the selected PR, laid out like GitHub's PR page. tab / shift+tab or 1–4 switch tabs:
- Conversation: the description, then a timeline of comments, reviews, pushed commits, and review threads (resolved ones folded), ending with a merge box (review, checks, conflicts). Reviewers, assignees, and labels sit in a sidebar on wide terminals.
- Files changed: syntax-highlighted diff with word-level change highlights and review threads inline under their lines, plus a file tree on wide terminals. Lockfiles and very large diffs start collapsed.
- Commits: commits grouped by day.
- Checks: every check on the latest commit, failures first.
| Key | Action |
|---|---|
j / k, ctrl+d / ctrl+u, space |
Scroll |
/ |
Search the current tab (enter keeps it, esc cancels or clears) |
[ / ] |
Previous / next item (Conversation, Commits) or file (Files) |
n / N |
Next / previous search match; without a search, next / previous review thread (Files) |
s |
Cycle layout: auto → split → unified |
w |
Toggle line wrapping |
x |
Collapse / expand the current file |
r |
Request or remove reviewers (type to filter, space toggles, enter saves) |
m |
Merge (↑/↓ method, b delete branch, a auto-merge, ! admin bypass when allowed) |
d |
Jump to Files changed |
R |
Reload |
esc |
Back to the list |
A, D, M, W, X, o, and c work from here too.
The mouse works too: click a tab to switch, click a file in the tree to jump to it, and scroll with the wheel. In the list, click a PR to select it and click it again to open it. Hold Option (or Shift, depending on your terminal) to select text.
Images in descriptions and comments render inline. Terminals with the kitty graphics protocol and Unicode placeholders (kitty, Ghostty, Rex) get full-resolution images; others get a truecolor half-block preview. Detection is automatic; set SUP_IMAGES=kitty or SUP_IMAGES=blocks to force one.
PRs open instantly once cached. In the background, sup warms every listed PR (nearest the cursor first), keeps a disk cache in ~/.cache/sup/prs, and refreshes what's open. A PR is only refetched when its updatedAt changes, and its diff only when the head commit does.
| Variable | Description | Default |
|---|---|---|
SUP_ORG |
Override org detection (comma-separated) | auto-detected |
SUP_DEV_DIR |
Override repo location search | auto-detected |
SUP_IMAGES |
Image rendering: kitty or blocks |
auto-detected |
Repos are automatically found in: ~/Development, ~/dev, ~/projects, ~/code, ~/src, ~/repos, ~/github, ~/git, ~