Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Install and configure Framer SDK/CLI authentication. Use when setting up a new Framer integration, configuring API keys, or initializing Framer in your project. Trigger with phrases like "install framer", "setup framer", "framer auth", "configure framer API key".
.claude/skills/jeremylongshore-framer-install-auth/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -7% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -28% | 0% |
Set up the Framer Plugin SDK for building editor plugins, or the framer-api package for Server API access. Framer has two developer surfaces: Plugins (run inside the Framer editor UI) and Server API (run from any Node.js server via WebSocket).
| Type | Package | Use Case | |------|---------|----------| | Plugin | framer-plugin | UI that runs inside Framer editor | | Server API | framer-api | Headless CMS sync, CI/CD publishing | | Code Components | React in Framer | Custom components on the canvas | | Code Overrides | React in Framer | Modify existing component behavior |
bash# Scaffold a new plugin project npx create-framer-plugin@latest my-plugin cd my-plugin npm install npm run dev
This creates a Vite + React project with the framer-plugin package pre-configured. The plugin runs inside Framer's editor iframe.
bashnpm install framer-api
typescript// server.ts — Server API connection import { framer } from 'framer-api'; const client = await framer.connect({ apiKey: process.env.FRAMER_API_KEY!, // From site settings siteId: process.env.FRAMER_SITE_ID!, }); // List all CMS collections const collections = await client.getCollections(); console.log('Collections:', collections.map(c => c.name));
bash# .env (NEVER commit) FRAMER_API_KEY=framer_sk_abc123... FRAMER_SITE_ID=abc123def456 # .gitignore .env .env.local
Open Framer, go to your project, click Plugins > Development > select your local plugin. The dev server hot-reloads into the editor.
typescript// Plugin verification — runs inside Framer editor import { framer } from 'framer-plugin'; export function App() { const handleTest = async () => { const selection = await framer.getSelection(); console.log('Selected layers:', selection.length); framer.notify(`Found ${selection.length} selected layers`); }; return <button onClick={handleTest}>Test Connection</button>; }
| Error | Cause | Solution | |-------|-------|----------| | Plugin not showing | Dev server not running | Run npm run dev and reload Framer | | Invalid API key | Wrong key or site ID | Generate new key in site settings | | WebSocket connection failed | Network/firewall | Allow outbound WSS connections | | framer-plugin not found | Missing dependency | Run npm install framer-plugin |
After setup, proceed to framer-hello-world for your first plugin or component.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 21,953 | 15,070 | -31% | 1 | 1 | 0% | 3,326 | 2,950 | -11% | 0 | 0 | — |
case-02 | fail→pass | 18,534 | 10,386 | -44% | 1 | 1 | 0% | 3,346 | 3,084 | -8% | 0 | 0 | — |
case-03 | fail→pass | 22,884 | 18,322 | -20% | 1 | 1 | 0% | 3,356 | 3,549 | +6% | 0 | 0 | — |
case-04 | fail→pass | 17,557 | 11,597 | -34% | 1 | 1 | 0% | 2,333 | 2,171 | -7% | 0 | 0 | — |
case-05 | fail→pass | 17,546 | 3,383 | -81% | 1 | 1 | 0% | 2,158 | 1,553 | -28% | 0 | 0 | — |
case-06 | pass→pass | 7,633 | 8,583 | +12% | 1 | 1 | 0% | 1,395 | 1,449 | +4% | 0 | 0 | — |
case-07 | pass→pass | 8,867 | 5,154 | -42% | 1 | 1 | 0% | 1,683 | 1,862 | +11% | 0 | 0 | — |
case-08 | pass→pass | 6,251 | 2,274 | -64% | 1 | 1 | 0% | 1,165 | 1,313 | +13% | 0 | 0 | — |
case-09 | pass→pass | 12,968 | 11,533 | -11% | 1 | 1 | 0% | 1,362 | 1,980 | +45% | 0 | 0 | — |
case-10 | pass→pass | 16,300 | 10,659 | -35% | 1 | 1 | 0% | 1,868 | 1,950 | +4% | 0 | 0 | — |
case-11 | pass→pass | 15,916 | 13,748 | -14% | 1 | 1 | 0% | 1,837 | 2,431 | +32% | 0 | 0 | — |
case-12 | pass→pass | 13,626 | 7,730 | -43% | 1 | 1 | 0% | 1,649 | 2,089 | +27% | 0 | 0 | — |
case-13 | fail→pass | 8,097 | 4,213 | -48% | 1 | 1 | 0% | 1,579 | 1,706 | +8% | 0 | 0 | — |
case-14 | fail→pass | 20,305 | 3,609 | -82% | 1 | 1 | 0% | 3,306 | 1,583 | -52% | 0 | 0 | — |
case-15 | pass→pass | 9,826 | 11,906 | +21% | 1 | 1 | 0% | 1,639 | 1,908 | +16% | 0 | 0 | — |
case-16 | fail→pass | 7,776 | 9,800 | +26% | 1 | 1 | 0% | 1,372 | 1,862 | +36% | 0 | 0 | — |
case-17 | fail→pass | 10,967 | 1,958 | -82% | 1 | 1 | 0% | 1,043 | 1,152 | +10% | 0 | 0 | — |
case-18 | pass→pass | 8,219 | 4,901 | -40% | 1 | 1 | 0% | 1,474 | 1,739 | +18% | 0 | 0 | — |
case-19 | pass→pass | 17,522 | 14,121 | -19% | 1 | 1 | 0% | 2,216 | 2,655 | +20% | 0 | 0 | — |
case-20 | pass→fail | 14,354 | 9,607 | -33% | 1 | 1 | 0% | 2,005 | 2,833 | +41% | 0 | 0 | — |
case-21 | pass→pass | 9,243 | 13,121 | +42% | 1 | 1 | 0% | 2,088 | 2,625 | +26% | 0 | 0 | — |
case-22 | pass→pass | 16,169 | 20,772 | +28% | 1 | 1 | 0% | 2,283 | 4,539 | +99% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.