The brain that ships
design that
doesn’t look generated.
v3.1.0 is here. A 7-axis synthesizer turns any brief into a fresh design language. 160 brand specs become training data, not templates. New in 3.1: output is anchored to your brand with a fidelity hard floor, mobile-gated against horizontal scroll, and reaches for a derived wow moment. The recommender re-ranks from a local decisions ledger that learns from your work. Runs in Claude Code, Cursor, Windsurf and 14 more IDEs. Same brief always ships the same output. Offline. Deterministic. No LLM in the engine.
You vibe code in Claude Code or Cursor.
Your AI ships slop by default.
Ask the model to "build a fintech landing." You get the same five tells inside ten seconds. Purple-to-blue gradients. Three equal cards. Inter at display size. John Doe in the testimonial. Bouncing arrow CTA. Centered hero. 300ms ease-in-out on every transition. The output is technically correct and visually disposable.
- Purple → blue 135° gradient
- Three equal cards in a row
- "Lorem ipsum dolor sit amet"
- "John Doe" / "Jane Doe" testimonial
- Inter 96px hero, centered
The assistant has read every design system on GitHub. It has no idea which one fits your brief. It defaults to the centroid — the average of every SaaS site it ever ingested. The result reads as generated within seconds. Your domain, your industry, your customers — none of it influences the output.
Investors flag it. Customers click away. Designers refuse to touch it. You ship faster but the shape of what you shipped is generic. A year of vibe coding leaves a portfolio that all looks the same. The velocity feels free until the brand bill comes due.
What if your AI assistant had a designer's brain wired up next to it — a brain that knew which design language fits your brief, refused the slop fingerprints before commit, and learned from every shipped output?
That's v3.1. Keep scrolling.
Brand specs are training data,
not templates.
The catalogue used to be a menu. Pick Stripe, get Stripe-flavored tokens. v3 turned that on its head: the 160 brand specs become vocabulary the engine distills from. Output is novel every call.
Recommender returns a brand specimen.
match_brand(brief) → stripe
You ship Stripe tokens. Or you fork them. Either way, the system has nothing new to say.
Synthesizer compiles a fresh design language.
synthesize(brief) → novel tokens
Same brief, same output, every time. Different brief, different system. The catalogue is now the corpus.
Seven values.
One design language.
Briefs map deterministically to seven axis values. Axis values compile to palette, type, spacing, radius, and motion tokens. Same brief always yields the same output.
--canvas, --inkscale ratio, weights--s-1..--s-7--r-sm..--r-xltracking, line-height--ease, --t-fastdisplay, body pair
Three modes.
Auto-dispatched.
The synthesizer picks its own mode based on whether you anchored to a named brand. Strict for exact replication, anchor for guided variation, pure for infinity space.
100% named brand · verbatim
Anchor on a named brand with strict=True. 100% Stripe tokens, no axis adaptation. Fastest path. For when you know exactly what you want and the brief is "give me Stripe."
reference_brands=["stripe"] strict=True
70% named · 30% axis adaptation
Anchor on a named brand, then bend it toward the brief's axis values using four sibling brands as additional vocabulary. The variation that still smells like Stripe but feels like yours.
reference_brands=["stripe"] tone=["warm","editorial"]
0% named · 100% axes
No brand named. The synthesizer picks 8 axis-matching exemplars from the catalogue and distills them into a novel design language. No single brand copied; their shared vocabulary harvested.
industry="developer-tools" tone=["bold","editorial"]
The brain learns
from itself.
Every call writes to .ux/decisions.jsonl. The recommender re-ranks future candidates by your past wins in the same industry plus UI-type bucket. Cold-start safe. Local only.
The intelligence loop is now closed. Only decisions with lint_score ≥ 80 and user_accepted = true count toward future re-ranking. Your install gets sharper for the work you actually ship.
This page was synthesized
by v3.1 itself.
We ran the synthesizer on a brief that describes this page. The tokens it emitted power what you are reading right now. The brain ships its own marketing.
industry = "developer-tools" tone = ["bold", "editorial", "kinetic", "humanist"] audience = ["vibe-coder", "ai-builder"] must_have = ["dark-mode"] forbidden = ["playful", "rounded"]Mode dispatched
pure_synthesis
audi, bentley, bmw, bmw-m, bugatti,
ferrari, lamborghini, mclaren
Bricolage Grotesque
Inter for body. Both ship via Google Fonts. The display face here on this page is exactly what came out of the synthesizer.
JetBrains Mono · for code · ratio 1.333
This card uses the literal token values from the synthesize() call: canvas #424448, ink #c0c2c6, body #9a9ca0, primary #987d86. Radius 7px. Spacing scale 4-8-12-20-32-52-84.
View token outputThese are the actual tokens that powered this page. The brain ships its own marketing. The brief and output are in the HTML source as a comment at the top of the file.
Three properties.
No competitor has all three.
Runs on a plane. No API key. No vendor lock-in. The 1,243 entries, 152 rules, 160 brand specs, and the synthesizer all live inside the Python wheel. Air-gapped repos can ship it.
Same brief always produces the same tokens. Every sort has an explicit tiebreaker. Reproducible across machines, file systems, Python versions. Diffing two synth runs is meaningful.
Every call writes to .ux/decisions.jsonl. The recommender re-ranks future candidates from your past wins. No telemetry. Your install gets sharper for your work, not aggregate slop.
If you ship by feel,
the brain is your floor.
You prompt an assistant. It returns code. The CSS is generic. The hierarchy is flat. The palette is the default Tailwind ten. You ship anyway, because the alternative is hand-tuning a thousand tokens.
uxskill sits between you and the assistant. The brief becomes a synthesized design language before code is written. The linter catches the slop before commit. The ledger remembers what worked. You stay vibe; the floor stays high.
1,243 entries.
Browse the corpus.
Apple, Stripe, Linear, Vercel, Ferrari, Anthropic. Full palettes, typography, voice. JSON for queries, prose for context.
Browse brands ·Deterministic regex. Sub-50ms scan on 10K lines. Catches placeholder text, default Tailwind palettes, A11y skips, marketing buzzwords.
Browse rules ·The full architecture writeup. Why brand specs became training data. Why the synthesizer is deterministic. Why the ledger closes the loop.
Read the launch ·Install in 60 seconds.
Pick the runtime that fits where you live. The Python wheel is the engine; the npm wrapper invokes it from Node hosts; the Claude marketplace installs the slash commands and sub-agents directly.
$ pip install uxskill
$ npx uxskill init
$ claude plugin install uxskill
Open source · MIT · No telemetry · No LLM · Star on GitHub