A self-hostable, AI-native fork of EmDash. Full-stack TypeScript CMS built on Astro, with AI agents that work while you sleep.
EmDash is a genuinely good CMS. Astro-native, TypeScript, schema-in-database, sandboxed plugins. But it has a contradiction: it calls itself open source while requiring Cloudflare infrastructure. Dynamic Workers for plugin sandboxing, R2 for storage, D1 for the database. You can't run the full feature set without a Cloudflare paid account. That's not the WordPress spirit of "install it anywhere."
OpenEmDash fixes this. Two changes:
-
Host anywhere. Docker, any VPS, any cloud. SQLite or Postgres. Local filesystem or S3-compatible storage (Minio, AWS, Backblaze). Zero Cloudflare dependency.
-
AI-native from day one. A built-in AI copilot sidebar with BYOK (bring your own key) support. Named AI agents that run on schedules as CMS plugins. Toto writes blog posts at 2 AM. BUBU reviews your SEO at dawn. You wake up to drafted content. These aren't features bolted on. They're teammates.
docker compose up --buildOpen http://localhost:4321/_emdash/setup to initialize your site.
That's it. No Cloudflare account, no AWS credentials, no external services. SQLite database and local file storage, ready to go.
OpenEmDash ships with AI agent plugins that use EmDash's existing plugin system (hooks, cron, settings, admin pages). Agents are plugins. The community can build more.
Writes blog posts on a schedule. Configure a topic, set a cron schedule, and Toto generates drafts overnight. All content starts as ai_draft — you review before publishing.
Reviews your content for SEO. Checks titles, meta descriptions, keyword density, readability scores. Runs after every publish or on a schedule.
No AI vendor lock-in. Configure any provider:
- Anthropic (Claude)
- OpenAI (GPT-4, etc.)
- Ollama (local models, fully private)
- Google (Gemini)
API keys are encrypted at rest (AES-256-GCM). Keys never appear in API responses or logs.
Everything EmDash has, plus host-anywhere and AI:
- Content — Blog posts, pages, custom types. Rich text (TipTap + Portable Text). Revisions, drafts, scheduled publishing, full-text search, visual editing.
- Admin — Visual schema builder, media library, navigation menus, taxonomies, widgets, WordPress import.
- Auth — Passkey-first (WebAuthn) with OAuth and magic link fallbacks. Role-based access: Admin, Editor, Author, Contributor.
- Plugins —
definePlugin()API with hooks, storage, settings, admin pages, cron, and API routes. - AI Copilot — Chat sidebar in admin. Talk to your agents, trigger runs manually, see activity.
- Self-hosted — Docker Compose with SQLite + local storage. Postgres and S3 for production scale.
| Layer | Default (self-hosted) | Also works with |
|---|---|---|
| Database | SQLite | Postgres, Turso/libSQL, Cloudflare D1 |
| Storage | Local filesystem | S3, Minio, R2, Backblaze B2 |
| Plugins | In-process (trusted) | isolated-vm sandbox, Cloudflare Workers |
| AI | BYOK (any provider) | Ollama (fully local/private) |
This is a pnpm monorepo.
git clone https://github.com/your-org/openemdash.git && cd openemdash
pnpm install
pnpm buildRun the demo (Node.js + SQLite, no external services):
pnpm --filter emdash-demo seed
pnpm --filter emdash-demo devOpen the admin at http://localhost:4321/_emdash/admin.
pnpm test # run all tests
pnpm typecheck # type check
pnpm lint:quick # fast lint (< 1s)
pnpm format # format with oxfmtpackages/
core/ Astro integration, APIs, admin, AI provider layer
admin/ Admin UI (React)
auth/ Authentication library
blocks/ Portable Text block definitions
cloudflare/ Cloudflare adapter (optional, for CF deployments)
plugins/ First-party plugins
ai-writer/ Toto — AI content writer agent
seo-analyzer/ BUBU — SEO analysis agent
audit-log/ Audit trail
forms/ Form submissions
...
templates/ Starter templates (blog, marketing, portfolio)
demos/ Development and example sites
docs/ Documentation site (Starlight)
OpenEmDash is a fork of EmDash by Cloudflare. We maintain a patch series on top of upstream, periodically rebasing on tagged releases. Platform abstraction improvements are contributed back upstream where possible. The AI agent system and Docker packaging are permanent divergence points.
EmDash is MIT licensed. OpenEmDash is MIT licensed.
Alpha. Docker self-hosting works. AI agent plugins are in development. We welcome contributions, feedback, and ideas.
See CONTRIBUTING.md for the contributor guide.