Design-system intelligence · runs locally

Your codebase already has a design system. It just doesn’t know it.

Saer reads your Tailwind config, your CSS variables and every component, reconstructs the colour system you actually ship, and shows exactly where the code has drifted from it.

Nothing uploadedNo accountNo AI guessing
$ saer scan .
SAER interface system intelligence
 
Detected
Tailwind config: found
CSS custom properties
 
Colour system reconstructed.
167 canonical colour entities
99.8% token-reference coverage
 
Found
97 exact drift findings (753 raw uses)
72 near-matches, kept separate
1 entity Saer could not resolve, and says so
 
Report .saer/report.html <- open this

Twelve colours that were meant to be tokens.

Each raw hex sits next to the declared token it is almost certainly a copy of. Found in a real scan of Lunary, the app I build. Hover for the evidence.

#ff6b6b
chart-aspect-square
#c084fc
chart-aspect-conjunction
#9b75e3
content-muted
#6d28d9
content-muted
#e7d7fb
lunary-accent-100
#1a1030
content-primary
#7f1d1d
lunary-error-700
#ffe08a
tint-warning-edge
#8fae6e
chart-earth
#fed7aa
chart-aspect-opposition
#ff7b72
chart-fire
#080b12
color-bg
Lunary: 72 near-misses like these, plus 97 raw hexes that exactly equal a token (753 uses).
How it works

One command. Evidence, not opinions.

1

Reconstruct

Saer finds every place your project declares colour, follows every var() chain to the real value, in every theme and mode, and builds the system you actually have.

2

Compare

It reads every component and finds raw values that bypass a token, near-misses that were probably meant to be one, tokens nobody uses, and definitions that contradict each other.

3

Decide

You get one report: what’s certain, what’s inferred and how confident, and the handful of questions only you can answer. Saer never invents an answer it can’t prove.

A real report

What Saer found in my own app.

.saer/report.html · LunaryColour · Tailwind v3 + CSS variables
167colour tokens reconstructed
99.8%of references resolved
97raw hexes that equal a token
6,955raw colour uses read

Exact drift Deterministic

Hard-coded values identical to a declared token. Safe to replace.

#8458d8
color-primary · lunary-primary
120 uses
#ffffff
chart-surface · chart-shadow +1
112 uses
#c77dff
color-accent · chart-selected +1
64 uses
#7b7be8
color-secondary · lunary-secondary
62 uses
#ee789e
color-rose · lunary-rose
32 uses

Near-matches Inferred

Probably meant to be a token. Shown with distance, never mixed with exact drift.

#080b12 → #0a0a0a
color-bg · ΔOKLab 0.017
34 uses
#e7d7fb → #edd6ff
lunary-accent-100 · ΔOKLab 0.011
16 uses
#ff6b6b → #f87171
chart-aspect-square · ΔOKLab 0.015
10 uses
#1a1030 → #1a0f2e
content-primary · ΔOKLab 0.005
6 uses
#c084fc → #c77dff
chart-aspect-conjunction · ΔOKLab 0.019
4 uses
Plus: 20 groups of similar unlabelled colours that look like a missing token, put to you as questions, and 1 value Saer could not resolve, reported as exactly that.

Numbers and colours from a real scan of Lunary, October 2026. Nothing was cherry-picked except the order.

Principles

Built to be trusted with your codebase.

Local

Your code never leaves your machine.

No upload, no account, no telemetry. It works offline after the first run. Your repository is read, never sent.

Deterministic

Same code in, same answer out.

No model at scan time. Every finding traces back to the files it came from, and the findings are identical on every machine and Python version.

Honest

“I don’t know” is an answer.

When the evidence doesn’t settle a question, Saer says so and shows you why, instead of guessing confidently.

What’s coming

Colour first. The whole audit next.

● In beta

Colour

Tokens, themes, modes, drift, near-matches, dead and conflicting declarations.

Typography

Families, sizes, weights, line heights and tracking: the scale you really use.

Spacing, radius & elevation

The spacing, radius, shadow and layering scales hiding in your styles.

Components

Every component, where it’s used, duplicates, variant sprawl and one-off overrides.

Accessibility

Contrast of the colour pairs you actually ship, focus styles and tap targets.

The full audit

One report across every area: scores you can trace, the top fixes, and evidence for each.

Guard

A CI check that fails the pull request when new drift sneaks in.

Website audit

Point Saer at a URL for a quick read of a live site’s design system.

Pricing

Free to look. Pay to see everything.

Free

£0forever

Try it on any project.

  • Scan any project, locally
  • Headline numbers and your top findings
  • Nothing uploaded, no account
Join the beta

Pro

£240/year

For one developer who wants the whole picture.

  • Full report: every finding, every file
  • Every domain as it ships, not only colour
  • JSON export of the reconstructed system
  • Updates for as long as you subscribe
Beta testers get it free

Team

£290 per seat/year

From 3 seats. Add or remove seats any time.

For a team that wants drift caught before it merges.

  • Everything in Pro, for every seat
  • Guard: fail a pull request when new drift appears
  • Shared baseline, so only new drift is flagged
  • Priority fixes when Saer gets something wrong
Beta testers get it free

Bigger team, invoicing or security review? Talk to us about Enterprise.

Prices in GBP. Paid plans open after the private beta. Everyone in the beta gets Pro free while it runs.

Private beta

Try it on your codebase.

FAQ

Questions, answered plainly.

Does any of my code leave my machine?

No. Saer runs on your computer, reads your files, and writes a report into a .saer folder in your project. Nothing is uploaded, there is no account, and no AI model is involved when it scans. The only network use is a one-time download of two standard Python libraries the first time you run it.

What does it understand today?

Colour, thoroughly: Tailwind v3 configs, Tailwind v4 @theme blocks, CSS custom properties (including dark mode and other theme contexts), Tailwind's own default palette, and pnpm, npm and yarn monorepos. Typography is being built now; spacing, radius and elevation, components, accessibility and a CI guard follow, adding up to a full design-system audit. All of it is included in Pro as it ships.

How is this different from a linter or a token tool?

Linters check rules you already wrote down, and token tools assume your tokens are the truth. Saer starts from the code you actually ship, works out what the system really is, and shows where reality and intention have come apart: raw values that equal a token, near-misses, dead declarations, conflicting definitions.

What happens when Saer isn't sure?

It says so. If two files define the same variable differently and nothing in the code says which wins, Saer reports both and tells you it can't rank them, rather than picking one. Exact findings and inferred ones are always kept apart.

Will it change my code?

No. It only reads. It writes its report into .saer/ inside the project you scanned, which you can delete or git-ignore.

What do I need?

A Mac (Linux should work but is less tested; Windows isn't supported yet), Node 18 or newer, and Python 3.10 or newer. Results are identical on every supported Python version.

Can I cancel?

Yes, any time. Your licence keeps working until the end of the period you paid for.