GitHub

Pull requests, issues, repos and notifications in the panel

palupdated 2026-10-27DeveloperIn pal's registry󱔓Menu bar: Pull requests, Issues, Notifications󰀐Several accounts

Open in pal

In pal's registry: the button shows it in pal, which asks before installing; the command does the same from a terminal. This page can't see what your pal has installed.

GitHub: Pull Requests: Mine, Review requested and Merged, with the checks and the review decision on each row
Pull Requests: Mine, Review requested and Merged, with the checks and the review decision on each row
GitHub: The pane a pull request opens with: the body, the latest comments and reviews, every check by name
The pane a pull request opens with: the body, the latest comments and reviews, every check by name
GitHub: Notifications by reason, newest first; the first row is the unread count
Notifications by reason, newest first; the first row is the unread count
GitHub: Search GitHub: repositories, issues, pull requests and users for one query
Search GitHub: repositories, issues, pull requests and users for one query
1 of 4

What it does

Your pull requests, issues, repositories and notifications, and a search over all of GitHub. Signs in through the gh CLI or a token.

  • Your pull requests, the ones waiting on your review and what merged this week, with checks and review state; mute one, or ignore it until it changes
  • A pull request or issue in full: the body, latest comments and reviews, every check, who approved
  • Your repositories, your organisation's and your stars; cmd+e opens the local clone in the editor
  • Notifications by reason; enter opens the thread and marks it read, space in the popover reads it first
  • Search all of GitHub as you type, your own work first; is:pr, author: and label: work as on GitHub
  • Create an issue or a repository, check out a branch or merge, without leaving the keyboard

Palettes 5

  • Pull Requestsprslistrefreshes every 5 min

    Yours, the ones waiting on your review, and what merged lately.

    • ↵Open the pull request
    • ⌘CCopy its URL
    • ⌘⇧OCheckout the branch
    • ⌘BCopy the branch name
    • ⌘⇧KOpen the checks
    • ⌘⇧FOpen the files changed
    • ⌘⇧RMark a draft ready for review
    • ⌘⇧MMerge
    • ⇥All, Mine, Review requested, Merged
  • Issuesissueslistrefreshes every 5 min

    Assigned to you, mentioning you, opened by you; Create issue.

    • ↵Open the issue
    • ⌘CCopy its URL
    • ⌘⇧XClose it
    • ⇥All, Assigned, Mentioned, Created
  • Repositoriesreposlistrefreshes every 5 min

    Yours, starred, and your organisation's recently pushed.

    • ↵Open on GitHub
    • ⌘EOpen the clone in the editor
    • ⌘OOpen the clone's folder
    • ⌘⇧CCopy the clone URL
    • ⌘POpen the path typed in the bar
    • ⌘CCopy the URL
    • ⇥All, Mine, Starred, Organisation
  • Notificationsnotificationsliverefreshes every 1 min

    Unread, by reason; opening one marks it read.

    • ↵Mark read and open
    • ⌘⇧RMark as read
    • ⌘⇧AMark all as read
    • ⌘CCopy its URL
  • Search GitHubsearchinput

    GitHub's search syntax over issues, pull requests, repositories and users, what you are involved in first.

    • ↵Open what was found
    • ⌘CCopy its URL
    • ⇥Everything, Issues and PRs, Repositories, Users

