---
name: figma-use
description: Control Figma via CLI — create shapes, frames, text, components, set styles, layout, variables, export images. Use when asked to create/modify Figma designs or automate design tasks.
---
# figma-use
CLI for Figma. Two modes: commands and JSX.
```bash
# Commands
figma-use create frame --width 400 --height 300 --fill "#FFF" --layout VERTICAL --gap 16
figma-use create icon mdi:home --size 32 --color "#3B82F6"
figma-use set fill 1:23 "$Colors/Primary"
# JSX (props directly on elements, NOT style={{}})
echo '
Hello
' | figma-use render --stdin --x 100 --y 100
```
## Before You Start
```bash
figma-use status # Check connection
```
If not connected — start Figma with remote debugging:
```bash
# macOS
open -a Figma --args --remote-debugging-port=9222
# Windows
"%LOCALAPPDATA%\Figma\Figma.exe" --remote-debugging-port=9222
# Linux
figma --remote-debugging-port=9222
```
> Figma 126+ blocks remote debugging. Run `figma-use patch` once to fix, then restart Figma. Click **Always Allow** on the keychain prompt. Re-run after Figma updates.
>
> **Can't patch?** Use `figma-use daemon start --pipe` — launches Figma with debug pipe, no patching needed.
Start Figma with `--remote-debugging-port=9222` and you're ready.
> **Non-default port?** If Figma is on another port, pass `--port ` to any command (or set the `FIGMA_PORT` env var). Errors will show the correct port.
> ```bash
> open -a Figma --args --remote-debugging-port=9333
> figma-use get components --port 9333
> ```
## Two Modes
**Imperative** — single operations:
```bash
figma-use create frame --width 400 --height 300 --fill "#FFF" --radius 12
figma-use set fill "#FF0000"
figma-use node move --x 100 --y 200
```
**Declarative** — render JSX trees:
```bash
echo '
Title
Description
' | figma-use render --stdin --x 100 --y 200
```
stdin supports both pure JSX and full module syntax with imports:
```tsx
import { Frame, Text, defineComponent } from 'figma-use/render'
const Button = defineComponent(
'Button',
Click
)
export default () => (
)
```
**Elements:** `Frame`, `Rectangle`, `Ellipse`, `Text`, `Line`, `Star`, `Polygon`, `Vector`, `Group`, `Icon`, `Image`, `Instance`
Use `` to create component instances:
```tsx
```
⚠️ **Always use `--x` and `--y`** to position renders. Don't stack everything at (0, 0).
## Icons
150k+ icons from Iconify by name:
```bash
figma-use create icon mdi:home
figma-use create icon lucide:star --size 48 --color "#F59E0B"
figma-use create icon heroicons:bell-solid --component # as Figma component
```
In JSX:
```tsx
```
## Images
Load images from URL:
```tsx
```
## Export JSX
Convert Figma nodes back to JSX code:
```bash
figma-use export jsx # Minified
figma-use export jsx --pretty # Formatted
# Format options
figma-use export jsx --pretty --semi --tabs
# Match vector shapes to Iconify icons (requires: npm i whaticon)
figma-use export jsx --match-icons
figma-use export jsx --match-icons --icon-threshold 0.85 --prefer-icons lucide,tabler
```
Round-trip workflow:
```bash
# Export → edit → re-render
figma-use export jsx --pretty > component.tsx
# ... edit the file ...
figma-use render component.tsx --x 500 --y 0
```
Compare two nodes as JSX:
```bash
figma-use diff jsx
```
## Export Storybook (Experimental)
Export all components on current page as Storybook stories:
```bash
figma-use export storybook # Output to ./stories/
figma-use export storybook --out ./src/stories # Custom output dir
figma-use export storybook --match-icons # Match vectors to Iconify icons
figma-use export storybook --no-semantic-html # Disable semantic HTML conversion
```
**Semantic HTML:** By default, components are converted to semantic HTML elements based on their names:
- `Input/*`, `TextField/*` → ``
- `Textarea/*` → `