A free skill for your coding agent

Sweep the AI slop out of your design.

Broom brings the most popular design skills and a working studio's own taste into one skill. Your agent reads it before it writes UI and checks its work against your product's own design system, so the next screen looks designed, not generated.

npx skills add boburxd/broom
GitHubBuy me a coffee

Free and open source. Works in Claude Code, Codex, Cursor and other agents.

Example: one release screen, built twice.

Drag the divider

What the agent wrote
Releases
iOS and Android

Unlock your potential today

LiveIn reviewBeta
Two checks are still running on build 318.
This week
Builds14
Crash-free99.2%
Testers212
Review38 min
StatusVersionWhen
In review4.2.0 · build 31812 min ago
Live4.1.9 · build 311Tuesday
Failed4.1.8 · build 309Last week
Built from your system
Releases
iOS and Android

Version 4.2.0 is in review

iOS · build 318 · submitted 12 minutes ago
Two checks are still running on build 318.
This week
Builds14
Crash-free99.2%
Testers212
Review38 min
StatusVersionWhen
In review4.2.0 · build 31812 min ago
Live4.1.9 · build 311Tuesday
Failed4.1.8 · build 309Last week
  • SeparationGlow at restColoured stripeSpaced capitalsGradient fillFill and border
  • HierarchyToo many badgesA card in a cardFour loud charts
  • WordingVague headlineGeneric actionFour filter fields

Why it happens

Why AI-built products all look the same.

A coding agent that has not been given your system writes the average of every interface it has read. The average has a look, and your users have learned to recognise it.

Defaults

The same defaults, everywhere

Indigo gradients, pill-shaped everything, a glow on every card, three features in a row. Rarely ugly. Just nobody’s.

Build a dashboard for
Pick any product: the agent writes the same card, and only the noun changes.Example

Drift

Drift, one screen at a time

Every new screen brings a colour that is not in your palette, a corner that is not in your scale, a button variant nobody designed. Somebody cleans it up — or nobody does, and it ships.

Near-misses: colours and corners almost in your scale.Example

Prompts

Prompts do not stick

“Follow our design system” holds for a screen or two. Then the defaults come back, because the agent was given a sentence about your system instead of the system.

A sentence about your system holds for a screen or two.Example

The difference

Your agent does not need more taste. It needs your system.

A generic prompt gives every product the same advice. Broom starts from your product, or from a short brief when there is nothing yet, and hands the agent its own names and numbers.

A generic anti-slop prompt

design-prompt.md · example

  1. 1# Design guidelines
  2. 2Use a modern, clean aesthetic.
  3. 3Keep the design consistent.
  4. 4Choose a harmonious palette.
  5. 5Avoid generic-looking UI.
  6. 6Use plenty of whitespace.
  7. 7Make it feel premium.
  • The same file for every product
  • No number to follow, nothing to check

Broom

Example system
type.title16 / 500
type.numberGeist Mono
color.success#1f7a4d
radius.control10px
color.accent#1f5bff
Invoice 0142
$1,240.00
Paid
Add a note
Send receipt
  • Read from your own code or Figma file
  • Components, tokens and rules in your names
  • A slop check before the agent says done

Works with

Your agent. Your stack.

One folder of plain files. The agent you already use reads it, on the stack you already have.

npx skills add puts it in the right folder for each agent you name.

Your system first

How it works.

It reads what your product already declares before it judges anything. The scripts do the numbers; the agent you already use does the judgement, with the model you already use.

Your code, your Figma file or a short brief goes in. Two scripts read the system already there, find where the interface drifts from it, and build and validate a design system. Your agent reads documents and screens, judges and writes. Out come a report, fixes in your code, or a design system.

Your code

Your Figma file

Or a short brief

Two scripts: the numbers

  • detect.mjs reads your system, finds the drift

  • design.mjs builds the system, runs the validators

Your agent: the judgement

  • Reads documents, screenshots and screens

  • Judges and writes the review and the copy

SLOP_REPORT.md

/broom audit

Fixes in your code

/broom fix

A design system

/broom design

The scripts need Node 18 or later and nothing else, and they make no network calls. Reading a Figma file needs Node 22.15. There is no account and no server of ours: it all happens in your repository and your agent session.

Six commands

Say what you need. The skill knows the steps.

