Skip to main content

gh-prs

A simple CLI that lists the GitHub pull requests you need to act on, powered by the gh CLI. No TUI — just readable, colored, grouped output.

By default it shows only the PRs that need your attention:

  • Needs your review — PRs where your review is requested and still needed: once the PR is approved (mergeable without you) it is hidden unless you are personally on the requested-reviewers list (not just through a team), and it is also hidden while changes are requested (the author is reworking it). Drafts are excluded (not ready for review), as are conflicting PRs (a review would be staled by the rebase). A PR also resurfaces here when your previous review was dismissed.
  • New commits since your review — PRs you already reviewed (approved, requested changes, left a review comment, or had your review dismissed by a push) whose head commit is no longer the one you reviewed — new commits or a rebase the author forgot to re-request review for; the case that is otherwise easy to miss. Hidden while the PR is conflicting (more commits are coming anyway). A PR never appears both here and in Needs your review: whenever it qualifies there (e.g. a re-request after a comment-only review), that section wins; a re-request after your still-standing approval keeps it here.
  • Ready to ship — PRs you created that are approved, with CI green (or no checks) and no conflicts.
  • CI failed — PRs you created where a check is failing.
  • Conflicts to resolve — PRs you created that have merge conflicts, drafts included (the base moved underneath your draft; resolving early is cheaper than later).
  • Waiting on review — time to nudge — PRs you created that are still awaiting review and have gone quiet longer than the staleness threshold (3 days by default). There's nothing for you to do — the code is fine, CI is green, no conflicts — but it has been sitting long enough that pinging the reviewers is warranted. Any new activity (a comment, a commit) resets the clock, so it won't nag while there's discussion. Change the threshold with --stale-after 5d or the stale_after config setting; set it to null in the config to turn the nudge off entirely.
  • Drafts gone quiet — finish or mark ready — draft PRs you created that have sat untouched longer than the same staleness threshold. A fresh draft is deliberately parked work-in-progress and stays out of the way (failing CI included — red checks are expected while iterating), but one that has gone quiet is probably forgotten: finish it, mark it ready, or close it. Shares the Waiting on review threshold and off switch.

Prerequisites

  • GitHub CLI (gh) installed and authenticated (gh auth login)
  • Python 3.14+
  • uv

Install

With Homebrew:

brew install denrou/gh-prs/gh-prs

Or from PyPI:

uv tool install gh-prs

Or straight from the repository:

uv tool install gh-prs --from git+https://github.com/denrou/gh-prs.git

As a gh alias

gh alias set --shell prs 'gh-prs'

Then simply run:

gh prs

Usage

gh prs              # PRs that need your attention (default)
gh prs -c/--created # every open PR you created
gh prs -r/--review  # every PR awaiting your review
gh prs -a/--all     # every PR you are involved with
gh prs --json       # raw JSON (for scripting)
gh prs --count      # print only the PR count for the selected view
                    # (attention count by default; handy for status bars)
gh prs --no-color   # disable colored output

gh prs snooze 123           # hide a PR (of the current repo) for 24h
gh prs snooze 123 -R o/r    # …of another repo (owner/repo)
gh prs snooze 12 34 --for 3d  # …several at once, for a custom window (12h, 3d, 1w)
gh prs unsnooze 123         # remove a PR's snooze
gh prs snooze               # with no arguments: list snoozed PRs

gh prs --stale-after 5d  # flag your PRs (review-waiting or draft) quiet this long

--count exits non-zero when fetching fails, so status-bar scripts can tell "no PRs" apart from "the lookup broke". With -c or -r it uses a fast count-only query (well under a second) — ideal for frequent polling.

Snoozing

Sometimes a PR legitimately needs someone's attention but not yours — say a dependency bump routed to you through a team when a teammate is the natural reviewer. gh prs snooze <pr>... hides one or more PRs from the default attention view; gh prs snooze with no arguments lists what's currently snoozed, and gh prs unsnooze <pr>... brings a PR back early. Reference a PR the way gh does: a bare number, scoped by -R/--repo owner/repo (or the repository of the current directory when omitted), or a full URL. Bare numbers are resolved through gh, so Enterprise hosts work too.

A snooze lasts 24 hours by default (--for 12h/3d/1w to change) and is also tied to the PR's state at snooze time: its head commit and the reasons it needs your attention. Whichever comes first — the window elapsing, new commits landing, or those reasons changing (say a review lands and a PR that was waiting is now yours to merge) — resurfaces the PR with a warning and drops the snooze, so you acknowledge a specific state for a bounded time, never future work. The attention view prints how many snoozed PRs it withheld on stderr — hiding is visible, never silent. Explicit views (-c/-r/-a), --count for those views, and --json ignore snoozes entirely, so scripts and exact counts are unaffected.

Snoozes are stored locally in ~/.config/gh-prs/snooze.json (honors $XDG_CONFIG_HOME); they never touch the PR on GitHub.

Configuration

Settings live in ~/.config/gh-prs/config.json (honors $XDG_CONFIG_HOME), separate from the snooze store. It's optional — every setting has a default. Today the only key is stale_after, the silence threshold for the Waiting on review and Drafts gone quiet nudges:

{ "stale_after": "5d" }

Accepts the same duration syntax as --for/--stale-after (12h, 3d, 1w), or null to disable both nudges. The --stale-after flag overrides the file for a single run. An unreadable or invalid config only warns and falls back to the 3-day default, so a typo never breaks the tool.

For status bars, prefer the uv tool install binary (~/.local/bin/gh-prs) over uv run inside the repo — it skips ~250 ms of project resolution per invocation.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gh_prs-0.9.0.tar.gz (49.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gh_prs-0.9.0-py3-none-any.whl (26.7 kB view details)

Uploaded Python 3

File details

Details for the file gh_prs-0.9.0.tar.gz.

File metadata

  • Download URL: gh_prs-0.9.0.tar.gz
  • Upload date:
  • Size: 49.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for gh_prs-0.9.0.tar.gz
Algorithm Hash digest
SHA256 e9c1dba0d797e80f8cef11cd674203611db7337c57065750038f27aeb6c37c31
MD5 fa3f2e6ee69845ac20d28e805cf4371d
BLAKE2b-256 cf0f590bc44b9f59e315fe294fe6af85fa4260f7dc003bd37c1104827a668326

See more details on using hashes here.

Provenance

The following attestation bundles were made for gh_prs-0.9.0.tar.gz:

Publisher: python-publish.yml on denrou/gh-prs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gh_prs-0.9.0-py3-none-any.whl.

File metadata

  • Download URL: gh_prs-0.9.0-py3-none-any.whl
  • Upload date:
  • Size: 26.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for gh_prs-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3661084cace159b58f9547c2e1ffbf7a2d9ba449c9df6975497c633aa518f859
MD5 4f0c2d5e86e5b5f9f78300ebc36700b4
BLAKE2b-256 3dc98aee1cb52cfd8ec95871a0c8fd9c303ab4416b156a865d18fc7674ee8ab5

See more details on using hashes here.

Provenance

The following attestation bundles were made for gh_prs-0.9.0-py3-none-any.whl:

Publisher: python-publish.yml on denrou/gh-prs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.11.0

2 files

0.10.0

2 files

0.9.2

2 files

0.9.1

2 files

This release

0.9.0 This release

2 files

0.8.0

2 files

0.7.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page