open-source · design-system + motion skill

One DNA, infinite
flowing identities.

Your agent scaffolds a UI in seconds. fluid gives it a unique brand and motion that actually moves.

$ npx skills add Darcos-Loft/fluid Get fluid

Refined on real client sites. Now open for your agent.

vigie.plr-studio.com
Vigie, a real site Alicohre, a real site Seguiarq, a real site
Vigie · real
108
curated palettes
57
type pairings
22
detector rules
0
runtime dependencies

Built with fluid

Real sites, real DNA.

Client work shipped on this system. The rules stay constant, every identity is its own.

Not a black box

One brief, six honest steps.

The same machine, every time. Here is one of our own products, Vigie, running through it, start to live.

1 the brief

You say it plain.

brief › An accessibility-audit SaaS. RGAA/EAA compliance, legible, trustworthy, French-first.
2 inference

It reads the room.

accessibilitycompliancelegibleseriousbrand + product
3 the database

It commits, not guesses.

paletteCobalt paper
typeFraunces + Switzer
styleEditorial · compliance
4 generate

Tokens, then UI.

/* committed, not default */ :root{ --brand:#2b3fe0; --paper:#f0ece4; --font:"Fraunces"; }
5 the guardrail

The detector signs off.

0 errors, 0 warnings
no AI-purple gradient
AA contrast, no Inter
reduced-motion path

The engine, not a template

A database, not a guess.

Every identity starts from a curated library, then commits and adapts. That is why two clients in the same sector never collide.

108 palettes57 type pairings53 styles14 layouts32 chart types10 tech stacks
Sound orangefintech
Oxbloodluxury
Cobalt papereditorial
Teal coralhealth
Royal indigobanking
Acid sunyouth
Mediterranean claytravel
Quantum tealai
Emerald velvetjewelry

Motion is the fluid part

The rules, made playable.

Bad motion is the loudest slop tell. Below is one real UI card entrance, replayed two ways. Same content, same timing budget. Watch the fluid version next to the common mistake, then see each rule broken out underneath.

The exact same card, entering two ways, looping side by side. scale(0) with linear pops out of nothing and reads cheap. The house version grows from presence with a little blur and the right curve.

Common mistake
Deploy readybuild #284passing
Tests312 / 312
Bundle214 kb
Regioncdg · fra
Ship it

scale(0) + linear. It pops out of nothing, mechanical.

The fluid way
Deploy readybuild #284passing
Tests312 / 312
Bundle214 kb
Regioncdg · fra
Ship it

scale(.96) + blur, house easing. It grows from presence, alive.

The same rules, isolated

1 · Easing
fluid
linear
Same distance, same time. fluid eases into place; linear feels robotic.
/* the house easing */ --flow: cubic-bezier(.22, .61, .30, 1); /* linear feels robotic */
2 · Scale
scale(0)
from nothing
scale(.96)
from presence
scale(0) pops out of thin air. Start near .96 and it grows, alive.
/* never from scale(0) */ from { scale: .96; filter: blur(8px); } to { scale: 1; filter: blur(0); }
3 · PressA primary button should feel like it has weight. Click: it presses in, then springs back.
/* weighted press */ button:active { translateY(2px) scale(.97); } /* spring back via --ease-spring */
the guardrail

It catches slop before it ships.

Deterministic, no API calls. It flags the top slop tells with line numbers and a CI exit code: AI-purple gradients, transition: all, scale(0), pure black, and more.

$ node fluid/detector/detect.mjs ./src scanned 41 files Button.tsx:24 ai-purple-gradient (#7C3AED → #A855F7) Hero.css:12 transition: all name the properties Card.tsx:8 scale(0) reveal from 0.96 Theme.css:3 pure black #000 use a tuned near-black 4 slop tells flagged · 0 errors

The catalogue

Every slop tell, named.

The 22 deterministic checks the detector runs. For each one, the cliché it forbids and the fix it points you to. No model, no API, just rules with line numbers.

category
severity
22 rules

Motion 6

transition-allinfo

transition: all animates every property, layout included.

Name what moves: transition: transform .2s, opacity .2s.

animate-layout-propertywarn

Transitioning width, height, top or left forces reflow and stutters.

Move and resize with transform instead.

ease-ininfo

ease-in starts slow, so an entrance feels laggy.

Enters use ease-out, the house cubic-bezier(.22,1,.36,1).

scale-zerowarn

scale(0) makes an element appear out of nothing.

Start near scale(.93) so it grows from presence.

long-durationinfo

Over 1200ms drags on anything you trigger often.

Micro-interactions 150 to 250ms, reveals can run longer.

dated-bounce-easeinfo

A negative control point is the dated anticipate bounce.

Use a real spring, cubic-bezier(.34,1.4,.5,1).

Generic look 15

generic-fontwarn

Inter, Roboto or Arial as the primary face is the top AI tell.

Pick a face with character, keep those only as fallbacks.

cliche-purple-gradientwarn

The purple to violet gradient is the default AI-app look.

Commit to a brand palette and ration a single accent.

pure-blackinfo

Pure #000 reads harsh and generic.

Use a tuned near-black like #0e1326.

emoji-iconinfo

Emoji in markup render differently on every platform.

Use an SVG icon set, or a drawn one for signature work.

template-signatureinfo

An Aceternity, Magic UI or 21st block shipped verbatim.

Keep the structure, reskin with your tokens and motion.

space-groteskinfo

Space Grotesk is the display face AI keeps reaching for.

Pick a heading face with more specific character.

gradient-textinfo

Gradient-clipped text on everything is a tell.

Ration it to a single hero word, or use a solid color.

justified-textinfo

Justified text opens rivers of whitespace on the web.

Left align.

tiny-textinfo

Text under 10px is hard to read.

Keep the smallest label around 11 to 12px.

em-dashwarn

An em dash or en dash in the copy. The house style bans them.

Use a comma, a period or a colon.

crushed-trackinginfo

Tracking tighter than -0.04em crushes the letters together.

Headings -0.02 to -0.03em, body at 0.

marketing-buzzwordinfo

Supercharge, seamless, empower: filler that says nothing.

Say the specific thing the product does.

numbered-section-markersinfo

Zero-padded section numbers (01, 02, 00 / INDEX) used as eyebrows.

Let the section titles carry themselves, drop the markers.

hero-eyebrow-chipinfo

A small label or pill chip sitting right above the h1.

Fold the kicker into the headline, or drop it.

oversized-typeinfo

A fixed font-size of 120px or more that does not scale.

Use a responsive clamp() for the hero.

Project 1

no-reduced-motionwarn

The project animates but has no reduced-motion path anywhere.

Add @media (prefers-reduced-motion: reduce).

Six skills, one system

A family, not a file.

Each skill owns one job. Install the whole suite, or just the one you need.

identity

design-system.

A unique brand per brief, drawn from a 108-palette database, then committed.

-s design-system
motion

fluid.

The house motion language plus a deterministic, dependency-free detector.

-s fluid
audit and modernize

redesign.

Audit an existing site and ship a fresh identity, keeping content and SEO.

-s redesign
imagery

brandkit.

Premium brand reference images, logo boards, mockups, with any model.

-s brandkit
the verb layer

refine.

20 named refine moves, from typeset to polish, each wired to the system.

-s refine
discipline

output.

The last gate: no placeholders, every interactive state, the brief honestly met.

-s output

And refine turns "make it better" into precise moves you call by name:

typesetcolorizeanimatesettleflowbolderquieterdistillregroupglassiconifydeslopbrandwardproductwardauditcritiquehardenpolishtonerecase

Works with every agent

Drop it in, keep your stack.

Plain SKILL.md files and pure CSS tokens, no runtime. The whole suite runs in any framework, or none.

Claude Code
Cursor
Codex
Copilot
Gemini CLI
Windsurf
OpenCode
any skills host

Get started

Give your agent a spine.

Stop shipping slop. Install fluid and let every build flow from one honest system.

The full suite
$ npx skills add Darcos-Loft/fluid
One skill
$ ...fluid -s design-system
Claude Code·Cursor·Codex·Copilot