agentleFS
HugoLopes45HugoLopes45/design-skills/skills/visual-direction/SKILL.md

visual-direction

Skill1 starsChanged 3 months agoMITView on GitHub

Set the visual direction before any token exists — style thesis, three calibration dials, industry constraints, real research sources. Use when starting UI or brand work, when a design has no point of view, when choosing an aesthetic direction, or when someone says "make it look premium".

4 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

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

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Every visual decision derives from four inputs, gathered before touching the dials:

    line 14
  2. Distinctive:

    All three dials at extremes: always wrong.

    line 46
  3. Distinctive:

    When the user attaches a reference image, extract signals, never facts: dominant hue and temperature, surface lightness, font category, …

    line 113
  4. Distinctive:

    Write the thesis inside those bounds.

    line 119

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “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

Visual Direction

Slop has no thesis. A generated UI is a bag of defaults because nothing forced its decisions to agree. Before any token, you make three calls: the dials, the industry bucket, and the thesis sentence. Every downstream decision must trace back to them.

An existing product already has a direction, stated or not. Read it off the current interface and name it. Write a new direction only when the work explicitly reopens it.

The inputs — nothing aesthetic is arbitrary

Every visual decision derives from four inputs, gathered before touching the dials:

  • Brand: the identity that already exists: hue, voice, what's shipped. The thesis names an existing brand or creates a missing one; it never ignores one.
  • Audience: who looks at this, in what state. An on-call engineer at 3am and a first-time gift shopper need different surfaces.
  • Task: is the thing used, read, contemplated, or browsed, how often, and at what stakes. Frequency and stakes set density and motion harder than taste does.
  • Category conventions: what the audience's other tools look like: the industry bucket below. Breaking a convention is a decision with a stated reason, never a default.

A decision you can't trace to one of these four is decoration. "It looks premium" is not an input.

The three dials

DialRangeLow endHigh end
DESIGN_VARIANCE (V)1–10Symmetrical, grid-lockedExpressive, intentionally broken
MOTION_INTENSITY (M)1–10Static, no animationCinematic, physics-driven
VISUAL_DENSITY (D)1–10Gallery (whitespace dominant)Cockpit (information dense)

Defaults: V=5 / M=3 / D=5. Dial values constrain every downstream decision. A finance app at V=3/M=1/D=9 never gets pill buttons or decorative gradients. A creative agency at V=8/M=6/D=3 never gets a 12-column symmetric grid.

Variance levels. 1–3: strict grid, equal gutters, predictable. 4–7: intentional offset, overlapping elements, mixed aspect ratios, left-aligned headers over centered data. 8–10: asymmetric, masonry, massive empty zones; broken symmetry is the point. Above 3, any asymmetric layout collapses to single-column on small viewports. Horizontal scrolling is always a failure.

Motion levels. 1–3: static; hover and active states via CSS only. 4–7: purposeful transitions on state changes and loading, cubic-bezier(0.16, 1, 0.3, 1), transform and opacity only. 8–10: choreographed, spring physics, scroll-triggered reveals. The motion skill carries the full animation budget.

Density levels. 1–3: gallery, 3–5 elements per viewport, body 18px+, massive gaps. 4–6: standard app; most products land here. 7–9: cockpit, compact rows, 1px dividers, tabular numerals, no cards.

Combinations that fight themselves

Each dial is a material signal. When the signals contradict, the interface feels wrong without the user being able to say why. Clamp the outlier:

  1. D≥7 with M≥7: clamp M to 4. Density wins; in a cockpit every pixel is working, and animation steals pixels from their job.
  2. V≤2 with M≥8: clamp M to 5. A rigid grid says "engineered steel", spring physics says "rubber". Pick one material.
  3. V≥8 with D≥8: works only when the asymmetry encodes information priority (largest widget = most important metric). Decorative asymmetry at cockpit density: clamp V to 6.
  4. All three dials at extremes: always wrong. Move at least one toward center.

Industry bucket

The bucket sets the default dial range and the forbidden patterns. The stricter constraint always wins.

BucketVMDNon-negotiables
SaaS / DevTools428Dark-mode first, semantic color only, keyboard shortcuts
Finance219Red/green for data only, zero decorative gradients, nothing animated near money
Healthcare315WCAG AA mandatory, prominent error states, predictable layout under stress
Consumer655Emotion-led, photography, warmth, onboarding delight
Productivity319Expert-first density, power features visible, no distraction
Creative863Typography as art, whitespace as breath, intentional rule-breaking

