Summary
Cloudflare Worker Loaders (Dynamic Workers) moved to open beta on
2026-03-24, available to all paid Workers users. apps/host-cloudflare
currently runs the interim QuickJS-WASM substrate specifically because Worker
Loaders was in closed beta. That constraint is now lifted, so we can evaluate
switching host-cloudflare's engine seam from QuickJS to the
dynamic-worker executor (the same one apps/cloud uses), and the stale
"closed beta" comments/docs should be updated regardless.
Background
The code documents QuickJS as a temporary accommodation, not a preference:
// apps/host-cloudflare/src/execution.ts:21-26
// QuickJS-wasm is the default code substrate because it runs in a single Worker
// with no extra binding. When Cloudflare's dynamic Worker Loader leaves closed
// beta, swap CodeExecutorProvider for the dynamic-worker executor (cloud's) —
// it's a one-Layer change behind this same seam.
host-cloudflare/README.md:87-89 and notes/research/product-model.md:89
echo the same: dynamic-worker is the intended cloud runtime.
Latest status (now open beta):
What switching would gain (capability, not just speed)
QuickJS has hard limitations the dynamic-worker runtime does not:
- Binary values: QuickJS cannot represent
Blob/File/Uint8Array at the
tool boundary at all; dynamic-worker passes them via structured clone + a
tagged-ArrayBuffer codec.
- Serialization fidelity: QuickJS forces JSON round-trips, losing
Date /
Map / Set; dynamic-worker uses Workers RPC structured clone.
- Node APIs / network: QuickJS blocks
fetch and has no nodejs_compat
inside the WASM context; dynamic-worker has nodejs_compat and configurable
globalOutbound.
- Isolation: separate workerd isolate vs WASM memory space inside the same
isolate.
Performance is workload-dependent and unmeasured in this repo (the "100x"
figure is isolates-vs-containers, not vs QuickJS). Isolate boot is a few ms, and
warm-cache reuse via get(id) can remove most of the per-call cost (tracked
separately as the warm-cache key fix).
Scope
Relationship to other work
- Depends on / benefits from the warm-cache
get(id) key fix in
runtime-dynamic-worker (separate issue) for latency.
- Independent of the
github_app auth work (separate issue).
Decision needed
Whether to actually adopt dynamic-worker for host-cloudflare now, or only
update the stale docs/comments and keep QuickJS until a benchmark justifies the
switch. This issue tracks the evaluation; the doc/comment refresh is worth doing
either way.
- To see the specific tasks where the Asana app for GitHub is being used, see below:
Summary
Cloudflare Worker Loaders (Dynamic Workers) moved to open beta on
2026-03-24, available to all paid Workers users.
apps/host-cloudflarecurrently runs the interim QuickJS-WASM substrate specifically because Worker
Loaders was in closed beta. That constraint is now lifted, so we can evaluate
switching
host-cloudflare'sengineseam from QuickJS to thedynamic-workerexecutor (the same oneapps/clouduses), and the stale"closed beta" comments/docs should be updated regardless.
Background
The code documents QuickJS as a temporary accommodation, not a preference:
host-cloudflare/README.md:87-89andnotes/research/product-model.md:89echo the same: dynamic-worker is the intended cloud runtime.
Latest status (now open beta):
What switching would gain (capability, not just speed)
QuickJS has hard limitations the dynamic-worker runtime does not:
Blob/File/Uint8Arrayat thetool boundary at all; dynamic-worker passes them via structured clone + a
tagged-ArrayBuffer codec.
Date/Map/Set; dynamic-worker uses Workers RPC structured clone.fetchand has nonodejs_compatinside the WASM context; dynamic-worker has
nodejs_compatand configurableglobalOutbound.isolate.
Performance is workload-dependent and unmeasured in this repo (the "100x"
figure is isolates-vs-containers, not vs QuickJS). Isolate boot is a few ms, and
warm-cache reuse via
get(id)can remove most of the per-call cost (trackedseparately as the warm-cache key fix).
Scope
CloudflareCodeExecutorProviderinapps/host-cloudflare/src/execution.tsfrommakeQuickJsExecutor()tomakeDynamicWorkerExecutor({ loader: env.LOADER })behind the existingCodeExecutorseam (the "one-Layer change" the comment describes).worker_loadersbinding (LOADER) toapps/host-cloudflare/wrangler.jsonc.README.mdseam table(the README already lags reality on R2 blobs + the MCP-session Durable
Object — refresh those while here).
runtime; gate with
format:check/lint/typecheck/test.Relationship to other work
get(id)key fix inruntime-dynamic-worker(separate issue) for latency.github_appauth work (separate issue).Decision needed
Whether to actually adopt dynamic-worker for host-cloudflare now, or only
update the stale docs/comments and keep QuickJS until a benchmark justifies the
switch. This issue tracks the evaluation; the doc/comment refresh is worth doing
either way.