Know which pull requests are waiting on you.
Steward turns your GitHub notifications into one row per pull request, sorted by whether it’s your team’s work and whether its current state needs you. Each row tells you which rule put it there.
Two questions for every pull request
Is the author on one of your teams? Does the pull request need something from you right now? GitHub’s notification reason is one input to the second question, not the answer.
| My teamAuthors on the teams you pick | ExternalEveryone else, bots included | |
|---|---|---|
| Needs my eyesWaiting on your review or reply | A teammate asked for your review, or something changed after you approved.
|
Another team asked for your review, or for your team’s.
|
| FYIUseful to know, nothing owed | Your team’s work, moving along without you.
|
Wider activity you can skim later or skip.
|
Same comment notification, different answer
GitHub sends both of these with the reason comment. Steward checks the reviews and the pull request’s current state, then tells you what the notification means for you.
The rules, in order
Checked from top to bottom; the first match decides. There’s no model and no score, so the same inputs always produce the same row.
| Order | When | Result | The row says |
|---|---|---|---|
| 1 | You opened it, or it’s still a draft | Hidden | No row |
| 2 | You or one of your teams was mentioned | Needs my eyes | “You were mentioned.” |
| 3 | It merged or closed | FYI | “Merged — nothing left for you to do.” |
| 4 | Someone requested changes after you approved | Needs my eyes | “@bob requested changes after you approved.” |
| 5 | Your review is requested, but you approved the latest commit | FYI | “Your review is requested, but you already approved these changes.” |
| 6 | Your review, or your team’s, is requested | Needs my eyes | “Your review is requested.” |
| 7 | You’re involved, and changes were requested since your last review | Needs my eyes | “@bob requested changes since your last review.” |
| 8 | You’re involved, and it lost an approval it had | Needs my eyes | “This pull request was approved, but changes have since been requested.” |
| 9 | Your own review is the latest activity | Cleared | “Your own review is the latest activity.” |
| 10 | Fully approved | FYI | “Fully approved — you’re not blocking it.” |
| 11 | You approved, and others haven’t yet | FYI | “You approved; it’s waiting on others, not you.” |
| 12 | Anything else: comments, CI, subscriptions | FYI | “New comments that don’t change your responsibility.” |
Mentions and lost approvals stay in Needs my eyes until you mark them Done, even if quieter activity arrives later. When pull-request details can’t be loaded, Steward falls back to GitHub’s reason and says so on the row.
Local-first, built on gh
Your inbox lives in a database on your Mac. Everything that touches GitHub goes through the CLI you’re already signed into.
- GitHub access
- Steward runs
ghfor every request. It never reads, stores, or logs your token, and there’s no Steward account to create. - Storage
- Rows, history, and pending actions live in a local SQLite database. GitHub remains the source of truth for shared activity.
- Sync
- On launch, every 10 minutes, and whenever you press ⌘R. The first sync reads the last 30 days of notifications.
- Writes
- Two, both on request: Done marks the notification thread done, and Unsubscribe drops your subscription. They wait a moment before sending, so a quick ⌘Z cancels them. Read state stays local.
- Scope
- Pull-request notifications only. Your own pull requests and drafts stay out; a draft appears once it’s ready for review.
- Teams
- “My team” means the teams you pick. A 2,000-person org-wide team doesn’t count unless you choose it.
Keyboard
- JK
- Next and previous pull request
- []
- Previous and next section
- ↩
- Open in GitHub
- E
- Mark done
- ⇧E
- Mark the whole section done
- U
- Toggle read
- M
- Unsubscribe
- X
- Select; ⇧J ⇧K extend
- ⌘Z
- Undo; ⇧⌘Z redo
- ⌘K
- Command palette
GitHub API details it handles
- A re-delivered notification doesn’t bring back a pull request you marked Done. Genuinely newer activity does.
- GraphQL can return data and errors in the same response. Steward keeps what loaded and marks which context is missing.
- A thread can keep its
mentionreason through later activity, so only a change intomentioncounts as a new mention. - If team membership can’t be loaded, authors are treated as external and the row says why.
Pay once
$10 at launch, then $20. One purchase covers every future update. There’s no subscription and no account.
I built Steward for my own review queue and use it every day. It’s a small app, and I plan to keep maintaining it.
Steward for macOS
$10 Regular price $20 · USD, one-time
- Everything in the app today
- Every future update
- No subscription or Steward account
Questions
What do I need to run it?
A Mac, a GitHub account, and the GitHub CLI installed and signed in (gh auth login). Steward uses that login.
Does it use AI to sort my inbox?
No. Classification is a fixed set of rules over the pull request’s state and your reviews, listed above. Every row shows the rule that matched.
Does Steward review code?
Not yet. Today it’s the inbox, and opening a pull request takes you to GitHub. A review workspace, then optional review with your own local agent tools, come after.
Which notifications does it show?
Pull requests only: no issues, releases, Actions, or discussions. Pull requests you opened are left out of the inbox.
Couldn’t I build this myself?
Yes. A list of your pull requests is an afternoon’s work. Trusting it every morning takes longer: classification rules that hold up, sync that survives a flaky connection, undo that cancels a write before it reaches GitHub, and the API quirks above. Steward is that work, maintained.
Is it really a one-time purchase?
Yes. $10 at launch, $20 after, and every future update is included.