
Emdash Cms
Scaffold or extend an Astro site with EmDash for typed content collections, Portable Text, plugins, and Cloudflare D1/R2 or Node SQLite hosting.
Overview
EmDash CMS is an agent skill for the Build phase that guides installing and extending EmDash—a TypeScript Astro CMS with Portable Text, sandboxed plugins, and Cloudflare or SQLite backends.
Install
npx skills add https://github.com/aradotso/trending-skills --skill emdash-cmsWhat is this skill?
- Scaffold via npm create emdash@latest with blog, marketing, portfolio, starter, blank, and Cloudflare vs Node/SQLite tar
- Full-stack TypeScript CMS on Astro with Portable Text (structured JSON) instead of stored HTML
- Plugin system executed in sandboxed Worker isolates rather than full filesystem/database access
- Passkey-first authentication and one-click or CLI Cloudflare deploy paths
- Triggers cover WordPress migration, D1 configuration, collection queries, and adding EmDash to existing Astro projects
- Five scaffold templates: blog, marketing, portfolio, starter, blank
- Two platform targets: Cloudflare (D1 + R2 + Workers) or Node.js with SQLite
Adoption & trust: 621 installs on skills.sh; 31 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want a extensible CMS on Astro and Cloudflare but do not have a repeatable agent playbook for content types, D1, plugins, auth, and migration from WordPress.
Who is it for?
Indie builders shipping Astro marketing sites, blogs, or portfolios who prefer edge hosting on Cloudflare D1/R2 or a simple SQLite Node deployment.
Skip if: Teams that need a hosted SaaS CMS with zero infra, or apps with no content-management layer where a static site generator alone is enough.
When should I use this skill?
set up EmDash CMS; add EmDash to my Astro site; create a content type in EmDash; build an EmDash plugin; query EmDash content collections; migrate from WordPress to EmDash; configure EmDash with Cloudflare D1; add authen
What do I get? / Deliverables
After the skill runs, your project has EmDash configured with the right template or add-on install path, content collections aligned to your site, and a clear next step to deploy or extend plugins on Workers or Node.
- Configured astro.config.mjs with EmDash integration
- Content types/collections and deployment-ready Cloudflare or SQLite backend setup
Recommended Skills
Journey fit
EmDash setup, content modeling, and deployment land in the build phase when you wire the product’s content layer and hosting. Integrations is the canonical shelf because the skill centers on installing EmDash, Astro config, Cloudflare Workers/D1, auth, and CMS plugins—not pure UI polish.
How it compares
Use instead of bolting WordPress or a generic headless CMS API when you want Astro-native collections and Worker-sandboxed plugins in one stack.
Common Questions / FAQ
Who is emdash-cms for?
Solo and indie developers building Astro sites who need structured content, Portable Text, plugins, and Cloudflare or Node deployment without figuring out EmDash docs from scratch.
When should I use emdash-cms?
During Build when you set up EmDash, add it to an existing Astro site, create content types, query collections, build plugins, migrate from WordPress, configure D1, or add passkey auth—typically before launch content goes live.
Is emdash-cms safe to install?
Treat it like any third-party skill: review the Security Audits panel on this Prism page and inspect SKILL.md before granting network, deploy, or Cloudflare credentials to your agent.
SKILL.md
READMESKILL.md - Emdash Cms
# EmDash CMS > Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection. EmDash is a full-stack TypeScript CMS built on Astro and Cloudflare. It is the spiritual successor to WordPress: extensible, developer-friendly, and powered by a plugin system that runs plugins in sandboxed Worker isolates rather than with full filesystem/database access. EmDash stores rich text as Portable Text (structured JSON) rather than HTML, supports passkey-first auth, and runs on Cloudflare (D1 + R2 + Workers) or any Node.js server with SQLite. --- ## Installation ### Scaffold a new project ```bash npm create emdash@latest ``` Follow the prompts to choose a template (blog, marketing, portfolio, starter, blank) and a platform (Cloudflare or Node.js/SQLite). ### Deploy to Cloudflare directly Use the one-click deploy button from the README, or: ```bash npm create emdash@latest -- --template blog-cloudflare cd my-site npm run deploy ``` ### Add EmDash to an existing Astro project ```bash npm install emdash ``` ```typescript // astro.config.mjs import { defineConfig } from "astro/config"; import emdash from "emdash/astro"; import { d1 } from "emdash/db"; export default defineConfig({ integrations: [ emdash({ database: d1(), // Cloudflare D1 }), ], }); ``` For Node.js + SQLite (no Cloudflare account needed): ```typescript // astro.config.mjs import { defineConfig } from "astro/config"; import emdash from "emdash/astro"; import { sqlite } from "emdash/db"; export default defineConfig({ integrations: [ emdash({ database: sqlite({ path: "./content.db" }), }), ], }); ``` --- ## Key CLI Commands ```bash # Scaffold a new EmDash project npm create emdash@latest # Generate TypeScript types from your live schema npx emdash types # Seed the demo site with sample content npx emdash seed # Run database migrations npx emdash migrate # Start the dev server (standard Astro command) npx astro dev # Build for production npx astro build # Open admin panel (after dev server starts) open http://localhost:4321/_emdash/admin ``` ### Monorepo / contributor commands ```bash pnpm install pnpm build pnpm test # run all tests pnpm typecheck # TypeScript check pnpm lint:quick # fast lint (< 1s) pnpm format # format with oxfmt # Run the demo (Node.js + SQLite, no Cloudflare needed) pnpm --filter emdash-demo seed pnpm --filter emdash-demo dev ``` --- ## Configuration ### Cloudflare (D1 + R2 + KV + Worker Loaders) ```jsonc // wrangler.jsonc { "name": "my-emdash-site", "compatibility_date": "2025-01-01", "d1_databases": [ { "binding": "DB", "database_name": "emdash-content", "database_id": "$DATABASE_ID" } ], "r2_buckets": [ { "binding": "MEDIA", "bucket_name": "emdash-media" } ], "kv_namespaces": [ { "binding": "SESSIONS", "id": "$KV_NAMESPACE_ID" } ], // Remove this block to disable sandboxed plugins (free accounts) "worker_loaders": [ { "binding": "PLUGIN_LOADER" } ] } ``` ```typescript // astro.config.mjs import emdash from "emdash/astro"; import { d1 } from "emdash/db"; import { r2 } from "emdash/storage"; import { kv } from "emdash/sessions"; export default defineConfig({ integrations: [ emdash({ database: d1({ binding: "DB" }), storage: r2({ binding: "MEDIA" }), sessions: kv({ binding: "SESSIONS" }), }), ], }); ``` ### Node.js + SQLite ```typescript // astro.config.mjs import emdash from "emdash/astro"; import { sqlite } from