creating-plugins

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

Updated Aug 14, 2026
One-click install
npx skills add https://github.com/tatran0195/emdash-with-docs --skill creating-plugins-tatran0195
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: creating-plugins
Source: https://github.com/tatran0195/emdash-with-docs/tree/main/templates/blank/.agents/skills/creating-plugins
Command: npx skills add https://github.com/tatran0195/emdash-with-docs --skill creating-plugins-tatran0195

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 the split between build-time descriptors and runtime definitions. This Skill provides the complete structure and reference documentation needed to scaffold and implement a working EmDash plugin correctly. ## Core Features & Use Cases - Plugin Scaffolding: Generate the descriptor factory, sandbox entrypoint, package.json exports, and tsconfig for standard or native plugin formats. - Feature Implementation: Add hooks, storage collections, KV state, API routes, Block Kit admin pages, settings schemas, and Portable Text block types with correct signatures. - Marketplace Publishing: Bundle and publish standard plugins with capability declarations, allowed hosts, and validation-compliant tarballs. - 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 called 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. Configure package.json exports for "." and "./sandbox", then register the descriptor in astro.config.mjs.

What is the difference between standard and native EmDash plugins?▼

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

Can EmDash plugins run sandboxed on Node.js?▼

No. Sandboxed execution uses Cloudflare's Dynamic Worker Loader with isolated V8 isolates and is only available on Cloudflare Workers. On Node.js platforms, all plugins run in trusted mode in the main process.

How do EmDash plugin capabilities work?▼

Capabilities are declared in the plugin descriptor and control which APIs appear on the plugin context, such as content:read, network:request, or email:send. In sandboxed mode they are enforced at runtime via an RPC bridge; in trusted mode they serve as documentation only.

Why can't sandboxed EmDash plugins use Portable Text blocks?▼

Portable Text blocks require Astro components for site-side rendering, which are loaded at build time from an npm package. Sandboxed plugins are installed at runtime and cannot ship components, so PT blocks are a native-plugin-only feature.

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. The bundle is validated for size, Node.js built-ins, and sandbox compatibility, and each published version receives an automated security audit.