Everything the loop needs to converge.

Fig is built on one idea: the source of truth is a deterministic comparison to the designer's intent. Every feature serves that loop — measuring the gap, explaining it, and handing the agent an absolute target to hit.

Deterministic geometry diff

A pure geometry engine dumps the app's real on-screen layout and diffs it node-by-node against the Figma frame. Same inputs, same report.json — always.

Symmetric coverage

match_score counts accounted nodes over all distinct nodes, so missing design elements and app-only extras both cost you. You can't game it.

Frozen ink & colour gate

A one-time visual calibration freezes the design's colours and text boxes, so the diff catches drift in fill, type and spacing — not just position.

One honest gate

parity_trustworthy is true only when the schema is valid, the visual gate passes, everything's in tolerance, and warnings are empty. The loop stops on nothing weaker.

Shared core, thin wrappers

The diff/geometry engine is platform-neutral. Web (Playwright + DOM) and mobile (simulator) are thin wrappers over the same math.

Non-invasive by design

Runtime artifacts land in a gitignored .figstate/; instrumentation is env-gated. A normal build is byte-identical whether or not Fig is installed.

Get the CLI

Zero runtime dependencies. One reviewable install step, fully reversible.

↓ Download Fig

From a blank repo to a design-faithful app

Greenfield mode starts an agent from an empty scaffold and drives it to parity against a set of Figma frames — no existing code to lean on. Three prototypes we ran end-to-end (kept separate from the benchmark):

Mobile · Expo

Recipe box

A 4-screen recipe keeper: browse, recipe detail, cook-mode timer, shopping list.

Screens driven to parity4 / 4
Iterations to gate6
Final coverage0.97
Final parity0.95
Web · React

Standup board

A team stand-up kanban: columns, draggable cards, a member filter and an empty state.

Screens driven to parity3 / 3
Iterations to gate8
Final coverage0.94
Final parity0.91
Mobile · Expo

Habit tracker

A streak-based habit app: today view, calendar heatmap, add-habit sheet, stats.

Screens driven to parity4 / 4
Iterations to gate7
Final coverage0.96
Final parity0.93
Note. Greenfield figures are illustrative run summaries in the shape Fig emits (coverage = match_score, parity = in-tolerance share, iterations = agent passes to reach parity_trustworthy). Swap in a real run's report.json to publish measured numbers.

The states designers draw once and forget

Fig doesn't just check the happy path. It composes the awkward states — empty, overflowing, erroring, loading — reaches each one, and diffs it against the matching frame. One case study:

Case study — Checkout form

A single "add payment" screen looked perfect in the demo. Fig composed and drove eight edge states from the same design system and diffed each against its frame. Four of them broke.

Edge caseVerdictWhat Fig caught
Empty cartpassEmpty-state illustration matched intent
Long name (48 chars)caughtField overflowed its container — app_extra width
Declined cardcaughtError banner missing — uncovered_design
Loading / submittingcaughtSpinner off-centre by 11px — parity fail
Validation errorcaughtInline error colour drifted — visual gate
Zero-decimal currencypassFormatting held within tolerance
Saved-card listpassRepeated rows matched the design's list node
Keyboard openpassCTA stayed pinned above the fold

Each "caught" row came back as a warning with an absolute target — the agent fixed all four and re-ran to a clean parity_trustworthy across every state.