Every pull request, reviewed before you merge.
Scout reads each pull request on GitHub and comments on the lines that would break: bugs, security holes and slow paths. No style nitpicks, no praise, no seat fees.
Paid per review from your Scout credit · works on private repositories
export async function onPaymentFailed(event) { const charge = event.data.object;- await stripe.charges.create(retryParams(charge));+ await retry(3, () =>+ stripe.charges.create(retryParams(charge))+ ); await markRetried(charge.id);}Three steps, then it runs itself.
Reviews run on our servers, so they happen whether or not your computer is on.
- 1
Install the GitHub app
Add ScoutCode to your account or organization and pick the repositories it can see.
- 2
Pick how hard it thinks
Every repository starts on Medium. Choose Low or High per repository whenever you like.
- 3
Open a pull request
Scout reviews it when it’s opened or pushed to, and comments on the lines that need it.
Finds what breaks. Skips what doesn’t.
Scout is told to report real problems and nothing else. Formatting and naming are left alone unless they cause a bug, and a pull request that looks right gets a short summary with no comments at all.
- Bugs
Off-by-ones, wrong conditions, missed awaits, code that doesn’t do what the PR says.
- Security
Injection, leaked secrets, missing auth checks, unsafe input handling.
- Data loss
Broken error handling, race conditions, writes that can be lost or corrupted.
- Performance
Only real problems at scale: queries in loops, quadratic work, blocking calls on hot paths.
x to countAdd a trailing commaNice work on this PR!Ask again with a comment.
Pushed a fix? Comment @scout review on the pull request and a fresh review lands on the latest commit. Anyone with write access to the repository can ask.
a41f9c2…Retries now reuse the event ID as an idempotency key, so a timed-out charge can’t go through twice. Looks correct.
Reviewed by ScoutCode Cloud at a41f9c2.Pay for reviews, not seats.
Each review comes out of your Scout credit, and the Code Review page lists what every one cost. Pick Low for quick passes on small repositories and High where it counts.
- api#482Retry failed payment webhooksMediumPosted2 comments$0.012
- web#1290Move auth to middlewareLowPostedNo issues$0.006
- api#479Batch invoice exportsMediumPosted4 comments$0.019
- 0
- files read per pull request
- 0
- passes on every finding: one finds it, one tries to disprove it
- 0
- characters of diff per review, with the whole repository to read
- 0
- approvals or blocked merges, ever
Questions
What does it cost?
Each review is paid from your Scout credit, at a price that depends on how hard it reasons. Every review shows what it cost, so there’s no subscription or seat to work out.
What does Scout see?
The whole repository at the pull request’s latest commit, not just the diff. It reads the files a change touches, searches for callers, checks commit history and CI results, follows your AGENTS.md, CLAUDE.md or .scout/review.md, and remembers how you answered its earlier comments. Lockfiles and generated files are skipped.
How does it avoid noise?
Every possible problem is checked a second time by a skeptical pass that tries to disprove it against the real code. Only what survives is posted, and you choose how sure it must be: strict, balanced or thorough.
Can it approve or block a pull request?
No. Scout posts a review with comments only, so it never approves, requests changes or gets in the way of a merge.
Who can ask for a review?
Turn on Every PR and each pull request is reviewed when it’s opened or pushed to. Anyone with write access can also comment @scout review, and you can start one from the Code Review page.
Does it work on private repositories?
Yes. The app reads only the repositories you give it, and you can remove any of them on GitHub at any time.
Get your next pull request reviewed.
Sign up, install the app on GitHub and open a pull request. That’s the whole setup.
If Stripe accepts the charge but the response times out,
retrysends it again and the customer is charged twice. Give the call an idempotency key so every retry is the same charge.- stripe.charges.create(retryParams(charge))+ stripe.charges.create(retryParams(charge), { idempotencyKey: event.id })