Regulated and safety-critical domains carry hard ceilings that override any preference: finance and banking M≤2 and V≤4, healthcare M≤3 and V≤3, legal and government M≤2 with D≥5, safety-critical operations M≤1 with D≥7. The ceiling is not the floor; you can always go calmer.

The style thesis — one sentence before any token

A thesis is an image, not adjectives. "Clean, modern, minimal" is not a thesis: you can't picture it, so it constrains nothing. "A flight cockpit at midnight" is: it fixes darkness, density, instrument-grade type, zero decoration.

The test: could a stranger pick your UI out of a lineup from the sentence alone?

Name the material and the light; the rest follows:

AxisOptions (not exhaustive)
Materialpaper, glass, steel, concrete, fabric, film
Lightdaylight, midnight, studio, candlelit, overcast
Temperaturewarm, cold, neutral-cold, neutral-warm
Roleinstrument (used), publication (read), gallery (contemplated), shopfront (browsed)

Worked derivations, to imitate, not copy:

  • "A flight cockpit at midnight" (observability tool). V=3/M=1/D=8. Surfaces oklch(14% 0.01 250), cold hue. Tabular numerals everywhere, mono for data, no display font. Radius 4px, no gradients, state changes instant.
  • "Field notes on cream paper" (journaling, learning). V=6/M=3/D=4. Warm surfaces oklch(97% 0.01 85), ink-dark text. Editorial serif display over humanist sans body, oldstyle figures in prose. Radius 8–12px, diffusion shadows only: paper casts soft shadows, it doesn't glow.
  • "A concrete showroom in daylight" (luxury e-commerce). V=8/M=5/D=2. Near-white neutrals; the product carries all the color. One type family, extreme weight contrast. Massive whitespace, full-bleed imagery, sparse choreographed motion.

A token you can't justify from the thesis is a default in disguise.

Aesthetic directions — the named categories

The thesis is the sentence; the direction is its category. Naming it anchors downstream decisions.

DirectionCore constraintWhat it rules out
EditorialType hierarchy carries all visual weightGradient accents, card-heavy layouts, decorative illustration
Data-DenseInformation visible without hover; tables over cards; mono numericsCards on data surfaces, decorative color
SaaS MarketingDark-first; product screenshots as design elements; asymmetric gridSymmetric layouts, stock photography
App ProductEvery element earns its pixel; keyboard-firstDecorative motion, marketing copy patterns
Motion-LedMotion communicates state; spring physics; reduced-motion nativeLinear easing, aesthetic-only animation
BentoAsymmetric tiles, one job per tile, diffusion shadows, large radiusUniform card grids, tight spacing

Research — where to look, what to refuse

Fetch real design work before generating tokens. Sources chosen for evidence quality, not visual impressiveness:

SourceWhat it provides
Mobbin (mobbin.com)Real product flows from shipped software
Godly (godly.website)Curated production web typography and layout
Refero Styles (styles.refero.design)Palettes, type, spacing extracted from shipped products, each with a one-line descriptor
Direct product researchLinear, Vercel, Railway, Posthog, Arc, Raycast: inspect the real products
Open-source design systemsReal component decisions with real constraints; study the decisions, never import the stack

Excluded: Dribbble and Awwwards. Both optimize for a thumbnail or a jury, not for what ships. Inspiration from either leads straight back to the AI-tell patterns (oversaturated gradients, dramatic shadows, interactions that collapse under real content).

When the user attaches a reference image, extract signals, never facts: dominant hue and temperature, surface lightness, font category, spacing rhythm, CTA style, density. Then synthesize original values. Copying hex codes from a screenshot is theft with worse contrast.

Order of operations

  1. Industry bucket and dials bound what's allowed.
  2. Research supplies the raw material.
  3. Write the thesis inside those bounds. If the thesis fights the dials, resolve it now, not in CSS.
  4. Derive: hue and surface lightness from material and light, type personality from role, motion from whether the thing is used or contemplated.
  5. Name the direction category, then hand off: color skill for the palette, typography skill for the type system, layout skill for hierarchy and spacing, motion skill for the animation budget.

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.