uxskill
Star on GitHub

v3.0 — THE BRAIN · 2026-05-28

Brand specs are training data,
not templates.

In v2.0, the 160-brand catalogue was a pool the recommender picked from. In v3.0, it's the vocabulary a 7-axis synthesizer distills into a novel design language per brief. Same files. Same JSON. The role changed.

The shift in one paragraph

v2 said: "your brief sounds like a fintech dashboard. Here's the Stripe spec — use it." The output looked Stripe-like. Good for prototyping, dangerous for shipping. If you wanted "Stripe-like but for healthcare," you got Stripe-like and had to manually warm the palette.

v3 says: "your brief sounds like a fintech dashboard. Here are 8 brands whose category-seed axes are closest to yours in 7-dimensional space — Stripe, Linear, Datadog, Snowflake, ClickHouse, and 3 more. I'm going to distill their palettes, type stacks, motion vocab, and density signals into a fresh design language that fits THIS brief. No one specific brand wins. The output is unique." The same 160 brand files now play a different role.

The 7-axis synthesizer

The brief maps deterministically to 7 continuous axes:

Axis0.0 end1.0 end
warmthcold / clinicalwarm / inviting
contrastflat / muteddramatic / loud
densityairy / sparsedense / packed
geometrysharp / angularsoft / rounded
formalityplayfulcorporate
motionstillkinetic
type_personalitygeometrichumanist

Same brief → same axes, every call. No randomness. No clock. No LLM. Pure Python math.

Each axis then compiles to concrete tokens:

Three modes, auto-dispatched

The synthesizer chooses how to consult the brand catalogue based on what the brief says:

strict_brand

Brief: reference_brands=[stripe] strict=True. The recommender emits 100% Stripe tokens verbatim. No synthesis. Fastest path. Used when you know exactly what you want and need pixel-fidelity to one brand.

brand_anchor

Brief: reference_brands=[stripe] (no strict flag). Stripe gets ~70% of the vocabulary weight in the mix. The other 30% comes from 4 sibling brands whose category-seed axes match the rest of the brief. Used when you want Stripe's taste but applied to your domain.

pure_synthesis

Brief: no reference_brands at all. Synthesizer pulls 8 brands closest to the brief's axes in 7-D space, distills their vocabulary, mixes weighted by axis position. No single brand dominates. Output is novel each time. Infinity space, grounded in real brand patterns.

Why we kept the catalogue (and didn't burn it for "infinite space")

The maximalist v2.1 spec said: drop the manifests, generate every palette / type pair / spacing scale from scratch on every call, achieve true infinity.

We rejected this. Three reasons:

Instead, v3 achieves infinity by making the COMBINATIONS of finite vocabulary continuous. The catalogue stays. The output is still novel. Best of both.

Try it

pip install uxskill
uxskill init                              # auto-detects your IDE
uxskill synthesize --industry fintech-payments --tone bold
# → SynthesizedSystem(mode="pure_synthesis", axes={warmth: 0.35, ...},
#                    palette={canvas: "#0a1014", ...}, type_pair={...})

uxskill synthesize --brand stripe          # brand_anchor (70/30)
uxskill synthesize --brand stripe --strict # strict_brand (100% Stripe)

Related reads