// product · code review

Code review that acts like a senior engineer – not a checklist that PMs muted by Tuesday.

On every push, CodeGuards reads the diff in repository context, knows the architecture your team has actually agreed on, and leaves one focused remark per real issue on the diff line. Verdict is one of clean or remarks – not a 40-comment essay your team scrolls past.

Try Code review · 14 days free See how a remark looks

You've probably tried a PR review bot before. We've watched a lot of teams turn one off after sprint two. Here's the difference we built around:

What you don't want

  • A bot that drops a wall-of-text summary on every PR — useful for nobody, scrolled past by everybody.
  • Generic style nits applied identically to a Rust microservice and a Laravel monolith.
  • Posts the same remark every PR even after your team agreed it's fine — twice.
  • Has no idea your project has bounded contexts, architectural layers, or "Controller never talks to Model directly" rules.
  • Leaves dead, "resolved" threads littering the MR after you replied "ack, ignoring".
  • Charges a flat seat-license whether your team ships 3 PRs a week or 300.
  • Comes alongside the security tool, the SAST tool, and the SCA tool — four invoices, four dashboards, four audit trails.

What CodeGuards Code review does

  • One remark per line, on the diff. Not a top-level essay. If there's nothing to say, the verdict is clean and the bot stays quiet.
  • Repo-aware reasoning. Defaults match the language and framework we detect; you tune them per repo if needed.
  • Per-repo memory. Click "Suppress" once with a one-line reason — the same pattern stops surfacing on this repo, both for the exact match and for the category-path neighbours so a rephrased AI output still gets caught.
  • Knows your architecture. Per-repo rulebook lets the bot enforce your bounded-context rules, not generic SOLID lectures.
  • Auto-resolves the GitLab thread when your team agrees a remark is a known false positive. No dead threads.
  • Usage-based billing. Pay per review run, not per seat. A repo that ships a PR a week costs less than one that ships 50.
  • Same workspace as Security scans. One audit trail, one Stripe invoice, one place to look.

Four things that make this not just another bot

Each is a deliberate choice that has cost us speed of shipping. We made them because a code-review bot that doesn't have these is a bot you'll mute by week 3.

// 01

Repository context, not diff-only

Reads the surrounding files — what the function is called from, which interface it implements, which test it has. Style nits stop being style nits when the bot can see callers.

// 02

Architecture-boundary aware

Per-repo rulebook holds your bounded contexts and dependency rules. The bot flags the diff that bypasses them — with a one-line citation of the rule, not a generic "consider refactoring".

// 03

Per-repo memory of false positives

Suppressions are per-repo, per-fingerprint, with a category-path fallback. A rephrased Claude output still hits the same rule — you don't suppress the same thing 12 times.

// 04

Closes its own threads

On GitLab, when you (or the bot, after you click Suppress) agree a remark is fine, the discussion is auto-resolved via the GitLab API. The MR view stays clean — no dead "resolved" threads.

// what a remark actually looks like

Inline on the line. Anchored to the diff. One thread per remark.

app/Http/Controllers/InvoiceController.php · @@ -42,6 +42,12 @@ 42 public function show($id) 43 { 44- $invoice = Invoice::find($id); 44+ $invoice = DB::table('invoices')->where('id', $id)->first(); 45+ $items = DB::table('invoice_items')->where('invoice_id', $id)->get(); 46 return view('invoices.show', compact('invoice', 'items')); 47 }
codeguards · code review remark · architecture · line 44

Controller is reaching the database directly — bypasses the repository layer.

This file's bounded context (BoundedContext/Billing) declares the rule Controller → Action → Service → Repository → Model. The new lines call DB::table() straight from the controller, which skips three layers and the per-tenant scoping that InvoiceRepository::findForOrganization() applies.

Why this matters here: the existing InvoiceRepository already enforces organization_id isolation. This change exposes any invoice id to any logged-in user.

Suggested next step: route the read through InvoiceRepository::findForOrganization($id, $request->user()->organization_id).

That's one remark, anchored to one line, on one PR. If the bot has nothing to flag, the verdict is clean and no comments are posted at all. Re-runs update existing threads in place — the discussion tab never grows by accident.

What the first two weeks usually look like

Tuned for one connected repo, both products on, default rulebook. Numbers are from teams shipping 20–50 MRs per week.

  1. Day 1 · You connect the repo setup ≈ 4 minutes
    Webhook registered, baseline rulebook seeded for your stack. Next push fires a review.
  2. Days 2–4 · The "wait, this thing actually reads the code" moment ≈ 15 inline remarks across 8 PRs
    Most land. Some are noise specific to your codebase — you click Suppress with a one-line reason.
  3. Days 5–8 · Suppressions compound repeat-remark rate drops 60–70%
    The same rule that fired three times last week stops firing entirely on this repo. The bot starts feeling tuned, not overbearing.
  4. Days 9–14 · Your reviewers stop being the bot human PR-review time per MR drops noticeably
    The boilerplate part of code review (style, missing tests, the obvious architecture bypass) is handled by the bot. Humans focus on intent.
  5. Week 3+ · Audit trail starts being useful every remark, every suppression, every reviewer is on record
    When someone asks "why didn't anyone flag X?" — there's a thread, with a name on it, and a one-line reason.

