pimenov.ai

База знаний

EmDash — open-source CMS от Cloudflare на базе Astro

Open-source CMS от Cloudflare на TypeScript и Astro 6: sandbox-плагины, встроенный MCP-сервер, деплой на Workers или Node.js. Возможности, лимиты и ограничения.

Опубликовано Обновлено

Open-source CMS, которую Cloudflare собрала с нуля на TypeScript и Astro 6. Без PHP, без легаси, с изолированными плагинами и встроенной поддержкой ИИ-агентов через MCP. Позиционируется как «духовный наследник WordPress» на современном стеке.

⚠️
Статус на 1 августа 2026: публичная beta. Первый релиз v0.1.0 вышел 1 апреля 2026, релиз emdash@0.29.0 опубликован 10 июля 2026. В README репозитория статус проекта указан как beta preview, поэтому для сайтов с деньгами и SLA брать его рано. Лицензия MIT.
💡
MCP (Model Context Protocol) — открытый протокол, через который ИИ-агент получает доступ к данным и действиям внешней системы. Встроенный MCP-сервер EmDash отдаёт контент, схему, медиа, таксономии, меню и ревизии.

Зачем это нужно

WordPress — это больше 20 лет PHP-наследия, десятки тысяч плагинов с полным доступом к базе и файловой системе и модель безопасности из начала двухтысячных. По отчёту Patchstack о безопасности WordPress, в 2025 году в экосистеме нашли 11 334 новых уязвимости — на 42% больше, чем годом ранее, и приходятся они в основном на плагины и темы, а не на ядро. Именно этот аргумент Cloudflare поставила в центр анонса EmDash.

EmDash берёт то, что сделало WordPress успешным — простоту, расширяемость, экосистему — и пересобирает без легаси. Каждый плагин работает в изолированном sandbox, контент хранится как структурированный JSON (Portable Text), а деплой — serverless на Cloudflare Workers.


Ключевые возможности

ВозможностьЧто это значит
Темы на AstroТемы — обычные Astro-проекты с компонентами, Tailwind CSS, React/Vue/Svelte через Islands. Никакого проприетарного формата
Sandbox-плагиныКаждый плагин запускается в изолированном Dynamic Worker. Доступ к данным — строго через capabilities в манифесте
Кастомные типы контентаКоллекции и поля настраиваются прямо в админке, схема отражается в базе и в генерируемых TypeScript-типах
AI-nativeВстроенный MCP-сервер: агент работает с контентом, схемой, медиа, таксономиями, меню и ревизиями через те же API, что и админка
WordPress-импортВстроенная миграция: посты, страницы, кастомные типы, медиа, таксономии
ServerlessДеплой на Cloudflare Workers — масштабируется до нуля и обратно. Или на любой Node.js-сервер
Portable TextКонтент хранится как структурированный JSON, а не сырой HTML. Проще парсить, трансформировать, переиспользовать
Генерация типовКоманда npx emdash types создаёт TypeScript-типы из живой схемы базы данных
Passkey-входАутентификация по умолчанию — passkey (Touch ID, Windows Hello, ключ безопасности). Пароли не используются, дополнительно подключаются GitHub и Google
Портируемость стекаKysely для SQL и S3 API для файлов: работает на D1, SQLite, Turso/libSQL или PostgreSQL и с R2, AWS S3 или локальными файлами
Реестр плагиновЦентрализованный маркетплейс с автоматическим аудитом кода через Workers AI плюс экспериментальный федеративный реестр со своей политикой доверия
Инструменты для агентовAgent skills для сборки плагинов и тем, CLI для управления контентом и схемой, конвертер Gutenberg → Portable Text
МонетизацияОтдельный пакет @emdash-cms/x402 — оплата доступа к контенту по стандарту x402

Как устроена архитектура

graph TD
    A["Браузер"] --> B["Astro — SSR / SSG"]
    B --> C["EmDash Integration"]
    C --> D["REST API"]
    C --> E["Админ-панель"]
    C --> F["Система плагинов"]
    D --> G["SQLite / Cloudflare D1"]
    E --> G
    F --> H["Dynamic Workers — sandbox"]
    H -.->|"capabilities"| G
    C --> I["R2 / Локальное хранилище"]
    C --> J["MCP Server"]
    J --> K["ИИ-агенты"]

