#13051 d5bffde Thanks @dario-piotrowicz! - Use today's date as the default compatibility date
Previously, when generating a compatibility date for new projects or when no compatibility date was configured, the date was resolved by loading the locally installed workerd package via miniflare. This approach was unreliable in some package manager environments (notably pnpm). The logic now simply uses today's date instead, which is always correct and works reliably across all environments.
#13051 d5bffde Thanks @dario-piotrowicz! - Deprecate supportedCompatibilityDate export
The supportedCompatibilityDate export is now deprecated. Instead of relying on the workerd-derived compatibility date, callers should just use today's date directly, e.g. new Date().toISOString().slice(0, 10).
#13011 b9b7e9d Thanks @ruifigueira! - Add experimental headful browser rendering support for local development
Experimental: This feature may be removed or changed without notice.
When developing locally with the Browser Rendering API, you can enable headful (visible) mode via the X_BROWSER_HEADFUL environment variable to see the browser while debugging:
X_BROWSER_HEADFUL=true wrangler dev
X_BROWSER_HEADFUL=true vite dev
Note: when using @cloudflare/playwright, two Chrome windows may appear — the initial blank page and the one created by browser.newPage(). This is expected behavior due to how Playwright handles browser contexts via CDP.
#12992 48d83ca Thanks @RiscadoA! - Add vpc_networks binding support for routing Worker traffic through a Cloudflare Tunnel or network.
{
"vpc_networks": [
// Route through a specific Cloudflare Tunnel
{ "binding": "MY_FIRST_VPC", "tunnel_id": "<tunnel-id>" },
// Route through the Cloudflare One mesh network
{ "binding": "MY_SECOND_VPC", "network_id": "cf1:network" }
]
}
#13155 5d29055 Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| workerd | 1.20260329.1 | 1.20260331.1 |
#13162 fb67a18 Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| workerd | 1.20260331.1 | 1.20260401.1 |
#13238 b2f53ea Thanks @guybedford! - Fix source phase imports parsing in Miniflare
Miniflare now uses the acorn-import-phases plugin to parse import source syntax when analyzing module dependencies. This fixes ERR_MODULE_PARSE errors when running Workers that use source phase imports for WebAssembly modules in local development.
#13011 b9b7e9d Thanks @ruifigueira! - Add experimental headful browser rendering support for local development
Experimental: This feature may be removed or changed without notice.
When developing locally with the Browser Rendering API, you can enable headful (visible) mode via the X_BROWSER_HEADFUL environment variable to see the browser while debugging:
X_BROWSER_HEADFUL=true wrangler dev
X_BROWSER_HEADFUL=true vite dev
Note: when using @cloudflare/playwright, two Chrome windows may appear — the initial blank page and the one created by browser.newPage(). This is expected behavior due to how Playwright handles browser contexts via CDP.
#13051 d5bffde Thanks @dario-piotrowicz! - Remove formatCompatibilityDate from the package's public exports
This utility has been removed from the public API. Callers should use getTodaysCompatDate() from @cloudflare/workers-utils instead.
#13051 d5bffde Thanks @dario-piotrowicz! - Remove getLocalWorkerdCompatibilityDate from the package
This utility has been removed because its implementation besides being unreliable is no longer needed. Callers should now use today's date as the compatibility date directly, e.g. via getTodaysCompatDate() from @cloudflare/workers-utils.
#12992 48d83ca Thanks @RiscadoA! - Add vpc_networks binding support for routing Worker traffic through a Cloudflare Tunnel or network.
{
"vpc_networks": [
// Route through a specific Cloudflare Tunnel
{ "binding": "MY_FIRST_VPC", "tunnel_id": "<tunnel-id>" },
// Route through the Cloudflare One mesh network
{ "binding": "MY_SECOND_VPC", "network_id": "cf1:network" }
]
}
#13051 d5bffde Thanks @dario-piotrowicz! - Add getTodaysCompatDate() utility function
Returns today's date as a YYYY-MM-DD string.
#13151 9c4035b Thanks @G4brym! - Add type generation for AI Search bindings
Running wrangler types now generates AiSearchNamespace and AiSearchInstance types for ai_search_namespaces and ai_search config bindings respectively. Both simple and per-environment modes are supported.
// wrangler.json
{
"ai_search_namespaces": [
{ "binding": "AI_SEARCH", "namespace": "production" }
],
"ai_search": [
{ "binding": "BLOG_SEARCH", "instance_name": "cloudflare-blog" }
]
}
// Generated by `wrangler types`
interface Env {
AI_SEARCH: AiSearchNamespace;
BLOG_SEARCH: AiSearchInstance;
}
#13011 b9b7e9d Thanks @ruifigueira! - Add experimental headful browser rendering support for local development
Experimental: This feature may be removed or changed without notice.
When developing locally with the Browser Rendering API, you can enable headful (visible) mode via the X_BROWSER_HEADFUL environment variable to see the browser while debugging:
X_BROWSER_HEADFUL=true wrangler dev
X_BROWSER_HEADFUL=true vite dev
Note: when using @cloudflare/playwright, two Chrome windows may appear — the initial blank page and the one created by browser.newPage(). This is expected behavior due to how Playwright handles browser contexts via CDP.
#12992 48d83ca Thanks @RiscadoA! - Add vpc_networks binding support for routing Worker traffic through a Cloudflare Tunnel or network.
{
"vpc_networks": [
// Route through a specific Cloudflare Tunnel
{ "binding": "MY_FIRST_VPC", "tunnel_id": "<tunnel-id>" },
// Route through the Cloudflare One mesh network
{ "binding": "MY_SECOND_VPC", "network_id": "cf1:network" }
]
}
#13155 5d29055 Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| workerd | 1.20260329.1 | 1.20260331.1 |
#13162 fb67a18 Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| workerd | 1.20260331.1 | 1.20260401.1 |
#13136 ab44870 Thanks @petebacondarwin! - Display build errors for auxiliary workers in multi-worker mode
Previously, when running wrangler dev with multiple -c config flags (multi-worker mode), build errors from auxiliary/secondary workers were only logged at debug level, causing Wrangler to silently hang. Build errors from all workers are now displayed at error level so you can see what went wrong and fix it.
#12992 48d83ca Thanks @RiscadoA! - Fix remote proxy worker not catching errors thrown by bindings during wrangler dev
#13238 b2f53ea Thanks @guybedford! - Fix source phase imports in bundled and non-bundled Workers
Wrangler now preserves import source syntax when it runs esbuild, including module format detection and bundled deploy output. This fixes both --no-bundle and bundled deployments for Workers that import WebAssembly using source phase imports.
#10126 14e72eb Thanks @nekoze1210! - fix: Sort D1 migration files to ensure consistent chronological ordering
wrangler d1 migrations list and wrangler d1 migrations apply previously returned migration files in an order dependent on the filesystem, which could vary across operating systems. Migration filenames are now sorted alphabetically before being returned, ensuring consistent chronological ordering.
#13150 4dc94fd Thanks @dario-piotrowicz! - Polish Cloudflare Vite plugin installation during autoconfig
Projects using Vite 6.0.x were rejected by auto-configuration because the minimum supported version was set to 6.1.0 (the @cloudflare/vite-plugin peer dependency). The minimum version check is now 6.0.0, and when a project has Vite in the [6.0.0, 6.1.0) range, auto-configuration will automatically upgrade it to the latest 6.x before installing @cloudflare/vite-plugin.
#13051 d5bffde Thanks @dario-piotrowicz! - Use today's date as the default compatibility date
Previously, when generating a compatibility date for new projects or when no compatibility date was configured, the date was resolved by loading the locally installed workerd package via miniflare. This approach was unreliable in some package manager environments (notably pnpm). The logic now simply uses today's date instead, which is always correct and works reliably across all environments.
Updated dependencies [5d29055, fb67a18, d5bffde, b9b7e9d, b2f53ea, 48d83ca]:
#13131 65acf66 Thanks @dario-piotrowicz! - Use miniflare's handleStructuredLogs option instead of handleRuntimeStdio for processing workerd output
Previously, vitest-pool-workers manually processed raw stdout/stderr streams from the workerd runtime via handleRuntimeStdio, with its own filtering of known noisy messages (e.g. LLVM symbolizer warnings). This switches to miniflare's handleStructuredLogs option, which parses workerd's structured JSON log output and automatically filters known unhelpful messages. This aligns with how both wrangler and vite-plugin-cloudflare handle workerd logs.
Updated dependencies [9c4035b, 5d29055, fb67a18, d5bffde, ab44870, 48d83ca, b2f53ea, b9b7e9d, 14e72eb, 4dc94fd, b2f53ea, d5bffde, 48d83ca]:
#13144 db60b94 Thanks @dario-piotrowicz! - Add gitignore helpers for appending Wrangler-related entries
New maybeAppendWranglerToGitIgnore and maybeAppendWranglerToGitIgnoreLikeFile functions that automatically append Wrangler-related entries (.wrangler, .dev.vars*, .env*, and their negated example patterns) to .gitignore or similar ignore files. Existing entries are detected and skipped to avoid duplicates.
#13106 c8c44a7 Thanks @dependabot! - Update dependencies of "create-cloudflare"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| create-react-router | 7.13.1 | 7.13.2 |
#13107 687f144 Thanks @dependabot! - Update dependencies of "create-cloudflare"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| create-astro | 5.0.3 | 5.0.4 |
#13108 3a8a24c Thanks @dependabot! - Update dependencies of "create-cloudflare"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| @angular/create | 21.2.3 | 21.2.5 |
#13109 9deba25 Thanks @dependabot! - Update dependencies of "create-cloudflare"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| create-waku | 0.12.5-1.0.0-alpha.5-0 | 0.12.5-1.0.0-alpha.6-0 |
#13110 71059be Thanks @dependabot! - Update dependencies of "create-cloudflare"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| create-vue | 3.22.0 | 3.22.1 |
#13111 f214760 Thanks @dependabot! - Add missing connect key to WorkerEntrypoint and DurableObject key lists in the runner worker
The connect method was added to the WorkerEntrypoint and DurableObject types in workerd 1.20260329.1 but was missing from the WORKER_ENTRYPOINT_KEYS and DURABLE_OBJECT_KEYS arrays used for RPC property access in the Vite plugin runner worker. This caused the compile-time exhaustiveness check to fail with the updated workers-types.
Updated dependencies [ffbc268, 9eff028, ed20a9b, f214760, 746858a, 9aad27f, 1fc5518, b539dc7, 9282493, a532eea, cd0e971, d4c6158, 2565b1d]:
#13105 ff41b07 Thanks @petebacondarwin! - fix: resolve TypeError: createRenderer is not a function when built with Vite 8
Vite 8 switched its bundler from Rollup to rolldown. The @cloudflare/style-provider package ships a hybrid ESM+CJS build (its es/ directory uses require() internally), which rolldown mishandles by generating an anonymous, unreachable module initializer — leaving createRenderer as undefined at runtime.
Fixed by aliasing @cloudflare/style-provider to its CJS entry (lib/index.js) in vite.config.ts. Rolldown handles plain CJS correctly via its interop layer.
#13025 9eff028 Thanks @ruifigueira! - Add missing devtools endpoints to browser rendering local binding.
The local browser rendering binding now implements the full set of devtools endpoints, matching the remote Browser Rendering API:
GET /v1/limits — returns local concurrency defaultsGET /v1/history — returns empty array (no persistence in local dev)GET /v1/devtools/session - list and inspect active sessionsGET /v1/devtools/session/:id — list and inspect active sessionGET /v1/devtools/browser/:id/json/version — Browser version metadata, includes webSocketDebuggerUrlGET /v1/devtools/browser/:id/json/list — A list of all available websocket targetsGET /v1/devtools/browser/:id/json — Alias for GET /v1/devtools/browser/:id/jsonGET /v1/devtools/browser/:id/json/protocol — The current devtools protocol, as JSON. Includes webSocketDebuggerUrl and devtoolsFrontendUrlPUT /v1/devtools/browser/:id/json/new — Opens a new tab. Responds with the websocket target data for the new tabGET /v1/devtools/browser/:id/json/activate/:target — Brings a page into the foreground (activate a tab)GET /v1/devtools/browser/:id/json/close/:target — Closes the target page identified by targetIdGET /v1/devtools/browser/:id/page/:target — WebSocket connection to a page targetGET /v1/devtools/browser/:id — WebSocket connection to a previously acquired browser sessionDELETE /v1/devtools/browser/:id — Closes a browser sessionPOST /v1/devtools/browser — Acquires a new sessionGET /v1/devtools/browser — Acquire a new session and connect via WebSocket in one step, returning cf-browser-session-id header#13086 d4c6158 Thanks @pombosilva! - Add Workflows support to the local explorer UI.
The local explorer (/cdn-cgi/explorer/) now includes a full Workflows dashboard for viewing and managing workflow instances during local development.
UI features:
#13111 f214760 Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| workerd | 1.20260317.1 | 1.20260329.1 |
#13078 9282493 Thanks @penalosa! - Fix noisy EBUSY errors on Windows when disposing Miniflare instances
On Windows, workerd may not release file handles immediately after disposal, causing EBUSY errors when Miniflare tries to remove its temporary directory during dispose(). Previously, this error propagated to the caller (e.g. vitest-pool-workers), producing repeated noisy error messages in test output. The cleanup is now best-effort — matching the existing exit hook behaviour — since the temporary directory lives in os.tmpdir() and will be cleaned up by the OS.
#13090 a532eea Thanks @edmundhung! - Remove LOCAL_EXPLORER_BASE_PATH and LOCAL_EXPLORER_API_PATH constants in favor of CorePaths.EXPLORER
These were redundant aliases introduced before CorePaths was centralized. All internal consumers now use CorePaths.EXPLORER directly.
#12858 f05f2da Thanks @repository! - Add disableRetryDelays() to WorkflowInstanceModifier to skip retry backoff delays in tests
When testing Workflows with retry configurations, the backoff delays between retry attempts of a failing step.do() caused real wall-clock waiting (e.g., 35 seconds for 3 retries with 5-second exponential backoff), even when step results were fully mocked. The new disableRetryDelays() method eliminates these delays while preserving retry behavior — all attempts still execute, just without waiting between them.
#13091 6d58f0f Thanks @penalosa! - Use today's date for the RTTI compat date query instead of a hardcoded "2023-12-01", so newly added Node.js builtin modules are recognized by the module fallback service.
#13070 cdb9c88 Thanks @penalosa! - Suppress CODE_MOVED for unknown code block log spam from workerd
These are internal workerd diagnostic messages not relevant to application developers. Miniflare's structured log handler already filters them, but vitest-pool-workers uses a custom handleRuntimeStdio that bypasses that pipeline. This adds the pattern to the pool's own ignore list.
#13069 6d0e329 Thanks @penalosa! - fix: suppress outputGateBroken stderr noise when testing Workflows
#13075 b8df076 Thanks @penalosa! - Support @voidzero-dev/vite-plus-test as an alternative to vitest
Users running tests via Vite+ (@voidzero-dev/vite-plus-test) with the recommended pnpm overrides no longer hit spurious version warnings or Disallowed operation called within global scope errors.
Updated dependencies [ffbc268, 9eff028, ed20a9b, f214760, 746858a, 9aad27f, 1fc5518, b539dc7, 9282493, a532eea, cd0e971, d4c6158, 2565b1d]:
#13086 d4c6158 Thanks @pombosilva! - Add Workflows support to the local explorer UI.
The local explorer (/cdn-cgi/explorer/) now includes a full Workflows dashboard for viewing and managing workflow instances during local development.
UI features:
#12868 ffbc268 Thanks @danielgek! - Add wrangler ai-search command namespace for managing Cloudflare AI Search instances
Introduces a CLI surface for the Cloudflare AI Search API (open beta), including:
ai-search list, create, get, update, deleteai-search search with repeatable --filter key=value flagsai-search statsThe create command uses an interactive wizard to guide configuration. All commands require authentication via wrangler login.
#13097 cd0e971 Thanks @pombosilva! - Add --local flag to Workflows commands for interacting with local dev
All Workflows CLI commands now support a --local flag that targets a running wrangler dev session instead of the Cloudflare production API. This uses the /cdn-cgi/explorer/api/workflows endpoints served by the local dev server.
wrangler workflows list --local
wrangler workflows trigger my-workflow '{"key":"value"}' --local
wrangler workflows instances describe my-workflow latest --local
wrangler workflows instances pause my-workflow <id> --local --port 9000
By default, commands continue to hit remote (production). Pass --local to opt in, and optionally --port to specify a custom dev server port (defaults to 8787).
#13050 ed20a9b Thanks @dario-piotrowicz! - Add minimum and maximum version checks for frameworks during auto-configuration
When Wrangler automatically configures a project, it now validates the installed version of the detected framework before proceeding:
#13111 f214760 Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"
The following dependency versions have been updated:
| Dependency | From | To |
|---|---|---|
| workerd | 1.20260317.1 | 1.20260329.1 |
#13079 746858a Thanks @penalosa! - Fix getPlatformProxy and unstable_getMiniflareWorkerOptions crashing when assets is configured without a directory
getPlatformProxy and unstable_getMiniflareWorkerOptions now skip asset setup when the config has an assets block but no directory — instead of throwing "missing required directory property". This happens when an external tool like @cloudflare/vite-plugin handles asset serving independently.
#13112 9aad27f Thanks @dario-piotrowicz! - Fix autoconfig failing on waku projects that use hono
Waku has a tight integration with Hono, causing both to be detected simultaneously and triggering a "multiple frameworks found" error. Hono is now filtered out when Waku is also detected.
#13113 1fc5518 Thanks @dario-piotrowicz! - Skip lock file warning for static projects during autoconfig
Previously, running autoconfig on a static project (one with no framework detected) would emit a misleading warning about a missing lock file, suggesting the project might be in a workspace. Since static projects don't require a lock file, this warning is now suppressed for them.
#13072 b539dc7 Thanks @jbwcloudflare! - Skip unnecessary GET /versions?deployable=true API call in wrangler versions deploy when all version IDs are explicitly provided and --yes is passed
When deploying a specific version non-interactively (e.g. wrangler versions deploy <id> --yes), Wrangler previously always fetched the full list of deployable versions to populate the interactive selection prompt — even though the prompt is skipped entirely when --yes is used and all versions are already specified. The deployable-versions list is now only fetched when actually needed (i.e. when no version IDs are provided, or when running interactively).
#13115 2565b1d Thanks @dario-piotrowicz! - Improve error message when the assets directory path points to a file instead of a directory
Previously, if the path provided as the assets directory (via --assets flag or assets.directory config) pointed to an existing file rather than a directory, Wrangler would throw an unhelpful ENOTDIR system error when trying to read the _redirects file inside it. Now Wrangler detects this condition earlier and throws a clear user error.
Updated dependencies [9eff028, f214760, 9282493, a532eea, d4c6158]:
#13068 e631a94 Thanks @dario-piotrowicz! - Add runCommand and quoteShellArgs, installPackages and installWrangler utilities to @cloudflare/cli/command
These utilities are now available from @cloudflare/cli as dedicated sub-path exports: runCommand and quoteShellArgs via @cloudflare/cli/command, and installPackages and installWrangler via @cloudflare/cli/packages. This makes them reusable across packages in the SDK without duplication.
#13102 e200179 Thanks @dario-piotrowicz! - First release of new package
Add @cloudflare/codemod package with internal AST-based codemod utilities (parseJs, parseTs, parseFile, transformFile, mergeObjectProperties) built on recast.
#12953 80b093e Thanks @jamesopstad! - Fix Cannot perform I/O on behalf of a different request errors for deferred dynamic imports
Concurrent requests that loaded the same dynamic import were previously sharing the same promise to resolve it in a Worker context. We now ensure that all imports execute within a Durable Object's IoContext before the result is returned to the Worker.
Updated dependencies [eeaa473, 9fcdfca, bc24ec8, 1faff35, 0b4c21a, 535582d, 992f9a3, f4ea4ac, 91b7f73, f6cdab2, 53ed15a, ce65246, 7a5be20, 6b50bfa, 0386553, 9c5ebf5, 53ed15a, 53ed15a]:
#13049 7a5be20 Thanks @nikitassharma! - add library-push flag to containers registries credentials
This flag is not available for public use.