Your code-review inbox, in the macOS menu bar.
Only the pull requests that need you β everything you're waiting on stays hidden.
GitHub notifications bury the one thing that matters β whose move is it? Pullover answers exactly that. It watches the repos you review in and keeps a short, honest inbox: if a PR shows up, it's waiting on you; if it doesn't, you're free.
- π― Only what needs you. Review requests, re-reviews, replies you owe, mentions β each PR sits under the reason it's there, longest wait first. The ones waiting on somebody else collapse into their own section.
- π§βπ» Your own PRs, too. They surface only when there's something for you to do: changes requested, a comment you haven't answered, red CI, merge conflicts, or approved and ready to merge.
- π Private repos and team requests. Both land in the inbox like anything else β nothing to configure.
- 𧬠Stacks stay together. A stacked PR shows its place in the chain (
4/8), and the stack is drawn as one connected run. - π€ Snooze until new activity. Park a PR and it comes back on its own β a new push, or a reply in a thread you're in.
- π Lives in the menu bar. A quiet count of PRs waiting on you; no Dock icon, no window to manage.
- β‘ Open it from anywhere. One keystroke β
ββ₯Pβ and the inbox is in front of you, whatever app you're in. - β¨οΈ Drive it from the keyboard. Get through the list without reaching for the mouse.
- π Light, dark, roomy or dense. Follows your macOS appearance out of the box, and can pack down to one row per PR when your list gets long.
- β¬οΈ Updates itself quietly. New versions download in the background; Pullover then offers a restart and waits for you to take it.
- π Read-only by design. Pullover never comments, approves, or merges. Clicking a PR opens it on github.com β you act where you always did.
- π€ Talks to your agents. An optional MCP server, local to your Mac, lets Claude Code and other agents ask which PRs are waiting on you and why β and park the ones that can wait β from the same inbox you see, with no extra GitHub token.
Tip
β¬οΈ Download the latest release β one universal build for Apple Silicon and Intel. Signed and notarized, so it just opens.
Drag Pullover into Applications and launch it.
Sign in with GitHub and you're done β out of the box Pullover watches every repo you're involved in. If that's too much, narrow it down to specific repos in Settings.
π οΈ Running from source
Release builds ship with a built-in OAuth client ID, but a from-source build needs its own. Pullover signs you in with GitHub's Device Flow, so it needs an OAuth App. You only do this once, and it takes about two minutes.
- Go to https://github.com/settings/developers and pick the OAuth Apps tab β not GitHub Apps, they're a different thing and won't work here.
- Click New OAuth App and fill in:
-
Application name β
Pullover -
Homepage URL β anything valid; Device Flow never opens it.
-
Application description β optional, and it's what shows on the authorization screen. Suggested:
A menu-bar inbox that shows only the pull requests waiting on you, and hides the ones where you're waiting on someone else. Reads only β it never comments, reviews, or merges anything.
-
Redirect URI β unused by Device Flow.
http://localhostif you want one at all. Leave Allow wildcard matching off.
-
- Tick Enable Device Flow. Easy to miss, and without it sign-in fails with
unauthorized_client. - Leave Expire user access tokens OFF. It hands out an 8-hour token plus a
refresh_token, and Pullover doesn't implement refresh β you'd be silently signed out every few hours, and because the app doesn't tell a 401 apart from a network blip it would sit there showing a stale list and an error instead of sending you back to sign in. - Click Register application, then copy the Client ID. You don't need the client secret β Pullover is a public client and never asks for one.
cp .env.example .envPaste the Client ID into MAIN_VITE_GITHUB_CLIENT_ID. It's read at build time, so restart npm run dev after changing it.
npm install
npm run devClick the menu-bar item, hit Sign in with GitHub. Pullover shows you a short code, copies it to your clipboard and opens the browser β paste it, approve, and the window fills in.
npm testβ unit tests (all the classification logic lives insrc/core/) and screenshot testsnpm run test:visualβ screenshot tests alone. They render components in a real Chromium and compare against committed PNGs, so they neednpx playwright install chromiumonce. Re-record withnpm run test:visual -- -u.npm run typecheckβ type checkingnpm run lintβ lint + formatting check (Biome, config inbiome.json)npm run lint:fixβ apply every safe lint fix and reformatnpm run distβ local build intodist/. It signs with whatever Developer ID sits in your keychain, or not at all if there is none; either way it is not notarized, so a local build moved out ofdist/may needxattr -dr com.apple.quarantinebefore it will launch. Released builds are notarized in CI.
Let your agents check the inbox for you:
"Hey Claude, check Pullover to see what's on my plate right now."
They get the same classified inbox the window shows β what is waiting on you and why β with no extra GitHub token and no rules to re-implement. They can also park a pull request until tomorrow, which is the one thing your GitHub tooling cannot do.
Turn on MCP server in Settings, then hand your client the address it shows:
claude mcp add --transport http pullover http://127.0.0.1:7855/mcpNothing an agent does through Pullover reaches GitHub: it reads, and a snooze is a note on this Mac. To reply or approve, it uses its own GitHub tooling at the link Pullover gives it.
Pullover has no backend. There's no server in the middle, no account to create, no analytics, no telemetry, no crash reporting β the app talks to exactly one place, GitHub's API, straight from your Mac. The optional MCP server is off until you turn it on, and listens to this Mac alone. Your OAuth token never leaves the machine: it's encrypted via the macOS Keychain (Electron's safeStorage) and stored locally. And you don't have to take anyone's word for any of this β the entire app is open source, right here in this repo.
Pullover only ever reads from GitHub β never a comment, a review, or any other write there. The one thing it writes is its own snooze list, in a file on this Mac. Sign-in asks for repo and read:org, the narrowest scopes GitHub offers that can still see pull requests in private repositories and review requests that arrived through a team; if your organisation restricts third-party OAuth Apps, an owner has to approve Pullover under Settings β Third-party Actions Access before those repos show up.