Три принципиальных решения:

  • Astro вместо PHP-шаблонов. Один рантайм в dev и production (Cloudflare workerd). Темы — обычные Astro-проекты
  • Плагины в изоляции. Каждый плагин — отдельный Worker-изолят. Нет прямого доступа к базе или файлам. Доступ — только через объявленные capabilities в манифесте
  • Контент как данные. Portable Text (JSON) вместо HTML. Это упрощает работу ИИ-агентов и мультиканальную публикацию
  • Портируемые абстракции. Слой SQL закрыт Kysely, хранилище — S3-совместимым API, сессии — KV или Redis. На Cloudflare работает лучше всего, но привязки к нему нет

Быстрый старт

Требования: Node.js 22.12.0 или новее (нечётные версии не поддерживаются) и npm, pnpm или yarn.

npm create emdash@latest

Подключается как Astro-интеграция:

// astro.config.mjs
import emdash from "emdash/astro";
import { d1 } from "emdash/db";

export default defineConfig({
  integrations: [emdash({ database: d1() })],
});

Запрос контента — через Astro Live Collections, без ребилдов и отдельного API:

---
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---

{posts.map((post) => <article>{post.data.title}</article>)}

Генерация TypeScript-типов из текущей схемы:

npx emdash types

Как проверить, что всё работает

  1. Запустите dev-сервер проекта и откройте http://localhost:4321/_emdash/admin
  2. При первом входе откроется Setup Wizard: название сайта, таглайн, email администратора
  3. Нажмите Create Site и подтвердите создание passkey (Touch ID, Windows Hello, PIN или ключ безопасности)
  4. Признак успеха: вы попали в админ-панель и можете создать первую запись
  5. Выполните npx emdash types — команда должна сгенерировать TypeScript-типы без ошибок
  6. Запросите созданную запись через getEmDashCollection в шаблоне: она появится на странице без пересборки
💡
Совет: email на этапе установки сохраняется, но не подтверждается. Настройте отправку почты позже, если нужны приглашения и вход по magic link.

Безопасность плагинов: EmDash vs WordPress

АспектWordPressEmDash
ИзоляцияОбщий PHP-процесс, полный доступ к базе и файламКаждый плагин — отдельный Worker-изолят
БезопасностьОдин уязвимый плагин компрометирует весь сайтСкомпрометированный плагин ограничен объявленными capabilities, но данные внутри выданных разрешений ему доступны
РазрешенияПолный доступ по умолчаниюЯвный манифест capabilities
ЭкосистемаДесятки тысяч плагиновРанняя: официальный реестр, CLI и первые плагины

Пример манифеста — плагин отправки email при сохранении контента:

{
  "name": "email-on-save",
  "capabilities": {
    "content": ["read"],
    "email": ["send"]
  }
}
📌
Dynamic Workers (sandbox-плагины) доступны только на платных аккаунтах Cloudflare (от $5/мес). На бесплатном плане плагины можно отключить.

MCP-сервер и ИИ-агенты

EmDash поставляется со встроенным MCP-сервером (Model Context Protocol). Это значит, что ИИ-агенты могут:

  • Создавать и редактировать контент
  • Управлять коллекциями и схемой
  • Загружать медиафайлы
  • Интроспектировать структуру данных

Агенты работают с Portable Text (структурированный JSON), а не парсят HTML — это принципиально упрощает автоматизацию контента.


Тарифы и инфраструктура

EmDash — бесплатный и open-source. Платите только за инфраструктуру.

