<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dharmesh Gurnani</title>
    <description>The latest articles on DEV Community by Dharmesh Gurnani (@dharmeshgurnani).</description>
    <link>https://dev.to/dharmeshgurnani</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3621080%2F340f99f6-721a-4fe7-8e57-96bb5c06cc04.jpg</url>
      <title>DEV Community: Dharmesh Gurnani</title>
      <link>https://dev.to/dharmeshgurnani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dharmeshgurnani"/>
    <language>en</language>
    <item>
      <title>Self-Hosted AI Code Review: The 2026 Buyer's Guide</title>
      <dc:creator>Dharmesh Gurnani</dc:creator>
      <pubDate>Wed, 14 Oct 2026 09:16:02 +0000</pubDate>
      <link>https://dev.to/dharmeshgurnani/self-hosted-ai-code-review-the-2026-buyers-guide-3nd5</link>
      <guid>https://dev.to/dharmeshgurnani/self-hosted-ai-code-review-the-2026-buyers-guide-3nd5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cross-posted from the CodeOtter blog. The canonical, always-up-to-date version of this article lives at &lt;a href="https://codeotter.io/blog/self-hosted-ai-code-review-2026-buyers-guide" rel="noopener noreferrer"&gt;codeotter.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is the field guide for engineering leads deciding between **self-hosted AI code review&lt;/em&gt;* and the $24–$72/dev/mo SaaS incumbents in 2026.*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The question every platform lead is asking in 2026
&lt;/h2&gt;

&lt;p&gt;Every engineering team we talk to has the same conversation in 2026: &lt;strong&gt;"Do we keep paying $24–$72/dev/mo for a hosted AI reviewer, or do we self-host?"&lt;/strong&gt; The honest answer is that the question is mostly about five architectural questions, not vendor preference. Once you answer the five, the vendor falls out.&lt;/p&gt;

&lt;p&gt;This guide walks through the five questions, ports the 2026 numbers, and shows the matrix an engineering lead should run before signing a renewal or starting a self-host pilot. TL;DR at the top; math below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five questions that decide the purchase
&lt;/h2&gt;

