Anatoly logo - multi-LLM AI agent that audits your codebase

Use case

Audit your codebase from Claude Code. No API key.

Drive a full multi-LLM audit through your existing Claude.ai subscription. Tool use, real-time PostToolUse and Stop hooks, Opus deliberation pass — without a single API token billed on top.

Why use Claude Code as the runner

If you already pay for Claude.ai, your Pro / Max subscription unlocks a generous Claude Code budget. Anatoly runs on top of that runtime: every read, grep, file walk, RAG query and finding-resolution round-trip flows through Claude Code instead of an API key. Same audit pipeline. Zero tokens billed on top.

The first run is heavy — full embedding, all seven axes, deliberation pass. Every run after that is incremental: SHA-256 cached, unchanged files cost $0, and the hook only re-audits what you just edited.

One command to install the hook

~/your-project
$ npx anatoly hook init
→ writing .claude/settings.json (PostToolUse, Stop)
→ default anti-loop: max_stop_iterations 3
 hook installed · close & reopen Claude Code to activate

$ npx anatoly run
→ provider · claude-code (subscription)
→ axes (parallel) · sonnet 4.6 · 7/7 OK
→ deliberation · opus 4.7 · 22 → 11 confirmed
 .anatoly/runs/2026-05-05_104210/public_report.md

The save → audit → fix loop

Once the hook is installed, the loop runs automatically as you save files inside Claude Code. The anti-loop guard caps it at three cycles per file so it never spins on itself.

saveauditfindingfix

loop until file is clean · anti-loop guard built in

What the hook config looks like

.claude/settings.jsongenerated by anatoly hook init
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{ "type": "command",
        "command": "npx anatoly hook on-edit", "async": true }]
    }],
    "Stop": [{
      "hooks": [{ "type": "command",
        "command": "npx anatoly hook on-stop", "timeout": 180 }]
    }]
  }
}

What the integration gives you

Mix it with other providers

You're not locked in. Set the cross-cutting routing once, then override the heavier axes individually - useful when you want Opus on Correction but Sonnet everywhere else, or when you bring in a local model alongside Claude.

.anatoly.ymlcross-cutting + per-axis routing
routing:
  generation:
    quality: anthropic/claude-sonnet-4-6
    deliberation: anthropic/claude-opus-4-6
    fast: anthropic/claude-haiku-4-5-20251001

evaluation:
  axes:
    correction:
      enabled: true
      model: anthropic/claude-opus-4-6    # override quality routing
    utility: true    # inherits routing.generation.quality

Who this fits

Other use cases

Run your first auditSee a sample report →← All use cases