current_balance reads like a getter but changes a counter. Should a query change state?
Not another comment bot. A coach for the reviewer.
Paste a pull request. Get a few sharp questions about it. You write the review.
Questions, not verdicts
get_user removes the entry it looks up. Would a caller reading the name expect a delete?
first_score panics on an empty slice. Could returning an Option define the error out of existence?
build_report takes a validate flag, so it does two jobs. Would two functions leave the next change easier?
Illustration. The code is from the app's own test fixture; the questions are written to show the shape of a card.
What a bot can't copy
CodeRabbit, Copilot and chat assistants post comments on the diff. Review Coach does the opposite, on three axes a comment bot cannot copy without becoming a different product.
It coaches. It does not conclude.
The output is questions for a human, not rulings on a diff. At most it fills your own pending review, which only you can see, edit and submit.
The code is the style guide.
Naming conventions come from the whole existing codebase: verb vocabulary, affixes, casing per kind. Only drift from the repo's own habits is flagged. There is nothing to import or argue with.
Tactical vs strategic.
Does this change add a special case or remove one? Deepen the module, or push complexity onto its callers? Leave the next change easier, or harder?
Less is the product
A paragraph per hunk would make it the noise it is trying to beat. So the prompts are hard-capped per file and per pull request, and the cap does not lift when the PR gets bigger.
Every card has to earn its place against the cost of one more thing to read. A clean function should get none.
One pull request, start to finish
Paste a PR
A PR URL or owner/repo#123. The metadata and description come through gh, then a blobless clone and gh pr checkout put the whole repo on disk.
Separate the change
A per-file unified diff: what this PR does, apart from the codebase it lands in.
src-tauri/src/diff.rsLearn the house style
Read the whole repo for its de-facto casing and verb habits per kind, then flag only where this PR drifts from them.
src-tauri/src/conventions.rsRead the whole PR
One reading of the full change before any single file is coached, so every card knows what the PR is for.
prompts/overview-system.mdDeal the cards
An Ousterhout-anchored prompt per file. At most three question-shaped cards each, under a ceiling for the whole PR.
src-tauri/src/coach.rsKeep your judgment
Accept, edit or dismiss each card. What you keep exports as a clean markdown review, ready to paste.
src-tauri/src/review.rsPending, not posted
Or send the kept comments into your own pending GitHub review, on their diff lines. Only you see it until you submit.
src-tauri/src/send.rsQuestions in.
Your review out.
Request access →
You keep your judgment.
Nothing reaches the PR's author until you submit it. Send to GitHub carries only the comments you kept, exactly as you edited them.
It gets sharper with you
Warm-upAt PR load
When a PR opens, up to three due cards from the built-in review library: the questions worth asking before you start. Dismiss it in one action; it never blocks the review.
DrillOn a schedule
A separate session over the same library, on a spaced-repetition schedule. Grade each card and the schedule decides when it comes back. The library covers system design and how to write a review comment.
Your decisionsStored locally
Every accept and dismiss is remembered in a local database and makes the coach sharper for your repos, instead of a general-purpose ruleset tuned for someone else.
Send to your pending review
Via gh
Default · no setup
The app writes the pending review with the same gh login it already uses to load pull requests. Every repo you can reach, no key.
Best when you review from your own machine.
Via the Review Coach GitHub App
Hosted · private for nowAuthorize the App once and it writes the pending review as you: GitHub shows your avatar with the App's badge. The desktop app sends only what you kept, with a personal upload key.
It acts as you on purpose: GitHub shows a pending review only to its author, so a bot's draft would be invisible to you.
Pending means pending. You submit, or nobody does.
Read the comments again in the pull request itself, edit or delete any of them, and submit when you are ready. The tool never submits a review.
Have access? Open the GitHub App →Your model, your call
Claude API
HostedThe Anthropic API, with your own key in ANTHROPIC_API_KEY.
LM Studio
Fully offlineAny local OpenAI-compatible server. No key, no network. Test the connection and pick the loaded model in settings.
Claude Code CLI
Local CLIThe Claude Code command-line tool already on your machine, with its own sign-in.
Offline is first-class. Every desktop capability works with a local model and no network. A feature that only works in the cloud counts as a regression.
Questions
Does it post comments for me?
Where does my code go?
Why so few prompts?
Which conventions does it check?
What do I need to run it?
gh installed and authenticated, git, and one coaching provider. It runs on macOS, Linux and Windows.Can I download it?
Review your next PR with a coach.
Review Coach is in early access and built by Consensus Labs, an engineering studio in Amsterdam.
$ gh auth status $ npm install $ npm run tauri dev # then paste a PR URL, or owner/repo#123