&lt;p&gt;Every AI PR reviewer in 2026 — hosted or self-hosted — answers (or fails to answer) these five questions. They are not vendor-specific. They are architectural.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Where does your code live during a review?&lt;/strong&gt; (privacy / data routing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are the scores calibrated, or are they what an LLM felt like scoring?&lt;/strong&gt; (calibration / Score)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does it cost at 50 engineers over three years?&lt;/strong&gt; (TCO)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can it run air-gapped, with no outbound network calls?&lt;/strong&gt; (offline / air-gap)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it enforce &lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;CLAUDE.md&lt;/code&gt; at the merge gate?&lt;/strong&gt; (team rules)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a vendor cannot answer one of these in writing — with an endpoint, a gate name, or a hosting diagram — they do not have the architecture; they have a vibe. Skip them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question 1 — Where does your code live?
&lt;/h2&gt;

&lt;p&gt;The default answer for every hosted AI reviewer in 2026 is: &lt;strong&gt;the diff leaves your GitHub tenant and lands on the vendor's cloud.&lt;/strong&gt; CodeRabbit routes to AWS, Greptile to their managed SaaS, GitHub Copilot Code Review to Microsoft's tenant, Qodo Merge to theirs. They all require telemetry, all require a DPA, and none can credibly say "your diff never touched our disk" without a SOC 2 Type II report you cannot audit.&lt;/p&gt;

&lt;p&gt;For a startup selling B2B SaaS, this is a tradeoff most teams sign. For a &lt;strong&gt;regulated platform team&lt;/strong&gt; — fintech under PCI, healthtech under HIPAA, gov under FedRAMP, defense under ITAR — it is a hard block. The ICP-1 buyer (privacy-first platform teams, 25–250 engineers) is the one whose legal/compliance ticket says "we cannot send proprietary code to a third party." There is no SLA that closes that ticket.&lt;/p&gt;

&lt;p&gt;The architectural answer is &lt;strong&gt;self-hosted with zero telemetry&lt;/strong&gt;: the review runs on a Docker container or a Compose stack on your hardware, the model is downloaded once at admin time into a local &lt;code&gt;pb_data&lt;/code&gt; volume, and the only outbound calls during a review are to your GitHub webhook. You can prove this with &lt;code&gt;tcpdump&lt;/code&gt; on the review host. &lt;a href="https://dev.to/blog/running-offline-ai-code-reviews-with-laya-and-gguf/"&gt;CodeOtter's offline mode post&lt;/a&gt; walks through the architecture.&lt;/p&gt;

&lt;p&gt;If your code can leave your VPC, you do not need self-hosting. If it cannot, you already do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question 2 — Are the scores calibrated?
&lt;/h2&gt;

&lt;p&gt;Every hosted AI reviewer in 2026 produces numeric scores by asking a chat model to "give this PR a score between 0 and 100." The well-known failure mode is the &lt;strong&gt;75–85 clustering problem&lt;/strong&gt;: ask GPT-5 or Claude or Gemini to score ten PRs in a row and the answers cluster in a tight band around 80, regardless of whether the PR is a typo, a config flip, or a 600-line refactor of the auth path. You can prove this yourself with a 15-line script and your last ten PRs.&lt;/p&gt;

&lt;p&gt;The architectural answer is to &lt;strong&gt;separate the scoring engine from the narrative engine&lt;/strong&gt;. CodeOtter ships a &lt;strong&gt;dual-engine&lt;/strong&gt; architecture for exactly this reason: a deterministic &lt;a href="https://dev.to/blog/dual-engine-architecture-for-the-ai-era/"&gt;System 1 rubric engine&lt;/a&gt; (&lt;code&gt;POST /v1/systemone&lt;/code&gt;) owns every 0–100 gauge — &lt;code&gt;Quality&lt;/code&gt;, &lt;code&gt;Blast Radius&lt;/code&gt;, &lt;code&gt;Risk&lt;/code&gt;, &lt;code&gt;Tests&lt;/code&gt;, &lt;code&gt;Readability&lt;/code&gt;, &lt;code&gt;PR Hygiene&lt;/code&gt; — and every one of the 9 binary pre-merge gates (&lt;code&gt;Title&lt;/code&gt;, &lt;code&gt;Description&lt;/code&gt;, &lt;code&gt;Security&lt;/code&gt;, &lt;code&gt;Complexity&lt;/code&gt;, &lt;code&gt;Tests&lt;/code&gt;, &lt;code&gt;Docs&lt;/code&gt;, &lt;code&gt;Scope&lt;/code&gt;, &lt;code&gt;Guidelines&lt;/code&gt;, &lt;code&gt;Issue Requirements&lt;/code&gt;). The chat model never gets the token for the scores. It writes the executive summary, the file walkthrough, and the inline &lt;code&gt;suggestion&lt;/code&gt; blocks. Either engine can also operate standalone; the dashboard lets you re-run System 1 alone for a known-good &lt;code&gt;AGENTS.md&lt;/code&gt; flip.&lt;/p&gt;

&lt;p&gt;What this means in a procurement conversation: a &lt;code&gt;Quality: 42&lt;/code&gt; from CodeOtter is reproducible. You can defend it in a postmortem because the rubric says why. A "72/100 — looks risky" from a chat-LLM-only reviewer is whatever the model felt like scoring on the day. For a regulated team building an audit trail, only one of those two is a real signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question 3 — What does it cost at 50 engineers over three years?
&lt;/h2&gt;

&lt;p&gt;The headline seat price is one of four cost inputs. A defensible TCO adds &lt;strong&gt;per-PR review overages&lt;/strong&gt;, &lt;strong&gt;per-author overages&lt;/strong&gt; (Greptile charges per-author, not per-seat — consultants and OSS maintainers eat overages silently), &lt;strong&gt;infrastructure to host the alternative&lt;/strong&gt;, and &lt;strong&gt;engineering hours to wire each tool into CI, branch protection, and &lt;code&gt;AGENTS.md&lt;/code&gt; enforcement&lt;/strong&gt;. The full table is in the companion 3-year TCO post (CodeOtter pricing table comparison); the version below is rendered below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Per-seat&lt;/th&gt;
&lt;th&gt;3-yr TCO (50 eng)&lt;/th&gt;
&lt;th&gt;Cost shape&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeOtter (self-host)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0–$2,400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted infra (Hetzner AX162 or 2× M2 Pro)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeRabbit Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$24/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$43,200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-seat SaaS, telemetry required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeRabbit Pro+ / Team&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$48/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$86,400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-seat SaaS, adds org-wide policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeRabbit Advanced&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$72/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$129,600&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-seat SaaS, adds compliance reporting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Greptile Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$30/seat/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$54,000+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-author + $1/credit overage past 50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot Business&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$19/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$34,200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-seat SaaS, 200 PR-reviews/mo cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot Enterprise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$39/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$70,200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-seat SaaS, unlimited PR reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qodo PR-Agent OSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$3,000–$8,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted OSS, you operate it (no System 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qodo Merge (managed)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;Sales-quoted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap is roughly &lt;strong&gt;54x&lt;/strong&gt; between the cheapest self-hosted option and the most expensive SaaS. Even on a beefy self-hosted box (2× AMD EPYC, 128 GB RAM, RTX 4090 at ~$300/mo), the 3-year run-rate for CodeOtter is ~$10,800 — still &lt;strong&gt;12x cheaper than the cheapest SaaS&lt;/strong&gt;. The detailed battlecards against each — including the lines the headline price leaves out — are at the bottom of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question 4 — Can it run air-gapped, with zero outbound calls?
&lt;/h2&gt;

&lt;p&gt;For the &lt;strong&gt;air-gapped / regulated infra operator&lt;/strong&gt; (defense, gov, critical infrastructure, on-prem GPU boxes with no internet egress at runtime), the answer is binary: &lt;strong&gt;yes or no, with proof.&lt;/strong&gt; Procurement rule: a reviewer is air-gapped iff it can run a full PR review with the host's network cable unplugged and produce a scorecard on the PR thread.&lt;/p&gt;

&lt;p&gt;The architectural answer in 2026 is to &lt;strong&gt;download models once at admin time&lt;/strong&gt; and run them locally. CodeOtter ships five open-weight checkpoints out of the box (&lt;a href="https://dev.to/blog/how-codeotter-runs-five-open-weight-models-locally/"&gt;how they run on local hardware&lt;/a&gt;): Laya Typed-Decisions and Kev 0.8B ride a &lt;code&gt;ggmlc&lt;/code&gt; sidecar; Qwen2.5-Coder 1.5B / 7B ride a &lt;code&gt;llama.cpp&lt;/code&gt; &lt;code&gt;llama-server&lt;/code&gt;; Microsoft CodeReviewer rides a Python sidecar. The &lt;code&gt;Admin → Local Models&lt;/code&gt; flow downloads each model with Hugging Face URLs, verifies shards with &lt;code&gt;modelReady&lt;/code&gt;, detects Vulkan (Linux/Windows) or Metal (macOS arm64) automatically, and shuts down idle runtimes after 15 minutes. There is no auto-update, no telemetry, and no SaaS fallback. The &lt;code&gt;models.json&lt;/code&gt; registry is yours to edit.&lt;/p&gt;

&lt;p&gt;If you want the &lt;em&gt;best&lt;/em&gt; narrative review, point System 2 at Claude or OpenAI via BYOK; the whole point of System 1 is that the numbers do not depend on the LLM. You can run System 1 offline and System 2 online, separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question 5 — Does it enforce &lt;code&gt;AGENTS.md&lt;/code&gt; at the merge gate?
&lt;/h2&gt;

&lt;p&gt;Most teams already have a team-rules doc. It is usually called &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, or &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;. &lt;strong&gt;It is aspirational&lt;/strong&gt; — nothing automated reads it at the merge gate. A reviewer that ignores the doc is a reviewer that has not earned its $24–$72 per dev per month.&lt;/p&gt;

&lt;p&gt;The architectural answer is &lt;strong&gt;zero-config auto-detection at the repo root, with a typed &lt;code&gt;Guidelines&lt;/code&gt; merge gate that fails closed on violations.&lt;/strong&gt; CodeOtter reads &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt; at the repo root on first review, injects the rules into every subsequent prompt, and emits a binary &lt;code&gt;Guidelines&lt;/code&gt; gate on the scorecard. A finding the team marks as "noise" can be dismissed with &lt;strong&gt;1 click&lt;/strong&gt;; the dismissal persists as a team learning into &lt;code&gt;repoSettings[repo].learnings&lt;/code&gt; and the finding never re-appears on the next review. The deep-dive on the merge-gate semantics is at &lt;a href="https://dev.to/blog/agents-md-as-a-merge-gate/"&gt;AGENTS.md as a merge gate&lt;/a&gt;; the live flow is: dismiss a finding → it persists → re-review never re-flags it.&lt;/p&gt;

&lt;p&gt;A SaaS reviewer that requires you to maintain a &lt;code&gt;.coderabbit.yaml&lt;/code&gt; or a &lt;code&gt;.pr_agent.toml&lt;/code&gt; to mirror what is already in &lt;code&gt;AGENTS.md&lt;/code&gt; is a reviewer that has not read the room.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architectural matrix
&lt;/h2&gt;

&lt;p&gt;Once you have answered the five questions, the matrix falls out. The rows below are the architectural claims that hold in 2026 — they are not benchmark theater, they are the shape of each product.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;CodeOtter&lt;/th&gt;
&lt;th&gt;Hosted AI reviewer (CodeRabbit / Greptile / Copilot CR)&lt;/th&gt;
&lt;th&gt;Qodo / PR-Agent OSS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted (Docker / Compose)&lt;/td&gt;
&lt;td&gt;✅ First-class&lt;/td&gt;
&lt;td&gt;❌ SaaS only&lt;/td&gt;
&lt;td&gt;⚠️ You operate Python deps + secrets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100% Offline (GGUF + sidecars)&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;llama.cpp&lt;/code&gt; + &lt;code&gt;ggmlc&lt;/code&gt; + Metal/Vulkan&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deterministic System 1 scoring&lt;/td&gt;
&lt;td&gt;✅ 6 calibrated 0–100 gauges&lt;/td&gt;
&lt;td&gt;❌ LLM-only numbers (75–85 cluster)&lt;/td&gt;
&lt;td&gt;❌ LLM-only numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9 typed binary pre-merge gates&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Heuristic status check only&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;CLAUDE.md&lt;/code&gt; auto-detection&lt;/td&gt;
&lt;td&gt;✅ Auto-detect, zero config&lt;/td&gt;
&lt;td&gt;⚠️ &lt;code&gt;.coderabbit.yaml&lt;/code&gt; only&lt;/td&gt;
&lt;td&gt;⚠️ &lt;code&gt;.pr_agent.toml&lt;/code&gt; only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-click "Dismiss &amp;amp; remember rule"&lt;/td&gt;
&lt;td&gt;✅ Persisted as team learning&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incremental delta review (&lt;code&gt;prevSha → headSha&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅ Resolved-finding tracking&lt;/td&gt;
&lt;td&gt;⚠️ Re-runs the full PR&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline committable &lt;code&gt;suggestion&lt;/code&gt; blocks&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;POST /api/review-suggestions&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In-place PR comment upsert&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;&amp;lt;!-- codeotter:scores --&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;❌ Duplicates&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (free self-host, modify, redistribute)&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;Apache 2.0 (community PR-Agent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-seat cost (50-eng team, 3-yr)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0–$2,400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$34,200–$129,600&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$3,000–$8,000&lt;/strong&gt; (you operate it)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The single sentence to internalize: &lt;strong&gt;if your code can leave your VPC, you do not need CodeOtter. If it cannot, you already do.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest corners — when self-hosted is the wrong call
&lt;/h2&gt;

&lt;p&gt;A credible buyer's guide names its own weak spots. Self-hosted is the wrong call if any of these is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You want the slickest SaaS dashboard and do not care where the code lives.&lt;/strong&gt; CodeRabbit's UX leads; CodeOtter is functional, not glossy. Keep CodeRabbit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You rely on a full-repo graph Q&amp;amp;A workflow daily.&lt;/strong&gt; Greptile's repo-graph Q&amp;amp;A is genuinely good. Plan the transition if it is part of your daily loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You have no platform bandwidth.&lt;/strong&gt; CodeOtter's $0 headline is not free without 4 hours/month of upgrades and patches; a 5-person startup with no ops budget should stay on a hosted reviewer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want the best narrative, not reproducible numbers.&lt;/strong&gt; A 7B Qwen won't match GPT-5 on nuanced critique. Point System 2 at GPT-5 or Claude via BYOK; System 1 numbers don't depend on the LLM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CodeOtter is free to self-host and customize; make the call that fits your team.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 8 vendor questions to ask before signing
&lt;/h2&gt;

&lt;p&gt;A vendor should answer every one of these in a single document, with endpoints and diagrams, before you sign a 3-year deal. A vendor that hides behind "contact sales" for any of them is a vendor you cannot size without spending the engineering hours to size them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the per-seat, per-author, and per-PR breakdown? Show me the formula.&lt;/li&gt;
&lt;li&gt;What happens if I cross the PR-review cap? Degraded dashboard, or billed for overages?&lt;/li&gt;
&lt;li&gt;What is the telemetry default? Can I turn it off, or do I need a DPA?&lt;/li&gt;
&lt;li&gt;Where does my code route during a review? Does it touch a third-party cloud?&lt;/li&gt;
&lt;li&gt;How do I enforce &lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;CLAUDE.md&lt;/code&gt; at the merge gate? Auto-detection supported?&lt;/li&gt;
&lt;li&gt;How do I persist team learnings across PRs? Is there 1-click "Dismiss &amp;amp; remember rule"?&lt;/li&gt;
&lt;li&gt;What is the audit story for compliance? Can I export the review graph?&lt;/li&gt;
&lt;li&gt;What is the cold-start latency on the first review of the day? What model warms up — and is it local or hosted?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the vendor's answer to 1–4 is "call sales," pass. If the answer to 5–8 names an endpoint or a file path, you are talking to a vendor worth a 12-month pilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision matrix by ICP
&lt;/h2&gt;

&lt;p&gt;The 2026 buyer falls into one of four shapes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ICP-1 — Privacy-first platform team (regulated, 25–250 eng).&lt;/strong&gt; Self-host or do not buy. CodeOtter on a Hetzner box answers Q1, Q2, Q4 with proof. See &lt;a href="https://dev.to/compare/coderabbit/"&gt;vs CodeRabbit&lt;/a&gt; and &lt;a href="https://dev.to/compare/greptile/"&gt;vs Greptile&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ICP-2 — Cost-conscious indie / OSS maintainer (1–10 eng).&lt;/strong&gt; Self-host on a MacBook or a $20/mo VPS; the 1.5B Qwen runs offline on M-series silicon. See &lt;a href="https://dev.to/compare/coderabbit/"&gt;vs CodeRabbit&lt;/a&gt; for the per-seat math.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ICP-3 — Senior IC building their own tools (50–500 eng).&lt;/strong&gt; Self-host and wire &lt;code&gt;AGENTS.md&lt;/code&gt; as a merge gate; the 1-click team-learning flow is what makes the doc a real gate, not a wiki page. See &lt;a href="https://dev.to/compare/pr-agent/"&gt;vs PR-Agent&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ICP-4 — Air-gapped / regulated infra operator.&lt;/strong&gt; Self-host with no outbound calls; models download once at admin time and live in &lt;code&gt;pb_data&lt;/code&gt;. Verify with &lt;code&gt;tcpdump&lt;/code&gt; on the review host. See &lt;a href="https://dev.to/blog/running-offline-ai-code-reviews-with-laya-and-gguf/"&gt;the offline mode post&lt;/a&gt; and &lt;a href="https://dev.to/blog/how-codeotter-runs-five-open-weight-models-locally/"&gt;the local models deep-dive&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to read next
&lt;/h2&gt;

&lt;p&gt;The five questions above are the matrix; the deep-dives below are the architecture and battlecards.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TCO math&lt;/strong&gt; — the companion 3-year TCO post for a 50-engineer team covers the four real cost inputs and the line items the headline price hides (publishing alongside this guide in W1).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual-engine architecture&lt;/strong&gt; — &lt;a href="https://dev.to/blog/dual-engine-architecture-for-the-ai-era/"&gt;Why We Built a Dual-Engine Architecture (System One + LLM)&lt;/a&gt;. The calibration problem in full and the System 1 / System 2 split behind the AGPL-3.0 release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeRabbit battlecard&lt;/strong&gt; — &lt;a href="https://dev.to/compare/coderabbit/"&gt;CodeOtter vs CodeRabbit (2026)&lt;/a&gt;. The 72× 3-year TCO gap, the &lt;code&gt;AGENTS.md&lt;/code&gt; enforcement delta, and why CodeRabbit's &lt;code&gt;.coderabbit.yaml&lt;/code&gt; is a config layer not a gate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greptile battlecard&lt;/strong&gt; — &lt;a href="https://dev.to/compare/greptile/"&gt;CodeOtter vs Greptile (2026)&lt;/a&gt;. The repo-graph Q&amp;amp;A Greptile wins on, the 150×–240× TCO gap, and why per-author billing is a foot-gun at the boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR-Agent battlecard&lt;/strong&gt; — &lt;a href="https://dev.to/compare/pr-agent/"&gt;CodeOtter vs PR-Agent (Qodo) (2026)&lt;/a&gt;. The Apache 2.0 vs AGPL-3.0 license posture, the 14×–60× TCO gap, and the multi-agent Python CLI workflow library PR-Agent ships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGENTS.md as a merge gate&lt;/strong&gt; — &lt;a href="https://dev.to/blog/agents-md-as-a-merge-gate/"&gt;How CodeOtter Turns AGENTS.md From a Wiki Page Into a Merge Gate&lt;/a&gt;. The 1-click "Dismiss &amp;amp; remember rule" flow and the &lt;code&gt;Guidelines&lt;/code&gt; gate that fails closed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline mode&lt;/strong&gt; — &lt;a href="https://dev.to/blog/running-offline-ai-code-reviews-with-laya-and-gguf/"&gt;Running 100% Offline AI Code Reviews with Local GGUF, laya &amp;amp; CodeReviewer Sidecars&lt;/a&gt;. The 5-minute cold-start, the three sidecar runtimes, the &lt;code&gt;modelReady&lt;/code&gt; shard-verify lifecycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local models&lt;/strong&gt; — &lt;a href="https://dev.to/blog/how-codeotter-runs-five-open-weight-models-locally/"&gt;How CodeOtter Runs Five Open-Weight Models Locally&lt;/a&gt;. The &lt;code&gt;models.json&lt;/code&gt; registry, GPU detection, and the "no auto-download" admin contract.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The five questions — privacy, calibration, TCO, offline, team rules — are the matrix. The deep-dives are the architecture. Run the eight vendor questions, port the TCO math to your team's PR volume, and the procurement conversation gets shorter by an hour. Self-hosted is the right call when the code cannot leave the VPC, the numbers have to be reproducible, and the per-seat tax no longer earns its line item.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CodeOtter ships under the &lt;a href="https://codeotter.io/LICENSE" rel="noopener noreferrer"&gt;GNU AGPL-3.0&lt;/a&gt; — free to self-host, $0/seat, zero telemetry, single Docker image + PocketBase + Node 20. The CLI is &lt;code&gt;bin/codeotter.mjs&lt;/code&gt; (v0.4.0, zero runtime dependencies). The dual-engine System 1 + System 2 pipeline is the same in the platform dashboard, in CI, and in the MCP server.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>selfhosted</category>
      <category>ai</category>
      <category>github</category>
      <category>codereview</category>
    </item>
  </channel>
</rss>
