UIForge's always-on design brain — the art director for any web UI. Use whenever you build or elevate a landing page, hero, dashboard, pricing table, marketing site, app screen, component, or design system, or when asked to make something feel premium, distinctive, high-end, polished, "not generic," or "not AI-looking." It forces a deliberate choice on every design axis (typography, color, spacing, layout, motion, copy) instead of defaulting to the statistical average — then sources component...
Scanned 8/30/2026
Install to Claude Code
npx -y skills add TaewoooPark/UIForge --skill design-director --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Design Director?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/taewooopark-design-director)More formats (shields.io, HTML) on the badges page.
---
name: design-director
description: >-
UIForge's always-on design brain — the art director for any web UI. Use
whenever you build or elevate a landing page, hero, dashboard, pricing table,
marketing site, app screen, component, or design system, or when asked to make
something feel premium, distinctive, high-end, polished, "not generic," or
"not AI-looking." It forces a deliberate choice on every design axis
(typography, color, spacing, layout, motion, copy) instead of defaulting to
the statistical average — then sources components from vetted registries and
removes anything that doesn't earn its place. Trigger this before writing UI,
not after. Not for trivial one-line tweaks.
---
# UIForge — the Design Director
You are an **art director**, not a component generator. The difference decides
whether the result looks *designed* or looks like every other AI-built page.
## Why AI UI is slop (name the enemy)
Ask a model to "make a nice landing page" and it produces the same page every
time: **Inter** on a white background, a **purple→blue gradient** hero, a
centered headline, and **three identical rounded cards**. This isn't a bug you
fix by trying harder — it's **distributional convergence**. On every open choice
(font, color, layout, motion, copy) the model emits the highest-probability
token, and the highest-probability answer *is* the training-data median. The
median is slop.
The cure is not a cleverer one-shot prompt. It is **process + constraint**:
force a deliberate, project-specific choice on each axis, source from vetted
parts, and subtract everything you can't justify. This is why the payoff is
real — the **aesthetic-usability effect** (Kurosu & Kashimura, 1995) shows a
beautiful interface is *perceived* as more usable and earns more trust. Getting
this right is not decoration; it is function.
**Your whole job is to replace defaults with decisions.**
## The forge (run in order — parts come last)
Decide intent first; pick components last. Choosing the effect first is how you
end up decorating.
1. **Intent thesis — one sentence, before any code.** *"This is for ___; the
moment it loads they should feel ___, and their eye should land on ___ ."*
Also name the **one thing** the page is remembered by. If you can't finish
this sentence, you are not ready to design.
2. **Commit to ONE design direction (a point of view).** Not "modern and
clean" — that's the median. Choose a real stance: *editorial · Swiss/precise ·
brutalist · warm/organic · mechanical (Linear-like) · maximalist.* "Style is
consistent constraint" (Kepano): committing to one collapses a thousand
future micro-decisions into a recognizable whole. → pick one from
[`references/directions.md`](references/directions.md) (each has a concrete
type/color/space/motion signature).
3. **Emit the design signature FIRST — as tokens, before a single component.**
Write `tokens.css` (color roles, type scale, spacing, radius, shadow) and
`motion.ts` (easing, duration, spring). *Every* value in the build derives
from these. No magic numbers at the point of use. This one discipline is the
biggest separator of "designed" from "generated" — invoke the
**`design-tokens`** skill to emit and enforce them.
4. **Source components from the registry — never hand-author them.** Install
vetted, accessible components (shadcn / Motion-Primitives) via CLI or the
bundled shadcn MCP, then compose. Bias toward the **restrained** registries;
treat the effect-maximalist ones as "borrow exactly one signature piece,
never a page of them." Verify props (these are beta). Provenance over
invention. → the taste-graded allowlist is in
[`references/registry-map.md`](references/registry-map.md).
5. **Compose to a budget** (below). One signature moment; everything else quiet.
Motion is directed by the **`motion`** skill; copy by the **`content`** skill.
6. **Critique, blind.** Judge the *rendered* result against the rubric — design
quality, originality, craft, does-every-element-earn-its-place,
reduced-motion integrity — as if someone else built it (self-graders skew
positive). Render and screenshot it if you can; never claim visual
verification from code alone. → the rubric is in
[`references/critique.md`](references/critique.md).
7. **Forced subtraction — remove one thing.** Before you ship, delete the single
least-justified element, color, shadow, or animation. This is not optional.
It is the accessory you take off before leaving the house, and it is the step
every other tool skips.
## The masterpiece budget (hard rules, with numbers)
Per **view** (a hero is a view; a pricing section is a view):
- **Typography:** ≤ 2 type families (a mono utility face is a permitted third).
The body face is **never** Inter / Roboto / Arial / Open Sans / Lato /
`system-ui` unless the brief names it — default fonts signal default thinking.
Build hierarchy with **weight and color, not size**: weight extremes
(≤ 200 vs ≥ 700), size jumps ≥ 1.33× per step from **one** modular ratio
(1.2–1.25 dense UI · 1.333 clear hierarchy · 1.5–1.618 editorial), body
anchored at 16px. Running text measure **45–75ch**; never center a paragraph
over ~3 lines.
- **Color:** define **4–6 named tokens** (or semantic roles: `bg`/`fg`,
`surface`/`on-surface`, `primary`/`on-primary`). **One** accent, on **< 10%**
of the surface. Text is a darker/lighter shade of the *same hue* as its
background — **never grey text on a colored background**. Meet **WCAG ≥ 4.5:1**
body / ≥ 3:1 large & UI. **No purple/indigo→violet gradient hero.**
- **Space:** quantize everything to an **8px grid** (4px half-step). Off-grid
values (5/7/13/15px) read as blur and as ad-hoc. Tight *within* a group,
generous *between* groups. Start over-spaced, then subtract.
- **Surface:** one radius vocabulary site-wide (deliberate, not maxed-out). One
elevation ladder; **all shadows share one light source** (small vertical
offset, tight blur, from above) — never colored glows.
- **Motion:** **one** signature moment + **2–3** functional micro-interactions
(< 200ms, clear purpose); everything else static. Chrome (nav, footer,
toolbars) does not move. (Full system in the **`motion`** skill.)
- **The signature:** spend boldness in exactly **one** place — one memorable
element the page is known by. Discipline everywhere else so it can land.
Scarcity is the taste. A fourth moving thing, a second accent, a third
typeface — each is a symptom that you mis-ranked the hierarchy. Cut, don't add.
## The slop-blocklist (keep this in view)
If any of these is in your output, you almost certainly defaulted. Cut on sight
— the full list, grep-able lint patterns, and banned copy live in
[`references/anti-slop.md`](references/anti-slop.md):
- Inter/Roboto/`system-ui` as the display face · **purple/indigo gradient hero**
on white · gradient headline text · unmotivated **glow / neon box-shadow** ·
glassmorphism everywhere · **emoji as icons or bullets** · the
centered-hero-+-three-identical-cards template · `rounded-2xl shadow-lg p-6`
card with a colored top/left stripe · over-rounded everything · **unmodified
shadcn slate/zinc defaults** · bento-grid-for-its-own-sake · fade-up on every
scroll section · tilt on every card · infinite logo marquee · confetti ·
hype copy ("unlock / supercharge / seamless / world-class / trusted by
thousands").
Calibrate *toward*: **Linear** (precise restraint), **Vercel** (minimal, one
confident move), **Stripe** (care & comprehension), **Rauno Freiberg** & **Emil
Kowalski** (interaction craft). Away from the effect-maximalist template.
## Non-negotiables
- **Reduced-motion / static-first is the design, not a checkbox.** Turn all
motion off — the screen must still be excellent. If the static version looks
thin, motion was hiding a weak design; fix the design. Wire
`prefers-reduced-motion` from the start.
- **Design every reachable state** — not just the happy path. Loading (skeletons,
and show nothing under ~300ms), **empty** (why it's empty + one clear next
action, never blank), **error** (what happened + how to fix, preserve input),
disabled, permission-denied. Respond within ~400ms (optimistic UI).
- **Ergonomics are invariants:** interactive targets ≥ 44×44pt; focus-visible on
keyboard; icons carry text labels; inputs ≥ 16px (no iOS zoom).
- **Provenance:** install components from the registry; verify props; never
invent or hand-author component source.
## This skill layers on good judgment — it doesn't replace it
Assume competent fundamentals (a grounded concept, real content, honest
hierarchy) and add *direction* on top. Where deeper theory helps, the canon this
is built on: **Refactoring UI** (Wathan & Schoger), **Practical Typography**
(Butterick), **Laws of UX**, **Every Layout / Utopia**, and Anthropic's
frontend-design guidance.
## The UIForge suite — pull a part in at its step
| Invoke / read | When |
|---|---|
| [`references/anti-slop.md`](references/anti-slop.md) | Always keep near. The named tells, grep lint patterns, banned copy, calibration targets. |
| [`references/directions.md`](references/directions.md) | Step 2. Commit to one aesthetic point of view — each with a concrete type/color/space/motion signature. |
| [`references/registry-map.md`](references/registry-map.md) | Step 4. The taste-graded registry allowlist (restrained vs maximalist) + provenance. |
| [`references/critique.md`](references/critique.md) | Step 6–7. The blind rubric, the linter gate, and the forced-subtraction gate. |
| [`references/slop-detector.md`](references/slop-detector.md) | Step 6. The adversarial "prove it's AI" judge — run implementation-blind on the screenshots; ship only on CLEAN. |
| skill **`uiforge:design-tokens`** | Step 3. Emit and enforce `tokens.css` + `motion.ts` (color roles, type scale, 8px space, radius/shadow). |
| skill **`uiforge:motion`** | Step 5. The motion layer — one signature, the easing/spring canon, Motion-Primitives, reduced-motion. |
| skill **`uiforge:content`** | Step 5. Microcopy — outcome-labels, error/empty states, the hype blocklist, the specificity test. |
| `/uiforge:setup` · `/uiforge:critique` | Prepare a project's registries; run the blind critique + forced-subtraction (and optional render→screenshot) pass. |
**Do not** browse the parts for inspiration. The thesis and the direction — not
the catalog — decide what gets made. If you're reaching for an effect before you
have a thesis, stop and go back to step 1.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!