creating-plugins

Create EmDash CMS plugins with hooks, storage, routes, and admin UI.

Updated Sep 8, 2026
One-click install
npx skills add https://github.com/Thigh-Food/emdash --skill creating-plugins-thigh-food
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: creating-plugins
Source: https://github.com/Thigh-Food/emdash/tree/main/templates/marketing-cloudflare/.agents/skills/creating-plugins
Command: npx skills add https://github.com/Thigh-Food/emdash --skill creating-plugins-thigh-food

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Building extensions for the EmDash CMS requires understanding its two plugin formats, capability system, sandboxed execution model, and split build-time/runtime architecture, which is difficult to get right without guidance. ## Core Features & Use Cases - Plugin Scaffolding: Generate standard or native plugin packages with the correct descriptor factory, sandbox entrypoint, and package.json exports. - Feature Implementation: Add hooks, storage collections, KV state, API routes, Block Kit admin pages, and Portable Text block types with correct capability declarations. - Marketplace Publishing: Bundle, validate, and publish sandboxed plugins to the EmDash Marketplace. - Use Case: Build a form-submissions plugin that exposes a public API route, stores entries in an indexed collection, and renders a Block Kit admin table page. ## Quick Start Create an EmDash plugin named submissions with a public submit route, an indexed storage collection, and a Block Kit admin page listing recent entries.

Frequently Asked Questions about creating-plugins

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I create an EmDash CMS plugin?

Create a TypeScript package with a descriptor factory in src/index.ts returning a PluginDescriptor, and a default definePlugin() export in src/sandbox-entry.ts containing hooks and routes. Register the descriptor in astro.config.mjs under plugins or sandboxed.

What is the difference between standard and native EmDash plugins?

Standard plugins use definePlugin() with hooks and routes, run in trusted or sandboxed mode, and can be published to the marketplace. Native plugins support React admin components and Portable Text blocks but only run in trusted mode and cannot be sandboxed.

Can sandboxed EmDash plugins use React admin components?

No. Sandboxed plugins must use Block Kit, a declarative JSON UI rendered by the host, so no plugin JavaScript runs in the browser. React admin components and Portable Text block types are native-plugin-only features.

How do EmDash plugin capabilities work?

Capabilities like content:read or network:request are declared in the plugin descriptor and control which ctx APIs are available. In sandboxed mode they are enforced at runtime via an RPC bridge; in trusted mode they serve as documentation only.

Why does my sandboxed EmDash plugin fail when calling fetch?

Sandboxed plugins block direct network access and Node.js built-ins. Use ctx.http.fetch() with the network:request capability and declare allowedHosts in the descriptor, replacing any fs or path usage with Web APIs.

How do I publish an EmDash plugin to the marketplace?

Run emdash plugin bundle to create a .tar.gz tarball, authenticate with emdash plugin login via GitHub, then run emdash plugin publish. Bundles are validated for size, Node.js built-ins, and pass an automated security audit.