QA DNA · Production case study Claude Code · Anthropic API · 2026
Luthien, open-source AI control for Claude Code

Built with Claude, for Claude.

Luthien is a proxy that sits between Claude Code and the Anthropic API and makes sure Claude follows the rules a team sets. QA DNA used Claude Code to build large parts of it, then built the website that takes it to market. Claude wrote the code that keeps Claude in line.

40pull requests merged into Luthien by QA DNA
40 / 41QA DNA commits co-authored by Claude
Mar to May2026, the period of QA DNA's engineering work
5 to 15 msadded latency per request, per Luthien
The production use case

Claude Code is powerful. Sometimes it ignores the rules.

Teams write their conventions into CLAUDE.md: use uv, not pip; never touch this folder; ask before deleting. Claude Code usually follows them. Over long sessions and after context compaction, it sometimes doesn't, and a developer ends up correcting the same thing by hand again and again.

Luthien turns those rules into something enforced. Every request and response between Claude Code and the Anthropic API passes through the proxy, gets logged, and is checked against the team's policies. A response that breaks a rule is corrected or blocked before it reaches the developer, and a separate Claude model can act as a judge on each response.

Developer's machine

Claude Code

Runs as normal, on the team's own Claude subscription.

Claude
Luthien proxy

Policy checkpoint

  • Logs every request and response
  • Checks against CLAUDE.md and team rules
  • Rewrites or blocks a violation in transit
  • Optional judge model on each response
Anthropic

Claude API

OAuth pass-through. Luthien never sees an API key and adds no extra charge.

Claude
Two Claude Code terminals side by side. Without Luthien, Claude runs pip install despite a CLAUDE.md rule and the developer corrects it twice. With Luthien, the proxy blocks pip install and Claude switches to uv on its own.
The same session with and without Luthien, as shown on luthien.cc. CLAUDE.md says to use uv; Luthien catches the pip install and corrects it.
The twist
We built a control layer for Claude Code using Claude Code, and tested it by running Claude Code through it.

QA DNA's contributions to Luthien were written in pair with Claude. Of the 41 commits QA DNA authored in the Luthien repository, 40 carry a Claude co-author line. Onboarding bugs were found by dogfooding: running Claude Code through the proxy we were building, and fixing what broke.

fix: onboarding dogfood bugs - streaming protocol, OAuth detection, docker env (#449) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude Opus 4.6Claude Opus 4.6 (1M context)Claude Sonnet 4.6Claude Opus 4.7
Engineering

What QA DNA shipped into the proxy

The work focused on everything between "this works on the founders' laptops" and "a team can install it and trust it in production". Each item links to the merged pull request.

Use your own Claude subscription

No API key handed to the proxy, no surprise bills.

  • OAuth pass-through as the default path, documented end to end#468
  • Claude Pro and Max OAuth quickstart#270
  • Billing mode surfaced to prevent unexpected API charges#311
  • Billing badge: green when on OAuth, clear warning otherwise#477
  • Session ID extracted from OAuth metadata#400

Install in minutes

Onboarding that survives real machines and real clouds.

  • One-click Railway deploy with OAuth pass-through and default policies#497
  • Onboarding fixes from dogfooding and QA feedback#490
  • Local Docker build fallback when the image pull fails#455
  • Gateway memory cut to fit a 1 GB Docker limit#453
  • Safe defaults for fresh cloud deploys, all missing settings reported at once#450

Streaming you can trust

Claude Code streams everything, so the proxy has to stream correctly too.

  • Streaming protocol compliance validator#426
  • Error event on an empty stream instead of a silent HTTP 200#451
  • Conversation history recorded for Anthropic streaming responses#268
  • anthropic-beta header forwarded, SDK kept current#269
  • Chunk buffering so text rewrites work mid-stream#396

Policies and control

The part that actually keeps Claude Code in line.

  • luthien policy command in the CLI#479
  • Safety judge fixed for parallel MCP tool calls#356
  • Parallel and serial policy chains: crash and ordering fixes#305
  • Backend timeouts and safe handling when a policy errors#310
  • Policy configuration UI improvements#272

Testing

Our home ground as a QA company.

  • Mock end-to-end testing framework#307
  • Shellcheck added to dev checks, all warnings fixed#332
Go to market

Then we took it to market

QA DNA's in-house GTM and marketing team produced most of Luthien's public presence.

Website

Designed and built luthien.cc, including the request pipeline explainer and the beta sign-up path.

Copy

Product positioning and site copy, written for developers who already use Claude Code every day.

Blog

Content work on the Luthien blog alongside the founders.

luthien.cc homepage hero: Claude Code builds. You stay in control. With the install command and buttons for GitHub and Apply for beta.
Homepage: the positioning in one line, with install and beta sign-up right below it.
Problem section of luthien.cc with filter chips and cards collecting real Claude Code incidents from GitHub and social media.
The problem section collects real Claude Code incidents, filterable by type.
Architecture section of luthien.cc showing the request pipeline: You, Claude Code, Luthien, Anthropic API, with the checks Luthien runs.
Architecture explained as a terminal diagram, in the language of the people who use it.
Early feedback quote from a beta user followed by three get started steps: install, configure rules, let Claude build.
Early beta feedback and a three-step get started flow.
See it yourself

Everything here is public