EmDash 1.0がリリース!Cloudflare製CMSの安定版で何が変わったのか

Cloudflareのオープンソース CMS「EmDash」が1.0として安定版になりました。サンドボックス化されたプラグイン、AT Protocolベースの分散型プラグインレジストリなどの新機能と、0.xからのアップグレードの注意点を、実際にこのブログを1.2.0へ上げた経験も交えてまとめます。

はじめに

2026年9月28日、Cloudflareが開発しているオープンソースのCMS「EmDash」のバージョン1.0がリリースされました。4月1日に「WordPressの精神的後継」として発表されてから約半年で、ベータを抜けて安定版になった形です。

実は、このブログ(yamadori.app)もEmDashで動いています。microCMSとAstroの構成から移行し、先日1.2.0へのアップグレードも済ませました。

この記事では、EmDash 1.0の主な内容と、0.xからアップグレードするときの注意点を、実際に触ってみた感想も交えて紹介します。

EmDashとは

EmDashは、Astroをベースにしたフルスタックのコンテンツ管理システムです。

  • ライセンス:MIT(無料・オープンソース)
  • 実行環境:Cloudflare Workers または Node.js
  • サイトの実装:Astro
  • 記事の編集:EmDashの管理画面
  • AIエージェントからの操作:API、CLI、組み込みのMCPサーバー

開発者はAstroでサイトを作り、編集者は管理画面で記事を書き、AIエージェントはMCPやCLIからコンテンツを操作する、という役割分担になっています。

Cloudflareの公式ブログも8月からEmDashで運用されており、週に数百万ページビュー、正規のトラフィックで毎秒5,000リクエストのピークにも耐えているそうです。

EmDash 1.0の主な内容

安定版としての約束

1.0でいちばん大きいのは、機能よりも「互換性の約束」です。

EmDashはセマンティックバージョニングに従っており、1.0以降は 破壊的変更はメジャーバージョンでしか入らない と明言されました。0.x系ではマイナーアップデートのたびに非推奨APIの削除や仕様変更があったので、本番サイトで使うにはこれが一番うれしいポイントです。

その代わり、1.0では0.x時代に非推奨になっていたAPIがまとめて削除されています(詳しくは後述します)。

サンドボックス化されたプラグイン

EmDashのプラグインは、サイト本体とは別の隔離された環境で動きます。

  • 初期状態でアクセスできるのは、プラグイン自身の専用ストレージだけ
  • サイトのコンテンツ、メディア、ユーザー、シークレット、ファイルシステム、ネットワークには、既定ではアクセスできない
  • 追加の権限はプラグインが宣言し、サイト管理者が承認する必要がある

スマートフォンアプリの権限確認に近い仕組みです。インストール時には、プラグインが要求する権限(content:read、media:write、network:requestなど)が確認ダイアログに表示されます。アップデートで新しい権限が追加された場合も、管理者が改めて承認するまでは古いバージョンのまま動き続けます。

WordPressのプラグインは同じPHPプロセスで動き、データベースやファイルシステムに直接アクセスできます。EmDashでは、この部分を根本から変えています。

実行基盤は、プラットフォームによって異なります。

  • Cloudflare Workers:プラグインごとにDynamic Worker(Worker Loader)として起動
  • Node.js:Workersのランタイムであるworkerdを別プロセスで起動し、その中で実行

なお、Cloudflare Workersでサンドボックスプラグインを使うには、Worker LoaderのためにWorkers Paidプランが必要です。テンプレートは無料プランでもデプロイできるよう、この設定がコメントアウトされた状態になっています。

AT Protocolベースの分散型プラグインレジストリ

1.0と同時に、プラグインのレジストリ(カタログ)も公開されました。

https://plugins.emdashcms.com

特徴的なのは、Blueskyと同じ AT Protocol(atproto) の上に作られている点です。

  • プラグインの作者は、Atmosphereアカウント(Blueskyなどと共通のアカウント)で公開する
  • パッケージやリリースの情報は作者が署名し、作者自身のアカウントに保存される
  • プラグインの名前は@ハンドル/スラッグの形式になる(例:@example.com/my-gallery)

中央のマーケットプレイスにアカウントやリリース履歴を預けないので、仮にカタログ側が掲載を止めたり、サービスが終了したりしても、作者は自分の識別子と公開履歴を失いません。

