Kata is in development. The compiler ships first.

Your AI has never seen your app.

So it writes code that looks like everyone else's. Kata is a command-line tool that reads your codebase once, teaches your AI tools what your product actually looks like, and comments on your pull requests when something drifts away from it.

Join the waitlist See what you get

Free and open source. Nothing leaves your machine.

kata check · voice
// edit me

Those are our real voice rules running on that text. Edit it and watch them work.

Installs into

Claude CodeCursorGitHub Copilot WindsurfZedv0Codex

The problem

Every AI builds the same website.

Not badly. Just identically. A model that has never seen your product reaches for the average of everything it was trained on, and the average has a look. You know it the moment you see it, because you are the one who rewrites it afterwards. The same drift runs through the copy and the code, and you rewrite those too.

01

The sparkle

specimen

A four-point star on anything intelligent. It has become the universal badge for "a machine made this".

✨ AI-powered insights

// the badge nobody's brand includes

02

Fake browser chrome

specimen

Three traffic-light dots around a demo that is not in a browser. Nobody asked for a window and there isn't one.

a pricing card, for some reason

// it is not a window

03

Emoji as iconography

specimen

Typed, not drawn. They break at every size, sit differently on every platform, and belong to no brand.

🚀 Fast  🔒 Secure  ⚡ Simple

// your icon set has none of these

04

The indigo gradient

specimen

Indigo into violet, on the badge and the button and the hero. A default that four hundred thousand landing pages share.

Get Started

// #6366f1 → #8b5cf6, the people's gradient

05

Headlines that break anywhere

specimen

Lines filled greedily until one word is stranded. It reads as careless because it is.

Build products your users will absolutely
love

// "love", alone on line two

06

Values that should be tokens

specimen

A hex code typed inline because the model did not know you had a variable for it. Your system quietly rots.

color: #c1492d; /* --shu exists for this */

// correct colour, orphaned value

07

Prose with a fingerprint

specimen

A dash in every sentence and claims shaped like "not just X". Readers recognize the cadence before they finish the paragraph.

"It isn't just fast — it's a whole new way to build."

// two tells, one sentence. try it in the checker above

08

Code that ignores house style

specimen

PascalCase pages in a kebab-case app. A hand-rolled fetch when your framework ships one. Correct, compiling, and visibly not yours.

inertia('OrderHistory') // yours are kebab-case

// runs fine. still wrong here

What you get

Three things land in your repo.

Kata is not advice and it is not a style guide you have to maintain. It produces files you can read, and it wires them into Alchemy, the same one-file QA setup that already runs your tests and lint.

One

Your language, written down

A single file describing how your product actually looks. Colour named for the job it does, your layout rules, which component is for which purpose, and the things you never do.

// .kata/app.kata.json
"accent": "#D4652E",
"rule": "Buttons change colour
   on hover, never move.",
"neverUse": ["emoji icons"]

Two

Rules in every tool you use

The same file rendered into whatever each tool reads, plus an MCP server for long sessions. You write the language once rather than maintaining four copies that slowly disagree.

$ npx kata connect
✓ CLAUDE.md
✓ .cursorrules
✓ AGENTS.md
✓ MCP server registered

Three

Comments when it drifts

Teaching a tool is one time. Drift is forever. Kata reads each pull request against the same file and says what moved, in your language rather than generic lint rules. Alchemy runs the check like it runs your tests, so every pipeline it generates already enforces taste.

$ npx kata review  // alchemy runs this in CI
PR #482 · 3 findings
 Hardcoded #FEFEFC
  → use var(--card)
 Chip used for a list
  → use wordmarkRow

The difference

Same prompt. Same model. One of them knows you.

Both panels answer "add a pricing card". The only variable is whether the tool had a Kata file loaded. The card on the right is built from the same one that renders this page, so the thing it matches is the page you are reading.

Cursor, todaynot your app
✨ MOST POPULAR
Pro Plan
$29/mo
  • ✅ Unlimited projects
  • ✅ Priority support
  • 🚀 Advanced analytics

Kata review · 5 findings

Sparkle icon used twice. Not in your icon set.
Window chrome around a card. There is no window.
Emoji used as iconography. Your set has check and arrow-up.
Hardcoded #6366f1. No token matches. Your accent is --shu.
Inter loaded. Your display face is Instrument Serif.
Cursor, with your Katayour app
Most chosen
Studio
$29 per month
  • Projects without a limit
  • Support that answers first
  • Analytics with the detail

Kata review · clean

Every value is a token. No inline colour, no off-scale spacing.
Icons came from your set. Drawn, and they inherit colour.
Type follows your pairing. Display serif, sans for reading.
Copy matches your voice. Full sentences, no exclamation marks.

The obvious question

"I already have a design system."

You probably do, and it probably is not the part that helps here. Tokens are the solved problem. Every tool on earth exports colour. The part an AI actually needs is the part nobody writes down.

What your system already exports Tailwind config, Figma variables, CSS custom properties
  • Your colours
  • Your type scale
  • Your spacing units
  • Your radii and shadows
