ux-skill kills AI slop with 152 rules. It still isn't your brand

By The WAALEE Team · · 4 min read

ux-skill kills AI slop with 152 rules. It still isn't your brand

ux-skill is an open-source design intelligence engine that plugs into Claude Code, Cursor and Windsurf. Its pitch is blunt and correct: coding agents optimize for "does it run," so they default to the same safe layout, the same gray-on-white Tailwind palette, the same rounded card with a purple gradient. ux-skill ships a 152-rule deterministic linter that catches that pattern before it ships, no LLM call needed, plus a synthesizer that recommends a full design system from a brief. It's a genuinely useful piece of infrastructure. It also answers a different question than the one most teams actually have.

What the linter actually catches

Per the project's own docs, the `ux_lint` tool runs 152 regex-based rules against your files and returns findings with a rule id, severity, file, line, excerpt and fix, entirely offline. That's the right way to enforce "don't do this": no model in the loop to talk itself out of a rule, no drift between runs. It's the same instinct behind a linter for code style, just aimed at the visual output an agent produces instead of the syntax it writes.

  • The default shadcn look: rounded-xl cards, the same two grays, zero visual identity.
  • Inter (or the current default font) used everywhere, at every weight, for every purpose.
  • A purple-to-blue gradient hero with no connection to any actual brand.
  • Emoji used as section icons instead of real iconography.
  • Spacing and radii that are whatever the component library shipped with, untouched.

Where the brand it recommends comes from

The part worth reading closely is the synthesizer. ux-skill's v3.0 update, documented on its own blog, reframed its 160 brand specs: they used to be a catalogue the tool picked from, now they're described as "vocabulary" that a 7-axis engine distills into a fresh system per brief. Those 160 specs are real design data pulled from Apple, Linear, Vercel, Stripe, Ferrari, Anthropic and other well-known brands. Give the engine an industry, audience and tone, and it returns a palette, type pairing, motion presets and components, deterministically, same brief in, same system out.

That's a strong answer if you're starting from nothing and need a plausible design language fast. It's a different answer if you already have a brand. The project's own changelog treats an existing design system as "fixed input," meaning ux-skill will respect it once you hand it over, but the handing-over is still on you: someone has to transcribe your actual palette, type scale and spacing into whatever format the tool expects. Nothing in ux-skill looks at your live site and pulls that out for you.

A linter is not a source of truth

This is the same shape of gap as the Figma-pipe tools and CSS inspectors this space keeps shipping: a real improvement at enforcing or reading design decisions, built on the assumption that the decisions themselves are already captured somewhere clean. For a team with no existing brand, synthesizing one from Apple and Stripe's vocabulary beats shipping the Tailwind default. For a team that already has a shipped site with a real identity, that's not the problem, the problem is getting that identity into every agent's hands as structured input instead of a paragraph of adjectives someone writes from memory.

That's the step WAALEE handles. Paste a live URL and it extracts the actual colors, type scale, spacing and radii as W3C design tokens, ready to paste into Claude, Cursor, Lovable, v0 or Bolt, or to hand to a linter like ux-skill as the "fixed input" it's already built to respect. Your agent stops guessing at a brand and stops borrowing one from Stripe's playbook. It builds from yours.

Three ways to keep an AI coding agent from drifting into generic output, and what each one assumes you already have:

  • ux-skill: 152-rule offline linter plus an MCP server that blocks AI-slop patterns in Claude Code, Cursor and Windsurf. Strong at catching generic output; recommends a system synthesized from 160 other brands' specs, not yours.
  • ux-skill: Brand specs as training data: The project's own v3.0 writeup: its 160 brand specs are vocabulary for a synthesizer, and an existing design system is handled as fixed input you supply yourself.
  • WAALEE: Paste any live URL and get your actual colors, type, spacing and W3C tokens back as AI-ready prompts, the fixed input a linter or coding agent needs to build from your real brand instead of a borrowed one.

Rules stop the worst output. They don't tell an agent what your brand actually looks like. If you already have one, feed it in directly instead of describing it from memory.

Latest from the blog