Design System Generate Skill
There is a skill for auditing a design system that exists and a skill for
extracting one from a brand that exists. This one is for the case in between:
there is no system, and something ships on Thursday.
The output is not a mood board. It is a set of files an engineer can commit,
with a contrast audit attached to them.
Required Inputs
Ask for these if not provided:
- A name or seed — anything; the product name works. The same seed always
produces the same system, so this is how a design becomes reproducible.
- A brand colour, if one is non-negotiable (
#E4002B and so on). If there
isn't one yet, say so and let it choose.
- Light, dark, or both — default to both.
- A feeling, loosely: editorial, brutalist, glassy, terminal, or playful.
If the user describes it in their own words, map it to the nearest.
- Where it has to land — CSS variables, Tailwind, design tokens, Figma, a
VS Code theme, a deck theme, Storybook. Default to CSS + tokens.
Programmatic Helper
This skill is a thin wrapper around a deterministic generator. Do not invent hex
values — run it.
# Look at one first
npx --yes notugly <seed> --vibe editorial
# Lock a brand colour that is not up for discussion
npx --yes notugly <seed> --brand "#e4002b"
# Write the files
npx --yes notugly export <seed> --brand "#e4002b" --out ./design
npx --yes notugly slides <seed> --out ./deck # .thmx for PowerPoint/Keynote
npx --yes notugly storybook <seed> --out ./stories
# Prove the claim rather than making it
npx --yes notugly audit <seed> --brand "#e4002b"
npx --yes notugly vision <seed> # colour-blind collisions
npx --yes notugly print <seed> # what survives CMYK
export writes ten files: CSS custom properties, a Tailwind config, W3C design
tokens, React and Svelte snippets, a demo page, a loadable Figma plugin, and a
VS Code theme. Runtime cost is zero — it is all static text, so there is no
package to install and nothing to break at 3am.
Zero dependencies and no model call, so it is free to run and gives the same
answer every time.
The Method
Start from the constraint, not the palette. If there is a mandated brand
colour, pass it to --brand and build everything else around it. Generating
a lovely system and then discovering it cannot accommodate the company red is
the most common way this work gets thrown away.
Let the text colour be derived, never chosen. The generator picks each
text colour from its background so that no combination can fail. If you
find yourself hand-picking a hex for body copy, you have left the system.
Check it against the three things nobody checks. Colour-blind collisions
(vision), the CMYK gamut if anything will be printed (print), and the
chart accents if it will ever be a deck (slides warns when two chart series
are indistinguishable).
Ship the audit with the tokens. A design system without a contrast report
is a claim. Paste the audit output into the handoff.
Say what was decided and why. Record the seed and the flags. npx notugly <seed> --vibe <vibe> reproduces the whole thing exactly, which means the
design is a one-line command rather than a folder somebody has to keep.
Output Structure
Design System: [Product Name]
Seed: [seed] · Vibe: [vibe] · Brand locked: [hex or "no"]
Reproduce: npx notugly [seed] --vibe [vibe] [--brand #hex]
Palette
| Role |
Colour |
Hex |
Name |
On background |
Verdict |
| Background |
▪ |
#ffffff |
Paper |
— |
— |
| Body text |
▪ |
#020404 |
Soot |
20.55:1 |
AAA |
| Brand |
▪ |
#004054 |
Navy |
11.28:1 |
AAA |
Every ratio above is computed, not estimated.
Type
Headings: [family] · Body: [family] · Scale: [ratio] ([name])
[The size ladder, in px.]
Spacing, radius, elevation
[The 4px grid, the radius set, and the five elevation levels.]
What was checked
Files produced
[The list from export, with byte counts, and the runtime cost line.]
Open decisions for a human
[Anything the generator cannot decide: illustration style, photography
direction, motion beyond the presets, iconography.]
Quality Checks
- Did you run it, or describe it? Every hex in the output must come from the
tool. A plausible palette written by hand is exactly what this skill exists to
replace.
- Is the seed recorded? Without it the design is not reproducible and the
next person starts over.
- Did the brand colour survive? If the user gave one,
--brand must be in
the reproduce command.
- Is the audit attached? Not "it meets AA" — the actual ratios.
- Are the open decisions listed? A generator cannot choose an illustration
style. Pretending otherwise is how these documents lose credibility.
Anti-Patterns
- Inventing hex values. The whole point is that these are computed.
- Claiming AA without a number. "Accessible" is a marketing word; "4.52:1"
is a fact.
- Generating a system when one already exists. If the product has a design
system, use [[design-system-audit]]. If it has a brand but no system, use
[[brand-guidelines]] to extract first, then pass the result in via
--brand.
- Shipping the light theme only. Dark mode is where elevation and contrast
break, and it is cheaper to check now than to retrofit.
- Treating the vibe as the deliverable. The vibe is a starting point. The
deliverable is the token file and the audit.
Example Trigger Phrases
- "We need a design system by Thursday"
- "Pick a colour palette for [product]"
- "Build a starter theme around our brand red"
- "Generate design tokens for the new app"
- "Give me a Tailwind config that passes accessibility"
- "Make a deck theme that matches our product"
1---2name: design-system-generate3description: Generate a complete, accessibility-checked design system from scratch — colour ramps, type scale, spacing, elevation, and exports for CSS, Tailwind, design tokens, Figma, VS Code and PowerPoint. Use when asked to create a design system, pick a colour palette, build a starter theme, produce design tokens for a new product, or apply an existing brand colour to a full system. For auditing a system that already exists use design-system-audit; for extracting one from a live site use brand-guidelines.4---5
6# Design System Generate Skill
7
8There is a skill for auditing a design system that exists and a skill for
9extracting one from a brand that exists. This one is for the case in between:
10**there is no system, and something ships on Thursday.**
11
12The output is not a mood board. It is a set of files an engineer can commit,
13with a contrast audit attached to them.
14
15## Required Inputs
16
17Ask for these if not provided:
18
19- **A name or seed** — anything; the product name works. The same seed always
20 produces the same system, so this is how a design becomes reproducible.
21- **A brand colour**, if one is non-negotiable (`#E4002B` and so on). If there
22 isn't one yet, say so and let it choose.
23- **Light, dark, or both** — default to both.
24- **A feeling**, loosely: editorial, brutalist, glassy, terminal, or playful.
25 If the user describes it in their own words, map it to the nearest.
26- **Where it has to land** — CSS variables, Tailwind, design tokens, Figma, a
27 VS Code theme, a deck theme, Storybook. Default to CSS + tokens.
28
29## Programmatic Helper
30
31This skill is a thin wrapper around a deterministic generator. Do not invent hex
32values — run it.
33
34```bash
35# Look at one first
36npx --yes notugly <seed> --vibe editorial
37
38# Lock a brand colour that is not up for discussion
39npx --yes notugly <seed> --brand "#e4002b"
40
41# Write the files
42npx --yes notugly export <seed> --brand "#e4002b" --out ./design
43npx --yes notugly slides <seed> --out ./deck # .thmx for PowerPoint/Keynote
44npx --yes notugly storybook <seed> --out ./stories
45
46# Prove the claim rather than making it
47npx --yes notugly audit <seed> --brand "#e4002b"
48npx --yes notugly vision <seed> # colour-blind collisions
49npx --yes notugly print <seed> # what survives CMYK
50```
51
52`export` writes ten files: CSS custom properties, a Tailwind config, W3C design
53tokens, React and Svelte snippets, a demo page, a loadable Figma plugin, and a
54VS Code theme. **Runtime cost is zero** — it is all static text, so there is no
55package to install and nothing to break at 3am.
56
57Zero dependencies and **no model call**, so it is free to run and gives the same
58answer every time.
59
60## The Method
61
621. **Start from the constraint, not the palette.** If there is a mandated brand
63 colour, pass it to `--brand` and build everything else around it. Generating
64 a lovely system and then discovering it cannot accommodate the company red is
65 the most common way this work gets thrown away.
66
672. **Let the text colour be derived, never chosen.** The generator picks each
68 text colour *from* its background so that no combination can fail. If you
69 find yourself hand-picking a hex for body copy, you have left the system.
70
713. **Check it against the three things nobody checks.** Colour-blind collisions
72 (`vision`), the CMYK gamut if anything will be printed (`print`), and the
73 chart accents if it will ever be a deck (`slides` warns when two chart series
74 are indistinguishable).
75
764. **Ship the audit with the tokens.** A design system without a contrast report
77 is a claim. Paste the `audit` output into the handoff.
78
795. **Say what was decided and why.** Record the seed and the flags. `npx notugly
80 <seed> --vibe <vibe>` reproduces the whole thing exactly, which means the
81 design is a one-line command rather than a folder somebody has to keep.
82
83## Output Structure
84
85---
86
87# Design System: [Product Name]
88
89**Seed:** `[seed]` · **Vibe:** [vibe] · **Brand locked:** [hex or "no"]
90**Reproduce:** `npx notugly [seed] --vibe [vibe] [--brand #hex]`
91
92## Palette
93
94| Role | Colour | Hex | Name | On background | Verdict |
95|---|---|---|---|---|---|
96| Background | ▪ | `#ffffff` | Paper | — | — |
97| Body text | ▪ | `#020404` | Soot | 20.55:1 | AAA |
98| Brand | ▪ | `#004054` | Navy | 11.28:1 | AAA |
99
100*Every ratio above is computed, not estimated.*
101
102## Type
103
104**Headings:** [family] · **Body:** [family] · **Scale:** [ratio] ([name])
105[The size ladder, in px.]
106
107## Spacing, radius, elevation
108
109[The 4px grid, the radius set, and the five elevation levels.]
110
111## What was checked
112
113- [ ] Every text pairing clears WCAG AA — *weakest: X:1*
114- [ ] No two colours merge under any simulated colour vision deficiency
115- [ ] Every colour is inside the CMYK gamut *(if printing)*
116- [ ] All six chart accents are distinguishable *(if there will be decks)*
117
118## Files produced
119
120[The list from `export`, with byte counts, and the runtime cost line.]
121
122## Open decisions for a human
123
124[Anything the generator cannot decide: illustration style, photography
125direction, motion beyond the presets, iconography.]
126
127---
128
129## Quality Checks
130
131- **Did you run it, or describe it?** Every hex in the output must come from the
132 tool. A plausible palette written by hand is exactly what this skill exists to
133 replace.
134- **Is the seed recorded?** Without it the design is not reproducible and the
135 next person starts over.
136- **Did the brand colour survive?** If the user gave one, `--brand` must be in
137 the reproduce command.
138- **Is the audit attached?** Not "it meets AA" — the actual ratios.
139- **Are the open decisions listed?** A generator cannot choose an illustration
140 style. Pretending otherwise is how these documents lose credibility.
141
142## Anti-Patterns
143
144- **Inventing hex values.** The whole point is that these are computed.
145- **Claiming AA without a number.** "Accessible" is a marketing word; "4.52:1"
146 is a fact.
147- **Generating a system when one already exists.** If the product has a design
148 system, use [[design-system-audit]]. If it has a brand but no system, use
149 [[brand-guidelines]] to extract first, then pass the result in via `--brand`.
150- **Shipping the light theme only.** Dark mode is where elevation and contrast
151 break, and it is cheaper to check now than to retrofit.
152- **Treating the vibe as the deliverable.** The vibe is a starting point. The
153 deliverable is the token file and the audit.
154
155## Example Trigger Phrases
156
157- "We need a design system by Thursday"
158- "Pick a colour palette for [product]"
159- "Build a starter theme around our brand red"
160- "Generate design tokens for the new app"
161- "Give me a Tailwind config that passes accessibility"
162- "Make a deck theme that matches our product"