インストール時には、EmDashが次のような検証を行います。

  • 作者アカウントの署名付きコミットに、そのリリース情報が含まれていることの証明
  • ダウンロードしたファイルのチェックサム、パッケージ名、バージョン、要求する権限
  • 作者が必須にしている場合は、ビルドの来歴(provenance)

カタログを動かすアグリゲーターや、Workers AIで説明文などをモデレーションするラベラーもオープンソースになっており、ほかの事業者が独自のカタログを立てることもできます。現時点では無料のプラグインのみで、有料プラグインは今後対応予定とのことです。

AIエージェントへの対応

EmDashは最初から、AIエージェントがCMSを操作することを前提に作られています。

  • 組み込みのMCPサーバー
  • CLI(emdashコマンド)
  • REST API
  • EmDash Agent Skills(エージェント向けの手順書)

Cloudflareのブログでは、AvuluxというチームがAgent Skillsの助けを借りて、WordPressのマイクロサイトを1日足らずでEmDashへ移行した事例が紹介されています。

このブログでも、Claude CodeからMCP経由で記事の下書きを作ったり、メディアをアップロードしたりしています。CMSの操作がそのままエージェントのツールになるのは、かなり便利です。

パフォーマンス関連の機能

Cloudflareのブログを移行する過程で、次の機能が追加されました。いずれもオプションです。

  • KVを使ったオブジェクトキャッシュ
  • Hyperdriveを使ったPostgreSQLのデータベースアダプター
  • Workers Cacheへの対応

EmDash Build(アルファ版)

あわせて、AIでサイトを作る「EmDash Build」もアルファ版として公開されました。ホスティング事業者やサイトビルダーのサービスが、自社に組み込んで使うことを想定したものです。

  • 要望の文章から、エージェントがコンテンツモデルを設計する
  • EmDashのMCPサーバーを通じてコンテンツを入れ、ページを書く
  • プロジェクトごとにCloudflare Sandboxのコンテナで動作確認する
  • 公開すると、Workers for Platforms上の本番サイトとしてデプロイされる

デモはbuild.emdashcms.com、ソースコードはgithub.com/emdash-cms/emdash-buildで公開されています。

コミュニティの規模

Cloudflareの発表によると、1.0の時点で次のような規模になっています。

  • コントリビューター:175人以上
  • コミット数:1,800以上
  • 翻訳:25言語
  • Discordコミュニティ:800人以上

0.xからアップグレードするときの注意点

主な破壊的変更

