Emdash CMS Plugin Runtime and Security Model
Understand how EmDash separates trusted and sandboxed plugin execution, and why Dynamic Workers matters for security boundaries.
Why this model exists
Most CMS plugin ecosystems fail at the same boundary: extensions run with too much privilege.
EmDash addresses this by separating plugin execution modes and making capability boundaries explicit.
Two execution classes
Trusted plugins
- loaded as part of your application runtime
- suitable for code you own or fully trust
- operationally simple, but security depends on your review discipline
Sandboxed plugins
- executed in isolated worker environments
- designed for untrusted or semi-trusted extension logic
- constrained by explicit capabilities, runtime limits, and network rules
The security posture depends less on plugin intent and more on runtime isolation guarantees.
Dynamic Workers in the architecture
Dynamic Workers is the isolation primitive used for sandboxed execution on Cloudflare.
Without it, sandbox mode is unavailable, and you should operate only with trusted plugin assumptions.
In practical terms:
- Free plan: core CMS works, sandboxed plugin mode does not
- Paid plan with Dynamic Workers: sandbox model becomes available
Capability model: least privilege by default
A plugin should declare only what it needs:
- read content
- write specific content domains
- call outbound network endpoints
- trigger selected workflow hooks
If a capability is not granted, the operation should fail deterministically. This is a design requirement, not a best-effort courtesy.
// Example: keep capability scope explicit
export default definePlugin({
id: "notify-on-publish",
capabilities: ["read:content", "email:send"]
});
Runtime guardrails that matter
Security and reliability both depend on hard limits:
- CPU and wall-time limits prevent runaway handlers
- memory ceilings constrain abuse and accidental leaks
- network policies block arbitrary exfiltration attempts
These controls convert plugin failures into bounded incidents instead of platform outages.
Threat model in one page
Assume any third-party plugin can contain:
- malicious behavior
- stale dependencies
- logic bugs under uncommon event timing
The plugin runtime should therefore guarantee:
- containment of blast radius
- denied-by-default privileged operations
- auditable execution outcomes
Trust should be earned by policy, not granted by installation.
Free plan operating model
If you are running without sandbox support:
- keep plugin set minimal
- prefer first-party or internally reviewed plugins
- perform dependency and permission review at release gates
- isolate risky integrations into external services where possible
This is a viable model for many teams, but it requires stronger governance discipline.
Decision criteria: when to require sandbox mode
Treat sandbox mode as mandatory when:
- you install plugins from external authors at scale
- compliance requires stronger isolation evidence
- business risk from plugin compromise is material
Treat sandbox mode as optional when:
- plugin surface is small and fully audited
- team controls release pipeline end to end
Practical governance checklist
Before enabling any plugin in production:
- document plugin owner and purpose
- review required capabilities and outbound endpoints
- set rollback owner and rollback procedure
- validate behavior in staging with failure injection
Plugin security is not a one-time architecture decision. It is an operational process backed by runtime boundaries.