agentleFS
XhiveeeXhiveee/skills/design-forge/SKILL.md

design-forge

Skill1 starsChanged 28 days agoMITView on GitHub

Mandatory first step before writing ANY frontend markup or styles — web pages, landings, app UI, components, dashboards, restyling, or any task whose output is visible UI (including vague asks like "make it beautiful"). Reasons like a senior design engineer: reads the product's domain, audience and mood, then DERIVES a bespoke visual direction (palette, typography, shape, motion, signature details) from principles — never from templates, presets, archetypes or a fixed style library — and builds it to invariant construction rules (anti-slop directives, semantic tokens, type/density scales, interaction states, UX copy).

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    1. richardochristjia/skills★ 2same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository3 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 5 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈5

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If you cannot write this brief, ask the user — never design blind.

    line 35
  2. Distinctive:

    Inter (or Roboto) "because safe" is forbidden: If the brief genuinely calls for neutral Swiss clarity, choose a real grotesque …

    line 75
  3. Very specific:

    No card-in-card: If content needs grouping inside a surface: spacing, hairline dividers, or a bg-subtle tint — never a second card.

    line 84
  4. Distinctive:

    Test each one: if it could be pasted into any other app unchanged, it is garnish, not a signature — delete it.

    line 103
  5. Distinctive:

    Empty decoration: Every visual element carries semantic or navigational load, or it is deleted.

    line 125
  6. Very specific:

    Spacing: multiples of 4/8 only: Every padding, margin and gap is a multiple of the base unit.

    line 129
  7. Distinctive:

    Run through this list; every item must be yes.

    line 146

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Design Forge — reason first, then build

This skill is passive and required: do not wait for the user to name it. Any task producing visible UI goes through this reasoning BEFORE markup. It pairs with (and does not replace) the design-system skill, which reasons about brief/meaning — Design Forge turns that direction into concrete, bespoke visual decisions.

Why

An LLM asked for "beautiful UI" reaches for its default taste — and handing it a ready-made contract only swaps one default for another. Presets, archetypes and galleries all converge: whoever generated the artifact, the output reads the same. This skill instead walks you through the reasoning a senior design engineer performs, so the direction is invented for this product, not selected from a shelf.

There are no templates in this skill. Nothing below tells you which style to use — only how to decide.


Step 0 — Write the product brief (before any markup)

In your plan/reply, write one short paragraph:

  • What the product does, who uses it, in what context (quick ops tool vs showcase vs data console vs long-form reading).
  • 3–5 mood words justified by the domain — not generic "modern, clean". A lab dashboard is "clinical, precise, calm"; a streetwear drop page is "loud, mischievous, tactile"; a legal archive is "quiet, weighty, ordered".
  • One sentence on what the UI should feel like to use: "a sharp instrument", "a warm workshop", "a quiet archive", "a crowded trading floor".

If you cannot write this brief, ask the user — never design blind. Every later choice must trace back to this paragraph; if a choice can't be justified by it, the choice is taste, not design.


Step 1 — Derive the direction

For each layer below, state the reason in one line before choosing: "because the product is X, the palette needs Y". No reason, no choice.

Palette — build it, don't pick it

  • Dominant hue comes from the mood: warm vs cool, natural vs synthetic, loud vs hushed. Saturation follows energy level. Light vs dark base follows context (dark = cinematic, focused, dev/instrument tools; light = docs, commerce, long-form) — not fashion.
  • Compose a semantic token layer, never raw hex sprinkled through components:
:root {
  /* surfaces — the stacking order of the page */
  --bg-base:     /* page background            */
  --bg-subtle:   /* recessed areas, wells      */
  --bg-elevated: /* cards, popovers, modals    */
  /* content */
  --text-primary:   /* headings, key data      */
  --text-secondary: /* body text              */
  --text-muted:     /* captions, hints        */
  /* strokes */
  --border-dim:    /* hairline separators      */
  --border-subtle: /* card/input outlines      */
  --border-focus:  /* focus ring (= accent)    */
  /* identity */
  --accent:        /* ONE expressive accent    */
  --accent-fg:     /* text on accent (contrast-checked) */
}
  • One accent. It is the product's voice: an alarm does not whisper, a ledger does not shout neon. Status semantics (success/warn/error) get muted, desaturated tones distinct from the accent — never a second "accent".
  • State the palette's logic in one line ("cold slate + surgical cyan — reads as instrumentation"). If you can't, the palette is decoration.
  • Contrast ≥4.5:1 body text, ≥3:1 large text/icons/focus ring. Dark + light behind the same custom properties ([data-theme="dark"] or prefers-color-scheme) when the product's context calls for both — a CRT-style instrument or a print piece may legitimately live in one mode; decide, don't default.

Typography — personality in display, service in body

  • Display face carries the character the brief named: a serif with intent, a grotesque with attitude, a mono for instruments. Body face optimizes reading. A technical mono accent (JetBrains Mono / IBM Plex Mono class) earns its place where data lives.
  • Inter (or Roboto) "because safe" is forbidden. If the brief genuinely calls for neutral Swiss clarity, choose a real grotesque deliberately (Plus Jakarta Sans, Geist, Satoshi class) — and write the reason. Any font is legal once; boring-by-default never is.
  • Modular scale: pick one ratio that fits the temperament (1.125–1.2 quiet/utilitarian, 1.25–1.333 balanced, 1.414+ dramatic) and derive all sizes from it on a 16px base. Never invent pixel values outside the scale.
  • Line-height is part of the size: display 1.05–1.15 with deliberate tracking, h3/card titles 1.2–1.3, body 1.5–1.6, labels/captions/mono 1.3–1.4 (uppercase tracking is a style decision — make it).

