Skip to content
zeroslop.design

[ zero-slop-design 0.2.0 ]14 skillsMIT

Define design

zero-slop-design is a plugin for coding agents. It records your design decisions in one DESIGN.md file. The agent builds, changes and reviews the interface against that file.

claude plugin marketplace add zero-slop-design/zero-slop-design-plugin

[ 01 / 06 ]The problem

An agent with no design record designs for the average.

Ask an agent for a settings page. You get the interface that it sees most often: a gradient header, glass cards, emoji in headings and a new spacing scale. Your prompt did not prevent these, so the agent used them.

It guesses the palette.

It has no record of your colors, so it selects a typical one. Often, that is a gradient.

It makes new tokens.

Each file gets a new spacing scale. The radius values almost match, but not fully.

It forgets the states.

The default state looks correct. Nobody designed focus, loading or error.

[ 02 / 06 ]The record

One file holds your values and your reasons.

DESIGN.md contains your tokens, your components and the rules for each. Each decision has a source. The agent marks its own suggestions as proposed. It lists each open decision as unresolved and does not fill it with a default.

The format follows the zero-slop-design DESIGN.md profile. This page has its own DESIGN.md.

DESIGN.md[ this page ]
x-zsd:
  review:
    status: draft
  unresolved:
    - Interface text not reviewed.
colors:
  surface: "#2F2F2F"
  on-surface: "#E0E0E0"
  outline: "#4A4A4A"
typography:
  display-xl:
    fontFamily: Faculty Glyphic

[ 03 / 06 ]The library

Keep a record of the websites you return to.

Explore DESIGN.md references from our favourite websites. Each file records observed styles, its source, and the questions that still need review. Download one and make it the starting point for your own design.

Browse the design library

[ 04 / 06 ]The skills

Fourteen skills in one loop: define, build and examine.

[ A ] Define

Start with your decisions.

Write down your decisions before the agent writes a component. Your decisions go in one list. The agent's proposals go in a different list. Open questions stay open.

[ 01 / 14 ] define-design

Write the brief before the pixels.

Makes a design brief from your instructions. It puts your decisions, the agent's proposals and the open questions in separate lists.

Use: Before a new interface or a new visual identity.

claude · ~/acme-web
  1. /zero-slop-design:define-design
  2. Landing page for our plugin. Calm and monochrome. No gradients.
  3. Read AGENTS.md, package.json
  4. Read refs/landing.jpg
  5. Who is the primary audience?
  6. Developers who use coding agents.
  7. Write design-brief.md
  8. 6 decisions recorded
  9. 1 unresolved: body font
design-brief.md
Design briefstatus: draftREFERENCEAUDIENCEDevelopers who usecoding agentsKEEPmonochrome1px gridASCII motionPREVENTgradientsglassemojiUNRESOLVED? body font

[ 02 / 14 ] create-design-md

Turn the brief into tokens.

Writes DESIGN.md from the approved brief. Values go in YAML and the rule for each value goes in text. Gaps go in the unresolved list.

Use: When the project needs a design file.

claude · ~/acme-web
  1. /zero-slop-design:create-design-md
  2. Read design-brief.md, AGENTS.md
  3. Read src/styles/tokens.css
  4. Kept 6 colors, 2 type roles, 2 spacing steps
  5. Write DESIGN.md
  6. Lint DESIGN.md
  7. 0 errors · tokens resolve
  8. 1 unresolved: body font
DESIGN.md
1--- 2name: acme-web 3colors: 4surface: "#121212" 5surface-raised: "#1E1E1E" 6on-surface: "#EDEDED" 7typography: 8headline: { size: 32px } 9body: { size: 16px }10spacing: { sm: 8px, md: 16px }11x-zsd:12kind: project13source: design-brief.md14review.status: draft15unresolved: [body font]16---BODY## Overview## Colors## Typography## Layout## Componentsvalues: YAMLroles: prosev lint: 0 errors? 1 unresolvedstatus: draft

[ 03 / 14 ] extract-design

Record the design you already have.

Reads source code, a running interface or screenshots. It records each value with its source and marks estimates as estimates.

Use: When the interface exists before its design file.

claude · ~/acme-web
  1. /zero-slop-design:extract-design
  2. Make DESIGN.md from localhost:3000 and src/.
  3. Open localhost:3000 · computed styles
  4. Read src/app/globals.css
  5. Image values have an estimate label
  6. Hover state is not in the source
  7. Write DESIGN.md · method: hybrid
  8. Each value has a source location