Each command is a short file of steps the agent follows. It reads the rules it needs, runs the scripts, and asks you only what is left open.

  • You have a product

    Find what drifted from your own system, then fix it.

    /broom audit
    Finds the slop and writes SLOP_REPORT.md. Changes no code.
    /broom fix
    Fixes the report one finding at a time, checking after every edit.
    /broom check
    A quick pass over the files you changed.
  • You need a design

    Start from a short brief, or give a product a new look.

    /broom design
    A design system from a short brief: tokens, components, DESIGN_SYSTEM.md and rules for your agent.
    /broom redesign
    A new look for a product that exists: an audit, a new system, then its screens one at a time.
  • You have a Figma file

    Turn the finished file into rules in its own names.

    /broom handoff
    A finished Figma file becomes the rules your agent builds from, in the file's own names.

That is how Claude Code takes them; in other agents, ask in the same words (broom audit). The skill also works without a command: whenever the agent writes or changes UI, it reads the rules first and runs the checker before it calls the work done.

The checker

Every finding names a file and a line.

detect.mjs reads the product's own system first, then prints one line a finding in three groups: must, drift from your system, and taste. This is its real output on the small example beside it, run when this page was built.

src/tokens.css
  1. :root {
  2. --color-page: #f7f7f8;
  3. --color-surface: #ffffff;
  4. --color-ink: #1c1d20;
  5. --color-accent: #1f5bff;
  6. --radius-control: 10px;
  7. --radius-card: 12px;
  8. }
src/InvoiceCard.tsx
  1. export function InvoiceCard() {
  2. return (
  3. <div className="rounded-[12px] border border-gray-200 bg-white p-6 shadow-lg">
  4. <h3 className="text-[17px] font-medium">Invoice 0142</h3>
  5. <span className="rounded-full bg-[#22c55e] px-3 text-white">Paid</span>
  6. <button className="rounded-[14px] bg-gradient-to-r from-purple-500 to-indigo-500 px-4 text-white">
  7. Get started
  8. </button>
  9. </div>
  10. );
  11. }
$ node detect.mjs .

must (2)

src/InvoiceCard.tsx:3 Separate the element with one technique, a fill first: drop the border or the shadow (a hover may add a shadow, a state may add a border). [border-and-shadow]

src/InvoiceCard.tsx:7 Say what the action or the failure actually is ("Create your first project") instead of "Get started" or "Oops". [generic-copy]

drift (5)

src/InvoiceCard.tsx:3 Use a class or variable from your own colour tokens instead of the framework's default palette. [palette-class]

src/InvoiceCard.tsx:5 Use one of your colour tokens instead of a hard-coded hex. [hex-off-system]

src/InvoiceCard.tsx:6 Use a class or variable from your own colour tokens instead of the framework's default palette. [palette-class]

src/InvoiceCard.tsx:6 Use a class or variable from your own colour tokens instead of the framework's default palette. [palette-class]

src/InvoiceCard.tsx:6 Use a radius from your scale instead of a one-off value. [radius-class]

taste (2)

src/InvoiceCard.tsx:6 Use a flat fill from your tokens; here the gradient is decoration. [gradient]

src/InvoiceCard.tsx:6 Give the button its action, or remove it until it has one; a button wired to nothing looks like it works. [inert-button]

9 findings in 2 files · score 476.2 (heavy)

The score on the last lineFindings per thousand lines, weighted, so a short example runs off the scale.
  • Clean 0–3nothing generic to speak of
  • Light 3–10a few generic patterns
  • Noticeable 10–20generic patterns across the product
  • Heavy 20+the interface reads as generated

A "Kept as theirs" block lists what your system does on purpose, such as a declared blur or pill-shaped controls, and the check leaves it alone. Run it yourself any time; it needs no network.

What is inside

One folder. Read it before you trust it.

Everything the agent reads and runs is plain text and plain JavaScript in your repository. Nothing is fetched while it works.

  • SKILL.md

    What the agent reads first, every time: your system comes first, which rules to open for the task, and the check before it calls UI work done.
  • commands/

    The six commands, step by step: audit.md · fix.md · check.md · design.md · redesign.md · handoff.md.
  • references/

    The rules, one file a topic: principles, the slop list, decision tables, components, copy, the studio's own hand, product types, the finishing passes, spacing, interaction, honesty and AI surfaces, the audit method, the checklist and the design brief.

    audit-method.md · bans.md · brief.md · checklist.md · components.md · copy.md · design-tables.md · finishing.md · honesty-and-ai.md · interaction.md · principles.md · product-types.md · spacing.md · studio-hand.md · writing.md

  • scripts/design.mjs

    Turns a brief, or a Figma file, into a design system: tokens, components, docs and rules, after the validators.
  • scripts/detect.mjs

    The checker. Node 18 or later, no dependencies, no network.
  • LICENSE

    Apache-2.0. Use it, change it, ship it. The licences of every source are in THIRD_PARTY_NOTICES.md.

