[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74755":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":16,"starSnapshotCount":16,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},74755,"emdash","emdash-cms\u002Femdash","emdash-cms","EmDash is a full-stack TypeScript CMS based on Astro; the spiritual successor to WordPress","https:\u002F\u002Fdocs.emdashcms.com",null,"TypeScript",10780,974,67,112,0,27,79,351,81,118.97,"MIT License",false,"main",[26,27,5,28],"astro","cms","typescript","2026-06-12 04:01:15","# EmDash\n\nA full-stack TypeScript CMS built on [Astro](https:\u002F\u002Fastro.build\u002F) and [Cloudflare](https:\u002F\u002Fwww.cloudflare.com\u002F). EmDash takes the ideas that made WordPress dominant -- extensibility, admin UX, a plugin ecosystem -- and rebuilds them on serverless, type-safe foundations. Plugins run in sandboxed Worker isolates, solving the fundamental security problem with WordPress's plugin architecture.\n\n## Get Started\n\n> [!IMPORTANT]\n> EmDash depends on Dynamic Workers to run secure sandboxed plugins. Dynamic Workers are currently only available on paid accounts. [Upgrade your account](https:\u002F\u002Fwww.cloudflare.com\u002Fplans\u002Fdeveloper-platform\u002F) (starting at $5\u002Fmo) or comment out the `worker_loaders` block of your `wrangler.jsonc` configuration file to disable plugins.\n\n```bash\nnpm create emdash@latest\n```\n\nOr deploy directly to your Cloudflare account:\n\n[![Deploy to Cloudflare](https:\u002F\u002Fdeploy.workers.cloudflare.com\u002Fbutton)](https:\u002F\u002Fdeploy.workers.cloudflare.com\u002F?url=https:\u002F\u002Fgithub.com\u002Femdash-cms\u002Ftemplates\u002Ftree\u002Fmain\u002Fblog-cloudflare)\n\nEmDash runs on Cloudflare (D1 + R2 + Workers) or any Node.js server with SQLite. No PHP, no separate hosting tier -- just deploy your Astro site.\n\n## Templates\n\nEmDash ships with three starter templates:\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### Blog\n\n\u003Ca href=\"assets\u002Ftemplates\u002Fblog\u002Flatest\u002F\">\u003Cimg src=\"assets\u002Ftemplates\u002Fblog\u002Flatest\u002Fhomepage-light-desktop.jpg\" alt=\"Blog template\" width=\"100%\">\u003C\u002Fa>\n\nA classic blog with sidebar widgets, search, and RSS.\n\n- Categories & tags\n- Full-text search\n- Comment-ready\n- RSS feed\n- Dark \u002F light mode\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### Marketing\n\n\u003Ca href=\"assets\u002Ftemplates\u002Fmarketing\u002Flatest\u002F\">\u003Cimg src=\"assets\u002Ftemplates\u002Fmarketing\u002Flatest\u002Fhomepage-light-desktop.jpg\" alt=\"Marketing template\" width=\"100%\">\u003C\u002Fa>\n\nA conversion-focused landing page with pricing and contact form.\n\n- Hero with CTAs\n- Feature grid\n- Pricing cards\n- FAQ and contact form\n- Dark \u002F light mode\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### Portfolio\n\n\u003Ca href=\"assets\u002Ftemplates\u002Fportfolio\u002Flatest\u002F\">\u003Cimg src=\"assets\u002Ftemplates\u002Fportfolio\u002Flatest\u002Fwork-light-desktop.jpg\" alt=\"Portfolio template\" width=\"100%\">\u003C\u002Fa>\n\nA visual portfolio for showcasing creative work.\n\n- Project grid\n- Tag filtering\n- Case study pages\n- RSS feed\n- Dark \u002F light mode\n\u003Cbr \u002F>\u003Cbr \u002F>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## Why EmDash?\n\n**WordPress was built for a different era.** Running WordPress today means managing PHP alongside JavaScript, layering caches to get acceptable performance, and knowing that [96% of WordPress security vulnerabilities come from plugins](https:\u002F\u002Fpatchstack.com\u002Fwhitepaper\u002Fstate-of-wordpress-security-in-2024\u002F). EmDash is what WordPress would look like if you started from scratch with today's tools.\n\n**Sandboxed plugins.** WordPress plugins have full access to the database, filesystem, and user data. A single vulnerable plugin can compromise the entire site. EmDash plugins run in isolated [Worker sandboxes](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fruntime-apis\u002Fbindings\u002Fworker-loader\u002F) via Dynamic Worker Loaders, each with a declared capability manifest. A plugin that requests `read:content` and `email:send` can do exactly that and nothing else.\n\n```typescript\nexport default () =>\n\tdefinePlugin({\n\t\tid: \"notify-on-publish\",\n\t\tcapabilities: [\"read:content\", \"email:send\"],\n\t\thooks: {\n\t\t\t\"content:afterSave\": async (event, ctx) => {\n\t\t\t\tif (event.content.status !== \"published\") return;\n\t\t\t\tawait ctx.email.send({\n\t\t\t\t\tto: \"editors@example.com\",\n\t\t\t\t\tsubject: `New post: ${event.content.title}`,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n```\n\n**Structured content, not serialized HTML.** WordPress stores rich text as HTML with metadata embedded in comments -- tying your content to its DOM representation. EmDash uses [Portable Text](https:\u002F\u002Fwww.portabletext.org\u002F), a structured JSON format that decouples content from presentation. Your content can render as a web page, a mobile app, an email, or an API response without parsing HTML.\n\n**Built for agents.** EmDash ships with agent skills for building plugins and themes, a CLI that lets agents manage content and schema programmatically, and a built-in [MCP server](https:\u002F\u002Fmodelcontextprotocol.io\u002F) so AI tools like Claude and ChatGPT can interact with your site directly.\n\n**Runs anywhere.** EmDash uses portable abstractions at every layer -- Kysely for SQL, S3 API for storage -- that work with SQLite, D1, Turso, PostgreSQL, R2, AWS S3, or local files. It runs best on Cloudflare, but it's not locked to it.\n\n## How It Works\n\nEmDash is an Astro integration. Add it to your config and you get a complete CMS: admin panel, REST API, authentication, media library, and plugin system.\n\n```typescript\n\u002F\u002F astro.config.mjs\nimport emdash from \"emdash\u002Fastro\";\nimport { d1 } from \"emdash\u002Fdb\";\n\nexport default defineConfig({\n\tintegrations: [emdash({ database: d1() })],\n});\n```\n\nContent types are defined in the database, not in code. Non-developers create and modify collections through the admin UI. Each collection gets a real SQL table with typed columns. Developers generate TypeScript types from the live schema:\n\n```bash\nnpx emdash types\n```\n\nQuery content using Astro's Live Collections -- no rebuilds, no separate API:\n\n```astro\n---\nimport { getEmDashCollection } from \"emdash\";\nconst { entries: posts } = await getEmDashCollection(\"posts\");\n---\n\n{posts.map((post) => \u003Carticle>{post.data.title}\u003C\u002Farticle>)}\n```\n\n## Features\n\n**Content** -- Blog posts, pages, custom content types. Rich text editing via TipTap with Portable Text storage. Revisions, drafts, scheduled publishing, full-text search (FTS5), inline visual editing.\n\n**Admin** -- Full admin panel with visual schema builder, media library (drag-drop uploads via signed URLs), navigation menus, taxonomies, widgets, and a WordPress import wizard.\n\n**Auth** -- Passkey-first (WebAuthn) with OAuth and magic link fallbacks. Role-based access control: Administrator, Editor, Author, Contributor.\n\n**Plugins** -- `definePlugin()` API with lifecycle hooks, KV storage, settings, admin pages, dashboard widgets, custom block types, and API routes. Sandboxed execution on Cloudflare via Dynamic Worker Loaders.\n\n**Agents** -- Skill files for AI-assisted plugin and theme development. CLI for programmatic site management. Built-in MCP server for direct AI tool integration.\n\n**WordPress migration** -- Import posts, pages, media, and taxonomies from WXR exports, the WordPress REST API, or WordPress.com. Agent skills help port plugins and themes.\n\n## Portable Platforms\n\n| Layer    | Cloudflare                  | Also works with                                     |\n| -------- | --------------------------- | --------------------------------------------------- |\n| Database | D1                          | SQLite, Turso\u002FlibSQL, PostgreSQL                    |\n| Storage  | R2                          | AWS S3, any S3-compatible service, local filesystem |\n| Sessions | KV                          | Redis, file-based                                   |\n| Plugins  | Worker isolates (sandboxed) | In-process (safe mode)                              |\n\n## Status\n\nEmDash is in **beta preview**. We welcome contributions, feedback, plugins, themes, and ideas.\n\n```bash\nnpm create emdash@latest\n```\n\nSee the [documentation](https:\u002F\u002Fdocs.emdashcms.com\u002F) for guides, API reference, and plugin development.\n\n## Development\n\nThis is a pnpm monorepo. To contribute:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Femdash-cms\u002Femdash.git && cd emdash\npnpm install\npnpm build\n```\n\nRun the demo (Node.js + SQLite, no Cloudflare account needed):\n\n```bash\npnpm --filter emdash-demo seed\npnpm --filter emdash-demo dev\n```\n\nOpen the admin at [http:\u002F\u002Flocalhost:4321\u002F\\_emdash\u002Fadmin](http:\u002F\u002Flocalhost:4321\u002F_emdash\u002Fadmin).\n\n```bash\npnpm test          # run all tests\npnpm typecheck     # type check\npnpm lint:quick    # fast lint (\u003C 1s)\npnpm format        # format with oxfmt\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full contributor guide.\n\n## Repository Structure\n\n```\npackages\u002F\n  core\u002F           Astro integration, APIs, admin UI, CLI\n  auth\u002F           Authentication library\n  blocks\u002F         Portable Text block definitions\n  cloudflare\u002F     Cloudflare adapter (D1, R2, Worker Loader)\n  plugins\u002F        First-party plugins (forms, embeds, SEO, audit-log, etc.)\n  create-emdash\u002F  npm create emdash scaffolding\n  gutenberg-to-portable-text\u002F  WordPress block converter\n\ntemplates\u002F        Starter templates (blog, marketing, portfolio, starter, blank)\ndemos\u002F            Development and example sites\ndocs\u002F             Documentation site (Starlight)\n```\n","EmDash 是一个基于 Astro 构建的全栈 TypeScript 内容管理系统，旨在成为 WordPress 的精神继承者。它通过无服务器和类型安全的基础架构实现了扩展性、管理界面友好及插件生态系统等特性，尤其通过在隔离的 Worker 环境中运行插件解决了WordPress插件架构中的根本安全问题。该项目适合需要快速搭建博客、营销网站或个人作品集展示页面且对安全性有较高要求的场景使用，支持直接部署到 Cloudflare 或任何带有 SQLite 的 Node.js 服务器上运行。",2,"2026-06-11 03:50:39","high_star"]