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.
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.
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.
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.
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.
The diff/geometry engine is platform-neutral. Web (Playwright + DOM) and mobile (simulator) are thin wrappers over the same math.
Runtime artifacts land in a gitignored .figstate/; instrumentation is env-gated. A normal build is byte-identical whether or not Fig is installed.
Zero runtime dependencies. One reviewable install step, fully reversible.
↓ Download FigGreenfield 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):
A 4-screen recipe keeper: browse, recipe detail, cook-mode timer, shopping list.
| Screens driven to parity | 4 / 4 |
| Iterations to gate | 6 |
| Final coverage | 0.97 |
| Final parity | 0.95 |
A team stand-up kanban: columns, draggable cards, a member filter and an empty state.
| Screens driven to parity | 3 / 3 |
| Iterations to gate | 8 |
| Final coverage | 0.94 |
| Final parity | 0.91 |
A streak-based habit app: today view, calendar heatmap, add-habit sheet, stats.
| Screens driven to parity | 4 / 4 |
| Iterations to gate | 7 |
| Final coverage | 0.96 |
| Final parity | 0.93 |
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.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:
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 case | Verdict | What Fig caught |
|---|---|---|
| Empty cart | pass | Empty-state illustration matched intent |
| Long name (48 chars) | caught | Field overflowed its container — app_extra width |
| Declined card | caught | Error banner missing — uncovered_design |
| Loading / submitting | caught | Spinner off-centre by 11px — parity fail |
| Validation error | caught | Inline error colour drifted — visual gate |
| Zero-decimal currency | pass | Formatting held within tolerance |
| Saved-card list | pass | Repeated rows matched the design's list node |
| Keyboard open | pass | CTA 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.