You stopped
writing the code.
You still have to
answer for it.

Rennet is a review harness. It helps you work with coding agents effectively and transparently by breaking large changes into something you can understand and inspect.

Not for vibe coders. For agentic engineers.

Available now · Free · Open source

No API-key setup. No telemetry. Uses the Claude Code and Codex already on your machine.

macOS on Apple silicon, signed and notarized. Windows installer, not yet signed, so SmartScreen warns once. Both update themselves.

AI can produce more code than a human can hold in their head.

Pull requests have ballooned. Reading file by file asks you to keep pace with a machine that never gets tired.

Rennet does the structural reading for you: it groups the change, puts it in order, explains it, and surfaces the decisions inside it. You still read the code. Your attention goes where your judgment is actually needed.

  1. Raw change1,872 lines
  2. Related changes4 parts
  3. Human decisions11 calls
  4. PR reviewReady to post
From raw change to accountable judgment. Illustrative review data.

A coding harness points a model at your codebase so it can write. A review harness points models at a change so you can read it. The harness does the structural work. You do the deciding.

Two sides of the same responsibility.

Whether the code is yours or a teammate’s, the job is to understand what carries your name.

Before you submit

Your own work

Your coding agent finished the branch. Before you open the PR, Rennet helps you understand what it did, catch what is wrong, and send the fixes back to the agent, so the review a teammate sees is one you already stand behind.

  1. Branch

    Review the committed and working-tree changes.

  2. Refine

    Turn what you find into focused work for your coding agent.

  3. Re-read

    Rennet snapshots the branch again and re-reviews only what changed.

When they submit

Someone else’s work

A teammate sends an agent-written PR. Rennet walks you through it in an order you can actually follow, keeps the real code under your hands, and turns your decisions into one normal GitHub review in your own voice.

  1. Pull request

    Read the promise, structure, and changed code together.

  2. Question

    Question any finding, decision, or line.

  3. Review

    Edit and post the exact review GitHub receives.

Five lenses.
Five questions you already ask.

Open a change and Rennet reads it five ways. Each lens is a board that answers one question about the branch, and every answer cites the lines it came from. Open a citation and the code appears right under the sentence that cites it.

Design
What was this change supposed to do?
Sequence
In what order should I read it?
Decisions
Which choices need explaining?
Flagged
Where did the models find a problem, or disagree?
Noise
What can I skim? Lockfiles, import order, formatting.

The screenshots below are the real app reviewing an example branch: per-organisation rate limiting in a small service called atlas.

Design

Start from what the branch promised.

Design reads the branch against whatever it was written from: a spec, an ADR, a plan, or the pull request description. On atlas it finds the rate-limiting spec and lays out each requirement with the code and tests that answer it. Open one and the cited lines appear under the requirement, so the promise and the code that keeps it sit together on one screen.

atlas · feat/rate-limitingDesign
The Design lens showing the requirement 'Requests are limited per organisation': the SHALL sentence, two trigger-and-outcome scenarios, trace chips for the spec, bucket, middleware and test files, and the cited take function from src/rate-limit/bucket.ts revealed beneath them. The conversation pane on the left holds the reviewer's questions about the branch.
A fixture branch reviewed in the shipped app
Sequence

Read the work in the order it builds.

Sequence turns the change into steps, each a short explanation over the code it describes. Step two here is the token bucket: take refills from elapsed time on every read, which is why there is no timer anywhere in the branch. The note under the code names the clamps that keep it quiet. You still read the code; Sequence tells you what to read next.

atlas · feat/rate-limitingSequence
The Sequence lens at its second step, 'The bucket: refill on read, then take one token', with the take function from src/rate-limit/bucket.ts shown as highlighted TypeScript beneath the prose and an annotation about its Math.min and Math.max clamps under the code.
A fixture branch reviewed in the shipped app
Decisions

See the judgment calls hidden inside the change.

Decisions lists the choices the branch made, each with its reasoning, the alternatives it passed over, and the lines that show it. Five here: two stated in the proposal, three inferred from the code and marked as such. The first is one refill-on-read bucket per organisation, chosen over a fixed window that lets twice the limit through at the edge. Rennet surfaces the call. Whether it was the right one is yours to decide.

atlas · feat/rate-limitingDecisions
The Decisions lens from its title: 'Five judgment calls inside the change', then the first decision, 'One refill-on-read bucket', with its rationale, two alternatives not taken, evidence chips for bucket.ts, and the cited bucket code revealed beneath.
A fixture branch reviewed in the shipped app
Flagged

Work through what the models flagged, and where they disagree.

Flagged collects what Claude and Codex found, each finding with its severity, the lines involved, and a proposed fix. Three open on this branch, one high: a Redis outage that silently removes every limit. Both models raised it and disagree on how serious it is, so the board shows the split instead of averaging it away. A finding only one model raised says so. Dismiss it, discuss it, or request the change. Rennet flags; the verdict is yours.

