SynthesisUI

Get started

Three commands. The first one costs nothing and tells you where you stand - free, offline, no account.

See where you stand

$ npx synthesisui@latest doctor

Reads your repo locally and names every hand-written value your own system already has a token for. The number it prints is the pitch.

Bring a system

$ npx synthesisui@latest init --ds <slug>

Pick one from the gallery or birth your own - it arrives as files you own: tokens, typed components, and the GUIDE your agent reads first. Already have a system? `npx synthesisui adopt` describes yours instead of replacing it.

Turn on the loop

$ npx synthesisui@latest connect

Installs the check that runs by itself after every file your agent writes, plus the project tools it can query. Restart your agent session after the first connect - hooks are read at startup.

Update

$ npx synthesisui@latest upgrade <slug>

Writes an UPGRADE.md with exactly what changed. Nothing is overwritten silently.

Built for Claude Code first - the check runs itself after every write. The contract and the doctor run anywhere: any agent, any editor, any CI.

Coming from somewhere? Pick your door

From shadcn/ui

npx synthesisui@latest loginnpx synthesisui@latest init --styles tailwind --ds <slug>@import "_synthesisui/ds/<slug>/shadcn.css";

Log in first - private systems ride your account. Then one @import after your tokens, and every shadcn component switches onto the system's palette and clock.

From the project you have

npx synthesisui@latest import --drynpx synthesisui@latest loginnpx synthesisui@latest import

Reads the colours, radii, spacing and fonts you already wrote and hands back a v1 that mirrors them - your family names unchanged. --dry writes the census to disk and sends nothing, so you read the payload first.

From Figma

soon

The Figma reading is on the roadmap - the file's decisions arriving as a governed contract.

In a monorepo: one system, many consumers

Reading a workspace root averages every app in it, and a light app and a dark one average into a palette that is neither. The system comes from wherever your vocabulary is centralised; each app is measured against it.

npx synthesisui@latest import --dir packages/uinpx synthesisui@latest doctor apps/web-dashboardnpx synthesisui@latest doctor apps/web-review

Each app gets its own number against the same contract. A path scopes what is measured, never what counts as named.

Read the CLI reference · How governance works · Browse the gallery