Figma local dev loop
'Set up a local development workflow for Figma plugin and REST API projects.From its SKILL.md
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill figma-local-dev-loopAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.6 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Figma Local Dev Loop
Overview
Set up fast local development for two workflows: building Figma plugins that run inside the Figma editor, and building external apps that consume the Figma REST API.
Prerequisites
- Node.js 18+ with npm/pnpm
FIGMA_PATconfigured (seefigma-install-auth)- Figma desktop app (for plugin development)
Instructions
Step 1: REST API Project Structure
figma-integration/
├── src/
│ ├── figma-client.ts # Shared fetch wrapper
│ ├── extract-tokens.ts # Design token extraction
│ └── export-assets.ts # Asset export pipeline
├── tests/
│ ├── figma-client.test.ts
│ └── fixtures/ # Saved API responses for offline testing
│ └── sample-file.json
├── .env.local # FIGMA_PAT, FIGMA_FILE_KEY (git-ignored)
├── .env.example # Template for team
├── tsconfig.json
└── package.json
Step 2: Figma Plugin Project Structure
my-figma-plugin/
├── manifest.json # Plugin manifest (required by Figma)
├── code.ts # Plugin backend (runs in sandbox)
├── ui.html # Plugin UI (runs in iframe)
├── package.json
└── tsconfig.json
manifest.json (required):
{
"name": "My Plugin",
"id": "1234567890",
"api": "1.0.0",
"main": "dist/code.js",
"ui": "dist/ui.html",
"editorType": ["figma"],
"permissions": ["currentuser"]
}
Step 3: Plugin Development with Watch Mode
{
"scripts": {
"build": "esbuild code.ts --bundle --outfile=dist/code.js --target=es2020",
"watch": "esbuild code.ts --bundle --outfile=dist/code.js --target=es2020 --watch",
"dev": "concurrently \"npm run watch\" \"npm run watch:ui\"",
"watch:ui": "esbuild ui.tsx --bundle --outfile=dist/ui.html --loader:.html=copy --watch"
},
"devDependencies": {
"@figma/plugin-typings": "^1.0.0",
"esbuild": "^0.20.0",
"typescript": "^5.0.0"
}
}
Load the plugin in Figma:
- Figma desktop > Plugins > Development > Import plugin from manifest
- Select your
manifest.json - Run with
npm run watch-- changes auto-reload
Step 4: REST API Dev Loop with Testing
{
"scripts": {
"dev": "tsx watch src/extract-tokens.ts",
"test": "vitest",
"test:watch": "vitest --watch"
}
}
// tests/figma-client.test.ts
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { readFileSync } from 'fs';
// Load a saved API response for offline testing
const sampleFile = JSON.parse(
readFileSync('tests/fixtures/sample-file.json', 'utf-8')
);
describe('Figma token extraction', () => {
beforeEach(() => {
// Mock fetch to return saved fixture
vi.spyOn(global, 'fetch').mockResolvedValue(
new Response(JSON.stringify(sampleFile), { status: 200 })
);
});
it('should extract color styles from file', async () => {
const res = await fetch('https://api.figma.com/v1/files/test-key');
const file = await res.json();
const styles = Object.values(file.styles);
expect(styles.length).toBeGreaterThan(0);
});
});
Step 5: Save API Fixtures for Offline Dev
# Snapshot a Figma file for offline testing
curl -s -H "X-Figma-Token: ${FIGMA_PAT}" \
"https://api.figma.com/v1/files/${FIGMA_FILE_KEY}" \
> tests/fixtures/sample-file.json
# Snapshot specific nodes
curl -s -H "X-Figma-Token: ${FIGMA_PAT}" \
"https://api.figma.com/v1/files/${FIGMA_FILE_KEY}/nodes?ids=0:1,0:2" \
> tests/fixtures/sample-nodes.json
Output
- Working dev environment with hot reload
- Test suite with mocked Figma API responses
- Saved fixtures for offline development
- Plugin manifest configured for Figma desktop loading
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Plugin not appearing in Figma | Wrong manifest path | Re-import from correct manifest.json |
figma global undefined | Running outside Figma sandbox | Use @figma/plugin-typings for types only |
| Fixture stale | File changed since snapshot | Re-run fixture download script |
| esbuild watch crash | Syntax error in TS | Fix error; watch auto-restarts |
Examples
Quick Plugin Skeleton
// code.ts -- minimal Figma plugin
figma.showUI(__html__, { width: 300, height: 200 });
figma.ui.onmessage = (msg: { type: string; count: number }) => {
if (msg.type === 'create-rectangles') {
for (let i = 0; i < msg.count; i++) {
const rect = figma.createRectangle();
rect.x = i * 150;
rect.fills = [{ type: 'SOLID', color: { r: 1, g: 0.5, b: 0 } }];
figma.currentPage.appendChild(rect);
}
figma.closePlugin();
}
};
Resources
Next Steps
See figma-sdk-patterns for production-ready code patterns.
What ships with it: 7 files
6.1 KB alongside SKILL.md
references/
Gives 0 of the 12 instructions most images graphics skills give in ~1.4k tokens
Counted across 341 of the 354 authors here whose files we hold, read 2026-09-06
- Generate images via gemini_generate_imagein 14 of 341, across 10 files
- Set the aspect ratio via set_aspect_ratioin 14 of 341, across 10 files
- Verify MCP image tools are available before generatingin 13 of 341, across 9 files
- Show estimated cost before generatingin 13 of 341, across 9 files
- Run the post-generation SEO checklistin 13 of 341, across 9 files
- Structure prompts as subject, setting, style, lighting, compositionin 10 of 341, across 5 files
- Infer the brand strategy before generatingin 9 of 341, across 5 files
- Use at most two logo concept methodsin 9 of 341, across 5 files
- Use one dominant palette with repeating accentsin 9 of 341, across 5 files
- Extract fileKey and nodeId from the Figma URLin 9 of 341
- Read product marketing context before asking questionsin 8 of 341, across 3 files
- Keep the logo simple, symbolic, and ownablein 8 of 341, across 4 files
Said here and by no other author read
- Create the REST API project structure
- Create the plugin project structure with manifest.json
- Configure manifest.json for Figma desktop loading
- Bundle plugin code with esbuild watch mode
- Import plugin from manifest in Figma desktop
- Run REST dev loop with tsx watch
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.