I spend most of my working day in a terminal, and pull requests are the thing that keeps yanking me out of it. Someone asks for a review, CI goes red, a comment lands - and each time the answer is the same little ritual: alt-tab to the browser, find the tab, wait for GitHub to paint, squint at a diff, click into the Actions logs, scroll. By the time I’m back in my editor I’ve lost the thread of whatever I was doing.
perq is my attempt to stop doing that. It’s a terminal dashboard for the PRs you care about, built with Textual, with Claude Code available to summarise a PR, suggest review comments, answer questions, or investigate a failing check.
uv run perq
Keeping track of reviews
You open perq and you see three lists: the PRs you’ve opened, the ones waiting on your review, and the ones you’re otherwise tangled up in (assigned, mentioned, commented on). Each row tells you what you actually want to know at a glance - CI state, review decision, the diff size, how many comments, when it last moved.
Arrow-key to a PR, hit enter, and you’re in the detail view: five tabs for the overview, the conversation, code-review threads, individual CI checks, and the full diff.
The dashboard refreshes every sixty seconds without moving your cursor. It notifies you about changes such as CI passing, a new approval, or a review request.
Asking Claude about a PR
The part I use most isn’t the dashboard - it’s the four things Claude Code can do once you’re looking at a PR:
ssummarise - what this PR does, the key changes grouped by area, how risky it is, and anything worth asking the author.Rreview - an advisory code review with a verdict, findings tied tofile:linewith severities, and design and security notes.?ask - type any question about the PR and get an answer grounded in the diff and the conversation.ddiagnose - on a failed GitHub Actions check, perq pulls the job logs and Claude tells you what failed, the root cause, a suggested fix, and whether it smells flaky or real.
The response streams into a modal as it’s generated. Nothing is posted to GitHub automatically. Press c to copy the output or escape to dismiss it.
When you do want to act, perq can write to GitHub too - a to approve, x to request changes, c to leave a comment, C to close.
Technically
The whole thing hangs off a single GraphQL query. One round-trip to GitHub fills all three dashboard sections, and the detail view is a second query plus the raw diff. perq authenticates by shelling out to gh auth token, so if you’ve run gh auth login it just works (it falls back to $GITHUB_TOKEN).
I’m pleased with how the notifications turned out. Every refresh is diffed against the previous snapshot, and only transitions raise a toast - CI failing or recovering, a review decision changing, comment counts going up, a new review request appearing. Absolute states never fire, so startup is silent and a PR simply showing up on your dashboard doesn’t nag you. If more than five things changed at once, they collapse into a single “dashboard updated” line instead of a wall of toasts. On macOS, when the terminal isn’t focused, the same events become desktop banners via osascript.
The Claude integration is a thin wrapper around the CLI. perq spawns claude -p --output-format stream-json --max-turns 1, feeds it a self-contained prompt, and parses the streaming JSON for text deltas as they come. The prompts ship everything Claude needs inline - the PR metadata, description, conversation, review threads, and the diff (truncated if it’s enormous) - and explicitly tell it not to use any tools. For diagnosis, perq fetches the Actions job logs, strips GitHub’s per-line ISO timestamps, and tails them to fit. It’s one turn, no agent loop, no tool calls: a fast, bounded, read-only ask. The streaming subprocess runs in its own process group so a cancel actually kills it and its children.
There’s a command palette too (ctrl+p): paste any GitHub PR URL or type a owner/repo#123 shorthand to jump to a PR that isn’t even on your dashboard, or fuzzy-search the ones that are.
It’s about 1,800 lines of Python - Textual for the UI, httpx for GitHub, and the gh and claude CLIs for auth and intelligence. Python 3.12+, managed with uv.
I still use the browser for merging, branch management, project boards, and the notifications inbox. perq covers the review work I keep returning to throughout the day.
Try it
It’s on github.com/tuckerwales/perq. You’ll need Python 3.12+, uv, the gh CLI logged in, and the claude CLI on your PATH for the summaries and reviews.
uv run perq
Press s on a PR to request a summary.