What shipped on Tuesday, October 13, 2026

Today CodeOtter goes public on Show HN. It is a self-hosted AI code reviewer that runs on your hardware, not ours. The full source is at github.com/dharmeshgurnani/CodeOtter under the GNU Affero General Public License v3.0 (AGPL-3.0) — free to use, copy, distribute, and modify. Modified network services must publish their source.

Three things distinguish the architecture from the AI reviewers that shipped in 2025 and 2026:

  1. The scoring engine is deterministic. A typed rubric engine (POST /v1/systemone) owns every 0–100 gauge and every binary pre-merge gate. A language model never gets the token for the scores. A Quality: 42 from CodeOtter is reproducible and defensible in a postmortem because the rubric says why.
  2. The narrative engine is separate. System 2 writes the executive summary, the file-by-file walkthrough, and the inline suggestion blocks. Either engine operates standalone; you can re-run System 1 alone for a known-good AGENTS.md flip.
  3. The diff never leaves your hardware. The review runs on a Docker container or a Compose stack on your machine. Models download once at admin time into pb_data. There is no auto-update, no telemetry, no SaaS fallback. You can prove this with tcpdump on the review host.

The Show HN thread URL is set in src/lib/siteConfig.ts the moment the post goes live; the homepage strip picks it up automatically.

The architecture in one paragraph

Every pull request triggers a parallel execution of the two engines on the diff:

const [s1Result, llmResult] = await Promise.all([
  runSystemOneRubrics(diff, guidelines),
  runLanguageWalkthrough(diff, guidelines)
]);
const record = judge(s1Result, llmResult);

System 1 returns a typed scorecard: six calibrated 0–100 gauges and nine binary merge gates, none of which depend on the LLM. System 2 returns a narrative review powered by Claude, OpenAI, MiniMax, or OpenRouter via BYOK, or by local GGUF sidecars running on the box itself. judge() normalizes untrusted model output into a single record before it is written to PocketBase. The full deep-dive is on /blog/dual-engine-architecture-for-the-ai-era.

What is not here yet — the limitations we will not hide

A credible launch post names its own weak spots. The current build has three:

  • Cold start. The first local review of the day takes ~5 minutes while models warm up and shards hash-check. After that, reviews land in seconds. If you want sub-second at all times, point System 2 at a hosted model via BYOK; System 1 numbers do not depend on the LLM.
  • AGPL-3.0 is OSI-approved copyleft. You can self-host, fork, customize, and ship CodeOtter inside your product. If you offer a modified version as a network service, you must publish the source for that modified version. If you need an Apache 2.0 upstream, PR-Agent is the closer architectural cousin; the license posture is the trade-off.
  • The dashboard is functional, not glossy. UX polish is on the ROADMAP for later quarters. If your team wants the slickest SaaS dashboard and does not care where the code lives, CodeRabbit leads on that axis.

Call to action

  • Star github.com/dharmeshgurnani/CodeOtter. Stars are how a self-hosted OSS project signals viability to procurement.
  • Self-host. docker compose up on a $20/mo VPS or a MacBook. Models download once at admin time. No account required.
  • Discuss on the Show HN thread — the URL is in the homepage strip on launch day. The maintainer is in-thread for the launch day and the week after.

AGPL-3.0 · Free to self-host · $0/seat · Zero telemetry · Single Docker image + PocketBase + Node 20. The dual-engine System 1 + System 2 pipeline is the same in the platform dashboard, in CI, and in the local CLI.