EmDash:致敬 Wordpress,挑战 Wordpress
Emdash 是一个基于Astro 和 Cloudflare 创建的全栈 Typescript CMS。Emdash 借鉴了 WordPress 的优点--可扩展性、管理后台用户体验、插件生态,并且基于无服务和类型安全对他们进行了重构。插件在沙盒的 Worker 中隔离运行,解决 WordPress 插件架构的基本安全问题。

开始
注意
EmDash 依赖于动态 Worker 来运行安全沙盒插件。动态 Worker 目前只对付费账户可用。请升级你的账号(5美金起)或者注释掉
wrangler.jsonc 配置文件的worker_loaders块,以禁用插件。
npm create emdash@latest或者直接部署到你的 Cloudflare 账号:
EmDash 在 Cloudflare (D1 + R2 + Workers) 或者任何 Node.js 服务器上与 SQLite 一起运行。无需,无需单独的主机层 – 只需部署 Astro 站点。
模板
EmDash 附带了三个入门模板:
博客经典的博客使用侧边栏widget、搜索 和 RSS。
| 营销以转化率为导向的落地页,包含价格信息和联系表单。
| 作品集用于展示创意作品的视觉作品集。
|
为什么使用 EmDash?
WordPress 是为一个不同的时代而构建的。今天运行 WordPress 意味着管理 PHP 和 JavaScript,分层缓存以获得可接受的性能,并知道 96% 的 WordPress 安全漏洞来自插件。EmDash 是 WordPress 的样子,如果你从头开始使用今天的工具。
沙箱化插件 WordPress 插件拥有对数据库、文件系统及用户数据的完全访问权限。仅凭一个存在漏洞的插件,便足以危及整个网站的安全。EmDash 插件通过“动态 Worker 加载器”(Dynamic Worker Loaders)运行于相互隔离的 Worker 沙箱之中,且每个插件均附带一份明确声明的权限清单。例如,一个仅申请了 read:content(读取内容)和 email:send(发送邮件)权限的插件,将只能执行这两项操作,而无法进行任何其他活动。
export default () =>
definePlugin({
id: "notify-on-publish",
capabilities: ["read:content", "email:send"],
hooks: {
"content:afterSave": async (event, ctx) => {
if (event.content.status !== "published") return;
await ctx.email.send({
to: "editors@example.com",
subject: `New post: ${event.content.title}`,
});
},
},
});结构化内容,而非序列化 HTML。WordPress 将富文本存储为 HTML,并将元数据嵌入在注释中——这使得您的内容与其 DOM 呈现形式紧密耦合。EmDash 采用 Portable Text,这是一种结构化的 JSON 格式,能够将内容与呈现形式彻底解耦。你的内容无需经过 HTML 解析,即可直接渲染为网页、移动应用界面、电子邮件或 API 响应。
专为智能代理(Agents)打造。EmDash 内置了用于构建插件和主题的“代理技能集”;提供一套命令行界面(CLI),允许代理以编程方式管理内容与数据架构;此外还集成了 MCP 服务器,使 Claude、ChatGPT 等 AI 工具能够直接与你的站点进行交互。
随处运行。EmDash 在每一个技术层级都采用了可移植的抽象层——例如使用 Kysely 处理 SQL 数据库,使用 S3 API 接口管理存储——从而能够兼容 SQLite、D1、Turso、PostgreSQL、R2、AWS S3 以及本地文件系统。尽管 EmDash 在 Cloudflare 平台上能发挥出最佳性能,但它绝非被锁定于该平台,完全支持在其他环境中部署运行。
工作原理
EmDash 是一项 Astro 集成。将其添加到你的配置中,即可获得一套完整的 CMS 系统:包含管理面板、REST API、身份验证、媒体库以及插件系统。
// astro.config.mjs
import emdash from "emdash/astro";
import { d1 } from "emdash/db";
export default defineConfig({
integrations: [emdash({ database: d1() })],
});内容类型定义在数据库中,而非代码中。非开发人员可以通过管理界面(Admin UI)来创建和修改集合。每个集合都对应一个真实的 SQL 表,且包含类型化的列。开发人员可以根据实时模式(Live Schema)生成 TypeScript 类型:
npx emdash types利用 Astro 的“实时集合”(Live Collections)来查询内容——无需重新构建,也无需单独的 API:
---
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---
{posts.map((post) => <article>{post.data.title}</article>)}功能特性
内容管理 —— 博客文章、页面、自定义内容类型。通过 TipTap 实现富文本编辑,并采用 Portable Text 格式存储。支持版本修订、草稿保存、定时发布、全文搜索(FTS5)以及行内可视化编辑。
管理后台 —— 功能完备的管理面板,包含可视化数据模型构建器、媒体库(支持通过签名 URL 拖放上传)、导航菜单、分类体系、小部件,以及 WordPress 导入向导。
用户认证 —— 优先采用 Passkey(WebAuthn)无密码认证,并提供 OAuth 和“魔术链接”(Magic Link)作为备用方案。基于角色的访问控制(RBAC):管理员、编辑、作者、贡献者。
插件系统 —— 提供 definePlugin() API 及生命周期钩子,支持 KV 存储、系统设置、管理页面、仪表盘小部件、自定义区块类型及 API 路由。通过 Dynamic Worker Loaders 在 Cloudflare 环境中实现沙箱化执行。
智能代理(Agents) —— 提供用于辅助插件与主题开发的 AI 技能文件。提供命令行界面(CLI)以实现站点自动化管理。内置 MCP 服务器,支持与各类 AI 工具直接集成。
WordPress 迁移 —— 支持从 WXR 导出文件、WordPress REST API 或 WordPress.com 导入文章、页面、媒体资源及分类数据。智能代理技能可辅助完成插件与主题的移植工作。
可移植平台
| 层 | Cloudflare | 也适配 |
|---|---|---|
| 数据库 | D1 | SQLite, Turso/libSQL, PostgreSQL |
| 存储 | R2 | AWS S3,任何兼容 S3 的服务,本地文件系统 |
| 会话(Session) | KV | Redis、基于文件 |
| 插件 | Worker isolates (sandboxed) | In-process (safe mode) |
状态
EmDash 仍处于 beta 预览阶段。接受贡献、反馈、插件 、主题和创意。
npm create emdash@latest请翻阅文档查阅指南,API 引用和插件开发。
开发
以下是 pnpm monorepo 库:
git clone https://github.com/emdash-cms/emdash.git && cd emdash
pnpm install
pnpm build运行 demo (Node.js + SQLite,无需 Cloudflare 账户)
pnpm --filter emdash-demo seed
pnpm --filter emdash-demo dev在 http://localhost:4321/_emdash/admin 中打开后台
pnpm test # run all tests
pnpm typecheck # type check
pnpm lint:quick # fast lint (< 1s)
pnpm format # format with oxfmt仓库结构
packages/
core/ Astro integration, APIs, admin UI, CLI
auth/ Authentication library
blocks/ Portable Text block definitions
cloudflare/ Cloudflare adapter (D1, R2, Worker Loader)
plugins/ First-party plugins (forms, embeds, SEO, audit-log, etc.)
create-emdash/ npm create emdash scaffolding
gutenberg-to-portable-text/ WordPress block converter
templates/ Starter templates (blog, marketing, portfolio, starter, blank)
demos/ Development and example sites
docs/ Documentation site (Starlight)


