Install Anti-Slop Oxlint Rules
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
Framer Plugin SDK expert. An agent skill from fredm00n/framerlabs.
$ npx skills add fredm00n/framerlabs --skill framer-plugins -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install fredm00n/framerlabs framer-plugins --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/fredm00n/framerlabs.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/framer-plugins .claude/skills/framer-plugins && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "framer-plugins" agent skill from https://github.com/fredm00n/framerlabs/tree/main/skills/framer-plugins into .claude/skills/framer-plugins/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "framer-plugins", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/fredm00n/framerlabs/tree/main/skills/framer-pluginsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add fredm00n/framerlabs --skill framer-plugins -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install fredm00n/framerlabs framer-plugins --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fredm00n/framerlabs.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/framer-plugins .agents/skills/framer-plugins && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "framer-plugins" agent skill from https://github.com/fredm00n/framerlabs/tree/main/skills/framer-plugins into .agents/skills/framer-plugins/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "framer-plugins", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add fredm00n/framerlabs --skill framer-plugins -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install fredm00n/framerlabs framer-plugins --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fredm00n/framerlabs.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/framer-plugins .cursor/skills/framer-plugins && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "framer-plugins" agent skill from https://github.com/fredm00n/framerlabs/tree/main/skills/framer-plugins into .cursor/skills/framer-plugins/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "framer-plugins", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/fredm00n/framerlabs.git --path skills/framer-plugins--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add fredm00n/framerlabs --skill framer-plugins -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install fredm00n/framerlabs framer-plugins --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fredm00n/framerlabs.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/framer-plugins .gemini/skills/framer-plugins && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "framer-plugins" agent skill from https://github.com/fredm00n/framerlabs/tree/main/skills/framer-plugins into .gemini/skills/framer-plugins/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "framer-plugins", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install fredm00n/framerlabs framer-pluginsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add fredm00n/framerlabs --skill framer-plugins -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/fredm00n/framerlabs.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/framer-plugins .github/skills/framer-plugins && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "framer-plugins" agent skill from https://github.com/fredm00n/framerlabs/tree/main/skills/framer-plugins into .github/skills/framer-plugins/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "framer-plugins", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add fredm00n/framerlabs --skill framer-plugins -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install fredm00n/framerlabs framer-plugins --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fredm00n/framerlabs.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/framer-plugins .opencode/skills/framer-plugins && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "framer-plugins" agent skill from https://github.com/fredm00n/framerlabs/tree/main/skills/framer-plugins into .opencode/skills/framer-plugins/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "framer-plugins", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
framer-pluginsFramer Plugin SDK expert. An agent skill from fredm00n/framerlabs.
Framer Plugins is an agent skill from fredm00n/framerlabs. 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.
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/api-reference.md`, `references/cms-managed-collections.md` and `references/marketplace.md`).
It sits in Development. It works with npm. The repository describes itself as: For experienced Framer creators looking to push the boundaries. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 3f51e5c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
framer.comesm.shFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
PD_LICENSE_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Framer Plugins loads about 4.8k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 67 tokens; SKILL.md has 1,760 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from fredm00n/framerlabs at commit 3f51e5c, republished under its MIT licence (© fredm00n). 1,760 words, ~4,773 tokens.
.claude/skills/framer-plugins/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.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.
@framer/plugin (v4+, the Framer 3.0 release). Renamed from framer-plugin, which is now deprecated on npm — never use the old name.npm create framer-plugin@latest (the create-framer-plugin scaffolder keeps its name and installs @framer/plugin)vite-plugin-framer (name unchanged; framer-plugin-tools pack CLI also unchanged)import "@framer/plugin/framer.css" (optional: import "@framer/plugin/inter.css" to load Inter alone)import { framer } from "@framer/plugin"npm run dev → Framer → Developer Tools → Development Pluginv4.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) and framer.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.framer.createManagedCollection() (3.10.2); framer.setCloseWarning() (3.10.3). framer.getManagedCollection() is deprecated → use getActiveManagedCollection() (the deprecation is in the d.ts; the CMS docs page still shows the old call in examples).npm create framer-plugin@latest → scaffolds Vite + React + framer.json + a sample App.configureManagedCollection + syncManagedCollection; asset/insert plugins use canvas (or image/editImage).import "@framer/plugin/framer.css" and call framer.showUI(...) in a useLayoutEffect.localStorage for per-user secrets, pluginData for shared state (see the decision tree below).Cloning an existing plugin to start a new one? Change
framer.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.
Every plugin needs a framer.json at the project root:
{
"id": "6bbb4f",
"name": "My Plugin",
"modes": ["configureManagedCollection", "syncManagedCollection"],
"icon": "/icon.svg"
}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), in public/. SVGs need careful centering.| 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.)
framer.showUI({ position?, width, height, minWidth?, minHeight?, maxWidth?, resizable? })
framer.hideUI()
framer.closePlugin(message?, { variant: "success" | "error" | "info" }) // returns never
framer.notify(message, { variant?, durationMs?, button?: { text, onClick } })
framer.setCloseWarning(message | false) // warn before closing during sync
framer.setBackgroundMessage(message) // status while plugin runs hidden
framer.setMenu([{ label, onAction, visible? }, { type: "separator" }])
framer.showContextMenu(items, { location }) // context menu inside the plugin UI (3.0)
framer.navigateTo(nodeId, { select?, zoom? }) // select + zoom a node into view (3.0; not gated)
framer.subscribeToOpenCodeFile(callback) // fires on code-file open/switch (3.0)closePlugin throws FramerPluginClosedError internally — always ignore in catch blocksshowUI should be called in useLayoutEffect to avoid flickerframer.mode — current mode stringframer.getActiveManagedCollection() // → Promise<ManagedCollection>
framer.getActiveCollection() // → Promise<Collection> (unmanaged)
framer.getManagedCollections() // → Promise<ManagedCollection[]>
framer.getCollections() // → Promise<Collection[]>
framer.createManagedCollection() // → Promise<ManagedCollection>framer.addImage(image) // NamedImageAssetInput | File → Promise<void>
framer.setImage(image) // sets on the current selection
framer.getImage()
framer.addText(text, options?)
framer.addSVG(svg) // SVGData; max 10kB
framer.addComponentInstance({ url, attributes?, parentId? }) // → Promise<ComponentInstanceNode>
framer.addDetachedComponentLayers({ url, layout, attributes? }) // → Promise<FrameNode> (inlines the layers)
framer.getSelection()
framer.subscribeToSelection(callback)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 plugins are their own world — the full surface (ManagedCollection API, field types, the silent-sync algorithm, user-editable fields, slug generation, field-data type wrappers, CMS pitfalls) lives in cms-managed-collections.md. Read it when the plugin syncs an external data source into a Framer collection; skip it otherwise.
Two things to carry even if you never open that file:
ManagedCollection.addItems() is an upsert (matched by id) — and there is no getItems(), only getItemIds().fieldData value needs an explicit type wrapper: { type: "string", value: "..." }. Raw values are silently ignored.import { framer, useIsAllowedTo, type ProtectedMethod } from "@framer/plugin"
// Imperative check
framer.isAllowedTo("ManagedCollection.addItems", "ManagedCollection.removeItems")
// React hook (reactive)
const canSync = useIsAllowedTo("ManagedCollection.addItems", "ManagedCollection.removeItems")
// Standard CMS sync permissions
const SYNC_METHODS = [
"ManagedCollection.setFields",
"ManagedCollection.addItems",
"ManagedCollection.removeItems",
"ManagedCollection.setPluginData",
] as const satisfies ProtectedMethod[]Only mutating methods are permission-gated. Reads — getItemIds, getPluginData, getActiveManagedCollection, getFields — have empty arrays in the SDK ProtectedMethod table, so isAllowedTo() on them always returns true. Gate writes; wrap reads in try/catch for robustness instead of adding no-op read guards. (The docs' own phrasing: unprotected methods "mostly start with get, but not all" — when unsure, let TypeScript decide: if a name isn't accepted as a ProtectedMethod, it needs no gate.)
Marketplace-reviewer contract (verdict-tested 2026-07): the automated review wants, at EVERY protected call site, all three of: an explicit framer.isAllowedTo() check adjacent to the call (a reactive useIsAllowedTo early-return far upstream does not count on its own), try/catch around the call with clear user-facing failure copy (no silent no-ops), and UI disabled via useIsAllowedTo while the permission is missing. Ungated protected calls in dead/parked code get flagged too — delete them. Detail: marketplace.md.
| Need | Use | Why |
|---|---|---|
| API keys, auth tokens | localStorage | Per-user, no size warnings, not shared |
| User preferences | localStorage | Per-user, synchronous |
| Data source ID, last sync time | collection.setPluginData() | Shared across collaborators, tied to collection |
| Project-level config | framer.setPluginData() | Shared, but 4kB total limit |
| Large / growing state (per-item sync maps, caches) | localStorage | pluginData's 2kB/entry cap blows up as the map grows; localStorage holds ~MBs |
| License / entitlement state | Your backend, keyed on framer.getCurrentUser().id | The user id (64-char hex) is stable per account across projects/devices; nothing client-side to leak, share, or carry into a project remix. Strongest option for paid plugins — see pitfalls.md |
pluginData: 2kB per entry, 4kB total. Strings only. Pass null to delete.pluginData is for small, bounded values. Anything that grows with content count (per-item delta-sync state, caches) will exceed 2kB/entry — keep it in localStorage and treat it as a rebuildable optimization, not shared truth (per-user, so collaborators rebuild it on first use).pluginData is namespaced per plugin — other plugins (and external agent tooling) cannot read or write your keys.localStorage: Sandboxed per-plugin origin, persists across all projects, but per-browser/device — soft friction only, never enforcement.setPluginData() (and other protected methods) surface an "Invoking protected message type" toast when called without a prior framer.isAllowedTo() check. It's the permission system, not a bug — gate the call and the toast disappears.pluginData is copied verbatim when a project is remixed — license keys and credentials carry into the new project and look valid. Detect the remix and clear stale credentials on load:
const { id: currentProjectId } = await framer.getProjectInfo()
if (storedProjectId !== currentProjectId) {
// Remixed → wipe credentials so the new owner does a fresh activation
if (framer.isAllowedTo("setPluginData")) {
await framer.setPluginData(PD_LICENSE_KEY, null)
// ... clear any other project-bound keys
}
setLicenseActive(false)
}Store the project ID at activation, compare every load; skip the clear silently if isAllowedTo is false (it retries next load). Full pattern + provider notes in pitfalls.md.
Verified against @framer/plugin v4 in a production canvas plugin (2026-06):
framer.createCodeFile(name, code, { editViaPlugin?: boolean })
// editViaPlugin: true → the file's "Edit Code" action opens this plugin instead of the editor
framer.getCodeFiles() // → Promise<CodeFile[]>
codeFile.setFileContent(code) // new version; UPDATES already-inserted canvas instances in place
codeFile.typecheck() // TS diagnostics without leaving the plugin
codeFile.exports // [{ name, componentId, insertURL, type }]
framer.addComponentInstance({ url }) // accepts insertURL or any module URL
instance.setAttributes({ controls }) // rewrites property-control values in place, repeatablecomponentIdentifier, never insertURL. The identifier is stable across regenerations: local-module:codeFile/{fileId}:{exportName}. insertURL is version-pinned (…/Name-hash.js@{versionId}) and changes on every setFileContent../Engine.tsx) or by absolute module URL — the build pipeline keeps URL imports live.https://framer.com/m/{Name}-{hash}.js[@version] — no auth, even from private projects. Unpinned URLs track the latest save instantly (no publish step); pinned URLs are immutable and survive file deletion.addComponentInstance({ url }) with another project's module URL works: the identifier becomes module:{moduleId}/{version}/{Name}.js:{export} (match on the module:{moduleId}/ prefix), no code file appears in the consumer project, and source updates surface as a manual "Update" button on the instance.@framerDisableUnlink (comment annotation above the component) blocks Edit Code/unlink on shared/hosted components. It cannot hide a local code file — those are always visible and editable in Assets > Code.react, react-dom, framer, framer-motion; version-suffixed specifiers (react@18) are rejected. Everything else enters via URL imports — pin them (e.g. https://esm.sh/<pkg>@<version>?external=react,react-dom, externalizing react so Framer's runtime supplies its own). The URL is kept verbatim in the compiled module, so version-pinned insertURLs freeze their dependency tree forever. Silent-failure signature: a code file whose exports stays [] while typecheck passes has an unsupported import — the build fails without an error surface.@framerIntrinsic width/height on cross-project inserts (verified 2026-07): addComponentInstance({ url }) honors the annotation for only a subset of hosted modules, even with identical compiled metadata. If the inserted size matters, set it explicitly after insert: node.setAttributes({ width: "600px", height: "400px" }).import { framer, useIsAllowedTo, FramerPluginClosedError } from "@framer/plugin"
import type {
ManagedCollection, ManagedCollectionField, ManagedCollectionFieldInput,
ManagedCollectionItemInput, FieldDataInput, FieldDataEntryInput,
ProtectedMethod, Collection, CollectionItem
} from "@framer/plugin"
import "@framer/plugin/framer.css"For deeper information, see the companion files in this skill directory:
Always
CLAUDE.md for project-specific overrides and decisions."@framer/plugin/framer.css" for native styling.<div role="button"> instead of <button> to avoid Framer's CSS overrides.FramerPluginClosedError in catch blocks — ignore it silently.showUI in useLayoutEffect to avoid resize flicker.framer.isAllowedTo() (synchronous, returns boolean) ADJACENT to every protected (mutating) call, wrap the call in try/catch with user-facing failure copy, and disable the triggering UI via useIsAllowedTo — the marketplace reviewer checks all three per call site. Reads aren't gated, so don't add no-op guards on them. Ship original sources + sourcemaps in the zip (see marketplace.md).localStorage for per-user secrets, pluginData for shared state — and clear credentials on project-remix mismatch (see Licensed plugins above).Canvas / code-file plugins
9. Match canvas instances by componentIdentifier, never insertURL (version-pinned, changes on every file save).
10. Generated/managed code files should pass { editViaPlugin: true } so "Edit Code" routes users back to the plugin.
11. Don't render an in-UI titlebar — Framer's window chrome already shows the plugin name + close; a 1px border-top is enough separation.
12. When cloning a plugin repo, give framer.json a fresh id (duplicate ids share state).
CMS plugins — see cms-managed-collections.md for detail:
13. Attempt silent sync in syncManagedCollection mode before showing UI.
14. addItems() is upsert; fieldData values need explicit { type, value }; never remove-all + re-add; never include userEditable fields in fieldData.
© fredm00n, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in skills/framer-plugins of fredm00n/framerlabs.
Open the folder on GitHubat commit 3f51e5c
Framer Plugins next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Framer Plugins this skillfredm00n/framerlabs | 135 | — | ~4.8k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Nx Run Tasksnomcopter/react-mosaic | 4.8k | 8 repos | ~613 | Automated safety check: Pass | Custom licence | |
| Get API Docs with chubandrewyng/context-hub | 14k | 2 repos | ~775 | Automated safety check: Pass | MIT | |
| Migrate Internal Package into GhostTryGhost/Ghost | 55k | — | ~3.8k | Automated safety check: Pass | MIT | |
| Open Code Review CLIalibaba/open-code-review | 44k | — | ~3.1k | Automated safety check: Pass | Apache-2.0 |
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
nomcopter/react-mosaic
Helps with running tasks in an Nx workspace. An agent skill from nomcopter/react-mosaic.
andrewyng/context-hub
Fetches current documentation for third-party APIs and SDKs with the chub CLI before the agent writes code against them, instead of relying on remembered API shapes.
TryGhost/Ghost
Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.
alibaba/open-code-review
Runs the ocr command-line tool to review Git changes, a commit or a branch comparison with an AI model, returning line-level comments and optionally applying fixes.
TriliumNext/Trilium
A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.
fredm00n/framerlabs
Create Framer Code Components and Code Overrides. An agent skill from fredm00n/framerlabs.
Works with
Categories
Framer Plugin SDK expert. An agent skill from fredm00n/framerlabs. Framer Plugins is an agent skill from fredm00n/framerlabs. Framer Plugin SDK expert.
Framer Plugins fits situations like: modifying Framer plugins.
Run `npx skills add fredm00n/framerlabs --skill framer-plugins -a claude-code`. Or copy the skill folder (skills/framer-plugins in fredm00n/framerlabs) into .claude/skills/framer-plugins in your project. Claude Code loads it when a task matches its description.
Run `npx skills add fredm00n/framerlabs --skill framer-plugins -a codex`. Or copy the skill folder (skills/framer-plugins in fredm00n/framerlabs) into .agents/skills/framer-plugins in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add fredm00n/framerlabs --skill framer-plugins -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/framer-plugins, .gemini/skills/framer-plugins, .github/skills/framer-plugins and .opencode/skills/framer-plugins in your project.
Going by SKILL.md and its folder, Framer Plugins needs the command-line tools its instructions call (npm) and credentials named PD_LICENSE_KEY.
SKILL.md names 2 domains. In commands or code: framer.com and esm.sh; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Framer Plugins is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 15k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Framer Plugins: Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars), Nx Run Tasks (nomcopter/react-mosaic, 4.8k stars), Get API Docs with chub (andrewyng/context-hub, 14k stars) and Migrate Internal Package into Ghost (TryGhost/Ghost, 55k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
fredm00n (a GitHub user) maintains it in fredm00n/framerlabs, which has 135 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on July 13, 2026.
Source: fredm00n/framerlabs on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.