A two-tier token system, built solo before the first screen was drawn, so a small team could ship fast without accumulating design debt.
A solo designer cannot afford design debt. The architecture came first: primitives feed semantic tokens, tokens feed components, components feed screens. One source of truth, so a single token change propagates through the entire product.
Naming was the contract. I wired semantic tokens so developers read the exact same language in code that I see in Figma. Handoff became a conversation about behavior, never about pixels.


Raw colour ramps and an alpha scale for overlays. Nothing here references a UI role yet.
These are the ingredients, not the recipe.

Every token resolves to a primitive and carries its own light and dark value. Developers read intent, not hex.
Change the primitive once and both themes update — the decision that let two themes ship from one source of truth.

Eleven core components, each built on semantic tokens with full state coverage.
No component invents its own colour — it inherits from the contract above, so one primitive change ripples through the whole library in both themes.

Full state coverage. Inputs alone carry eight — default, hover, focus, filled, disabled, error, success and read-only.
Each is a token lookup, not a hand-picked colour.

Building the token layer first felt slow, until it was the fastest thing I did. Here's what held up, and what I'd do differently.
Semantic naming. Positive, not green. Themes swapped underneath without touching a single component.
Architecture before screens. The first screen was slow to build. Every one after cost almost nothing.
An alpha scale, built early. Felt like over-engineering for an MVP, until overlays and disabled states just worked.
Document as I build. I wrote docs after. A system a developer can't read alone isn't finished.
A second set of eyes on naming. Working solo meant no one to sanity-check the contract. I'd add a handoff review earlier.
Prune sooner. A few components earned their place late. I'd cut one-offs to compositions faster to keep the library lean.
A banking app that pays you more the more you save.
Keep reading →