Skip to content
Tavero

Keep the UI your agent writes consistent.

Tavero scans your running React app, finds drift in buttons, cards, colors and spacing, and gives your coding agent each fix with the file, the line and the token to use. Free and open source.

npm i -D taveroOpen the demoRead the docs

High · buttons · Acme demo, 6 pages at 3 widths

7 text button styles

  • Button "primary" as rendered

    Button "primary" · canonical · 9 renders

    src/components/Button.tsx:4 · bg #3b5bdb, text #ffffff, radius 6, padding 10/16, 14px/600, border 1px, no shadow

  • written in Team as rendered

    written in Team · 3 renders

    src/pages/Team.tsx:6 · bg #f0f0f0, text #000000, radius 0, padding 1/6, 13px/400, border 2px #000000, no shadow

  • written in Reports as rendered

    written in Reports · 3 renders

    src/pages/Reports.tsx:7 · bg #ffffff, text #1d2433, radius 999, padding 9/18, 13px/500, border 1px #e4e7ec, no shadow

  • written in Settings as rendered

    written in Settings · 3 renders

    src/pages/Settings.tsx:12 · bg #e03131, text #ffffff, radius 4, padding 10/16, 14px/600, no border, no shadow

  • written in Billing as rendered

    written in Billing · 3 renders

    src/pages/Billing.tsx:8 · bg #4263eb, text #ffffff, radius 8, padding 11/18, 14px/600, no border, no shadow

Expected on the 4 other styles: Button "primary", or the allowed "ghost" and "secondary", chosen by a person in the panel.

What Tavero finds

Four rules, run on what the browser renders at mobile, tablet and desktop widths. Every finding names the component and the source line. Examples from the Acme demo, 6 pages.

Buttons

Distinct button styles, near duplicates, and buttons written in page markup instead of the shared component.

Button written in TeamButton written in ReportsButton written in Settings

Cards

Card-like containers that differ in background, border, radius, padding or shadow. 3 card styles in the demo.

Card style from the demoCard style from the demo

Colors

Colors outside your tokens, the nearest token, and the place where the literal is written.

#206f4asrc/tones.ts:3→ no close token (nearest --acme-muted #5b6475, ΔE 27.1); add a token

Scales

Radius, spacing, font size and shadow values that are not on the scale your tokens declare.

radius off the scale: 4px, 8px, 14px, 999px · declared: 10px, 6px

Your agent closes the findings

Tavero runs as an MCP server. The agent reads the design context before writing UI, picks a finding, fixes it, rescans only what it touched and checks the diff.

  1. Read the context

    Canonical components, tokens and conventions, in about 1,500 tokens.

  2. Open a finding

    The file and line, the current value, and the token or component to use.

  3. Fix and rescan

    Only the routes and the rule it touched. Seconds, not minutes.

  4. Check the diff

    Done when the finding is listed as resolved.

› tavero_context

Action button is Button from src/components/Button.tsx (props: variant)

--acme-primary #3b5bdb · --acme-radius 10px · --acme-space 16px

› tavero_findings rule=colors

f_ff30adc07c Color #4263eb is not a project token

› tavero_finding f_ff30adc07c

src/app.css:33 literal #4263eb in source

expected --acme-primary #3b5bdb (ΔE 3.5)

edit src/app.css:33 background: #4263eb → var(--acme-primary)

› tavero_scan routes=/billing rules=colors

› tavero_diff

resolved f_ff30adc07c Color #4263eb is not a project token

resolved f_18862a0332 Hardcoded color #4263eb in 1 place(s)

new 0

Claude Code with Opus 5.5, no shell, 29 s, 10 turns. Recorded on a copy of the Acme demo.

You decide what is intended

A local panel for the person behind the agent. Go through the findings with the keyboard. Each decision reaches the agent on its next call, without a rescan.

The Tavero panel choosing the canonical button for the Acme demo

The canonical picker for the Acme buttons. Open this panel

Fix
Confirmed work. The agent sees it first.
Intended
Hidden from the agent until the finding grows.
Canonical
The reference variant, with a name, used as the expected value.
Note
A message delivered with the finding.

Install

Add the package, then give your client the MCP config. Every config below is printed by tavero mcp --print-config.

npm i -D tavero
// .mcp.json
{
  "mcpServers": {
    "tavero": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "tavero",
        "mcp"
      ]
    }
  }
}

Then ask your agent to read tavero_context before it writes UI. Quick start