DiffHarborPROGet in touch

Only the findings that hold up.

Self-hosted AI code review that checks every finding before it comments.

acme/billing/#482Add line-item discounts to invoices
1 of 3 postedUnifiedSplita1c9e02

Reading order

Discount model
discount.go
item.go
Totals
invoice.go 1
invoice_test.go
API
handler.go
openapi.yaml
internal/billing/invoice.go+3−2Step 2 of 3 · Totals
38func Total(items []Item) int {
39− var sum int
39+ var sum int32
MajorVerifieddiffharbor · line 39

int32 overflows above $21M (2³¹ cents), and return int(sum) hides it. Total returns int: keep the sum an int.

Suggested changeCommit suggestion
− var sum int32
+ var sum int
40 for _, it := range items {
41− sum += it.Cents * it.Qty
41+ sum += int32(it.Net())
42+ tax += it.Tax()
43 }
44 return int(sum)

Dropped by verify · 2

“items may be nil” ranging over a nil slice is fine.

“Qty can be negative” NewItem rejects it, item.go:31.

DiffContextReviewVerifyResult

Your checks, on the changed lines

gitleakstscbiomeeslintoxlintgofmtvetstaticcheckgolangci-lintdeadcodefallowsquawkshellcheckluacheckactionlintzizmorosv-scanner
+ tests of changed packages

How a review works

Five steps,
and one of them says no.

DiffHarbor reviews every pull request and checks its findings before they reach you. Learn more

  1. 01

    Diff

    The whole PR first, then only what each push changes. Noise stays out.

  2. 02

    Context

    Your code, its history, your rules and what the team taught it.

  3. 03

    Review

    An agent works through the change like a reviewer would.

  4. 04

    Verify

    Every finding is checked again. What can't be backed up is dropped.

  5. 05

    Result

    A walkthrough and comments on the lines, with fixes you can apply.

Features

Fewer comments.
Each one backed up.

Fewer comments, each one backed by your own tooling and a second look. Incremental by default, so a rebase doesn't start the noise again. Learn more

Verified findings

Every finding is checked in the code by a second model. What it can't back up never gets posted.

Your checks as context

The linters, scanners and tests your repo already has, run on the changed lines only.

Incremental

A push reviews only files whose changed lines changed. A rebase or a merge of main reviews nothing.

Committable fixes

Local fixes become suggestion blocks. Fixed findings get their threads resolved.

Chat and learnings

Reply to a finding or mention the bot. Corrections become rules for the next reviews.

Large PRs in parts

Big diffs split by folder, each part reviewed and verified on its own, findings merged by severity.

PR reports

An HTML page per PR: reading order, diffs with findings, call graphs and merge risks. With your branding.

Per-repo settings

Rules, review skills, custom checks and monorepo overrides, all from the repo's base branch.

Self-hosted

Your code stays
in your harbor.

DiffHarbor runs on your infrastructure, next to your forge. Your code goes to your server and to the model provider you pick, nowhere else. Learn more

One container
A single Go binary on the standard library only. Expose two webhook routes; nothing else needs to be public.
Your model, your keys
Any model Pi supports, with automatic fallback when a provider hits a limit. Or point it at your own AI gateway.
GitHub and GitLab
A GitHub App or a GitLab bot user, gitlab.com or your self-managed instance.
Reports behind your SSO
PR reports are served by your server, under your login, with your logo and colors.
~/diffharbor
# the values go into .env next to it
$ cp compose.example.yml compose.yml
$ docker compose up -d --build
✓ diffharbor listening on :3000

Review and verify with

OpenAIAnthropicDeepSeekAWS BedrockAzure OpenAILiteLLM and gateways

diffharbor · discount.go:42 Minor

Rounding each line before the discount loses a cent on three-seat bundles. Round once, on the invoice total.

LK

lena · reply

That's on purpose: finance rounds half-up per line, never per invoice.

diffharbor · reply

Understood, per-line rounding is the rule here. Resolving this thread.

Learning saved for acme/billingResolved

Talk to the bot

A reviewer
you can argue with.

A reply in a thread gets an answer, a check of the claimed fix, or a concession and a resolved thread. Learn more

reply in a threadAnswers, checks your fix, or concedes
@bot <question>An answer about the PR, from the checkout
@bot reviewA full review, on demand
@bot review allA large PR, reviewed in parts

Security

It runs the PR's code.
Never near your keys.

The agent and the checks run the PR's code. DiffHarbor is built so that code can't reach the keys that matter. Learn more

root · node

Split privileges

Root holds the keys.
git, checks and the agent run as an unprivileged user with a read-only, short-lived token passed by env.

before · after

Clean jobs

Symlinks in a PR can't reach the server's files. Leftover processes are killed before and after every job; output is capped.

Because the checks run the PR's code, install DiffHarbor on repos whose PR authors you trust, such as your team.

This month, so far

Most findings never
make it to your PR.

One team's instance: every finding the agent raised, and what verify could back up in the code.

Pull requests
1,284
Findings raised
3,917
Verified, posted
1,106
Dropped by verify
2,811
Threads resolved
942

Bring DiffHarbor Pro into your harbor.

We're onboarding teams who run it on their own infrastructure. Tell us about your forge and your models, and we'll get you set up.