КомпонентБесплатный план CloudflareWorkers Paid (от $5/мес)
Workers (рантайм)100 000 запросов в сутки, 10 мс CPU на запрос10 млн запросов и 30 млн CPU-мс в месяц включено, далее $0.30 за млн запросов и $0.02 за млн CPU-мс
D1 (база данных)5 млн прочитанных и 100 000 записанных строк в сутки, 5 ГБ на аккаунт, до 500 МБ на базуСуточные лимиты заменяются месячными: включено 25 млрд прочитанных и 50 млн записанных строк, до 10 ГБ на базу и 1 ТБ на аккаунт, далее $0.001 за млн чтений, $1.00 за млн записей и $0.75 за ГБ в месяц
R2 (медиа)10 ГБ хранения, 1 млн операций записи и 10 млн чтений в месяц, egress бесплатныйДалее $0.015 за ГБ в месяц, $4.50 за млн операций записи и $0.36 за млн чтений, egress остаётся бесплатным
Sandbox-плагины (Dynamic Workers)❌ Недоступно✅ Включено
⚖️
Лимиты и цены проверены 1 августа 2026 по официальным страницам тарифов Workers, лимитов D1 и тарифов R2. Cloudflare меняет их без предупреждения — перед расчётом бюджета сверьтесь с первоисточником.

Для личного сайта или небольшого блога бесплатного плана хватает с запасом, но без sandbox-плагинов: их придётся отключить, закомментировав блок worker_loaders в wrangler.jsonc, либо запускать плагины в safe mode внутри основного процесса. Полный набор возможностей начинается с Workers Paid — минимум $5 в месяц на аккаунт.

Альтернатива без Cloudflare: EmDash работает на любом Node.js-сервере с SQLite или PostgreSQL и S3-совместимым хранилищем. Тогда стоимость равна стоимости вашего хостинга.


Сравнение с альтернативами

КритерийEmDashWordPressGhostStrapi
ЯзыкTypeScriptPHPJavaScriptTypeScript
ФронтендAstro 6 (SSR/SSG)PHP-шаблоны / HeadlessHandlebars / HeadlessHeadless only
Безопасность плагиновSandbox-изоляцияОбщий процессИнтеграции вместо плагиновMiddleware
AI-интеграцияВстроенный MCPЧерез плагиныЧерез APIЧерез API
ServerlessНативно (Workers)НетНетНет
ЭкосистемаРанняя: реестр, CLI, первые плагиныОгромнаяСредняяСредняя
ЗрелостьBeta preview: 0.1.0 в апреле 2026, 0.29.0 в июле 202620+ лет10+ лет5+ лет

Ограничения и когда не подходит

За четыре месяца проект ушёл далеко от первого preview, но зрелым его считать рано:

  • Плагинов и тем мало. Есть официальный реестр, CLI для сборки и публикации плагинов и стартовые шаблоны, но каталога уровня WordPress Plugin Directory нет
  • Федеративный реестр экспериментальный — включается через experimental.registry и требует sandbox-раннера
  • Аудит плагинов автоматический. Проверка кода через Workers AI снижает риск, но не заменяет ручной review, а сам маркетплейс на старте работал только через API
  • Sandbox-плагины требуют платного аккаунта Cloudflare либо запуска в safe mode внутри процесса
  • Плагины WordPress не переносятся как есть — нужна адаптация по официальному гайду порта
  • Ломающие изменения. Версии до 1.0 меняют API и схему: читайте релизы перед каждым обновлением
  • Комьюнити молодое — GitHub Issues, Discord и сабреддит r/emdash_cms
  • В репозитории статус проекта по-прежнему обозначен как beta preview

Когда лучше выбрать другое:

  • Нужен продакшн-сайт с SLA прямо сейчас и без запаса времени на баги — берите зрелую CMS
  • Проект держится на конкретных плагинах WordPress или на визуальном сборщике страниц
  • В команде нет разработчика, знакомого с TypeScript и Astro
  • Контентом управляют редакторы, для которых важна привычная библиотека блоков Gutenberg

Когда стоит присмотреться

  • Вы строите новый проект на Astro и хотите CMS с нативной интеграцией
  • Вам нужна CMS с AI-native архитектурой и MCP-сервером из коробки
  • Вы мигрируете с WordPress и готовы к serverless-стеку
  • Вы хотите sandbox-изоляцию плагинов вместо модели «всё имеет доступ ко всему»
  • Вам нужен структурированный контент как источник данных для нескольких каналов, а не HTML-простыня

Ссылки


Следующий шаг

Связанные материалы

Выбор CMS определяет, насколько просто к вашему контенту потом подключатся агенты и автоматизации. Это полезно продумать до старта проекта, а не после первой миграции.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov