Skip to content

Build Independently confirmed2 publishers 3 min read Published

EmDash 1.0 moves plugin vetting from manual review to a site owner's signed allowlist

Cloudflare's EmDash 1.0 runs each CMS plugin in its own isolate capped at 50ms of CPU per request, a dev.to breakdown says. Isolation limits what a bad plugin can reach, and choosing which publisher keys to trust stays with the site owner.

The Engineer · Build desk

Send a correction

Illustration accompanying EmDash 1.0 moves plugin vetting from manual review to a site owner's signed allowlist
Generated illustration

What happened

  • Cloudflare released EmDash 1.0 as a stable, free Astro-based CMS under the MIT license, after introducing it on April 1 and working on it for five months with contributors and production users.
  • Alongside it, Cloudflare launched a decentralized plugin registry that lets developers publish without handing ownership of their identity or releases to a central marketplace.
  • Cloudflare moved its own blog to EmDash in August, planning for millions of pageviews a week and legitimate traffic spikes of up to 5,000 requests per second.
  • Avulux, worn down by WordPress maintenance, converted a custom microsite to EmDash in under a day using EmDash Agent Skills, Cloudflare said.

Why it matters

  • What it limits constraint Integrations that need long-running work or their own network connections do not fit a 50ms isolate without direct network access, so those plugins need a different design before they can run.
  • Who has to decide decision Each site owner now decides which publisher keys to trust, a job the write-up itself expects non-technical users to find hard.
  • Who's exposed exposure A plugin can still write bad content into the paths it was granted; the sandbox walls off credentials, other plugins and unrelated content only.

Each EmDash plugin runs in its own V8 isolate on the Workers runtime, with no shared memory, no filesystem access and no direct network calls, according to a dev.to write-up of the release [6]. What the plugin gets is a capability token scoped to named CMS APIs and paths, such as "write to /blog/posts" but not "/admin/users" [7]. It cannot discover an API it was not granted [7]. Each request is capped at 50ms of CPU time and 128MB of memory [8]. Those figures come from the write-up, and anyone sizing a plugin against them is relying on one author [8].

The author names the cost. Plugins cannot run long tasks or hold persistent connections [9]. The write-up calls that acceptable because agents mostly orchestrate short, stateless steps, such as generating a post or triggering a build [9]. That holds only where every plugin call finishes its compute inside 50ms and keeps nothing open between requests [8]. The case to test first is one the author raises: an agent extending the CMS to integrate a third-party API [17]. With no direct network calls, that plugin needs the CMS to make the request through a granted capability, and the write-up does not describe one [6].

The registry is a set of signed manifests hosted on IPFS and indexed by a Cloudflare-operated discovery service, according to the same write-up [2]. Installation runs in order [3]:

1. The author publishes a manifest with the code hash, the plugin's permissions and an Ed25519 signature to IPFS, and can submit its CID to the discovery service for public listing [2][3]. 2. The site owner fetches the manifest and checks the signature against a public key they already know [3]. 3. If it verifies, the plugin goes on the site's local allowlist [3]. 4. EmDash downloads the code from IPFS and checks it against the hash before running it [3].

This is careful engineering. Because each site checks signatures itself, a compromised discovery service cannot inject code [10]. The same design puts the vetting in step 2. A valid signature proves which key signed a manifest. Whether that key belongs to someone whose code should run on the site is still a judgement, made by the site owner when the key goes on the allowlist [3]. The write-up calls managing those keys and allowlists "not trivial for non-technical users" [11]. Greg Barbosa, director of innovation and systems at Avulux, said of his company's move: "With EmDash, we now have a shared platform that developers can extend and marketers can edit content." [15]

The write-up's premise is that an agent extending a CMS cannot pause for human review, the step older plugin ecosystems assumed [17]. After installation, isolation limits the damage. The author says the model stops a malicious plugin from exfiltrating publisher credentials, modifying unrelated content or reading other plugins' state [12]. A plugin holding write access to /blog/posts can still write whatever it wants to /blog/posts [7][12]. Inside that scope, the agent API logs each action with the agent's identity, parameters and result, and sets a default quota of 100 requests a minute per agent [13]. At that default, a looping agent can still send 6,000 requests an hour [16].

In my view, isolation by default is the right design for a CMS that agents extend, provided plugins stay inside short, stateless jobs [9]. Under the flow as described, a plugin an agent wants to install runs only after its publisher's key passes the site's allowlist check [3].

What to watch

  • Whether Cloudflare's own EmDash documentation confirms the 50ms CPU cap, the 128MB ceiling and the Ed25519 manifest format described in the dev.to write-up.
  • Whether EmDash lets an agent add a publisher key to a site's allowlist without a person approving it.
  • How a plugin that integrates a third-party API gets network access when its isolate cannot make direct calls.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence45
Adoption30
Hype gap+25
Incentives65
Confidence50
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    Cloudflare released EmDash 1.0, a stable, free and open source CMS built on Astro under the MIT license; it introduced EmDash on April 1 and spent the past five months working with contributors and production users on it.

    Reported Supported Source: Cloudflare blogView cited source
  2. [2]

    EmDash's registry is a collection of signed manifests hosted on IPFS and indexed by a Cloudflare-operated discovery service; publishers verify plugin integrity using Ed25519 signatures and can maintain private allowlists.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  3. [3]

    Plugin author publishes a manifest (code hash, permissions, signature) to IPFS and optionally submits the CID to the discovery service; the publisher fetches the manifest and verifies the signature against a known public key; the publisher adds the plugin to a local allowlist if verification passes; EmDash downloads the code from IPFS and validates the hash before execution.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  4. [4]

    Cloudflare migrated the Cloudflare Blog to EmDash in August, which meant being ready for millions of pageviews per week and spikes up to 5,000 requests per second of legitimate traffic; optional KV object caching, a Hyperdrive database adapter and Workers Cache compatibility came out of that migration.

    Reported Supported Source: Cloudflare blogView cited source
  5. [5]

    Cloudflare launched a decentralized plugin registry that lets developers publish without handing ownership of their identity or releases to a central marketplace, while site owners discover and install plugins from inside EmDash.

    Reported Supported Source: Cloudflare blogView cited source
  6. [6]

    EmDash's plugin sandbox relies on Cloudflare Workers' V8 isolate model; each plugin runs in its own isolate with no shared memory, no access to the filesystem, and no direct network calls.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  7. [7]

    Each plugin receives a capability token granting access to specific CMS APIs (content CRUD, asset upload, schema modification), scoped to resources such as 'write to /blog/posts' but not '/admin/users'; plugins cannot discover or access APIs they were not explicitly granted.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  8. [8]

    Plugin execution limits are 50ms CPU time per request and a 128MB memory ceiling.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  9. [9]

    The trade-off is that plugins cannot perform long-running tasks or maintain persistent connections; the author says this is acceptable for agent workflows because agents typically orchestrate short, stateless operations (generate content, validate schema, trigger build).

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  10. [10]

    Even if the discovery service is compromised, it cannot inject malicious code because publishers verify signatures independently.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  11. [11]

    The downside is operational complexity: publishers must manage public keys and allowlists, which is "not trivial for non-technical users".

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  12. [12]

    The isolation model prevents a malicious plugin from exfiltrating publisher credentials, modifying unrelated content, or accessing other plugins' state.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  13. [13]

    Every agent action is logged with the agent's identity, tool call parameters and result; per-agent rate limits default to 100 requests per minute to prevent runaway loops.

    Reported Supported Source: dev.to write-up (mech_app_ai)View cited source
  14. [14]

    Avulux converted a custom microsite to EmDash after dealing with the maintenance burden of WordPress; using EmDash Agent Skills, the transition took less than a day.

    Reported Supported Source: Cloudflare blogView cited source
  15. [15]

    "With EmDash, we now have a shared platform that developers can extend and marketers can edit content."

    Reported Supported Source: Greg Barbosa, Director of Innovation and Systems at Avulux, quoted in the Cloudflare blogView cited source
  16. [16]

    At the default quota, one agent can send 6,000 requests an hour.

    Derived Supported
  17. [17]

    Traditional CMS plugin ecosystems assume human operators who manually vet extensions; an AI agent that needs to extend a CMS to support a new content type or integrate a third-party API cannot pause for human review.

    Reported Insufficient Source: dev.to write-up (mech_app_ai)View cited source

Sources

2 independent publishers whose own reporting we read for this story.

  1. blog.cloudflare.com

    1 article · September 28, 2026

    EmDash 1.0: the stable CMS with a secure plugin registry
  2. dev.to

    1 article · September 30, 2026

    EmDash's Sandboxed Plugin Registry: How Cloudflare Built Agent-Friendly CMS Extensions

Topics and entities

Topics