Shape & depth — the physics of the product

  • Radius is a philosophy: machined 0–2px, friendly 8–12px, organic asymmetric — whichever the brief demands, then ONE scale (card = R, control = R×0.6, chip = 0 or full). No rounded-2xl-on-everything reflex.
  • Borders are a decision: hairline vs hard 2px+, subtle vs stated — from the mood, not habit.
  • Depth language is chosen: flat, diffuse, hard offset, glow — matching mood. Texture (grain, noise, scanline, none) earns its place or is removed.
  • No card-in-card. If content needs grouping inside a surface: spacing, hairline dividers, or a bg-subtle tint — never a second card.

Motion — how the product should move

  • Feel follows the brief: snappy instrument (80–150ms), standard responsive (150–200ms, ease-out or cubic-bezier(0.16, 1, 0.3, 1)), expressive/languid (300ms+) — chosen for the product and applied consistently. Whatever the feel: no slow drifting/floating decoration, no ease-in-out on everything, no motion without a functional role.
  • Every interactive element ships all six states — no "hover works, everything else is browser default":
StateRequirement
defaulttoken colors only
hovervisible, in the product's voice (color swap, lift, border — your call, one call)
activepressed feedback (translate/darken/shadow collapse)
focus-visible2px var(--border-focus) ring + 2px offset — always, keyboard-first
disabledreduced opacity (~0.5), cursor: not-allowed, no hover effect
loadingbusy indicator, width held stable (no layout jump), action disabled

Signature details — invent them from the domain

  • Produce 3+ details no other product would have, drawn from this product's own metaphors, materials or process: a bank → ledger rules and running balances; music → staff lines and tempo ticks; maps → contour lines and grid refs; a workshop → tool marks and joinery.
  • Test each one: if it could be pasted into any other app unchanged, it is garnish, not a signature — delete it. Every detail must do communicative work (wayfinding, hierarchy, feedback, identity).

UX copy

  • No generic copy. Forbidden: "Click here", "Submit", "OK", "Lorem ipsum", "Description goes here", "Card title".
  • Buttons are contextual verbs + object: "Создать экземпляр", "Применить фильтры", "Export report" — name what happens.
  • Realistic data. Fill previews, tables and fixtures with plausible domain data (real-looking names, dates, amounts, statuses) in the product's language — not John Doe × 10.
  • Empty states have a job: one line saying what is empty + one action to fix it ("Пока нет отчётов — создайте первый" + primary button), never blank whitespace or a bare "No data".

Invariant construction rules (style-neutral)

These decide whether the build is sound, never what it looks like. They add zero visual flavor — no extra serif, no extra whitespace, no "premium" mood.

Anti-slop — forbidden clichés

  • Generic purple-to-blue / neon gradients as decoration. A gradient exists only when the direction calls for it — then it is the identity, not garnish.
  • Uniform rounding applied to everything without a radius philosophy.
  • Card-in-card hell (see Shape & depth).
  • backdrop-blur color blobs over dark backgrounds with no functional role. Glass only when it separates layers that actually overlap.
  • The "default well-crafted" look: giant editorial serif + huge whitespace + cream/beige palette + luxe minimalism applied reflexively. Quality is mandatory; that look is not — it is a template like any other.
  • Empty decoration. Every visual element carries semantic or navigational load, or it is deleted.

Grid, spacing & density

  • Spacing: multiples of 4/8 only. Every padding, margin and gap is a multiple of the base unit. Forbidden: p-[13px], gap-5 next to gap-6, mt-7, "almost aligned" magic numbers. If a value isn't on the scale, the layout is wrong, not the scale.
  • Density per region, not per page: compact for tables/dashboards/admin/data lists (row padding 8–12px, font 13–14px, tight gaps); comfortable for content screens, settings, forms (section gaps ≥48px, generous card padding).

Do / Don't

DoDon't
accent reserved for links, primary action, one key figureaccent splashed across badges, icons, headings
one radius scale from tokensrounded-xl on one card, rounded-3xl on another, no system
surface separation via spacing + hairlinescards inside cards inside cards
blur only on elements that overlay busy contentpurple blurred blobs as wallpaper
palette derived from the brief, stated in one linepalette copied from the last project that "looked nice"

Self-check before handing off

Run through this list; every item must be yes.

Direction

  • A product brief was written (domain, users, 3–5 justified mood words, "feels like" sentence).
  • Every style choice — palette, fonts, radius, shadows, motion — traces to the brief in one line each.
  • ≥3 signature details invented from this product's domain; none would survive a paste into another app.
  • No borrowed look: the result does not read as "that editorial thing", "that SaaS template", or any single known site's aesthetic.

Anti-slop

  • No Inter/Roboto default, no decoration-only gradients or blurs, no card-in-card, radius follows one scale.
  • Every visual element has a stated semantic/navigational role.

System

  • Font sizes only from the chosen modular ratio; line-heights per role.
  • All spacing is multiples of 4/8 — grep for [0-9]px outliers.
  • Semantic tokens used everywhere; theme mode(s) chosen deliberately; accent is single.
  • Every interactive element has all six states including focus-visible and loading.
  • Motion feel matches the brief; prefers-reduced-motion honored.

Copy

  • No generic strings anywhere; buttons are verb+object; empty states have a CTA; data looks real.

Anti-patterns (forbidden)

  • Reaching for a favorite or last-used style ("that editorial/brutalist/terminal thing worked before").
  • Treating any preset, template, gallery style, generated contract, or previous project's direction as the answer — even as a "starting point to tweak".
  • Applying the invariants as style: sanding every edge back into the safe, polished default.
  • Copying a known site's look — inspiration is allowed, transplantation is not.
  • Satisfying the letter of the rules while reintroducing slop (one accent plus five "status" colors that look identical; legal-duration transitions applied to everything so the UI never stops moving).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.