atlas · feat/rate-limitingFlagged
The Flagged lens from its title: three open findings, one high. The high finding, 'A Redis outage removes every limit, and the only trace is one log line per request', is open with a 'severity split' badge, its lifted fix, the Dismiss, Discuss and Request This Change actions, and the failOpen wrapper from src/rate-limit/store.ts cited beneath.
A fixture branch reviewed in the shipped app
The code

The code never disappears.

Every citation opens the same built-in Diff view: the changed-files rail, the hunk in place with syntax highlighting, and a marker on any line you have a request against. Here it is open on the middleware, with a request sitting on the 429 lines. Move from overview to evidence without losing your place. Rennet changes the reading order, not the need to read.

atlas · feat/rate-limitingDiff
Rennet's built-in Diff view on src/rate-limit/middleware.ts, a 37-line added file shown as highlighted TypeScript, with a rail of every changed file and its line counts on the right and two comment markers on lines 31 and 32 where a request change is staged.
A fixture branch reviewed in the shipped app

Don’t just read the diff. Talk to it.

Ask what changed, why it changed, how it fits the rest of the repo, or whether a failure path is intentional. The conversation stays attached to the review and its code.

src/rate-limit/store.tslines 84–101
− return store.get(key)+ return store.get(key).catch(() => fallback)
You

Why does this fail open instead of blocking the request?

Claude Code

The PR treats rate limiting as protective infrastructure, not an availability dependency. The fallback preserves service when the store is unavailable.

Your Claude Code. Your Codex. Already connected.

Rennet finds the Claude Code and Codex already installed on your machine and signs in as you already do. No new API keys. No extra bill from Rennet.

Claude CodeExisting install · existing account
CodexExisting install · existing account

Two independent reads.
Disagreement is where you look.

Claude and Codex review the same evidence independently. Rennet shows where they agree and, more importantly, where they split. Nothing is averaged into false consensus.

Claude

Fallback masks a real storage outage.

Request change
Codex

Availability policy supports this fallback.

Accept with note

Models disagree · human judgment required

Illustrative dual-review output
Explain and request changes

Select a range. Ask about it, or ask for it to change.

Highlight any lines on a board or in the diff and the toolbar offers Comment, Request Changes, and Explain. Explain asks the conversation beside the review about exactly those lines. Request Changes records a request against them that your coding agent will receive, with the lines attached. Here the reviewer has selected the failOpen wrapper under the high finding.

atlas · feat/rate-limitingFlagged
The Flagged lens with the failOpen function selected in the cited store.ts code and a selection toolbar floating above it offering Comment, Request Changes and Explain. The high finding's fix and its Dismiss, Discuss and Request This Change actions are visible above the selection.
A fixture branch reviewed in the shipped app
Hand-off and pull request

Your calls become a work order. The result comes back to you.

Every change you request collects in one place with its cited lines and its thread. Dispatch Round hands the whole set to your own coding agent. When the round is back, Rennet re-reads the branch and shows you what moved: the sections the round touched open, the ones it left alone stay folded, and every request is checked against the round's actual diff, not the agent's word. When nothing is left to ask, push the branch and open the pull request, in your own words and under your own name.

atlas · feat/rate-limitingChanges
The hand-off lane in its Changes state: one staged request change, 'Answer the 429 through json(response, 429, { error: rate limit exceeded }) so the envelope in docs/api.md holds', with its cited lines from src/rate-limit/middleware.ts revealed, its comment thread and an empty reply box, and a gold Dispatch Round button beneath.
A fixture branch reviewed in the shipped app

One app. A window or a tab. Any of your machines.

Run Rennet as the desktop app or open it as a browser tab served from your own machine. Both are the full product: no read-only mode, no feature in only one. Pair another computer or your phone over Tailscale to review from wherever you are. Nothing is hosted. The remote device talks straight to your machine, and it never sees a path on it.

What leaves your machine, and what doesn’t.

Nothing goes to Rennet. There is no Rennet backend and no telemetry. Your coding agents still send context to their own providers, under the accounts you already have, exactly as they do when you use them directly. Rennet says so plainly instead of hiding it.

Rennet backend
None
Telemetry
None
API key setup
None
Platforms
macOS, Windows
Licence
FSL-1.1-MIT

The questions worth asking.

Is this another autonomous review bot?

No. Rennet does the structural reading. You inspect, question, edit, and post the review another person sees.

Does dual review mean the models decide by majority?

No. Claude and Codex run independently. Agreement is evidence; disagreement is a signal for you, and Rennet never averages it away.

Does “local-first” mean nothing leaves my machine?

Rennet itself sends nothing anywhere. The coding agent you use still talks to its provider under its own terms and sign-in, exactly as it does today.

Make the next change digestible.

Not for vibe coders.
For agentic engineers.

macOS on Apple silicon, signed and notarized. Windows installer, not yet signed. Both update themselves.