@cloudflare/vite-plugin
1.64.0 · 14 Oct 2026MIT4M / weekRepositoryHomepagenpmAtom feed
238 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
1.64.0
14 Oct 2026Generate source maps for Worker environments by default
Worker builds now emit source maps unless Vite's
build.sourcemapor the Worker'supload_source_mapsis set, so deployed Workers get stack traces that point at the original source. The source maps are written next to the Worker bundle and included in Build Output; the client environment is unchanged, so no source maps are added to public assets. Setbuild.sourcemap: falsefor the Worker environment, orupload_source_maps: falsein the Worker config, to opt out.
Minor Changes
Generate source maps for Worker environments by default
Worker builds now emit source maps unless Vite's
build.sourcemapor the Worker'supload_source_mapsis set, so deployed Workers get stack traces that point at the original source. The source maps are written next to the Worker bundle and included in Build Output; the client environment is unchanged, so no source maps are added to public assets. Setbuild.sourcemap: falsefor the Worker environment, orupload_source_maps: falsein the Worker config, to opt out.
1.63.2
13 Oct 2026Fix optional Docker lookups printing Docker CLI errors during successful builds
cf buildlooks for Container images left behind by earlier builds so it can remove them. This lookup is best effort, but when Docker could not be reached it still printed errors such asCannot connect to the Docker daemon, even when the build succeeded and no image needed Docker. Docker commands whose output Wrangler reads no longer forward the Docker CLI's error output to the terminal. If one of these commands fails in a way that stops the command, the error message still includes the Docker CLI's output.Use consumer-specific CLI names and commands in shared user-facing messages
Shared deployment, container, configuration, and authentication helpers can now render commands and configuration filenames for their calling CLI while preserving Wrangler-compatible defaults. This prevents
cfworkflows from presenting Wrangler-branded guidance when an equivalentcfcommand exists.
Patch Changes
Fix optional Docker lookups printing Docker CLI errors during successful builds
cf buildlooks for Container images left behind by earlier builds so it can remove them. This lookup is best effort, but when Docker could not be reached it still printed errors such asCannot connect to the Docker daemon, even when the build succeeded and no image needed Docker. Docker commands whose output Wrangler reads no longer forward the Docker CLI's error output to the terminal. If one of these commands fails in a way that stops the command, the error message still includes the Docker CLI's output.Use consumer-specific CLI names and commands in shared user-facing messages
Shared deployment, container, configuration, and authentication helpers can now render commands and configuration filenames for their calling CLI while preserving Wrangler-compatible defaults. This prevents
cfworkflows from presenting Wrangler-branded guidance when an equivalentcfcommand exists.
1.63.1
8 Oct 2026Stop the update check from recommending deprecated versions
Previously, the "update available" notice shown by
wranglerand@cloudflare/vite-pluginalways pointed at whichever version was taggedlateston npm, even after that version had been deprecated for shipping a bug. Deprecated versions are now never recommended: if the latest release has been deprecated, the newest non-deprecated stable release below it is suggested instead, or nothing at all if you are already on it.The check now reads the npm registry directly instead of going through the
update-checkpackage, which discarded the deprecation information. The on-disk cache location and one-hour refresh interval are unchanged.Ship
usingandawait usingdeclarations to the runtime as writtenWorker builds no longer lower explicit resource management into helper code, so Workers that use it ship about 1.7 KB less. workerd supports the syntax natively. On Vite 8 the plugin builds Workers at an
es2026target, so Oxc leaves the syntax alone. On Vite 6 and 7, where esbuild has noes2026target, the Worker environments tell esbuild thatusingis supported instead. Client builds keep their own targets: the plugin changes only the Worker environments.Honor the source-map setting in release builds
Omit the plugin's JavaScript and declaration source maps when building with
SOURCEMAPS=false, reducing the installed package size. Normal development builds keep source maps, and application source-map settings are unchanged.
Patch Changes
Stop the update check from recommending deprecated versions
Previously, the "update available" notice shown by
wranglerand@cloudflare/vite-pluginalways pointed at whichever version was taggedlateston npm, even after that version had been deprecated for shipping a bug. Deprecated versions are now never recommended: if the latest release has been deprecated, the newest non-deprecated stable release below it is suggested instead, or nothing at all if you are already on it.The check now reads the npm registry directly instead of going through the
update-checkpackage, which discarded the deprecation information. The on-disk cache location and one-hour refresh interval are unchanged.Ship
usingandawait usingdeclarations to the runtime as writtenWorker builds no longer lower explicit resource management into helper code, so Workers that use it ship about 1.7 KB less. workerd supports the syntax natively. On Vite 8 the plugin builds Workers at an
es2026target, so Oxc leaves the syntax alone. On Vite 6 and 7, where esbuild has noes2026target, the Worker environments tell esbuild thatusingis supported instead. Client builds keep their own targets: the plugin changes only the Worker environments.Honor the source-map setting in release builds
Omit the plugin's JavaScript and declaration source maps when building with
SOURCEMAPS=false, reducing the installed package size. Normal development builds keep source maps, and application source-map settings are unchanged.
1.63.0
6 Oct 2026Add email-protected Quick Tunnels to the Cloudflare Vite plugin
Set
tunnel.allowedMailto a list of email addresses or domain patterns to require email authentication when exposing a Vite development or preview server through a Quick Tunnel.
Minor Changes
Add email-protected Quick Tunnels to the Cloudflare Vite plugin
Set
tunnel.allowedMailto a list of email addresses or domain patterns to require email authentication when exposing a Vite development or preview server through a Quick Tunnel.
1.62.2 – 1.62.54 releases that only update dependencieswrangler 4.147.0miniflare 5.20261001.0-alphaShow each
1.62.1
29 Sep 2026Resolve the affected Undici dependency in new Wrangler and Vite plugin installs
Undici 7.29.1 fixes GHSA-3wwx-pv8p-q78v. Update the shared dependency catalog and matching types used by Miniflare and Wrangler so downstream installs can resolve the patched runtime without an application-level override. A published release is still required for consumers; this changeset does not alter already published package metadata.
Patch Changes
Resolve the affected Undici dependency in new Wrangler and Vite plugin installs
Undici 7.29.1 fixes GHSA-3wwx-pv8p-q78v. Update the shared dependency catalog and matching types used by Miniflare and Wrangler so downstream installs can resolve the patched runtime without an application-level override. A published release is still required for consumers; this changeset does not alter already published package metadata.
1.62.0
28 Sep 2026Use
cf/configforcloudflare.config.tsauthoringExperimental
cloudflare.config.tsprojects must now importdefineConfig, bindings, triggers, and related helpers fromcf/config. Generated declarations from Wrangler and the Vite plugin also reference this package, so projects using the experimental configuration flow must addcfas a dependency.The Vite plugin no longer exports
@cloudflare/vite-plugin/experimental-config.wrangler/experimental-configremains available fordefineWranglerConfig, but no longer re-exports Cloudflare configuration helpers.Keep dependency optimization caches stable on the first Vite dev server restart.
The first dev server restart no longer re-optimizes unchanged dependencies, including in projects without Containers. Container images are still cleaned up when the server closes, even after a config reload removes the Cloudflare plugin.
Minor Changes
Use
cf/configforcloudflare.config.tsauthoringExperimental
cloudflare.config.tsprojects must now importdefineConfig, bindings, triggers, and related helpers fromcf/config. Generated declarations from Wrangler and the Vite plugin also reference this package, so projects using the experimental configuration flow must addcfas a dependency.The Vite plugin no longer exports
@cloudflare/vite-plugin/experimental-config.wrangler/experimental-configremains available fordefineWranglerConfig, but no longer re-exports Cloudflare configuration helpers.
Patch Changes
Keep dependency optimization caches stable on the first Vite dev server restart.
The first dev server restart no longer re-optimizes unchanged dependencies, including in projects without Containers. Container images are still cleaned up when the server closes, even after a config reload removes the Cloudflare plugin.
1.61.0
27 Sep 2026Support Workflows declared in
exportsonctx.exportsin local developmentA Workflow declared in a Worker's
exportsis now available onctx.exportsinwrangler dev, the Vite plugin and the Vitest plugin, with the same API as a Workflow binding:const instance = await ctx.exports.MyWorkflow.create({ params: { name: "World" }, });ctx.exportsandworkflowsbindings with the same Workflownameshare their instances, including instances created before the Workflow was declared inexports. Two Workers can't export the same Workflow name, and a binding to an exported Workflow must refer to the Worker and class that export it.getPlatformProxy()ignores Workflows declared inexports, since it doesn't run the Worker's code.wrangler workflowscommands run with--localalso work with Workflows declared only inexports, without aworkflowsbinding.In the Vitest plugin,
introspectWorkflow()andintrospectWorkflowInstance()still need a Workflow binding, and now explain how to add one when passed a Workflow fromctx.exports. Instances created throughctx.exportsare introspected too. Aworkflowsbinding whosescript_nameis the Worker's own name now resolves to the Worker itself again.
Minor Changes
Support Workflows declared in
exportsonctx.exportsin local developmentA Workflow declared in a Worker's
exportsis now available onctx.exportsinwrangler dev, the Vite plugin and the Vitest plugin, with the same API as a Workflow binding:const instance = await ctx.exports.MyWorkflow.create({ params: { name: "World" }, });ctx.exportsandworkflowsbindings with the same Workflownameshare their instances, including instances created before the Workflow was declared inexports. Two Workers can't export the same Workflow name, and a binding to an exported Workflow must refer to the Worker and class that export it.getPlatformProxy()ignores Workflows declared inexports, since it doesn't run the Worker's code.wrangler workflowscommands run with--localalso work with Workflows declared only inexports, without aworkflowsbinding.In the Vitest plugin,
introspectWorkflow()andintrospectWorkflowInstance()still need a Workflow binding, and now explain how to add one when passed a Workflow fromctx.exports. Instances created throughctx.exportsare introspected too. Aworkflowsbinding whosescript_nameis the Worker's own name now resolves to the Worker itself again.
1.60.1 – 1.60.22 releases that only update dependenciesminiflare 5.20260925.0-alphawrangler 4.141.0Show each
1.60.0
24 Sep 2026Advertise Local Explorer scheduled invocations to headless agents
The Vite plugin's Local Explorer hint now documents how to invoke a Worker's scheduled handler and points agents to the OpenAPI schema for the complete request contract.
Minor Changes
Advertise Local Explorer scheduled invocations to headless agents
The Vite plugin's Local Explorer hint now documents how to invoke a Worker's scheduled handler and points agents to the OpenAPI schema for the complete request contract.
1.59.0
24 Sep 2026Allow framework commands to produce Preview Build Output with the experimental config
When
cf previews deployinvokes a framework build command, Preview intent is now preserved. Function-basedcloudflare.config.tsfiles receiveisPreview: true, and generated Build Output is marked as a Preview build.Standardize Zod validation error output
Format validation errors with Zod's built-in
prettifyError()helper so Miniflare, Wrangler, the Vite plugin, and the Vitest plugin show consistent messages and property paths.
Minor Changes
Allow framework commands to produce Preview Build Output with the experimental config
When
cf previews deployinvokes a framework build command, Preview intent is now preserved. Function-basedcloudflare.config.tsfiles receiveisPreview: true, and generated Build Output is marked as a Preview build.
Patch Changes
Standardize Zod validation error output
Format validation errors with Zod's built-in
prettifyError()helper so Miniflare, Wrangler, the Vite plugin, and the Vitest plugin show consistent messages and property paths.
1.58.0
23 Sep 2026Generate types during development and supported builds with Vite's
experimental.newConfigoption or Wrangler's--experimental-new-configflag (and--experimental-cf-build-outputfor builds)When Wrangler's
--experimental-new-configflag or Vite'sexperimental.newConfigoption is enabled, inferred configuration and runtime declarations are now kept in.cloudflare/types/index.d.ts. Vite refreshes them during development and production builds. Wrangler refreshes them during development and when building with both--experimental-new-configand--experimental-cf-build-output. In the experimentalwrangler.config.tsformat, thetypesoption is now top-level because it applies to both commands.Prepare the required egress sidecar for local Containers without configured images
Wrangler dev and Vite dev/preview now pull the required sidecar for Durable Object-managed Containers that select their application image at start time. Previously, these Containers failed to start unless the sidecar image was already cached in Docker.
Minor Changes
Generate types during development and supported builds with Vite's
experimental.newConfigoption or Wrangler's--experimental-new-configflag (and--experimental-cf-build-outputfor builds)When Wrangler's
--experimental-new-configflag or Vite'sexperimental.newConfigoption is enabled, inferred configuration and runtime declarations are now kept in.cloudflare/types/index.d.ts. Vite refreshes them during development and production builds. Wrangler refreshes them during development and when building with both--experimental-new-configand--experimental-cf-build-output. In the experimentalwrangler.config.tsformat, thetypesoption is now top-level because it applies to both commands.
Patch Changes
Prepare the required egress sidecar for local Containers without configured images
Wrangler dev and Vite dev/preview now pull the required sidecar for Durable Object-managed Containers that select their application image at start time. Previously, these Containers failed to start unless the sidecar image was already cached in Docker.
1.57.1 – 1.57.33 releases that only update dependencieswrangler 4.136.3miniflare 5.20260921.0-alpha@cloudflare/unenv-preset 2.16.2Show each
1.57.0
21 Sep 2026Identify experimental Build Output resource configs by filename and location
The root remains
config.json, Worker configs are nowworker.config.json, and Container configs are nowcontainer.config.json. Resource configs no longer contain top-leveltypediscriminators, while settings and build context are stored together in the root config.Define experimental Cloudflare configuration with a single default export
Experimental
cloudflare.config.tsfiles now define settings and resources together in a default-exporteddefineConfig()call. Add a Worker underworker, add Containers to thecontainersarray, or omit both to provide settings only.import * as entrypoint from "./src/index.ts" with { type: "cf-worker" }; export default defineConfig({ accountId: "...", complianceRegion: "public", worker: { name: "my-worker", compatibilityDate: "2026-09-18", entrypoint, }, });Allow local Container images without exposed ports
Wrangler and the Cloudflare Vite plugin no longer reject images that omit Docker
EXPOSEmetadata. Local Containers can run command-only workloads or serve traffic through workerd without declaring an unused image port.
Minor Changes
Identify experimental Build Output resource configs by filename and location
The root remains
config.json, Worker configs are nowworker.config.json, and Container configs are nowcontainer.config.json. Resource configs no longer contain top-leveltypediscriminators, while settings and build context are stored together in the root config.Define experimental Cloudflare configuration with a single default export
Experimental
cloudflare.config.tsfiles now define settings and resources together in a default-exporteddefineConfig()call. Add a Worker underworker, add Containers to thecontainersarray, or omit both to provide settings only.import * as entrypoint from "./src/index.ts" with { type: "cf-worker" }; export default defineConfig({ accountId: "...", complianceRegion: "public", worker: { name: "my-worker", compatibilityDate: "2026-09-18", entrypoint, }, });
Patch Changes
Allow local Container images without exposed ports
Wrangler and the Cloudflare Vite plugin no longer reject images that omit Docker
EXPOSEmetadata. Local Containers can run command-only workloads or serve traffic through workerd without declaring an unused image port.
1.56.0
18 Sep 2026Build Containers when emitting experimental Build Output
Wrangler and the Cloudflare Vite plugin now build Dockerfile-backed Container images when experimental Build Output is enabled. Container configs are emitted under
.cloudflare/output/v0/containerswith local image references, while existing registry references pass through unchanged.Evaluate Flagship flags locally during development
Flagship bindings now use the local Miniflare store by default in Wrangler and the Vite plugin, keeping development offline and isolated from production flags. Set
remote: trueon a binding to continue using its remote app.Use
wrangler flagship flags pull <APP_ID>to seed the store from a remote app. Flag management commands also accept--localto read and update the local store directly.Pass Preview intent to
defineWorkerand upload its resolved configurationPreview builds now evaluate programmatic Worker configuration with
ctx.isPreviewset totrueand record that intent in Build Output. The shared Preview uploader deploys the resolved bindings and settings while preserving configured Preview base values when it creates a Preview.
Minor Changes
Build Containers when emitting experimental Build Output
Wrangler and the Cloudflare Vite plugin now build Dockerfile-backed Container images when experimental Build Output is enabled. Container configs are emitted under
.cloudflare/output/v0/containerswith local image references, while existing registry references pass through unchanged.Evaluate Flagship flags locally during development
Flagship bindings now use the local Miniflare store by default in Wrangler and the Vite plugin, keeping development offline and isolated from production flags. Set
remote: trueon a binding to continue using its remote app.Use
wrangler flagship flags pull <APP_ID>to seed the store from a remote app. Flag management commands also accept--localto read and update the local store directly.Pass Preview intent to
defineWorkerand upload its resolved configurationPreview builds now evaluate programmatic Worker configuration with
ctx.isPreviewset totrueand record that intent in Build Output. The shared Preview uploader deploys the resolved bindings and settings while preserving configured Preview base values when it creates a Preview.
1.55.0
17 Sep 2026Support explicit named Container image selection in local development
The Vite plugin builds or pulls named images from Wrangler configuration and exposes their local tags through
ctx.container.images. Pass one of those references toctx.container.start({ image })to select the image.This extends the experimental Durable Object-managed Containers interface.
Minor Changes
Support explicit named Container image selection in local development
The Vite plugin builds or pulls named images from Wrangler configuration and exposes their local tags through
ctx.container.images. Pass one of those references toctx.container.start({ image })to select the image.This extends the experimental Durable Object-managed Containers interface.
1.54.11
16 Sep 2026Only updates dependencies:miniflare 5.20260916.0-alphawrangler 4.133.0
1.54.10
15 Sep 2026Sync Local Explorer endpoint lists across agent hints
The Local Explorer endpoint list is now consistent across the three places it appears: the AGENTS.md template in
create-cloudflare, the runtime agent hint inwrangler dev, and the Vite plugin agent hint. All three now include theobservability/clearendpoint, use the canonical/cdn-cgi/local/explorerpath, and have cross-reference comments pointing to each other.Improve over-limit
run_worker_firsterrors when duplicate rules are presentThe error now reports distinct and duplicate-entry counts and lists duplicated rules, making it clear when removing redundant entries can bring the configuration within the limit.
Too many `run_worker_first` rules were provided; 105 rules provided (99 distinct, 6 duplicate entries) exceeds max of 100. Note: duplicate entries count towards the route limit. Ensure that no duplicate rules are present in your `run_worker_first` configuration. The duplicated rules found are: - "/rule/0" - "/rule/1" - "/rule/2" - "/rule/3" - "/rule/4" ...and 1 more duplicated rule.
Patch Changes
Sync Local Explorer endpoint lists across agent hints
The Local Explorer endpoint list is now consistent across the three places it appears: the AGENTS.md template in
create-cloudflare, the runtime agent hint inwrangler dev, and the Vite plugin agent hint. All three now include theobservability/clearendpoint, use the canonical/cdn-cgi/local/explorerpath, and have cross-reference comments pointing to each other.Improve over-limit
run_worker_firsterrors when duplicate rules are presentThe error now reports distinct and duplicate-entry counts and lists duplicated rules, making it clear when removing redundant entries can bring the configuration within the limit.
Too many `run_worker_first` rules were provided; 105 rules provided (99 distinct, 6 duplicate entries) exceeds max of 100. Note: duplicate entries count towards the route limit. Ensure that no duplicate rules are present in your `run_worker_first` configuration. The duplicated rules found are: - "/rule/0" - "/rule/1" - "/rule/2" - "/rule/3" - "/rule/4" ...and 1 more duplicated rule.
1.54.9
14 Sep 2026Ignore
.wranglerpersistence writes in Vite's file watcherMiniflare stores local D1, KV, R2, and observability state under
.wrangler/state. Those writes were watched as source changes on Linux and Windows, which fired every pluginhotUpdatehook and could make page loads take seconds. The plugin now ignores**/.wrangler/**while preserving anyserver.watch.ignoredpatterns already set by the user.
Patch Changes
Ignore
.wranglerpersistence writes in Vite's file watcherMiniflare stores local D1, KV, R2, and observability state under
.wrangler/state. Those writes were watched as source changes on Linux and Windows, which fired every pluginhotUpdatehook and could make page loads take seconds. The plugin now ignores**/.wrangler/**while preserving anyserver.watch.ignoredpatterns already set by the user.
1.54.8
11 Sep 2026Only updates dependencies:wrangler 4.131.1miniflare 5.20260911.0-alpha
1.54.7
10 Sep 2026Prevent delayed internal errors from fetch-only remote bindings
Fetch-only remote bindings such as D1 and R2 previously opened an unused WebSocket RPC session. RPC sessions are now created only when an RPC method is called.
Patch Changes
Prevent delayed internal errors from fetch-only remote bindings
Fetch-only remote bindings such as D1 and R2 previously opened an unused WebSocket RPC session. RPC sessions are now created only when an RPC method is called.
1.54.6
8 Sep 2026Only updates dependencies:miniflare 5.20260908.0-alphawrangler 4.130.0
1.54.5
7 Sep 2026Preserve HTTP/2
:authorityheader and non-default port in dev server requestsWhen Vite runs over HTTPS with HTTP/2 enabled, browsers send authority via the
:authoritypseudo-header rather thanHost. Previously, pseudo-headers were omitted when creating Fetch requests, causing non-default ports to be dropped fromrequest.urlandX-Forwarded-Host. Authority and scheme are now preserved from HTTP/2 pseudo-headers and request properties.
Patch Changes
Preserve HTTP/2
:authorityheader and non-default port in dev server requestsWhen Vite runs over HTTPS with HTTP/2 enabled, browsers send authority via the
:authoritypseudo-header rather thanHost. Previously, pseudo-headers were omitted when creating Fetch requests, causing non-default ports to be dropped fromrequest.urlandX-Forwarded-Host. Authority and scheme are now preserved from HTTP/2 pseudo-headers and request properties.
1.54.4
3 Sep 2026Surface Worker export type fetch errors during development
The Vite plugin now reports the Worker name, HTTP status, and response body when fetching export types fails. This preserves the underlying error instead of replacing it with a JSON parsing error.
Patch Changes
Surface Worker export type fetch errors during development
The Vite plugin now reports the Worker name, HTTP status, and response body when fetching export types fails. This preserves the underlying error instead of replacing it with a JSON parsing error.
1.54.1 – 1.54.33 releases that only update dependencieswrangler 4.128.0miniflare 5.20260831.0-alphaShow each
1.54.0
25 Aug 2026Enable FUSE-capable local container development
Miniflare now automatically passes the Docker privileges needed for FUSE to local Durable Object containers when using local rootless Docker on Linux with
/dev/fuseavailable, or a local Docker engine on macOS or through WSL where Linux containers run in a VM. This applies to Wrangler, the Cloudflare Vite plugin, and direct Miniflare use.Record the selected mode in the Build Output Specification top-level
config.jsonThe mode a build was produced in is now written to
.cloudflare/output/v0/config.jsonas amodefield, alongside the account and compliance settings.
Minor Changes
Enable FUSE-capable local container development
Miniflare now automatically passes the Docker privileges needed for FUSE to local Durable Object containers when using local rootless Docker on Linux with
/dev/fuseavailable, or a local Docker engine on macOS or through WSL where Linux containers run in a VM. This applies to Wrangler, the Cloudflare Vite plugin, and direct Miniflare use.Record the selected mode in the Build Output Specification top-level
config.jsonThe mode a build was produced in is now written to
.cloudflare/output/v0/config.jsonas amodefield, alongside the account and compliance settings.
1.53.1
20 Aug 2026Only updates dependencies:wrangler 4.125.0miniflare 5.20260820.0-alpha
1.53.0
18 Aug 2026Allow containers to be attached to a Durable Object from its
exportsentryA container can now be linked to its Durable Object from the export side, using a new
containerfield that names an entry in thecontainersarray. As a resultcontainers.class_nameis now optional — a container that is referenced this way only needs aname:{ "name": "my-worker", "main": "worker.js", "compatibility_date": "2026-07-01", "containers": [ { "name": "my-container", "image": "./Dockerfile", "max_instances": 1 } ], "exports": { "MyContainerDO": { "type": "durable-object", "storage": "sqlite", "container": "my-container" } } }The existing
containers.class_namedirection keeps working and either direction may be used, but the two must agree: a container that names its Durable Object cannot also be claimed by a different one.containeris only valid on livedurable-objectexports (createdandexpecting-transfer) and requiresstorage: "sqlite". Wrangler now also reports an error when:That last case was previously accepted but could never work: workerd attaches a single container per Durable Object namespace, and in local development every container for a class builds into the same image tag, so one silently overwrote the other. If you have two containers on one
class_name, give each its own Durable Object class.Honor
access.devwhen running Workers with@cloudflare/vite-plugin, soctx.access.getIdentity()returns the configured identity.Handle Worker-side request body cancellation without surfacing stream controller errors in local dev.
Minor Changes
Allow containers to be attached to a Durable Object from its
exportsentryA container can now be linked to its Durable Object from the export side, using a new
containerfield that names an entry in thecontainersarray. As a resultcontainers.class_nameis now optional — a container that is referenced this way only needs aname:{ "name": "my-worker", "main": "worker.js", "compatibility_date": "2026-07-01", "containers": [ { "name": "my-container", "image": "./Dockerfile", "max_instances": 1 } ], "exports": { "MyContainerDO": { "type": "durable-object", "storage": "sqlite", "container": "my-container" } } }The existing
containers.class_namedirection keeps working and either direction may be used, but the two must agree: a container that names its Durable Object cannot also be claimed by a different one.containeris only valid on livedurable-objectexports (createdandexpecting-transfer) and requiresstorage: "sqlite". Wrangler now also reports an error when:a
containerreference names a container that does not existtwo Durable Object exports claim the same container
a container and a Durable Object export disagree about which one they are linked to
a container ends up linked to no Durable Object at all
two containers share a
namea container's
class_namenames a Durable Object whosestorageislegacy-kvtwo containers are attached to the same Durable Object
That last case was previously accepted but could never work: workerd attaches a single container per Durable Object namespace, and in local development every container for a class builds into the same image tag, so one silently overwrote the other. If you have two containers on one
class_name, give each its own Durable Object class.
Patch Changes
Honor
access.devwhen running Workers with@cloudflare/vite-plugin, soctx.access.getIdentity()returns the configured identity.Handle Worker-side request body cancellation without surfacing stream controller errors in local dev.
Use a fixed default compatibility date rather than the current date
When no compatibility date was set, Wrangler, C3 and the Vitest pool all defaulted to the current date.
workerdonly accepts a compatibility date up to 7 days beyond its own release, so whenever aworkerdrelease was delayed the default could get ahead of the runtime that had been installed, and local development would fail to start.The default is now fixed at the release date of the
workerdversion that ships with each release, which leaves a week of headroom and updates asworkerdis upgraded.@cloudflare/vite-pluginpreviously inlined the date at which it was built. It now shares the same default.Prevent date-enabled Node.js compatibility from adding conflicting globals to generated runtime types
Runtime type generation now treats Node.js compatibility enabled by a compatibility date the same way as an explicit
nodejs_compatflag. Node.js globals continue to come from@types/nodeinstead of being generated asanydeclarations that override those types.Use the FedRAMP High managed container registry when Wrangler targets the FedRAMP High compliance region
Container builds, pushes, deployments, image commands, and local development now select the corresponding production or staging FedRAMP registry and API from either
compliance_regionorCLOUDFLARE_COMPLIANCE_REGION.
1.52.1
13 Aug 2026Only updates dependencies:miniflare 5.20260811.1-alphawrangler 4.123.0
1.52.0
12 Aug 2026Detect Node.js compatibility from the compatibility date, now that
nodejs_compatis enabled by defaultAs of compatibility date
2026-08-04, workerd enables thenodejs_compatandnodejs_compat_v2compatibility flags by default. Previously these tools only treated Node.js compatibility as enabled when one of those flags was listed explicitly, so a Worker on a compatibility date of2026-08-04or later without the flag would get Node.js APIs from the runtime but no Node.js polyfills from the bundler, andprocess.envcould be substituted with an empty object at build time. They now resolve these flags the same way workerd does, and honourno_nodejs_compatto opt out.To keep Node.js compatibility switched off on a newer compatibility date, specify both
no_nodejs_compatandno_nodejs_compat_v2, since each flag has its own default.@cloudflare/vitest-pool-workersneedsnodejs_compat_v2for its own test runner, so it continues to override a project that opts out of it. On a compatibility date that enables the flag anyway, it now drops the opt-out rather than adding the flag back, which workerd would reject — previously this stopped such a project from running any tests at all.wrangler typesalso no longer attributes its@types/nodesuggestion to "thenodejs_compatflag", which it can now make for Workers that do not set the flag at all.Ignore a
nodejs_compatcompatibility flag that the compatibility date already enablesworkerd rejects a compatibility flag that its compatibility date enables by default, so a Worker configured with both a compatibility date of
2026-08-04or later andnodejs_compatfailed to start locally with "The compatibility flag nodejs_compat became the default as of 2026-08-04 so does not need to be specified anymore".The redundant
nodejs_compatandnodejs_compat_v2flags are now dropped when starting the runtime, which has no effect on the resulting Worker because the compatibility date enables both anyway.no_nodejs_compatandno_nodejs_compat_v2still switch Node.js compatibility off, and a flag specified alongside its own opt-out is left alone so that workerd still reports those as contradictory.
Minor Changes
Detect Node.js compatibility from the compatibility date, now that
nodejs_compatis enabled by defaultAs of compatibility date
2026-08-04, workerd enables thenodejs_compatandnodejs_compat_v2compatibility flags by default. Previously these tools only treated Node.js compatibility as enabled when one of those flags was listed explicitly, so a Worker on a compatibility date of2026-08-04or later without the flag would get Node.js APIs from the runtime but no Node.js polyfills from the bundler, andprocess.envcould be substituted with an empty object at build time. They now resolve these flags the same way workerd does, and honourno_nodejs_compatto opt out.To keep Node.js compatibility switched off on a newer compatibility date, specify both
no_nodejs_compatandno_nodejs_compat_v2, since each flag has its own default.@cloudflare/vitest-pool-workersneedsnodejs_compat_v2for its own test runner, so it continues to override a project that opts out of it. On a compatibility date that enables the flag anyway, it now drops the opt-out rather than adding the flag back, which workerd would reject — previously this stopped such a project from running any tests at all.wrangler typesalso no longer attributes its@types/nodesuggestion to "thenodejs_compatflag", which it can now make for Workers that do not set the flag at all.
Patch Changes
Ignore a
nodejs_compatcompatibility flag that the compatibility date already enablesworkerd rejects a compatibility flag that its compatibility date enables by default, so a Worker configured with both a compatibility date of
2026-08-04or later andnodejs_compatfailed to start locally with "The compatibility flag nodejs_compat became the default as of 2026-08-04 so does not need to be specified anymore".The redundant
nodejs_compatandnodejs_compat_v2flags are now dropped when starting the runtime, which has no effect on the resulting Worker because the compatibility date enables both anyway.no_nodejs_compatandno_nodejs_compat_v2still switch Node.js compatibility off, and a flag specified alongside its own opt-out is left alone so that workerd still reports those as contradictory.
1.51.3
11 Aug 2026Only updates dependencies:wrangler 4.121.0miniflare 5.20260804.1-alpha
1.51.2
10 Aug 2026Update dev and preview for Miniflare's config-based options
The Vite plugin now converts the Miniflare options it creates for dev and preview sessions to Miniflare's config-based
workersshape.Users should not expect to notice any changes.
Patch Changes
Update dev and preview for Miniflare's config-based options
The Vite plugin now converts the Miniflare options it creates for dev and preview sessions to Miniflare's config-based
workersshape.Users should not expect to notice any changes.
1.51.1
7 Aug 2026Cut the per-request cost of local observability capture
Every tail event was written to the trace store as its own Durable Object call, so a request paid two or three round-trips per span. On a module-heavy app under the Vite plugin that dominated dev request latency. Rows are now buffered and written in batches, taking a request from roughly thirty calls to three.
Work in progress still shows up as it happens: the root span is written immediately, console logs and exceptions as they arrive, and a span's completion is written on the next event once 100ms has passed. An invocation that goes completely quiet writes nothing further until it ends, since the flush is driven by tail events rather than a timer.
The Vite plugin's own router, asset and proxy workers are also no longer captured. Their traces were noise the Observability views already hid, and skipping them cuts the spans recorded per request — a side benefit being that a trace's root is now your Worker rather than
__router-worker__.
Patch Changes
Cut the per-request cost of local observability capture
Every tail event was written to the trace store as its own Durable Object call, so a request paid two or three round-trips per span. On a module-heavy app under the Vite plugin that dominated dev request latency. Rows are now buffered and written in batches, taking a request from roughly thirty calls to three.
Work in progress still shows up as it happens: the root span is written immediately, console logs and exceptions as they arrive, and a span's completion is written on the next event once 100ms has passed. An invocation that goes completely quiet writes nothing further until it ends, since the flush is driven by tail events rather than a timer.
The Vite plugin's own router, asset and proxy workers are also no longer captured. Their traces were noise the Observability views already hid, and skipping them cuts the spans recorded per request — a side benefit being that a trace's root is now your Worker rather than
__router-worker__.
1.51.0
5 Aug 2026Improve the Local Explorer's Observability views
console.logmessages now render the way the console would (JSON-encoded strings are unwrapped and multi-argument logs are joined), traces and events can be looked up by trace or span id from the search bar, and an event's "View trace" button jumps to the exact invocation that emitted it — even when a trace_id spans several invocations (e.g. a subrequest or self fetch).Surface Local Explorer API to headless agents
When a Vite dev or preview server with the Cloudflare plugin is started in a headless AI agent environment, the plugin now prints the Local Explorer API URL and useful resource routes to stdout so agents can discover and call them programmatically.
Minor Changes
Improve the Local Explorer's Observability views
console.logmessages now render the way the console would (JSON-encoded strings are unwrapped and multi-argument logs are joined), traces and events can be looked up by trace or span id from the search bar, and an event's "View trace" button jumps to the exact invocation that emitted it — even when a trace_id spans several invocations (e.g. a subrequest or self fetch).Surface Local Explorer API to headless agents
When a Vite dev or preview server with the Cloudflare plugin is started in a headless AI agent environment, the plugin now prints the Local Explorer API URL and useful resource routes to stdout so agents can discover and call them programmatically.
1.50.0
31 Jul 2026Enable local observability capture by default in dev
wrangler devand the Vite plugin now capture request traces and console logs into the Local Explorer's Observability tab out of the box — previously this was opt-in behindX_LOCAL_OBSERVABILITY=true. SetX_LOCAL_OBSERVABILITY=falseto opt out (for example if the extra per-worker collector/streaming-tail services cause trouble in a multi-process dev-registry setup).
Minor Changes
Enable local observability capture by default in dev
wrangler devand the Vite plugin now capture request traces and console logs into the Local Explorer's Observability tab out of the box — previously this was opt-in behindX_LOCAL_OBSERVABILITY=true. SetX_LOCAL_OBSERVABILITY=falseto opt out (for example if the extra per-worker collector/streaming-tail services cause trouble in a multi-process dev-registry setup).
1.49.1
31 Jul 2026Rewrite local testing paths (
/cdn-cgi/*)Miniflare v5 moved its internal local testing endpoints to
/cdn-cgi/local/*(and/__cf_local/*for endpoints that must remain reachable over tunnels) to prevent any potential collision with production routes.wrangler devand the Vite plugin now transparently rewrite the old paths to the new ones, meaning you can continue to use the old paths without issue.These are the new paths:
Patch Changes
Rewrite local testing paths (
/cdn-cgi/*)Miniflare v5 moved its internal local testing endpoints to
/cdn-cgi/local/*(and/__cf_local/*for endpoints that must remain reachable over tunnels) to prevent any potential collision with production routes.wrangler devand the Vite plugin now transparently rewrite the old paths to the new ones, meaning you can continue to use the old paths without issue.These are the new paths:
/cdn-cgi/handler/scheduled→/cdn-cgi/local/scheduled/cdn-cgi/handler/email→/cdn-cgi/local/email/cdn-cgi/explorer/*→/cdn-cgi/local/explorer/*/cdn-cgi/mf/scheduled→/cdn-cgi/local/scheduled(Note/cdn-cgi/mf/scheduledis already deprecated)/cdn-cgi/mf/stream/*→/__cf_local/stream/*/cdn-cgi/mf/imagedelivery/*→/__cf_local/imagedelivery/*
1.49.0
30 Jul 2026The experimental build output directory now includes the Worker's configuration at
.cloudflare/output/v0/workers/default/config.jsoninstead of.cloudflare/output/v0/workers/<worker-name>/worker.config.json
Minor Changes
The experimental build output directory now includes the Worker's configuration at
.cloudflare/output/v0/workers/default/config.jsoninstead of.cloudflare/output/v0/workers/<worker-name>/worker.config.json
1.48.0
28 Jul 2026Serve the bundled client HTML in dev when Vite's
experimental.bundledDevis enabledNote that this feature is experimental and subject to change.
Destroy the client socket instead of crashing when a WebSocket upgrade fails
If
dispatchFetchrejected while a WebSocket upgrade was still in flight (for example when Miniflare is disposed during a dev server shutdown or restart), the error escaped theasyncupgrade handler as an unhandled rejection. This could terminate the dev server process and leaked the client socket. The upgrade handler now catches such failures and tears the socket down cleanly.Fix compatibility with Vite's
experimental.bundledDevoption. Keep Miniflare, containers, and tunnels alive when a build runs in dev.The plugin used the
buildEndhook as its signal that the dev server was closing, and tore down its dev resources there. Vite'sexperimental.bundledDevruns a build pass duringserve, which firesbuildEndwhile the dev server is still live — so Miniflare was disposed (the next request failed withExpected \miniflare` to be defined`), locally-built container images were removed, and any active tunnel was closed, all mid-serve.During
serve, these resources are now torn down from a patchedserver.close. We will replace server patching with first-class APIs when they are added to Vite.
Minor Changes
Serve the bundled client HTML in dev when Vite's
experimental.bundledDevis enabledNote that this feature is experimental and subject to change.
Patch Changes
Destroy the client socket instead of crashing when a WebSocket upgrade fails
If
dispatchFetchrejected while a WebSocket upgrade was still in flight (for example when Miniflare is disposed during a dev server shutdown or restart), the error escaped theasyncupgrade handler as an unhandled rejection. This could terminate the dev server process and leaked the client socket. The upgrade handler now catches such failures and tears the socket down cleanly.Fix compatibility with Vite's
experimental.bundledDevoption. Keep Miniflare, containers, and tunnels alive when a build runs in dev.The plugin used the
buildEndhook as its signal that the dev server was closing, and tore down its dev resources there. Vite'sexperimental.bundledDevruns a build pass duringserve, which firesbuildEndwhile the dev server is still live — so Miniflare was disposed (the next request failed withExpected \miniflare` to be defined`), locally-built container images were removed, and any active tunnel was closed, all mid-serve.During
serve, these resources are now torn down from a patchedserver.close. We will replace server patching with first-class APIs when they are added to Vite.Retry transient module-transport failures in the runner worker
Each
fetchModuleinvoke was a single fetch to the dev server with no retry. If that one fetch failed transiently (e.g.Network connection lostwhen workerd reuses a loopback connection that Node just closed), Vite's module runner cached the rejection and every request importing the affected module failed for the rest of the dev session. The invoke is an idempotent request for module code, so retry it up to three times before giving up.
1.47.0
23 Jul 2026Add local-dev observability
wrangler devand the Vite plugin now capture a trace for every local Worker invocation - spans, logs, andconsole.*output, including requests that cross worker or Durable Object boundaries.You can explore this data two ways:
While this is in testing it's off by default; set
X_LOCAL_OBSERVABILITY=trueto turn it on. It will be on by default in the public release.Recover local development after the Workers runtime crashes
Previously, an unexpected workerd crash left Miniflare running but unable to serve subsequent requests. Miniflare now restarts workerd after post-startup crashes, while continuing to surface startup crashes as fatal errors.
The Cloudflare Vite plugin also restarts the Vite development server after workerd recovers so its environments, hot channels, and module runners are recreated.
Minor Changes
Add local-dev observability
wrangler devand the Vite plugin now capture a trace for every local Worker invocation - spans, logs, andconsole.*output, including requests that cross worker or Durable Object boundaries.You can explore this data two ways:
A new Observability tab in the Local Explorer, with a Traces view (recent invocations, an inline timeline waterfall, and filters) and an Events view.
A read-only SQL endpoint at
/cdn-cgi/explorer/api/local/observability/query, discoverable via the Local Explorer's OpenAPI document, so coding agents and tools can query the samespansandlogstables.
While this is in testing it's off by default; set
X_LOCAL_OBSERVABILITY=trueto turn it on. It will be on by default in the public release.
Patch Changes
Recover local development after the Workers runtime crashes
Previously, an unexpected workerd crash left Miniflare running but unable to serve subsequent requests. Miniflare now restarts workerd after post-startup crashes, while continuing to surface startup crashes as fatal errors.
The Cloudflare Vite plugin also restarts the Vite development server after workerd recovers so its environments, hot channels, and module runners are recreated.
1.46.0
21 Jul 2026Reading the note…
1.45.1
17 Jul 2026Reading the note…
1.45.0
15 Jul 2026Reading the note…