A model given only this will still produce something that is not your product. It has the paint and none of the drawing.
What only exists in your head The reasons your work looks like your work
  • How your layouts relate. That a heading above a list shares the list's columns, and what happens when the window narrows.
  • Which component is for which job. That a chip carries status, and a row of names is something else entirely.
  • What you refuse to do. No fake window chrome, no emoji as icons, no gradient on display type.
  • Which surface you are on. That the docs theme and the marketing palette disagree on purpose.
This is what Kata reads out of your codebase, and it is the whole reason the output looks like you rather than merely tidy.

How it works · one

Point it at what you already have.

Nobody writes a design system from a blank file. Yours is already in production, spread across a stylesheet, a component folder and somebody's memory. Kata reads it out.

$ kata compile https://v5-x.leafphp.dev
8 measured 6 inferred 4 guessed 11 open
// scroll on, or press Run compile. Kata reads the source the way a reviewer would.

This is the one step that needs a model. Kata calls whichever one you already pay for, reading a key from your environment and never storing it. Anthropic, OpenAI, Google, or a local model through an OpenAI-compatible endpoint.

Everything after this is cheaper. Generating rules files is a pure transform with no model at all, and most review checks are deterministic. There is no account to create and no upload step, because the compiler is a CLI that runs where your code already lives. A design language in progress is one of the few things a company genuinely cannot post to a stranger's server.

How it works · two

One file. Every tool.

Rules files are the same content in four dialects. Writing them by hand is how they drift apart. Kata renders them, so they cannot.

CLAUDE.mdgenerated, do not edit

        

Claude Code and Claude Desktop

How it works · three

Rules do not enforce themselves. Something has to check.

ESLint knows your code style and Prettier knows your formatting. Neither has any idea that your buttons are pills or that your headlines break at the sentence. Kata reads each pull request against your file and says what moved.

PR #482 · feat: pricing page kata review · 5 findings, 1 blocking

Select a finding to see the rule it came from.

How it runs · Powered by Alchemy

Taste, checked like tests.

Kata compiles your language. Alchemy enforces it. The rules live in alchemy.yml, the one QA file your tests and lint already share, and they run wherever Alchemy runs: every commit, every pull request, every pipeline it generates. There is no new config file in your repo root. And outside PHP, kata runs standalone: same rules, your own CI.

In the file you already have alchemy.yml, next to your tests and lint
# alchemy.yml
kata:
  voice:
    paths: ["blog/**", "*.html"]
    deny:
      - pattern: "\u2014"
        max: 2
        reason: "dash cadence reads machine-made"
  code:
    deny:
      - pattern: "inertia\\('[A-Z]"
        reason: "pages are kebab-case here"
Alchemy stays tasteless on purpose. The taste in that block is yours, compiled by Kata, and Alchemy runs it the way it runs pest and pint. The old sidecar config is gone: what you author lives here, and what Kata compiles lands as a generated artifact.
The first kata ran on us A true story from r/PHP
  • A commenter called out AI-sounding copy on our Leaf 5 launch post. They were right, and the thread has receipts.
  • We compiled the tells into rules. The dash cadence, the reframed claims, the sentence shapes a person never types.
  • The rules swept our blog and the Alchemy site. Forty-seven fixes across two pages, and the writing came out better, not laundered.
  • Now the pipeline fails on them. Taste stopped being a memory and became a check.
Voice was the first axis because it found us first. Layout, components and code idiom compile the same way: rules read from your real work, enforced where the work happens.

The part nobody else does

It tells you what it does not know.

A compiler that quietly guesses is worse than one that admits a gap, because a guess in token shape survives review. Open questions ship into the rules file, so the model asks instead of inventing.

The registry

Browse a system. Then apply it.

A compiled language is a file, so it can be published, read and installed the way a package can. Open one to see the whole system, then take it with one command.

Applying a system is one command.

It writes the rules files, registers the MCP server, and leaves the compiled file in your repo so you can read and edit it. Nothing about your own code is uploaded to run it.

your repoone command
$ npx kata apply ./alewa.kata.json
✓ .kata/alewa.kata.json
✓ CLAUDE.md, .cursorrules, AGENTS.md
✓ MCP server registered

Built with

Kata runs on Hanabira.

This site, the compiler dashboard and the review UI are all one Hanabira app. If it feels quick, that is the point of showing you rather than telling you.

Hanabira is a React framework for people who wanted Next.js to be smaller. File-based routing, server rendering and data loading, without the parts you were never going to use. If you have been looking at TanStack Start and wishing it were lighter, it is worth ten minutes.

0config files to start a project
1dependency in the core runtime
~12kbclient runtime, gzipped

Open source

Free where it matters.

Kata is part of the Leaf ecosystem, which has been open source since the first commit. The compiler is yours, forever, for anything, and it runs on your machine rather than ours. The team review service is the part that keeps the lights on.

Kata

Free · MIT
  • Compile any repo, site or Figma file
  • Rules files and MCP server for every tool
  • Review locally and in your own CI
  • Public registry of compiled systems

Kata for teams

Later · when it earns it
  • Hosted reviews across every repo
  • Drift tracking as your system changes
  • One language shared across many teams
  • Private systems, SSO, audit history

Your AI already writes your code. Show it your app.

Kata is being built in the open and is not finished. The compiler ships first, then the review. Leave an address and you will hear from us when there is something real to run.

No product yet. No spam either. KATA by Leaf.