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 doctorReads 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 connectInstalls 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 importReads 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
soonThe 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-reviewEach 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