公式のアップグレードガイド(docs.emdashcms.com/upgrade-to-v1/)に、すべての変更点と対応方法がまとまっています。主なものは次のとおりです。

  • experimental.registryオプションの削除:トップレベルのregistryオプションへ、値をそのまま移す
  • 内部用のエントリーポイントの移動:emdash/routes/*やemdash/middleware/*などがemdash/internal/以下へ移動。emdash()の設定だけで使っているサイトには影響なし
  • emdash devとemdash auth secretコマンドの削除:開発サーバーはpnpm dev(astro dev)で起動する
  • CommentsとCommentFormの移動:emdash/ui/commentsからインポートする
  • cloudflareCache()の削除

設定の書き換えは、たとえば次のようになります。

// 0.x
emdash({
  experimental: {
    registry: { aggregatorUrl: "https://registry.example.com" },
  },
});

// 1.0
emdash({
  registry: { aggregatorUrl: "https://registry.example.com" },
});

古いプラグインの権限名(read:contentなど)は非推奨になりましたが、1.x系の間は引き続き使えます。起動時に警告が出るので、content:readのような新しい名前へ書き換えておきましょう。

npmの「1.0.0」に注意

少し紛らわしいのがバージョン番号です。npmにはemdash@1.0.0が存在しますが、これは2026年4月に誤って公開されたもので、正式な1.0ではありません。現在は非推奨になっています。

npm view emdash@1.0.0 deprecated
# Please install the latest version.

9月28日にリリースされた正式な安定版は 1.0.1 です。バージョンを固定する場合は、1.0.0を指定しないように気をつけてください。

アップグレードツールを使う

EmDashには、依存パッケージの更新を手伝うupgrade-emdashというツールがあります。EmDash関連のパッケージをまとめて更新し、エージェント向けのスキルも最新にしてくれます。

更新後は.emdash/UPGRADE.mdに、追加されたデータベースのマイグレーションや、プロジェクト側で必要な対応が書き出されます。

EmDashのコアのマイグレーションは、既定では デプロイ後の最初のリクエストで自動的に適用 されます。マイグレーションは前方向のみなので、本番に出す前に必ずデータベースのバックアップを取っておきましょう。

1.0以降のアップデート

1.0のあとも、短い間隔でアップデートが続いています。

1.1.0(10月1日)

  • 公開カレンダー:公開済み・予約済みの記事を月表示とアジェンダ表示で確認できる
  • HTMLブロックの分離:新しく作るHTMLブロックは、既定でサンドボックス化されたiframeの中で描画される
  • iframeブロック:YouTubeやVimeoのURLはプレーヤーとして表示される
  • Microsoftアカウントでのログイン(Microsoft Entra ID)
  • WebMCP検索:対応ブラウザーのAIエージェントに、サイト内検索のツールを公開できる

1.2.0(10月6日)

  • ドメイン変更ダイアログ:新しいドメインでサイトが表示されることを確認してから、サイトURLを切り替えられる
  • 動画ブロック:リッチテキストエディターで動画をアップロードして埋め込める
  • 記事一覧のページ番号表示
  • 管理画面に含める言語を絞るadmin.localesオプション
  • エディターのツールバーに関するXSSの修正

1.2.0にはセキュリティ修正も含まれているので、1.0.1や1.1.0を使っている場合も、早めに更新しておくのがおすすめです。

このブログを1.2.0にアップグレードしてみた

このブログは0.39.1で動いていたので、upgrade-emdashを使って一気に1.2.0まで上げました。

作業の流れ

  1. 本番のD1データベースをバックアップする
  2. upgrade-emdashでパッケージを更新する
  3. .emdash/UPGRADE.mdを読んで、必要な対応をする
  4. デプロイする

今回は9件のコアマイグレーションが追加されていましたが、デプロイ後の最初のリクエストで自動的に適用され、特にトラブルはありませんでした。

対応が必要だったところ

影響があったのは、1.1.0で入ったHTMLブロックの分離です。

このブログでは、アフィリエイトのバナーをHTMLブロックで埋め込み、自前のコンポーネントで描画していました。管理画面で作ったHTMLブロックが既定でiframeに分離されるようになったため、新しいブロックはEmDash標準のHtmlBlockに描画を任せ、既存のインラインのブロックだけを自前のコンポーネントで扱うように修正しました。

バックアップで少しハマった

バックアップにはwrangler d1 exportを使おうとしましたが、EmDashの全文検索が使っているFTS5の仮想テーブルが含まれていると、エクスポートできませんでした。そのため、Pythonで簡単なダンプ用スクリプトを書いてバックアップを取りました。

EmDashをD1で運用している場合は、アップグレードの前にバックアップ方法を確認しておくとよいでしょう。

ドキュメントのバージョンにも注意

もうひとつ気づいたのが、公式ドキュメントは常に最新版の内容になっている点です。0.39.1の頃に、ドキュメントに書かれている管理画面の機能(ドメイン変更など)を探しても見つからず、調べてみたら新しいバージョンで追加された機能だった、ということがありました。

ドキュメントどおりに動かないときは、まずnode_modules/emdash/package.jsonでインストールされているバージョンを確認するのがおすすめです。

気になる点

もちろん、良いことばかりではありません。

  • Cloudflareへの依存:Node.jsでも動きますが、KVキャッシュ、Hyperdrive、EmDash Build、サンドボックスプラグインなど、多くの機能はCloudflare上で使うことを前提にしています。Search Engine Journalでは、ホスティングの自由度という点でWordPressに劣るという指摘もされています
  • レジストリの運営:仕組みは分散型ですが、標準のカタログやモデレーションは現時点ではCloudflare側が運営しています
  • エコシステムの規模:WordPressのような膨大なプラグインやテーマの蓄積はまだありません
  • 有料プランが必要な機能:Workersでサンドボックスプラグインを使うにはWorkers Paidプランが必要です

おわりに

EmDash 1.0では、破壊的変更をメジャーバージョンに限るという約束によって、本番運用の安心感が大きく増しました。サンドボックス化されたプラグインと、AT Protocolを使った分散型のレジストリは、WordPressのプラグインが抱えてきたセキュリティや中央集権の問題に対する、ひとつの答えになっています。

AIエージェントからMCPやCLIで操作できる点も、実際に使ってみるとかなり便利です。このブログの記事も、エージェントと一緒に下書きを作ることが増えました。

Astroでブログや小規模なサイトを作っている人や、WordPressの代わりを探している人は、この機会に試してみてはいかがでしょうか。

npm create emdash@latest

参考

まだコメントはありません