Actions

  • OpenThe pull request, issue, repository, notification or profile on GitHub; a notification is marked read first.↵
  • Copy URL⌘C
  • Checkout branchgh pr checkout in the clone under repos_root.⌘⇧O
  • Copy branch name⌘B
  • Open checks⌘⇧K
  • Open files changed⌘⇧F
  • Copy referenceowner/repo#n.
  • Mute / UnmuteKeeps an open pull request or issue out of the lists, the counts and the bar popovers; the Muted filter lists them to unmute.⌘M
  • Mark ready for reviewOn a draft.⌘⇧R
  • MergeWith merge_method; asks first.⌘⇧M
  • Close issueAsks first.⌘⇧X
  • Create issueA form: repository, title, body.
  • Open in editorThe local clone, in code or the system opener.⌘E
  • Open folder⌘O
  • Copy clone URLssh or https, per clone_protocol.⌘⇧C
  • Copy owner/name
  • Open issues
  • Open pull requests
  • Open pathThe path typed in the bar (the repository row's argument) on the default branch; a form when picked without it.⌘P
  • Create repositoryA form: owner, name, description, private.
  • Mark as readWithout opening.⌘⇧R
  • Mark all as readAsks first.⌘⇧A
  • Open profileA user found by Search.↵
  • Copy login⌘C
  • Open repositories

Settings

Extension, [extensions.github]

token
empty secret

A personal access token (repo, notifications, read:org). Leave empty to use the gh CLI's login.

default_org
empty text

An organisation whose recently pushed repositories are listed, and an owner the Create repository form offers.

repos_root
empty path

Where your clones live (<root>/<name> or <root>/<owner>/<name>): enables Checkout on a pull request and Open in editor on a repository.

clone_protocol
SSH (git@github.com:...) select

What Copy clone URL copies. One of ssh, https.

merged_days
7days number

How far back the Merged list of Pull Requests reaches.

merge_method
Merge commit select

How the Merge action merges. One of merge, squash, rebase.

Defaults shown. Change them in pal's settings window or in the config file.

The README

Everything GitHub does, key by key, from the extension's own README.md

GitHub

One extension, five palettes, one sign-in: your pull requests, issues, repositories and notifications as rows, and GitHub's own search typed into the panel. Enter opens the thing on GitHub; the other actions copy, check out, merge, close or mark read without leaving the keyboard.

palette id kind what Enter does
Pull Requests github-prs indexed, 5 min opens the pull request
Issues github-issues indexed, 5 min opens the issue
Repositories github-repos indexed, 5 min opens the repository on GitHub
Notifications github-notifications live, 1 min marks the thread read and opens it
Search GitHub github-search input opens what was found

Pull Requests lists yours (is:open author:@me), the ones waiting on your review (review-requested:@me), and yours merged within merged_days, sectioned Mine, Review requested, Merged; the filter dropdown has the same three plus All and Hidden. The row is the title with owner/repo #n under it, a state dot (green open, grey draft, violet merged, red closed) and tags for the checks (checks ✓ / ✗ / …), the review decision (approved, changes requested, review), draft and conflicts, then the updated date. The palette opens with the detail pane: the body, the latest comments and reviews, and under them the repository, author, branch, size, every check by name, who approved, who asked for changes, reviewers, labels and dates (fetched when the cursor rests).

Issues is what is assigned to you, mentions you, or you opened, in that order, an issue in two lists listed once. Rows carry the first two labels, the comment count and the updated date; the pane the body, the latest comments and the milestone. Create issue at the top is a form (repository, title, body) whose submit opens the new issue.

Mute (cmd+m on a pull request or issue row, m in the bar popovers) keeps one out of every list, the bar counts and the popovers until you unmute it. Ignore until it changes (cmd+shift+i on a row, i in the popovers) does the same until anything about it moves: an update (a push, a comment, a review, an edit), its checks, its review decision or its mergeability, which then bring it back by themselves. The Hidden filter of either palette lists both, sectioned Muted and Ignored until it changes, with Unmute or Show again on the row. It is kept in pal's storage, not on GitHub, and a hidden thing keeps its notifications. Either ends on its own once it has nothing left to do: an id a fetched list shows merged or closed is dropped on that listing, and one no list has carried for thirty days is dropped too, each drop logged.

Repositories is yours (owner or collaborator, by push date), your default_org's recently pushed, and your starred ones, sectioned so. Rows show the description, tags for private, archived and the language, the stars and the push date; the pane adds forks, open issues, the default branch, the clone url and the local clone when one sits under repos_root. Create repository is a form (owner, name, description, private).

Notifications is every unread thread, sectioned by reason (Review requested, Mentioned, Assigned, Your threads, Comments, State changed, CI, Security, Subscribed), newest first inside one; the first row is the unread count. Enter marks the thread read and opens it, so the count is honest when you come back. The pane shows the pull request's or issue's text and latest comments behind a thread about one.

Search GitHub takes GitHub's syntax as you type: free text, repo:owner/name, is:pr, author:login, label:bug. Results come nearest first, each once: Involved (involves:@me), Your organisations (your account and your organisations), Repositories (yours first), Everywhere, Users. A query naming repo:, org: or user: skips the organisations tier. Your cached pull requests and issues are matched loosely too, so a typo still finds them; they show at once, at the top of Involved. Filters Everything, Issues and PRs, Repositories, Users. Each tier is its own request, sent together; a keystroke waits 300 ms for the next before asking, each tier's rows join below as soon as the tiers above them are in, and the search row's sweep runs until the last lands (about 2 s). Other people's pull requests come without the checks, review and conflicts tags, which GitHub computes per result; yours carry them from the cached lists.

Keyboard

keys action where
enter Open (Open on GitHub, Open profile) everywhere; a notification is marked read first
cmd+c Copy URL (Copy login on a user) everywhere
cmd+shift+o Checkout branch: gh pr checkout in the clone an open pull request with a clone under repos_root and gh on PATH
cmd+b Copy branch name pull requests
cmd+shift+k Open checks pull requests
cmd+shift+f Open files changed pull requests
cmd+shift+r Mark ready for review a draft pull request
cmd+shift+m Merge, with merge_method; asks first an open, mergeable pull request
cmd+shift+x Close issue; asks first an open issue
cmd+m Mute / Unmute (Show again on an ignored one): out of the lists, counts and bar popovers an open pull request or issue
cmd+shift+i Ignore until it changes: out of them until it is updated, its checks or review move an open pull request or issue
cmd+e Open in editor (code, else the folder) a repository with a local clone
cmd+o Open folder a repository with a local clone
cmd+shift+c Copy clone URL (clone_protocol) repositories
cmd+p Open path: the path typed in the bar's field (the row's argument, src/main.rs or docs) on the default branch; a form when picked without it repositories
cmd+shift+r Mark as read, without opening; every marked row when rows are marked notifications
cmd+shift+a Mark all as read; asks first notifications
cmd+k Copy reference (owner/repo#n), Copy owner/name, Open issues, Open pull requests, Open repositories the rest, without a shortcut
cmd+i The detail pane (open by default in Pull Requests and Issues)

Marked rows (⌘-click, ⇧-click for a range, ⇧↑/⇧↓) take every action above at once except Checkout branch, Open path and Mark all as read: several PRs or issues open in one go, the copies land one per line, mute, unmute, merge, close and mark ready go through them all (the question says how many). The PR, issue and notification popovers mark the same way: Enter opens each marked row, c copies them, m mutes (or, in notifications, marks read) them all, i ignores them until they change. Space in a popover previews the row under the cursor: the pull request's or issue's text and latest comments (a notification's too, when it is about one), with Enter and its c/m keys still working there.

Setup

Sign in one of two ways: install the gh CLI and run gh auth login (the extension asks gh auth token at most every five minutes), or set the token setting to a personal access token with repo, notifications and read:org (the config file holds a keychain: reference, never the value). With neither, each palette is one hint row saying how to sign in; Enter on it opens the token settings. A token GitHub rejects is the same row with GitHub's message.

Every request has a 10 s timeout. Pull Requests, Issues and Search are one GraphQL request each; Repositories and Notifications are REST with ETags, so a re-list that changed nothing costs no rate limit. The rows are kept in the extension's storage, so a restart still has them and an outage shows the last ones; while the rate limit is exhausted a hint row at the top says when it resets.

Settings, [extensions.github]:

key type default what
token secret (none) A personal access token; empty means the gh CLI's login.
default_org text (none) The organisation whose recently pushed repositories are listed, and an owner the Create repository form offers.
repos_root path (none) Where your clones live (<root>/<name> or <root>/<owner>/<name>); enables Checkout branch and Open in editor. ~ is expanded.
clone_protocol ssh / https ssh What Copy clone URL copies.
merged_days number (days) 7 How far back the Merged list reaches.
merge_method merge / squash / rebase merge How the Merge action merges.

prs item settings, [bar.items."github/prs".settings]:

key type default what
review_requests boolean false Count the reviews asked of you on the Pull requests strip; off, the strip is your own pull requests and a review sits in the popover alone.

Each bar item is hidden at zero; show = "always" under its [bar.items."github/<id>"] keeps the glyph on the strip anyway, muted, with an honest tooltip and the same popover (docs/config.md).

The bar item Pull requests is hidden at zero. When it has work, the strip is the bucket summary of your own pull requests: red blocked (conflicts, failing checks or changes requested), amber active (checks running or review required), green ready to merge, muted waiting. A review asked of you is someone else's work: it is in the popover's last section, and on the strip as a blue count only with review_requests. Its popover opens the same story: sections in that order, each row the PR title, owner/repo#n, the specific state badge and age. Six rows fit; the rest is "and N more in pal". ↑/↓ (or k/j) move the cursor, a click focuses a row, Enter opens it on GitHub, c copies its URL, r refreshes, and p opens the full Pull Requests palette.

The bar item Issues is hidden at zero. The strip counts assigned, mentioned and issues opened by you; the popover uses the same buckets in that order. Rows show the issue title, owner/repo#n, labels, comment count when present, and age. Six rows fit; the rest is "and N more in pal". ↑/↓ (or k/j) move the cursor, a click focuses a row, Enter opens it on GitHub, c copies its URL, r refreshes, and p opens the full Issues palette.

The bar item Notifications shows the unread count as a badge (hidden at zero), refreshed every five minutes and on show, wake and a network change. Its popover is the inbox at a glance: the unread threads grouped by repository (newest repository first, a count per repository), each with a colour rail for the subject's type (pull request and issue green, release blue, discussion violet, commit grey, checks amber, security red), its title, a badge for the reason GitHub gives (mention red, review violet, assigned blue, CI and state amber, security red, yours and subscribed grey, and the rest) and its age. Every thread is a row; the popover scrolls. The ring is the cursor: ↑/↓ (or k/j) move it, a click on a thread puts it there. Keys: Enter (or o) marks the thread read and opens it on GitHub, m marks it read and the list redraws with the count (with threads marked by ⌘-click, ⇧-click or ⇧↑/⇧↓, m marks all of them read at once), a (or ⌘⇧A) marks everything read and the popover reads "All caught up", p opens the Notifications palette, ⌘C copies the thread's URL. On a second account the title carries its name ("4 unread (Work)").

What it does not do

  • Review from the panel: approving, commenting and requesting changes happen on GitHub; the pane only shows them.
  • Repositories beyond yours, your organisation's recent ones and your stars: anything else is found through Search.
  • Notifications older than what GitHub returns as unread; read ones are not listed.
  • Checkout without a clone: Checkout branch needs the repository already cloned under repos_root and gh on PATH.

Platforms

macOS and Linux, the same on both. Open in editor uses code when it is on PATH, else the system opener on the folder.