DESIGN.md · extracted
12345SOURCElocalhost:3000src/app/globals.csscaptured 2026-10-06METHODhybridTOKENVALUESOURCE1surface#2F2F2Fglobals.css:142headlineFaculty 56pxcomputed h13bodyStrichpunkt 17pxcomputed p4gap-stack~24px~est hero.jpg5? button:hover?unresolvedv 3 measured1 estimate? 1 unresolved

[ B ] Set the system

Make each part of the system explicit.

Agents guess most about type, color, layout and states. Each of these has its own skill, its own rules and its own record.

[ 04 / 14 ] define-typography

Give each text a role.

Sets the headline, body and label roles with size, weight and line height. Each role uses a real font file and a fallback.

Use: For text hierarchy and font changes.

claude · ~/acme-web
  1. /zero-slop-design:define-typography
  2. Read DESIGN.md, src/app/layout.tsx
  3. next/font: Faculty Glyphic, Strichpunkt Sans, Google Sans Code
  4. Dense or comfortable body text?
  5. Comfortable. The docs pages have long text.
  6. Update DESIGN.md · typography
  7. headline, body, and label roles set
  8. Fallback family recorded for each font
  9. Italic: no asset. Recorded as unresolved.
DESIGN.md · typography
HEADLINE · Faculty Glyphic56 / 400 / 1.05Define designBODY · Strichpunkt Sans17 / 400 / 1.55zero-slop-design is a plugin for coding agents.It records your design decisions in one DESIGN.md file.LABEL · Google Sans Code11 / 500 / 1.4SKILLS · SETUP · LIBRARY · GITHUBSOURCEnext/font/googleFALLBACKGeorgia · system-ui · ui-monospace? italic not loadedx-zsd.unresolved

[ 05 / 14 ] define-color-system

Select colors by role. Then prove the contrast.

Sets the surface, text, action and status roles. It checks the contrast of each pair and defines each color mode.

Use: For color selection, contrast and theme changes.

claude · ~/acme-web
  1. /zero-slop-design:define-color-system
  2. Dark mode only. Monochrome. Status colors with a glyph.
  3. Read DESIGN.md, design-brief.md
  4. Measure 3 text pairs
  5. on-surface-variant on surface: 2.1:1
  6. Update on-surface-variant #4A4A4A → #8A8A8A
  7. 5.4:1 · passes 4.5:1 for text
  8. Update DESIGN.md · colors, contrast data
  9. 3 pairs pass · each status has a glyph
DESIGN.md · colors
PAIRCONTRASTAaon-surfaceon surfaceAaon-surfaceon surface-raisedon-surface-varianton surfaceAaAav 16.0:1v 14.2:1! 2.1:1 below 4.5v 5.4:1was 2.1STATUSv success! error? warningMODEdark · no overridesv 3 of 3 pairs pass 4.5:1

[ 06 / 14 ] define-responsive-layout

Break the layout where the content breaks.

Sets width limits, spacing and breakpoints at the widths where the content fails. It does not use a list of devices.

Use: For viewport limits, breakpoints and content order.

claude · ~/acme-web
  1. /zero-slop-design:define-responsive-layout
  2. Support 320 to 1440. Keep the docs rail on desktop.
  3. Read DESIGN.md, src/app/docs/layout.tsx
  4. Open localhost:3000 · 1440, 768, 390
  5. Rail labels wrap below 1024
  6. Two columns collide below 768
  7. Edit DESIGN.md · breakpoints, layout
  8. 2 breakpoints, each with a content condition
  9. Reading sequence kept at all widths
DESIGN.md · layout
1440lg · rail + content768md · no rail390base3201440768mdone column below 7681024lgrail removed below 1024v no horizontal scroll at 320status: draft

[ 07 / 14 ] define-interaction-states

Design all the states, not only the default.

Defines hover, focus, pressed, loading, error, success and disabled for each component. Each state has a trigger, a result and a recovery.

Use: For focus, loading, error, selection and motion.

claude · ~/acme-web
  1. /zero-slop-design:define-interaction-states
  2. Set states for button-primary. It submits the signup form.
  3. Read DESIGN.md, src/components/ui/button.tsx
  4. default, hover, focus found in code
  5. What occurs when a submit fails?
  6. Show the error. Keep the email value.
  7. Edit DESIGN.md · components.button-primary
  8. 6 states, each with trigger and result
  9. Second submit blocked while loading
DESIGN.md · button-primary
STATEPREVIEWTRIGGERRESULTdefaultrestfill, labelhoverpointerfill lightensfocusTab2px ringADDED TO DESIGN.mdloadingSavingsubmitdisablederror! Retryfailemail keptsuccessv Saved200focus keptreduced motionspinner → text "Saving"

[ C ] Build and change

