/figma-build
Build a Figma design from code or a description — the reverse of figma-codegen. Reuses the connected file's existing design system (components, variables, styles) instead of drawing primitives with hardcoded values. Triggers whenever the user wants something created or updated
$ npx -y skills add awdr74100/figwright --skill figma-build --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/figma-build
Context preview
The summary Claude sees to decide when to auto-load this skill.
Build a Figma design from code or a description — the reverse of figma-codegen. Reuses the connected file's existing design system (components, variables, styles) instead of drawing primitives with hardcoded values. Triggers whenever the user wants something created or updated
SKILL.md
figma-build.SKILL.mdname: figma-build
description: Build a Figma design from code or a description — the reverse of figma-codegen. Reuses the connected file's existing design system (components, variables, styles) instead of drawing primitives with hardcoded values. Triggers whenever the user wants something created or updated IN Figma from code or a spec — e.g. 'build this in Figma', 'create a Figma design for this', 'push this component/screen to Figma', 'turn this React/Vue into a Figma design', 'recreate this UI in Figma', 'make a Figma version of …', 'design a landing page/screen in Figma' — or whenever a coding artifact (a component, page, or spec) appears alongside a request to author in a connected Figma file. Works for full screens, sections, single components, or design-system assets.
figma-build
Turn code or a description into a Figma design that looks like it belongs in the file: **reuse the components, variables, and styles that already exist, and only build what's genuinely missing.** This is the mirror image of `figma-codegen` — same "reuse beats regenerate / reference tokens not literals" philosophy, pointed at the canvas instead of the codebase. This file is the router; deep detail lives in [`references/`](./references) — load a reference when its step is in play.
You operate on the **connected** Figma file (the plugin's current session). There is no fetch-by-URL; the user must have the target file open. Confirm a plugin is connected (`ping`) before building.
When to use
- The user wants to **create or update** something in Figma from code or a description — a screen,
view, modal/dialog/drawer/sidebar/panel, a single component, or a design-system asset.
- **Not** for reading a Figma design into code — that's `figma-codegen`.
First, understand the environment, then build (provider-first)
The write-side mirror of codegen's grounding, and the **most important habit**: an off-looking build almost always comes from **invented values** or **assumed conventions**. So **understand this user's actual environment first, then build into it** — never apply a generic template. There's no single "right" stack; there's _their_ stack. Look at **both ends** before creating anything:
- **The Figma file** — its existing design system, which you'll reuse and bind to:
1. **`get_variable_defs`** → the file's variables (colour / spacing / radius / typography) with names + values + `hex`. These are the tokens you bind to. 2. **`scan_components`** / **`get_local_components`** → existing components to **instance** rather than rebuild. Match the source UI pattern (a card, a list row, a nav, a button) to a component. 3. **`get_styles`** → shared paint / text / effect styles to apply.
- **The source you were handed** — when it's code, _which_ stack and styling system (Tailwind /
Chakra / MUI / CSS modules / vanilla …) and whether it has a config / theme / tokens file. That's where its real values live — read them from there, don't assume a default.
Then build, tracing every value to a source in priority order: **reuse** an existing component / variable / style; else take the **exact value from the source's own code** — provider-first, resolving whatever styling system it uses to real px / hex (CSS literally; Tailwind / Chakra / UnoCSS / … via their config or scale), never eyeballed; only **invent** from a consistent scale when neither exists. Full detail + the value-resolution method in `references/write-rules.md`.
Two jobs — both follow the write rules
Every build obeys the same cross-cutting rules — ground values (design system → source code → scale), reference tokens (colour via `bind_variable_to_paint`, scalars via `bind_variable_to_node`, shared looks via `apply_style_to_node`), auto-layout for related children (absolute only for top-level placement), HUG/FILL/FIXED sizing via `set_layout_props` (so the layout computes sizes — don't hardcode width/height), and real fonts (a new TEXT node defaults to Inter). → **[`references/write-rules.md`](./references/write-rules.md).**
- **Assemble a screen / component from what exists** (the common case): recognise the UI pattern,
`create_instance` matching components, bind tokens, build incrementally, screenshot-verify each step. → **[`references/assemble-screens.md`](./references/assemble-screens.md).**
- **Author a new design-system asset** (only when grounding found no equivalent): create
variables/collections, paint/text styles, or components + variant sets, then switch back to the reuse path. → **[`references/author-design-system.md`](./references/author-design-system.md).**
Motion (animation)
When the source carries animation — CSS `@keyframes` / `transition`, Framer Motion, GSAP, a Vue/Svelte transition — author it as Figma **Motion (beta)** on the frame you built rather than dropping it: `apply_animation_style` (presets from `get_motion_styles`) or `apply_manual_keyframe_track` per property, `set_timeline_duration` for length. A staggered row is **one atomic `batch`** of `apply_animation_style` ops with increasing `config.timelineOffset` — not N calls. Motion is Figma-Design-only and keyframes attach to a top-level frame's layers, so build the frame first. → **[`references/motion.md`](./references/motion.md).**
Verify visually (close the loop)
`get_screenshot` the built node, fix discrepancies, and re-screenshot — the same render-and-diff discipline codegen uses, in reverse. Check it against the source intent **and** against objective design health (this catches problems even when you built from a vague description with no source to compare): nothing clipped or overflowing, edges aligned, spacing consistent (one scale), a clear type hierarchy. An `empty: true` export means the node rendered nothing (hidden / off-canvas).
Rules
- **Understand the environment, then build.** Read both the file's design system _and_ the source's
stack / styling system before creating anything — there's no single
Read more
name: figma-build description: Build a Figma design from code or a description — the reverse of figma-codegen. Reuses the connected file's existing design system (components, variables, styles) instead of drawing primitives with hardcoded values. Triggers whenever the user wants something created or updated IN Figma from code or a spec — e.g. 'build this in Figma', 'create a Figma design for this', 'push this component/screen to Figma', 'turn this React/Vue into a Figma design', 'recreate this UI in Figma', 'make a Figma version of …', 'design a landing page/screen in Figma' — or whenever a coding artifact (a component, page, or spec) appears alongside a request to author in a connected Figma file. Works for full screens, sections, single components, or design-system assets.
figma-build
Turn code or a description into a Figma design that looks like it belongs in the file: **reuse the components, variables, and styles that already exist, and only build what's genuinely missing.** This is the mirror image of `figma-codegen` — same "reuse beats regenerate / reference tokens not literals" philosophy, pointed at the canvas instead of the codebase. This file is the router; deep detail lives in [`references/`](./references) — load a reference when its step is in play.
You operate on the **connected** Figma file (the plugin's current session). There is no fetch-by-URL; the user must have the target file open. Confirm a plugin is connected (`ping`) before building.
When to use
- The user wants to **create or update** something in Figma from code or a description — a screen,
view, modal/dialog/drawer/sidebar/panel, a single component, or a design-system asset.
- **Not** for reading a Figma design into code — that's `figma-codegen`.
First, understand the environment, then build (provider-first)
The write-side mirror of codegen's grounding, and the **most important habit**: an off-looking build almost always comes from **invented values** or **assumed conventions**. So **understand this user's actual environment first, then build into it** — never apply a generic template. There's no single "right" stack; there's _their_ stack. Look at **both ends** before creating anything:
- **The Figma file** — its existing design system, which you'll reuse and bind to:
1. **`get_variable_defs`** → the file's variables (colour / spacing / radius / typography) with names + values + `hex`. These are the tokens you bind to. 2. **`scan_components`** / **`get_local_components`** → existing components to **instance** rather than rebuild. Match the source UI pattern (a card, a list row, a nav, a button) to a component. 3. **`get_styles`** → shared paint / text / effect styles to apply.
- **The source you were handed** — when it's code, _which_ stack and styling system (Tailwind /
Chakra / MUI / CSS modules / vanilla …) and whether it has a config / theme / tokens file. That's where its real values live — read them from there, don't assume a default.
Then build, tracing every value to a source in priority order: **reuse** an existing component / variable / style; else take the **exact value from the source's own code** — provider-first, resolving whatever styling system it uses to real px / hex (CSS literally; Tailwind / Chakra / UnoCSS / … via their config or scale), never eyeballed; only **invent** from a consistent scale when neither exists. Full detail + the value-resolution method in `references/write-rules.md`.
Two jobs — both follow the write rules
Every build obeys the same cross-cutting rules — ground values (design system → source code → scale), reference tokens (colour via `bind_variable_to_paint`, scalars via `bind_variable_to_node`, shared looks via `apply_style_to_node`), auto-layout for related children (absolute only for top-level placement), HUG/FILL/FIXED sizing via `set_layout_props` (so the layout computes sizes — don't hardcode width/height), and real fonts (a new TEXT node defaults to Inter). → **[`references/write-rules.md`](./references/write-rules.md).**
- **Assemble a screen / component from what exists** (the common case): recognise the UI pattern,
`create_instance` matching components, bind tokens, build incrementally, screenshot-verify each step. → **[`references/assemble-screens.md`](./references/assemble-screens.md).**
- **Author a new design-system asset** (only when grounding found no equivalent): create
variables/collections, paint/text styles, or components + variant sets, then switch back to the reuse path. → **[`references/author-design-system.md`](./references/author-design-system.md).**
Motion (animation)
When the source carries animation — CSS `@keyframes` / `transition`, Framer Motion, GSAP, a Vue/Svelte transition — author it as Figma **Motion (beta)** on the frame you built rather than dropping it: `apply_animation_style` (presets from `get_motion_styles`) or `apply_manual_keyframe_track` per property, `set_timeline_duration` for length. A staggered row is **one atomic `batch`** of `apply_animation_style` ops with increasing `config.timelineOffset` — not N calls. Motion is Figma-Design-only and keyframes attach to a top-level frame's layers, so build the frame first. → **[`references/motion.md`](./references/motion.md).**
Verify visually (close the loop)
`get_screenshot` the built node, fix discrepancies, and re-screenshot — the same render-and-diff discipline codegen uses, in reverse. Check it against the source intent **and** against objective design health (this catches problems even when you built from a vague description with no source to compare): nothing clipped or overflowing, edges aligned, spacing consistent (one scale), a clear type hierarchy. An `empty: true` export means the node rendered nothing (hidden / off-canvas).
Rules
- **Understand the environment, then build.** Read both the file's design system _and_ the source's
stack / styling system before creating anything — there's no single
Free, two-way Figma MCP server. Turn designs into framework-aware code, and push code back to the canvas. Works with Claude Code, Cursor, Codex, and any MCP client.
Repo: awdr74100/figwright
Other skills on figwright.
- /figma-typings-audit
Upgrade @figma/plugin-typings and absorb what the new version exposes. Diffs the .d.ts between the installed and the target version (that package ships no changelog), sorts the changes into breakage / new API / silently-added fields, maps each onto the sandbox handlers, the
Open skill - /mcp-sdk-audit
Upgrade @modelcontextprotocol/server (the MCP TypeScript SDK v2) and prove the wire contract survived. The SDK is a runtime dependency whose breakage lands on the wire, not in the type checker — so this sorts each release by which SDK source files it touched (Figwright uses only
Open skill - /figma-codegen
Generate framework-aware code from a Figma design. Reads the project's stack profile and emits code matching the existing framework (React/Vue/Svelte/Next/etc.) and styling (Tailwind/CSS/CSS-in-JS), reusing existing components and design tokens instead of regenerating from
Open skill