The per-repo rulebook is the product

Defaults are sensible for the language and framework we detect. But the place where this stops being a generic bot is the per-repo rulebook — your architecture rules, in version control, enforced on every PR.

You can express things like "controllers never talk to Eloquent models", "every public method on a Service class needs a feature test", "no DB::raw outside Repository/". The bot flags the diff that crosses them.

If your team disagrees with a remark, click Suppress once and add a note. The rulebook stays the same — only this fingerprint stops surfacing on this repo.

// .codeguards/review.yml
version: 1
tone: "professional"
rules:
  architecture:
    - id: "controller-no-direct-model"
      severity: "high"
      applies: "app/Http/Controllers/**"
      forbid:
        - "Eloquent\\Model::*"
        - "DB::table"
      why: "Reach via Action → Service → Repository."
  tests:
    - id: "service-needs-feature-test"
      applies: "app/**/Services/**"
      require: "tests/Feature/**"
  style:
    - id: "no-magic-numbers"
      severity: "low"
      except: [0, 1, -1]
suppressions: // auto-managed
  file: ".codeguards/suppressions.yml"

Same audit shape as Security scans

Each review is a timestamped record: which commit, the verdict, the remarks raised, the suppressions accepted, who clicked them, with what reason. The same evidence shape your security pipeline produces — but for everyday code-quality decisions, not just vulnerabilities.

Useful when an engineering manager asks "why didn't anyone flag X?" and the answer is "we did, here's the thread, here's who agreed it was fine, here's the rule it cited". That's SOC 2 CC8.1, ISO 27001 A.14.2, and the change-management half of PCI-DSS 6.3 — out of the box, both products contribute the same rows.

How it integrates

  • GitLab (cloud + self-hosted) — MR open/update, manual rerun, CI trigger, auto-resolve discussions
  • GitHub (cloud) — PR open/sync, manual, CI trigger, inline review comments
  • Inline review threads — one per remark, each with a "Suppress" action chip and signed action URL (no extra auth)
  • Slash commands/codeguards suppress, /codeguards explain, /codeguards help
  • Slack — optional channel notification on remarks verdict
  • Webhooks — outbound webhook on each completed review for your own tooling
  • MCP server — read the per-repo rulebook and create or update custom rules via Cursor or any MCP-compatible AI agent

FAQ

Will it spam my PRs like the last one we tried?

No. One inline thread per remark, anchored to the line. If the bot has nothing material to say, the verdict is clean and no comments are posted at all. Re-runs update existing threads in place — the discussion tab does not grow by accident.

What if it's wrong?

Click "Suppress" with a one-line reason. The remark is dismissed, the GitLab thread is auto-resolved, and the same fingerprint stops surfacing on this repo for both exact matches and rephrased neighbours. The audit trail keeps the suppression with the author and reason — so the decision is reviewable later.

Does it actually understand my architecture?

To the extent your team has written it down, yes. The per-repo rulebook (.codeguards/review.yml) is where you express bounded contexts, layered dependencies, and the rules you actually enforce in PR review today. The bot reads it and flags the diff that violates it. If you don't have a rulebook, the bot still does style/quality remarks based on language defaults — but the architecture-aware part is opt-in.

Is it just an LLM call wrapped in a webhook?

Inside, yes — the reasoning is from a frontier LLM. What's around it is the actual product: the diff line mapper that anchors comments precisely, the suppression engine with category-path fallback, the per-repo rulebook loader, the GitLab/GitHub adapters that know how to post inline review comments and resolve threads, the Stripe meter that bills per run not per seat, and the audit-grade record on every review. Swapping the LLM is a one-driver change for us.

How do I run only some PRs through it?

Per-repo toggle in Integrations. You can run Code review on the design-system repo and not on the marketing-site repo. You can also pin it to specific branches via the per-repo settings.

What does a "review" cost?

One review = one PR/MR analyzed against your rulebook on its current head. We charge per review run, metered to Stripe. Re-runs of the same head are deduplicated for free; re-runs after a new push are a new review. See the pricing page for plan details and the bundle with Security scans.

Does it ever push code to my PR branch?

Never. We don't post commits to your branch. Some remarks include a suggested change as a code block in the comment for you to copy/paste — but the branch is yours.

What CodeGuards remembers

Accumulated project knowledge per repo — suppressions, conventions, fixes and exceptions your team already decided. CodeGuards applies that history on the next diff.

accepted suppressions
architecture conventions
historical fixes
repository structure
known exceptions
team decisions

Used in active engineering workflows

2,000+
code changes reviewed monthly
49+
repositories analyzed
130+
adversarial tests
~9s
median feedback
Try it on one repo for two weeks. 14-day free trial · one workspace, both products on · no card required, no auto-renewal · cancel by closing the browser tab.
Start free trial
Want the vulnerability and exploitability side too? Same workspace, same Stripe invoice. Take the bundle. Security scans →