Build from the record. Change only what you name.

The agent builds with your tokens and shows which tokens it used. When you change a decision, only that decision and its dependent values change.

[ 08 / 14 ] apply-design

Build with the tokens. Show the mapping.

Changes components, layouts and styles with the values in DESIGN.md. It reports the token for each change.

Use: When the interface must follow the design file.

claude · ~/acme-web
  1. /zero-slop-design:apply-design
  2. Build the hero buttons from DESIGN.md.
  3. Read DESIGN.md, AGENTS.md, src/app/globals.css
  4. Edit src/components/ui/button.tsx
  5. Edit src/app/page.tsx
  6. button-primary → bg-primary, rounded-sm
  7. label-md → text-label-md · spacing.sm → gap-2
  8. 4 tokens, 2 components mapped
  9. Not measured: hover, focus. Check at localhost:3000.
src/components/ui/button.tsx
DESIGN.mdbutton-primaryrounded.smlabel-mdspacing.smbutton-primaryrounded.smlabel-mdspacing.sm4 tokens mappedbutton.tsx · page.tsx? hover, focus not measured

[ 09 / 14 ] update-design-md

Change one decision. Keep the others.

Changes only the decisions that you name and the values that depend on them. All other decisions stay the same.

Use: When your design data or instructions change.

claude · ~/acme-web
  1. /zero-slop-design:update-design-md
  2. Change rounded.sm from 4px to 6px.
  3. Read DESIGN.md
  4. Recorded 44 selections before the change
  5. Search rounded.sm, 4px in DESIGN.md
  6. 2 related instructions found
  7. Edit DESIGN.md · rounded.sm, Shapes
  8. 1 specified, 2 related, 41 kept
  9. Related work: src/components/ui/button.tsx, input.tsx
DESIGN.md · diff
DESIGN.mdstatus: approved? status: draftrounded:kept sm: 4px sm: 4px! - sm: 4pxv + sm: 6pxspecified md: 8pxkept## ShapeskeptButtons use 4px corners.Buttons use 4px corners.! -Buttons use 4px corners.v +Buttons use 6px corners.relatedFocus ring radius: 6px.Focus ring radius: 6px.! -Focus ring radius: 6px.v +Focus ring radius: 8px.relatedInputs match button corners.keptchanged 3 · kept 41 · status: draftsource: developer request

[ 10 / 14 ] export-design-tokens

Send the same values to each stack.

Exports tokens as CSS variables, DTCG JSON or a Tailwind v4 theme. If it cannot export a value, it stops and tells you why.

Use: When you connect DESIGN.md to your token source.

claude · ~/acme-web
  1. /zero-slop-design:export-design-tokens
  2. CSS variables to src/styles/tokens.css.
  3. Bash node tools/zsd.mjs export DESIGN.md --format css
  4. stop: {colors.ring} does not resolve
  5. Set colors.focus to {colors.primary}?
  6. Yes. Use primary.
  7. Write src/styles/tokens.css
  8. mapped 42/42 · 0 lost
  9. Report: tokens.map.md · DESIGN.md stays the source