Installed by hand, the folder goes into .claude/skills/ (Claude Code), .agents/skills/ (Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode) or .windsurf/skills/ (Windsurf).

/broom design

What a design system looks like when it lands.

The script writes into a folder of its own and never deletes. Your agent moves the files in, and asks before it touches one you already have.

  • components/

    Your stack, every variant and state.

  • tokens/

    CSS variables light and dark, Tailwind, DTCG JSON, Dart, Swift and Kotlin.

  • docs/components/

    One page per component.

  • .claude/skills/

    The skills, in your product's names. The slop check is a script.

  • DESIGN_SYSTEM.md

    Every token value and the component index.

  • CLAUDE.mdAGENTS.md.cursorrules

    Point your agent at all of it.

Components, not snippetsEvery variant and state, the keyboard path and the accessibility attributes.
For a web app
44
For a mobile app
50
For a website
52
Your stackEvery text pairing in the tokens is checked against its background, light and dark.
StackCodeTokensDocs
React + TailwindYesYesYes
Next.js + TailwindYesYesYes
VueYesYesYes
SvelteYesYesYes
React NativeYesYesYes
HTML + CSSSpecYesYes
FlutterSpecYesYes
SwiftUISpecYesYes
Jetpack ComposeSpecYesYes

Code: component files for the stack. Spec: each component written down in full for your agent to build.

Skills your agent runs

In your product's own component names and numbers. The slop check is a script it runs before it calls a task done.

  • build
  • states
  • edge-cases
  • consistency
  • review
  • finish
  • slop-check
  • and one for your product type

Yours to keep: use it, change it, ship it and sell what you build with it. No attribution, no licence to track.

Sources

Built on the work of 33 skills, guides and systems.

Broom brings together the ideas of the design skills and guides below, restated in its own words and checked against each other. Thank you to their authors.

Design skillsmost installed first

Platform guidelines

Design systems and files

Each source's licence is in THIRD_PARTY_NOTICES.md in the repository. Read the notices

Before you install

Questions.

What people ask before they add a skill to their agent.

  • Is it really free?

    Yes. Broom is open source under the Apache-2.0 licence. There is no account, no plan and no payment: the work that needs a model runs in your own agent session, with the model and the plan you already have.

  • Which agents does it work with?

    Any agent that reads Agent Skills, among them Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode and Windsurf. The install command puts the skill in the right folder for each agent; by hand it is one folder to copy.

  • Does my code leave my machine?

    Not because of Broom. The two scripts read your files where they are and make no network calls. Your code goes only where your agent already sends it: to the model you chose for it.

  • Will it change my design?

    Not what your system does on purpose. It reads your tokens, components, radii, fonts and blurs first; a declared blur, a gradient or pill-shaped controls stay as they are. Slop is what drifts from your system toward generic defaults. The audit changes no code at all, and a fix is one finding per edit.

  • Which stacks?

    The checker reads web code and Flutter, SwiftUI and Jetpack Compose, and finds the system each of them declares.

    /broom design writes component code for React + Tailwind, Next.js + Tailwind, Vue, Svelte and React Native, and a full specification of every component for HTML + CSS, Flutter, SwiftUI and Jetpack Compose.

  • What does it need?

    Node 18 or later for the scripts, and nothing else. Reading a Figma file needs Node 22.15 or later, because Figma files are compressed with zstd.

  • Can I change it, or use it at work?

    Yes. Under Apache-2.0 you can use it, change it and ship it, commercially too. Keep the licence and the notices with it.

  • What happened to the Broom app?

    Broom was a paid service at app.broom.design until 5 October 2026. It closed, and every account and its data were deleted. What it did now runs in your own agent, as this skill.

Privacy

The skill collects nothing. It is a folder of files in your repository, it runs inside your own agent, and its scripts make no network calls.

This site sets no cookies and stores nothing in your browser. It counts visits with Vercel Web Analytics, without a cookie and without anything that identifies you.

A support payment is made on Dodo Payments' own checkout page; this site never sees your card.

Broom used to be a paid service at app.broom.design. It closed on 5 October 2026; its accounts and their data were deleted, and the privacy policy and terms that described it no longer apply. Questions go to the repository's issues.

Your agent is going to write the interface either way.

Give it your components, your tokens and your rules instead of its defaults. Add the skill, then ask it for an audit, a design or a handoff in the session you already have open.

npx skills add boburxd/broom
GitHub
  • What your system does on purpose stays
  • One finding an edit, checked after each
  • No account, and no network calls from the scripts