Review your own branch before you push, or the PR you’ve been asked to approve. Nothing is posted automatically. You decide what’s worth a comment.
Free forever. No account, no GitHub app, no admin to ask.
Checked every run
Works with what you already use
Which is the only reason anybody leaves a reviewer switched on.
A confident wrong comment teaches people to ignore the bot. When the code and the ticket disagree, coduck does what a senior reviewer does. It asks.
- const { data, isLoading } = useUserProgress(userId)+ const data = SAMPLE_TASKSSAMPLE_TASKS renders for every user. ENG‑482 asks for the
signed‑in user’s own progress. Is the endpoint not landed yet?
/v2/progress ships Thursday, placeholder until then.
disabled={isRestricted || !currentOrganization}+ disabledReason={!isRestricted ? 'You need to be an admin…' : undefined}“Adds a disabled reason so a regular member knows why they can’t toggle the setting.”
The line above uses isRestricted. This one negates it, so the
reason goes to admins instead, and the toggle is now disabled for everyone.
Real finding on PostHog #22766. A PostHog reviewer caught the same thing.
A pull request description tells you what a change is meant to do, and reviewers tend to take it at its word, because checking is work. Coduck checks. When the code does something other than what the description claims, it says so and shows the mechanism.
When coduck is sure, it does not just say so. It writes a test that fails on your branch, then re‑runs the same test against the fix. A failing test is not an opinion you have to argue with.
› renders the signed‑in user’s own progress
expectedtasks for user_8123
receivedSAMPLE_TASKS
same test, re‑run once useUserProgress was restored
Findings land in your terminal. What becomes a PR comment is your call, every time.
Your ADRs, your AGENTS.md, your security notes, not a vendor’s defaults.
Backend and frontend security are different documents. It loads the ones your frameworks need.
This mirrors an actual Coduck review, with the file paths and specifics swapped for a generic example.
| found | must fix | should fix | nits | |
|---|---|---|---|---|
| product | 2 | 1 | 1 | 0 |
| architecture | 1 | 0 | 1 | 0 |
| security | 1 | 0 | 0 | 1 |
| correctness | 1 | 1 | 0 | 0 |
Every user sees the same fixed example data instead of their own progress, so the ticket's acceptance criteria can't hold for anyone.
A user with nothing in progress still sees a full task list and sample data, the one case the ticket calls out.
This file is a byte-for-byte copy of one already in the admin view, so every future fix has to be made twice.
Every dashboard load sends a visitor's IP address to an external image host, just for a placeholder avatar.
Users outside one role lose the dashboard they had, replaced by the new widget. The ticket asked for an addition, not a swap.
Coduck works with JavaScript, TypeScript, and Python now, along with React, Vue, and Angular. Support for other languages and frameworks is on the way.
Beta
Coduck is early, and the findings it misses matter as much as the ones it makes. If it flagged something that was fine, missed something that was not, or said anything that wasted your time, we want the example.
support@coduck.dev