Write a decision once. Every future edit gets checked against it, so nothing you've already settled gets silently overturned.
Works with Claude Code today.
npx codekeel installRunning npx codekeel install sets up everything in one shot: it registers a few hook commands in your global ~/.claude/settings.json, adds /decision to ~/.claude/commands/, and seeds this project's ledger/DECISIONS.yaml with six curated starter rules covering secrets, personal information, migrations, failing tests, lint/type suppressions, and .env files. No account, no network call — all local.
The hooks and slash commands are global — set up once per machine, shared by every project you touch. The ledger isn't: it lives inside each repo, so you need to run npx codekeel install again (or just npx codekeel ledger init) in every new project to get one seeded there. Already-installed hooks are skipped automatically, so re-running anywhere is always safe.
Each starter rule is an ordinary entry once written: supersede any of them the same way you'd supersede a decision you recorded yourself.
FUNCTIONS.md and PROJECT_STATE.mdaren't part of that setup step — they show up separately, written by a hook that runs after your first real Claude Code session in the project.
From your normal session, via the /decision command. No separate tool to open. It also notices decisions you never said out loud, mined from the conversation, and proposes them for review rather than recording anything on its own.
/decision > Every API route validates input with Zod before use.
Recorded as D-014, scoped to web/src/app/api/**
A live check runs against every edit inside that decision's scope, automatically.
Checking edit against D-014... ✗ Blocked: removes Zod validation from POST /api/webhook
Contradictions and stale entries surface for a quick human call, not a silent guess.
Decision D-004 conflicts with D-014. 1. Supersede D-004 2. Keep both (false positive) 3. Don't record
Three separate layers, only one of which needs an Anthropic API key:
Before an edit lands, if a turn is touching an unusually broad set of files, or a file that looks auth/permissions/billing/migration-related and wasn't mentioned, Claude Code pauses and asks you first. No ledger entry required — this runs on every session.
A mechanically-checkable decision (e.g. "migrations are append-only") gets checked instantly and locally — no network call, no account needed, and no meaningful delay.
Checking edit against D-002 (local)... ✗ Blocked: modifies an existing migration
A decision that depends on judgment (e.g. "don't change styling unless the prompt asked for it") can't be reduced to a pattern — the diff and the instruction that triggered it get checked by a live model call. This is the one part of the three that needs a key.
Only for the live checks, and only when ANTHROPIC_API_KEYis set: the file path, the diff, and the prompt that triggered it are sent straight from your machine to Anthropic's API for a verdict, then discarded. codekeel has no server in that path and never sees this traffic.
Nothing is retained anywhere by codekeel — not your code, not your diffs, not the verdicts.
The free CLI handles recording and reviewing decisions locally, and even enforces the decisions that reduce to a plain pattern (no model call, no key). Setting ANTHROPIC_API_KEY puts a live model in the loop, called directly from your machine, for the parts that genuinely need judgment:
Every diff under a decision's scope that can't be reduced to a pattern gets checked against it in real time, with an explanation if it's about to drift.
Checking edit against D-014... ✗ Blocked: removes Zod validation from POST /api/webhook
An admissibility check catches invariants too fuzzy to actually verify, before they clutter the ledger with rules nothing can check.
/decision > Write clean code ✗ Too vague to enforce. Try: "No function exceeds 50 lines"
PROJECT_STATE.mdgets fed back into every new session's context on its own, instead of just sitting in the repo waiting to be read.
Your decision ledger. Created by install (or ledger init on its own) with six starter rules, then grows as you record your own via /decision. Project-local — run it again in each new project you want covered.
- id: D-014 decision: Every API route validates input with Zod scope: [web/src/app/api/**] invariant: No route handler skips Zod parsing on its input status: active created: 2026-07-17
An auto-maintained map of every function and export in your codebase, so your agent can check before writing something that already exists. Pseudocode signatures only, regenerated automatically as the codebase changes.
## src/lib/theme.ts - `const ACCENT: string` - `function isEntitled(input: EntitlementInput): boolean`
A running summary of what happened in each project: files touched, what was asked. Written and fed back into every new session's context automatically — free, no key needed.
## 2026-07-17 **Files touched:** web/src/app/page.tsx **Worked on:** - Rebuilt the FAQ accordion section
We built codekeel because our own agent kept re-deciding things we'd already settled, three prompts after we settled them. Writing the rule down in a comment didn't help — it just became one more thing the agent had to notice, remember, and correctly apply on its own. It needed to be enforced, not just remembered.
A decision ledger without enforcement is just documentation nobody re-reads. codekeel closes that gap: the ledger is checked against, not just consulted, so a decision made once actually stays made.
It runs entirely on your machine and is free and open source under AGPL-3.0 — no account, no server, and nothing about how it works is hidden from you. If you want the parts that need judgment, not just pattern matching, bring your own Anthropic key; codekeel is never in that path.