AI Frontend Governance for production codebases

Catch UI drift before it ships.

Decantr gives AI coding agents the contract, context, and evidence they need to edit your frontend without drifting from your product standards.

v3.4.0 shipping today · ★ 6 on GitHub · 8 MCP tools · MIT
npx @decantr/cli scan
Or press / to focus the command

Project Health: from 42 to 94

First pass 0/100
After repair 0/100 +52

Project Health is a deterministic score over duplicate components, raw values, route coverage, and accessibility checks. Open-source rubric →

Works with frameworks you already ship

ReactNext.jsRemixVue NuxtSvelteSvelteKitSolidStart AstroViteTailwindCSS Modules MUIshadcn/ui

What scan actually does

~/your-app — npx @decantr/cli scan decantr v3.4.0
$npx @decantr/cli scan
scanning project structure...
Detected React 18 + Tailwind 3 + Vite
Indexed 64 components, 18 routes, 312 source files
analyzing component reuse and token coverage...
!Project Health: 42/100 · 3 findings · all repair-ready
Evidence bundle written → .decantr/evidence/latest.json (gitignored)
Done in 4.2s · zero files modified · ready for your agent

The drift problem

The first AI edit looks fine. The tenth one drifts.

Coding agents are fast enough to outrun your product standards. Decantr gives them the context and evidence loop they were missing.

01 / Duplication

Components get rebuilt locally

The agent reimplements a button, card, or form instead of importing the primitive your app already owns.

02 / Tokens

Raw values sneak in

Inline colors, arbitrary Tailwind values, and one-off spacing slip past review because each prompt only sees part of the app.

03 / Intent

Route intent goes stale

Pages keep changing while docs, route maps, and design expectations stop agreeing with what users actually touch.

One local loop

Scan. Adopt. Verify.

Three commands. Three artifacts. Your app remains the authority — Decantr just gives your agent something to repair against.

Scan

Reads routes, components, styling, and existing project rules. Zero writes to source.

npx @decantr/cli scan
prints a zero-write fit report

Adopt

Writes a repo-owned contract and an observed baseline. Reversible. Gitignored where it should be.

npx @decantr/cli adopt --yes
writes decantr.essence.json + .decantr/graph/*

Verify

Emits findings with stable codes, repair IDs, and an evidence bundle your agent reads automatically.

npx @decantr/cli verify --evidence
writes .decantr/evidence/latest.json
Plugs into your agent natively. Cursor, Claude Code, Continue.dev, Windsurf, and Cline pick up findings via our MCP server. Or pipe to any agent: decantr verify --evidence | claude --apply

One repair, end to end

What your AI actually receives.

Decantr emits a finding. Your agent reads it. The diff lands clean. No vibes — concrete codes, IDs, and anchors.

1 · Finding emitted
// .decantr/evidence/latest.json
{
  "code": "COMP001",
  "route": "/feed",
  "file": "app/feed/SaveBtn.tsx",
  "issue": "Duplicate primitive",
  "expected": "@/ui/Button",
  "repair_id": "r_4a2"
}
2 · Agent reads context
# MCP-fetched repair prompt
route: /feed
duplicate: app/feed/SaveBtn.tsx
already-owned: @/ui/Button

action:
  replace local button
  with imported primitive
  preserve onClick + label
  no other changes
3 · Diff lands clean
// app/feed/SaveBtn.tsx
- import { motion } from "framer"
- const SaveBtn = (p) => (
-  <motion.button {...p} /> )
+ import { Button } from "@/ui/Button"
+ export const SaveBtn = (p) =>
+   <Button {...p} />
Repair landed in 1.2s · 3 lines changed · 0 ripple edits · finding closed

Why a new tool

Linters check syntax. Decantr checks intent.

Existing tools see *files*. Decantr sees *routes, primitives, and the contract you've already shipped.*

Decantr ESLint Stylelint Storybook
Scope UI semantics + drift JS syntax CSS rules Component dev env
Reads route-scoped context Yes No No Partial
Repair-ready findings for AI Yes No No No
MCP / agent-native protocol 32 tools No No No
Zero source modification Yes Yes Yes Setup files
Open source · MIT Yes Yes Yes Yes

Built for local control

Take the speed. Keep the authority.

Local-first

Runs from your terminal, your CI, or any MCP-compatible agent.

Your code stays yours

Findings, baselines, and screenshots live on your machine by default.

Drops into your stack

Brownfield adoption observes what's already there. No rewrite, no migration.

Style-system agnostic

Tailwind, CSS modules, MUI, shadcn, your own design system — Decantr observes.

Agent-ready context

Give the AI a map before it edits.

Before your agent touches a route, Decantr can hand it the route contract, owned primitives, allowed tokens, and active findings — through MCP or stdout.

decantr task /feed "add save action" MCP · live
ROUTE      /feed
OWNS       SavedRecipes, FeedItem, ActionsBar
PRIMITIVES @/ui/Button, @/ui/Card, @/ui/Dialog
TOKENS     text-primary, bg-card, gap-sm
RULES      no inline styles · import primitives only · ARIA labels required
BEHAVIOR   confirmation-dialog · accessible name · destructive copy
EVIDENCE   last-pass 0x4a2 · 3 findings open · 8 MCP tools online

Built in the open

Specific. Shipped. Auditable.

No black box, no telemetry by default, no rug pull. The whole loop is yours to read and to fork.

Packages shipping 8 @ v3.4.0 npm
MCP tools online 8 for any MCP agent
License MIT no rug pull, ever
Source TypeScript GitHub

Pricing posture: the CLI, verifier, MCP server, and contract layer are free forever, MIT licensed. A hosted Project Health dashboard is on the roadmap — opt-in, never required.

Momentum

What's shipping next.

Shipping now · v3.4.0

Proof-lab hardened Project Health

Route discovery, graph context, shell drift evidence, and MCP task scoping tightened against messy and pristine Brownfield apps.

Next · v3.2

Hosted Project Health dashboard

Push your local evidence to a team view. PR comments, drift over time, repair throughput — opt-in only.

Soon · v4.0

Cross-repo intelligence

One contract layer across your design system and consumers. Repair findings travel with shared primitives.

Already scanned?

Lock the contract. Run adopt.

Adopt observes what's already in your app and writes a repo-owned contract. Reversible. Gitignored. Yours.

npx @decantr/cli adopt --yes