src/styles/tokens.css
cssdtcgtailwind--out src/styles/tokens.csssource1:root {2--zsd-colors-surface:#2F2F2F;3--zsd-colors-on-surface:#E0E0E0;4--zsd-colors-outline:#4A4A4A;5--zsd-colors-focus:6--zsd-spacing-md:12px;7--zsd-rounded-sm:4px;8}{colors.ring}!#E0E0E0;======! stop: {colors.ring} does not resolvev mapped 42/42 · 0 lostreport: tokens.map.md · format: css

[ D ] Examine

Find the slop before your users do.

Each review reports what it measured and what it could not measure. It never reports an unmeasured item as a pass. It changes nothing without your approval.

[ 11 / 14 ] review-design-md

Find contradictions before they ship.

Finds broken token references, missing states and rules that disagree. It reports each problem. It does not fix problems without your approval.

Use: Before implementation and after each change to DESIGN.md.

claude · ~/acme-web
  1. /zero-slop-design:review-design-md
  2. Read DESIGN.md, design-brief.md
  3. Inspect references, states, instructions
  4. line 14: {colors.brand} does not resolve
  5. line 31: button-primary has no focus state
  6. lines 22, 38: two radius values for button
  7. DESIGN.md not changed
  8. decision needed: 4px or 8px corners
  9. 3 defects found. Correct the file now?
inspection report
12colors:13surface: "#2F2F2F"14accent: "{colors.brand}"!21rounded:22button: 4px!30components:31button-primary:!32hover: "{colors.primary-hover}"38Buttons use 8px corners.!no focus! L14{colors.brand} missingadd token! L31no focus stateadd focus! L22,384px and 8px radiuskeep oneDESIGN.md unchanged? 1 decision needed

[ 12 / 14 ] review-design-drift

Measure the interface against the record.

Compares measured values from the running interface with DESIGN.md. It lists each difference. It never reports an unmeasured value as a pass.

Use: After an interface change.

claude · ~/acme-web
  1. /zero-slop-design:review-design-drift
  2. Read DESIGN.md
  3. Open localhost:3000 · 1440 × 900 · dark
  4. Measured 2 components
  5. Compare button-primary, button-secondary
  6. rounded: 4px, measured 10px
  7. gap: 8px, measured 16px
  8. colors and type match
  9. No files changed. 2 differences to resolve.
drift report
EXPECTED · DESIGN.mdMEASURED · localhost:3000! rounded4px→10px! gap8px→16pxv colorsmatchv typematch2 drift0 changed · decision needed

[ 13 / 14 ] review-accessibility

Examine contrast, keys, labels and focus.

Finds accessibility problems in the design file or the interface. It gives the WCAG criterion for each problem. It never calls a lint result full conformance.

Use: For contrast, keyboard use, labels, focus and zoom.

claude · ~/acme-web
  1. /zero-slop-design:review-accessibility
  2. Inspect the setup section against WCAG 2.2 AA.
  3. Open localhost:3000/#setup · 1440 × 900
  4. Press Tab through 7 controls
  5. Measure contrast of 12 text pairs
  6. 2.4.7 focus visible on all controls
  7. 1.4.3 caption text 5.5:1, needs 4.5:1
  8. 2.5.8 target spacing needs manual check
  9. Conformance not claimed. 0 defects, 1 manual item.
accessibility report
INSPECTED · #setup1234WCAG 2.2 AAv 2.4.7focus visible7 of 7 controlsv 1.4.3caption 5.5:1needs 4.5:1? 2.5.8target spacingmanual checkconformance: not claimed0 defects · 1 manual · 0 files changed

[ 14 / 14 ] enforce-design

Stop design drift before it merges.

Adds design code checks from DESIGN.md to your repository and its continuous integration. A change with a color, size, font or effect that the design does not permit fails the build.

Use: When new code must stay inside the recorded design.

claude · ~/acme-web
  1. /zero-slop-design:enforce-design
  2. Read DESIGN.md, package.json, .github/workflows
  3. Write tools/zero-slop-design/, design-check.config.json
  4. Bash zsd check-code DESIGN.md
  5. pricing.tsx:12 bg-blue-500 is not a token
  6. Use bg-primary? The chart colors come from a library.
  7. Yes. Keep the chart colors as an exception.
  8. Write .github/workflows/design-check.yml
  9. 0 errors · 1 exception with a cause · CI step added
pull request checks
src/app/pricing.tsx11<Button12className="bg-blue-500">!bg-primary">v17// design-check-ignore-next-line color-value: chart palette18const series = chartPalette;19<Chart data={series} />CHECKS · design-check.ymlvLint DESIGN.md0 errors!Check source code against DESIGN.md1 errormerge blockedvCheck source code against DESIGN.md0 errors1 exception · each with a causev ready to mergenot checked: layout, contrast, states

[ 05 / 06 ]The limits

What the plugin does not do.

It does not impose a style.

The template is only an example. Your decisions replace it.

It does not approve its own guesses.

Proposals stay marked as proposed until you approve them.

It does not fill gaps with defaults.

If nobody made a decision, the plugin lists it as unresolved.

It does not call a lint a review.

A clean lint result does not prove that the interface is correct or accessible.

[ 06 / 06 ]Setup guide

Install with two commands. Start with one skill.

The plugin includes its runtime. You do not need an npm package or a network service.

Do you already have an interface? Start with extract-design, not define-design.

GitHub
  1. 01

    Add the marketplace

    claude plugin marketplace add zero-slop-design/zero-slop-design-plugin
  2. 02

    Install the plugin

    claude plugin install zero-slop-design@zero-slop-design
  3. 03

    Write a design brief

    /zero-slop-design:define-design
  4. 04

    Make the design file

    /zero-slop-design:create-design-md

Skill commands use the plugin namespace. For local development, start Claude Code with --plugin-dir and the absolute path to the plugin.

[ optional ] Local tools · Node.js 22 or later

  • Examine a design file

    node tools/zsd.mjs lint DESIGN.md --strict --json
  • Export CSS variables

    node tools/zsd.mjs export DESIGN.md --format css --out tokens.css
  • Compare two versions

    node tools/zsd.mjs diff before.md after.md --json