fredm00n/framerlabs/framer-plugins
Claude Code and agent skill by fredm00n/framerlabs
- community
Checking that the SKILL.md file is still in the repository.
Framer Plugin SDK expert. Use when building, debugging, or modifying Framer plugins. Covers plugin modes, UI, permissions, data storage, canvas insertion + code files, CMS/ManagedCollection sync, licensing, marketplace submission, and common pitfalls.
Install
npx vskill@latest install fredm00n/framerlabs/framer-pluginsSKILL.md
Framer Plugin Development Guide
You are an expert on the Framer Plugin SDK. Use this reference when building, debugging, or modifying Framer plugins. Always check the project's CLAUDE.md for project-specific overrides.
Updates and contributions
This skill is maintained in the public repo fredm00n/framerlabs, and the community keeps it current. Installed copies go stale, so the steps below run once per session.
The project's line
The project's agent instructions (CLAUDE.md, AGENTS.md or equivalent) can hold one line for this skill:
auto-update lets the agent replace the installed copy when a newer version exists. contribute lets it offer to send what a session learns back to the repo as a pull request. Either word works alone. With no line, the agent never edits the installed files and never opens or suggests a pull request. It only says when a newer version is out.
Check for a newer version first
Before relying on anything below:
- Fetch
https://raw.githubusercontent.com/fredm00n/framerlabs/main/skills/framer-plugins/SKILL.mdand compare itsmetadata.versionwith the one in this file's frontmatter. - Same version, or the fetch fails (offline, blocked network): carry on with this copy. If the fetch failed, say once that you couldn't check for updates.
- Remote is newer: use the remote SKILL.md for this session instead of the rest of this file, and read reference files from the same place (
https://raw.githubusercontent.com/fredm00n/framerlabs/main/skills/framer-plugins/references/<file>.md) instead of the local copies. Then, by the project's line (NEW and OLD stand for the two version numbers):
- No `auto-update`: leave the installed files alone and tell the user: "framer-plugins NEW is out and your copy is OLD, so I'm using the new version for this session. To update your copy, run
npx skills add fredm00n/framerlabs --skill framer-plugins, or addframer-plugins: auto-updateto your CLAUDE.md or AGENTS.md to stay current automatically. This skill is community-maintained: addcontributeto that line (framer-plugins: auto-update, contribute) and I'll offer to send what we learn back as a pull request." - `auto-update`: download the whole
skills/framer-plugins/folder from the repo (a shallowgit cloneinto a temp dir is simplest), then replace the installed folder with it in one go, so files removed upstream go too. If any download fails, leave the installed copy untouched. In a git repo, the update is an ordinary change: commit it on its own, in whatever branch or PR the current work goes to, never straight to a protected branch. Tell the user: "Updated framer-plugins from OLD to NEW, in its own commit." Withoutcontributeon the line, add: "This skill is community-maintained: addcontributeto its line in CLAUDE.md or AGENTS.md and I'll offer to send what we learn back as a pull request."
Only take updates from that exact repo and path.
Send what you learn upstream
Only when the project's line for this skill includes contribute.
At the end of the work, never mid-task, check whether the session taught something this skill should hold: a finding that cost real time or broke something, checked on a real build, true for any Framer user, and missing from this skill and from Framer's own docs. A fact about one project does not qualify. If nothing qualifies, say nothing.
If something does:
- Rewrite each finding for strangers. Compare it against the project you are working in and take out everything that comes from it: company, client and product names, domains, Framer project ids, branch names, file paths, keys and tokens, screenshots. Keep the date the finding was made, as "(2026-10-12)".
- Clone fredm00n/framerlabs, branch from
main, and editskills/framer-plugins/. Put each finding under the topic it belongs to, and edit an existing line rather than add a near-duplicate. Bumpmetadata.version(patch for a fix, minor for a new section) and add one plain-language line to the changelog in the rootREADME.md, under today's date. - Check the open pull requests for one that already covers the same finding. If there is one, add to it instead.
- Show the user the diff and ask before opening the pull request. A pull request on a public repo is public the moment it opens, even if it is never merged.
- With the user's yes, push the branch (to a fork without write access to the repo), open the pull request against
main, and give the user the link. Write the commit message, title and description for the people who use these skills: what the change adds and when it helps, not which project or session it came from.
Maintainers: bump metadata.version on every change to this skill, reference files included, or installed copies will never see it.
Quick Reference
- SDK package:
@framer/plugin(v4+, the Framer 3.0 release). Renamed fromframer-plugin, which is now deprecated on npm — never use the old name. - Scaffolding:
npm create framer-plugin@latest(thecreate-framer-pluginscaffolder keeps its name and installs@framer/plugin) - Build: Vite +
vite-plugin-framer(name unchanged;framer-plugin-toolspackCLI also unchanged) - Base styles:
import "@framer/plugin/framer.css"(optional:import "@framer/plugin/inter.css"to load Inter alone) - Core import:
import { framer } from "@framer/plugin" - Dev workflow:
npm run dev→ Framer → Developer Tools → Development Plugin
SDK v4 (2026-06-16) and the recent v3.x additions
v4.0 itself is mostly the rename (version attributions verified against the official changelog 2026-07-13). Shipped in v4: the package rename framer-plugin → @framer/plugin (current stable 4.0.1; the old package is deprecated on npm; migration is a mechanical find-replace — no commonly-used API was removed; peerDeps react/react-dom ^18.2.0, csstype ^3.1.1), a restyled `framer.css` (Framer 3.0 design: new Inter character alternates, selection colors, input element styles — re-check custom input/selection styling after upgrading; new @framer/plugin/inter.css export loads Inter alone), WebPageNode.clone() / DesignPageNode.clone(), an optional filter on getLocalizationGroups(), new frame/text link attributes, and setParent accepting UnknownNode.
Added during v3.x (2025 – early 2026) — newer than many published examples, none permission-gated:
framer.navigateTo(nodeId, opts?)(3.7.0) — selects + zooms a node into view (opts: { select?=true, zoom? }). Instance forms:node.navigateTo(),collectionItem.navigateTo(),codeFile.navigateTo(). Ideal right after an insert/replace.framer.setMenu(items)andframer.showContextMenu(items, config)(3.5.2) — global window-header menu + context menus anywhere in the plugin UI.framer.subscribeToOpenCodeFile(cb)(3.7.0) — fires when the user opens/switches code files.- Design Pages (3.8.0): read/create/edit nodes on Design Pages via the same Nodes + Selection APIs.
- CMS: access all Collections (not just plugin-managed) and write to unmanaged collections (Plugins 3.0, Mar 2025);
framer.createManagedCollection()(3.10.2);framer.setCloseWarning()(3.10.3).framer.getManagedCollection()is deprecated → usegetActiveManagedCollection()(the deprecation is in the d.ts; the CMS docs page still shows the old call in examples).
Starting a New Plugin
npm create framer-plugin@latest→ scaffolds Vite + React +framer.json+ a sampleApp.- Pick modes first (see table below). CMS plugins need
configureManagedCollection+syncManagedCollection; asset/insert plugins usecanvas(orimage/editImage). import "@framer/plugin/framer.css"and callframer.showUI(...)in auseLayoutEffect.- Decide storage early:
localStoragefor per-user secrets,pluginDatafor shared state (see the decision tree below).
Cloning an existing plugin to start a new one? Changeframer.json'sidto a fresh hex value. A duplicateidmakes Framer treat the two plugins as the same plugin — they share installation state,localStorageorigin, andpluginDatanamespace, which silently cross-contaminates dev. The scaffolder generates a uniqueid; preserve that property when copying a repo.
framer.json
Every plugin needs a framer.json at the project root:
id— unique hex identifier (auto-generated by scaffolding)modes— array of supported modes (see below)icon— 30×30, SVG or bitmap (supply bitmaps at 90×90 px), inpublic/. SVGs need careful centering.
Plugin Modes
| Mode | Purpose | framer.mode value | |
|---|---|---|---|
canvas | General-purpose canvas access | "canvas" | |
configureManagedCollection | CMS: first-time setup / field config | "configureManagedCollection" | |
syncManagedCollection | CMS: re-sync existing collection | "syncManagedCollection" | |
image | User picks an image | "image" | |
editImage | Edit existing image | "editImage" | |
collection | Access user-editable collections | "collection" | |
code | Edit the currently open code file | "code" | |
localization | Edit the active locale | "localization" |
CMS plugins use both configureManagedCollection + syncManagedCollection. (The v4 d.ts Mode union also carries an undocumented api value — ignore it unless the docs pick it up.)
Core framer API
UI Management
closePluginthrowsFramerPluginClosedErrorinternally — always ignore in catch blocksshowUIshould be called inuseLayoutEffectto avoid flicker
Properties
framer.mode— current mode string
Collection Access
Canvas Methods (canvas mode)
addComponentInstance resolves to the created node — keep it; you need its id for selection-aware replace/geometry-copy flows. addImage/addSVG/addText resolve to void.
CMS / ManagedCollection (pointer)
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/framer-plugins/SKILL.md
Popularity
- Repository stars
- 125
- Repository forks
- 12
- 7-day trend score
- 24
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 23 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/fredm00n/framerlabs/framer-plugins)