deeepSpace renders each component from your code in a real browser, in every variant you designed in Figma, and compares it with the design: sizes, spacing, colors, borders, corner radius, typography, text, icons, and a pixel comparison of the whole component.

Before you begin

  • React components (.tsx, .ts, .jsx, .js). Vite, Next.js, webpack and Create React App projects are supported, with or without Storybook.
  • The component is pushed from Figma with the latest deeepSpace Figma plugin.
  • The Figma component is linked to its code component in deeepSpace: on the component page, the Details panel → Code → Link the code (or Match components on the Components page, to link them all at once). Every component your files export can be linked, including parts that live next to a main component (a TableRow beside Table).
  • Your project’s dependencies are installed (npm install, pnpm install…): the CLI builds your components with them.

How it runs

  1. Run deeep sync. After syncing your components, the CLI builds them into a small preview app with your project’s own settings (path aliases, Tailwind/PostCSS, CSS modules, Sass, fonts, global styles and providers) and uploads it privately to deeepSpace.
  2. deeepSpace renders every Figma variant of each linked component in a sandboxed browser, then compares it with the design.
  3. Open the component in deeepSpace: each variant shows how closely the code matches it. A comparison usually takes about a minute.
The sync output ends with one of:
A component that fails to build (a missing import, for example) is set aside: the sync output names it and the reason, and every other component is still compared.
The preview page is the default. If it can’t be built and the project has Storybook, the CLI uses your Storybook instead, opening each component’s story with the design’s values as story args.

Reading the results

Everything is on the component page.
  • Score: the pill at the top, such as 87% · Close to the design, is how closely the component matches its design across all variants. Green from 95%, orange from 80%, red below. Click it to open the variant that needs the most work.
  • Variants: every variant designed in Figma, as cards, each with its own score and number of differences. Filter them by Figma property. Move the mouse across a card to swipe between the design and your rendered code.
  • One variant: click a card to open it. Switch between Design, Code (your component, rendered), Side by side and Swipe (drag the line between the design and the code). Use ← → or the strip at the bottom to move between variants, and Esc to go back to all of them.
  • Differences: each one is a numbered pin on the image and a line in the panel on the right, in plain words: Font size: 16px in design, 14px in code. Click a pin or a line, or use ↑ ↓: the spot is outlined, the rest of the image fades, and its values show next to it.
    • High and Medium differences are the ones you can see. Minor ones (a color or size that isn’t a design token, details barely visible) are folded into one line; Show lists them and pins them too.
    • A difference caused by another one (a button is narrower because its font is smaller) is listed under its cause, not as a separate difference.
    • The same difference on repeated elements (five accordion titles) is one difference, in 5 places.
  • How it’s rendered (in the panel of a variant): the exact code rendered, for example <Button variant="secondary" size="sm">Label</Button>, and how each Figma property was turned into a prop. You can correct it.
  • What’s checked (in the panel of a variant): what was matched and checked, and what isn’t checked yet.
Use Compare again (the Details panel → Code) to run the comparison now, even if nothing changed.

When something isn’t right

Mappings come from your Figma Code Connect files when you have them, otherwise from matching names. Your corrections always win.

Known limits

The comparison doesn’t check everything yet. Knowing what it can’t see keeps a result from being read as more (or less) than it is.

Settings

Add an optional compare block to deeep.json:
deeep.json

Privacy

Your build is uploaded privately and only used to render your components. Comparison images are visible only to people with access to your project. Old builds and images are cleaned up automatically.