Skip to main content
CODEMUXManual

The Pull Requests Page

A triage list of every pull request across the repos you have open — grouped by what needs you, searchable, with tabs for the ones you're reading.

The Review pane follows one request — the one on the branch you're standing on. The Pull Requests page is the other half: every request across every repository you have open in Codemux, grouped by what actually needs you.

It opens in the main area with the sidebar still beside it, like Automations, Devices, and Usage; the workspace you were in stays loaded underneath, so nothing reloads when you come back. While it's open the title bar hides the workspace tabs and panel controls, and the sidebar footer's destinations are replaced by a single ← Back button.

To leave, click Back, pick a workspace or start a new agent in the sidebar, or press Esc. With a request open in the detail panel, the first Esc closes the panel and the second leaves the page. Esc is ignored while your cursor is in a text field or a dialog is open, so a half-written review is never lost to a stray keypress. Opening another of these pages replaces this one.

On a phone-width window, or when there is no workspace yet, the page takes the whole window instead and draws its own back arrow.

Getting There

  • Sidebar footer — the pull-request icon (one of the default footer pins).
  • Command palette — the Pull requests command (also matches pr, prs, review, merge request, incoming).
  • pr mode in the palette — type pr and the palette narrows to loaded requests only, ranked by number, title, repo, and author. pr 285 puts #285 first. Selecting one opens the page at that request.
  • Clicking a request URL anywhere in the app — see In-app links.
  • Incoming rows in the Review pane, and the Open button on a toast.

The Badge

The sidebar icon carries a count, capped at 9+, and its tooltip reads "Pull requests — 3 waiting on you".

It counts exactly two things:

  1. A request where a review is requested from you.
  2. One of your own requests whose checks are failing.

Nothing else. Opening the page marks those as seen, so the badge drops to zero while you're actually looking at them, and only comes back when something new arrives.

Triage Groups

GroupWhat lands here
Needs your reviewA review is requested from you. Its header icon is ember.
YoursYou opened it.
WatchingEverything else in repos you have open.

Review-requested beats authorship, so your own PR that someone asked you to review still sorts to the top group.

Watching is collapsible and folded by default — captioned "Repositories you have open but aren't involved in." — and when opened its rows are denser, one line each. It opens by itself when it's the only group with anything in it. Rows are newest-first within each group.

Searching and Filtering

The search field accepts free text plus filters:

FilterValues
is:draft, ready
ci:failing, passing, pending, none (with aliases like red and green)
author:a handle

The placeholder shows the shape: Search pull requests, or is:draft ci:failing. Beside the search field, a dropdown switches between Open, Closed, and All, and a refresh button reloads the list. ↑ / ↓ move through the rows and ↵ opens one.

The footer reports coverage honestly — "14 repositories · 1 local-only · 2 unreachable". Local-only repositories have no remote, so there is nothing to ask a host about: they're counted but never queried, and never reported as unreachable. When every repository you have open is local-only, the list says "No repositories with a remote." When every reachable repository fails, it says "Couldn't list pull requests for 3 repositories." and gives each one's error — pointing at Source Control sign-in only when an error looks like an authentication problem.

The list renders at most 200 rows, saying so explicitly: "Showing the first 200 of 341."

Rows

Each row leads with the request's state icon (open, draft, merged, or closed), then #N / !N and the title, a CI icon (a spinner while checks run, a red ✕ or green check once known, a dim dot before the rollup lands, nothing on drafts), a Draft chip, a state label (changes requested, ready to merge, merged, closed), and +adds −dels. A second line shows the author, a host mark, the repo, "checked out" when a workspace has it, and the age.

Hover or focus a row for Check out (creates a worktree) or Switch (jumps to the workspace that already has it).

The list holds still while you use it

A background poll that wants to re-sort the list won't, as long as your pointer or keyboard focus is in it. Rows the poll wanted to move get a small ember dot instead — "Updated — the list will re-sort when you're done" — so the row under your cursor is always the row you click.

A failed refresh raises a strip — "The latest refresh failed · showing the list from 6m ago" with Retry — and leaves every row in place.

Refresh cadence and rate limits

The list refreshes every minute while you're on the page; the sidebar badge and toasts check every 5 minutes. All of it pauses while Codemux is hidden or idle for 6 minutes.

If GitHub refuses a request because your account's API budget is spent, Codemux stops asking everywhere at once — page, badge, and toasts — instead of retrying into the limit. The strip reads "Rate limit reached · showing the list from 6m ago, resuming at 14:12", Retry stays disabled until then, and the page refreshes on its own when the budget refills. GitLab repositories keep refreshing.

Reading Several at Once

Clicking a row opens it in a detail panel on the right; drag the divider to resize it. The panel's top is a tab strip of the requests you've opened. Each tab has its own status dot, middle-click closes it, and a + picker ("Open a pull request…") offers everything loaded. The strip also carries Open in browser and a close button ("Close (Esc)") that hides the panel — its tabs come back with the next request you open.

The tabs work from the keyboard: Tab lands on the active one, ← / → move focus, Enter or Space switches to the focused request, and Delete or Backspace closes it.

The detail column below is the same surface as the Review pane — header, Summary / Timeline / Code, action bar. See Reviewing & Merging.

Two things worth knowing:

  • Drafts here are separate from the panel's. The same request can have two independent half-written reviews — one in the workspace panel, one on this page — and neither clobbers the other.
  • A merged request stays readable in its tab even after it drops out of the Open filter.

A GitHub /pull/N or GitLab /-/merge_requests/N URL for a repository you have open routes to this page instead of your browser. Trailing /files, /commits, query strings, and fragments are all tolerated.

Three ways out of that:

  • Shift-click the link.
  • Settings → Source Control → Links → "Open pull request links in the browser".
  • Have no project open for it — then it goes to the browser with a toast explaining why: "Opening this pull request in the browser — acme/web isn't a project you have open in Codemux."

Self-hosted instances are only intercepted if you've declared them under Self-hosted servers. Buttons already labelled Open in browser are never intercepted.

Toasts

Exactly two events raise a toast, app-wide:

  • Review requested · acme/web#285 — the title as the description, with Open.
  • CI failed on acme/web#285 — the failing check's name as the description, with Fix, which hands that specific check to an agent. It falls back to Open when the check name can't be fetched.

Neither fires from the snapshot carried over from your last session, neither re-fires while the condition persists, and a request that arrives already-red is never announced — so opening Codemux in the morning doesn't bury you in toasts about things you already knew.