Export tokens figma
Export Figma variables to design token files in DTCG, CSS custom properties, Tailwind v4/v3, SCSS, TypeScript, JSON, Style Dictionary, or Tokens Studio. Use when the user wants to pull design tokens OUT of Figma into code — triggers: 'export tokens', 'export Figma variables', 'generate CSS variables from Figma', 'turn my Figma variables into a tokens.json / Tailwind config / SCSS', 'sync design tokens to code'. Works on ANY Figma plan (reads via the Plugin API, not the Enterprise-only Variables REST API). For the reverse direction (code → Figma) use import-tokens-figma.From its SKILL.md
npx -y skills add southleft/skills-for-figma --skill export-tokens-figmaAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 1 command, including `node scripts/convert-tokens.mjs variables.json --format dtcg --out tokens/`.
SKILL.md
4.8 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
export-tokens-figma — Figma variables → design tokens
Read every local variable in a Figma file and emit design-token files. The canonical output is DTCG (W3C Design Tokens Community Group JSON); CSS, Tailwind, SCSS, TS, and JSON derive from it.
Why this beats a raw REST export: Figma's Variables REST API is Enterprise-only (403 on
Starter/Pro/Org). This skill reads through the Plugin API via use_figma, so it works on every
plan and resolves aliases + multi-mode values that get_variable_defs (default mode only) drops.
Skill boundaries
use_figmarules — load the officialfigma-useskill first; it is the full Figma Plugin API reference. Essentials these scripts rely on: plain JS with top-levelawait+return(no IIFE, nofigma.closePlugin();console.logis not returned), inputs inlined asconstat the top of each script, colors in 0–1 range, load fonts before any text op,await figma.getNodeByIdAsync(...), and atomic errors (a failed script applies nothing — read the error, fix, retry).- Reverse direction (code → Figma variables) → use the
import-tokens-figmaskill.
Workflow
- Confirm scope & format. Ask (or infer) the target format (
dtcgis the safe default), whether to split by mode/collection, and the output path. Get the file key from the active Figma file or a URL the user provides. - Read the variables. Run
scripts/read-variables.jsviause_figma(skillNames: "export-tokens-figma"). It returns the normalized collections/modes/variables tree with hex colors, resolved alias references, scopes, and code syntax. - Save the read output to a file, e.g.
variables.json. - Convert — deterministically. Run the bundled converter (Node 18+, zero dependencies). Do not
hand-write the conversion — this script is the source of truth and produces identical output every
run:
This matches the Consolenode scripts/convert-tokens.mjs variables.json --format dtcg --out tokens/ # --format: dtcg (default) | css-vars | tailwind-v4 | tailwind-v3 | scss | ts-module # | json-flat | json-nested | style-dictionary-v3 | tokens-studio # (aliases: css, tailwind, ts) # --out <dir> write file(s) — tokens-studio writes several; omit to print to stdout # --prefix <p> prefix CSS/SCSS var names # --modes Light,Dark include only these modes (default: all) # --collection <substr> include only collections whose name contains <substr>figma_export_tokensformatters. It handles exactly what freehand conversion gets wrong: per-type units (opacity/line-height unitless, spacing/radiuspx); multi-mode output (CSS & Tailwind v4 emit:root+.dark/[data-theme]; TS/JSON emit{mode: value}; SCSS suffixes modes; DTCG keeps them in$extensions); aliases →var()/{ref}; font-weight names → numbers; DTCG round-trip metadata; and it warns on slug collisions and non-numeric weights. (style-dictionary-v3andtailwind-v3use the primary mode, matching the Console — those formats have no native multi-mode encoding.) - Report. Surface the written path(s) and any warnings the converter printed (collisions / weight issues are real findings about the Figma file, worth flagging to the user).
Notes
- The converter is deterministic and authoritative. references/token-formats.md documents the formats it emits; it is reference, not a thing to re-implement by hand.
- Where it runs:
read-variables.jsruns anywhere viause_figma.convert-tokens.mjsis Node, so it needs a terminal-capable agent (Claude Code, the Code tab in Claude Desktop, Cursor, Codex, Gemini CLI). In plain Desktop/web chat (no shell), run the converter on your own machine against the savedvariables.json, or accept a best-effort inline conversion for DTCG only. - Large systems: if the read is huge, scope it to specific collection names before saving.
- Aliases across collections become
var(--…)/{ref}— export all collections together so those references resolve.
What ships with it: 3 files
31.6 KB alongside SKILL.md, 2 of them executable
references/
- token-formats.md3.9 KB
scripts/
- convert-tokens.mjsruns24.1 KB
- read-variables.jsruns3.6 KB
Gives 0 of the 12 instructions most css styling skills give in ~1.1k tokens
Counted across 512 of the 512 authors here whose files we hold, read 2026-09-06
- Animate only transform and opacityin 32 of 512, across 30 files
- Respect prefers-reduced-motionin 21 of 512
- Support reduced motion preferencesin 16 of 512, across 6 files
- Use Tailwind CSS for stylingin 14 of 512, across 13 files
- Specify AnimatePresence mode explicitlyin 12 of 512, across 2 files
- Set initial states explicitlyin 12 of 512, across 2 files
- Use semantic HTML elementsin 11 of 512, across 10 files
- Use oklch for color valuesin 11 of 512, across 10 files
- Honor prefers-reduced-motion in animationsin 10 of 512
- Provide a reduced-motion fallback for animationsin 10 of 512, across 9 files
- Use property names in camelCasein 9 of 512, across 4 files
- Ensure UI animations stay under 300msin 9 of 512, across 6 files
Said here and by no other author read
- Load the figma-use skill first
- Confirm target format and output path
- Read variables using read-variables.js
- Run convert-tokens.mjs for conversion
- Report written paths and conversion warnings
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.