releases.shpreview
Cloudflare/Workers SDK

Workers SDK

$npx -y @buildinternet/releases show cloudflare-workers-sdk
Mon
Wed
Fri
AprMayJunJulAugSepOctNovDecJanFebMarApr
Less
More
Releases247Avg81/moVersions@cloudflare/vite-plugin@1.21.1 → wrangler@4.83.0
Mar 27, 2026

Minor Changes

  • #12964 e0831c6 Thanks @ryanking13! - Update dependencies in Python workers templates

    The workers-runtime-sdk library is added as a dev dependency and the webtypy is removed as a dependency.

Minor Changes

  • #13027 9fcdfca Thanks @G4brym! - feat: Add ai_search_namespaces and ai_search binding types

    Two new binding types for AI Search:

    • ai_search_namespaces: Namespace binding — namespace is required and auto-provisioned at deploy time if it doesn't exist (like R2 buckets)
    • ai_search: Single instance binding bound directly to a pre-existing instance in the default namespace

    Both are remote-only in local dev.

  • #13030 0386553 Thanks @natewong1313! - Add local mode support for Stream bindings

    Miniflare and wrangler dev now support using Cloudflare Stream bindings locally.

    Supported operations:

    • upload() — upload video via URL
    • video(id).details(), .update(), .delete(), .generateToken()
    • videos.list()
    • captions.generate(), .list(), .delete()
    • downloads.generate(), .get(), .delete()
    • watermarks.generate(), .list(), .get(), .delete()

    The following are not yet supported in local mode and will throw:

    • createDirectUpload()
    • Caption upload via File
    • Watermark generation via File

    Data is persisted across restarts by default. You must set streamPersist: false in Miniflare options to disable persistence.

Patch Changes

  • #12686 1faff35 Thanks @edmundhung! - Move internal proxy endpoint to reserved /cdn-cgi/ path

    The internal HTTP endpoint used by getPlatformProxy has been moved to a reserved path. This is an internal change with no impact on the getPlatformProxy API.

  • #13080 f4ea4ac Thanks @penalosa! - fix: glob patterns for module rules no longer match double-extension filenames like foo.wasm.js

    Previously, the globsToRegExps helper compiled glob patterns without a trailing $ anchor. This caused patterns like **/*.wasm to match any path containing .wasm as a substring — including filenames such as foo.wasm.js or main.wasm.test.ts.

    When using @cloudflare/vitest-pool-workers with a wrangler.configPath, Wrangler's default CompiledWasm module rule (**/*.wasm) was silently applied to test files whose names contained .wasm, causing them to be loaded as WebAssembly binaries instead of JavaScript and failing at runtime.

    The fix restores the $ end anchor in the compiled regex so that **/*.wasm only matches paths that literally end in .wasm, while the leading ^ remains absent to allow matching anywhere within an absolute path.

Patch Changes

  • #13077 11c77b7 Thanks @penalosa! - fix: runInDurableObject now correctly returns redirect responses (3xx) from Durable Object callbacks instead of throwing "Expected callback for X" errors

  • #13056 8384743 Thanks @penalosa! - fix: Support dynamic import() inside entrypoint and Durable Object handlers

    Previously, calling exports.default.fetch() or SELF.fetch() on a worker whose handler used a dynamic import() would hang and fail with "Cannot perform I/O on behalf of a different Durable Object". This happened because the module runner's transport — which communicates over a WebSocket owned by the runner Durable Object — was invoked from a different DO context.

    The fix patches the module runner's transport via the onModuleRunner hook so that all invoke() calls are routed through the runner DO's I/O context, regardless of where the import() originates.

  • #13074 4618c05 Thanks @penalosa! - fix: only apply module fallback extension probing for require(), not import

    The module fallback service previously tried adding .js, .mjs, .cjs, and .json suffixes to extensionless specifiers unconditionally. Per the Node.js spec, this extension-probing behaviour is specific to CommonJS require(). ESM import statements must include explicit file extensions.

    Extension-less TypeScript import specifiers continue to work correctly — they are resolved by Vite's resolver rather than the fallback's extension loop.

  • #13073 baec845 Thanks @penalosa! - Add adminSecretsStore() to cloudflare:test for seeding secrets in tests

    Secrets store bindings only expose a read-only .get() method, so there was previously no way to seed secret values from within a test. The new adminSecretsStore() helper returns Miniflare's admin API for a secrets store binding, giving tests full control over create, update, and delete operations.

    import { adminSecretsStore } from "cloudflare:test";
    import { env } from "cloudflare:workers";
    
    const admin = adminSecretsStore(env.MY_SECRET);
    await admin.create("test-value");
    
    const value = await env.MY_SECRET.get(); // "test-value"
  • #13083 cfd513f Thanks @penalosa! - Add a 30-second timeout to waitUntil promise draining to prevent hanging tests

    Previously, if a ctx.waitUntil() promise never resolved, the test suite would hang indefinitely after the test file finished. Now, any waitUntil promises that haven't settled within 30 seconds are abandoned with a warning, allowing the test suite to continue. This aligns with the production waitUntil limit.

  • Updated dependencies [eeaa473, 9fcdfca, bc24ec8, 1faff35, 0b4c21a, 535582d, 992f9a3, f4ea4ac, 91b7f73, f6cdab2, 53ed15a, ce65246, 7a5be20, 6b50bfa, 0386553, 9c5ebf5, 53ed15a, 53ed15a]:

    • wrangler@4.78.0
    • miniflare@4.20260317.3

Minor Changes

  • #13031 eeaa473 Thanks @WalshyDev! - Add support for Cloudflare Access Service Token authentication via environment variables

    When running wrangler dev with remote bindings behind a Cloudflare Access-protected domain, Wrangler previously required cloudflared access login which opens a browser for interactive authentication. This does not work in CI/CD environments.

    You can now set the CLOUDFLARE_ACCESS_CLIENT_ID and CLOUDFLARE_ACCESS_CLIENT_SECRET environment variables to authenticate using an Access Service Token instead:

    export CLOUDFLARE_ACCESS_CLIENT_ID="<your-client-id>.access"
    export CLOUDFLARE_ACCESS_CLIENT_SECRET="<your-client-secret>"
    wrangler dev

    Additionally, when running in a non-interactive environment (CI) without these credentials, Wrangler now throws a clear, actionable error instead of hanging on cloudflared access login.

  • #13027 9fcdfca Thanks @G4brym! - feat: Add ai_search_namespaces and ai_search binding types

    Two new binding types for AI Search:

    • ai_search_namespaces: Namespace binding — namespace is required and auto-provisioned at deploy time if it doesn't exist (like R2 buckets)
    • ai_search: Single instance binding bound directly to a pre-existing instance in the default namespace

    Both are remote-only in local dev.

  • #12874 53ed15a Thanks @xortive! - Add Workers VPC service support for Hyperdrive origins

    Hyperdrive configs can now connect to databases through Workers VPC services using the --service-id option:

    wrangler hyperdrive create my-config --service-id <vpc-service-uuid> --database mydb --user myuser --password mypassword

    This enables Hyperdrive to connect to databases hosted in private networks that are accessible through Workers VPC TCP services.

  • #12852 6b50bfa Thanks @Carolx715! - Add interactive data catalog validation to R2 object and lifecycle commands.

    When performing R2 operations that could affect data catalog state (object put, object delete, lifecycle add, lifecycle set), Wrangler now validates with the API and prompts users for confirmation if a conflict is detected. For bulk put operations, Wrangler prompts upfront before starting the batch. Users can bypass prompts with --force (-y). In non-interactive/CI environments, the operation proceeds automatically.

  • #13030 0386553 Thanks @natewong1313! - Add local mode support for Stream bindings

    Miniflare and wrangler dev now support using Cloudflare Stream bindings locally.

    Supported operations:

    • upload() — upload video via URL
    • video(id).details(), .update(), .delete(), .generateToken()
    • videos.list()
    • captions.generate(), .list(), .delete()
    • downloads.generate(), .get(), .delete()
    • watermarks.generate(), .list(), .get(), .delete()

    The following are not yet supported in local mode and will throw:

    • createDirectUpload()
    • Caption upload via File
    • Watermark generation via File

    Data is persisted across restarts by default. You must set streamPersist: false in Miniflare options to disable persistence.

  • #12874 53ed15a Thanks @xortive! - Add --cert-verification-mode option to wrangler vpc service create and wrangler vpc service update

    You can now configure the TLS certificate verification mode when creating or updating a VPC connectivity service. This controls how the connection to the origin server verifies TLS certificates.

    Available modes:

    • verify_full (default) -- verify certificate chain and hostname
    • verify_ca -- verify certificate chain only, skip hostname check
    • disabled -- do not verify the server certificate at all
    wrangler vpc service create my-service --type tcp --tcp-port 5432 --ipv4 10.0.0.1 --tunnel-id <tunnel-uuid> --cert-verification-mode verify_ca

    This applies to both TCP and HTTP VPC service types. When omitted, the default verify_full behavior is used.

  • #12874 53ed15a Thanks @xortive! - Add TCP service type support for Workers VPC

    You can now create TCP services in Workers VPC using the --type tcp option:

    wrangler vpc service create my-db --type tcp --tcp-port 5432 --ipv4 10.0.0.1 --tunnel-id <tunnel-uuid>

    This enables exposing TCP-based services like PostgreSQL, MySQL, and other database servers through Workers VPC.

Patch Changes

  • #13039 bc24ec8 Thanks @petebacondarwin! - fix: Angular auto-config now correctly handles projects without SSR configured

    Previously, running wrangler deploy (or wrangler setup) on a plain Angular SPA (created with ng new without --ssr) would crash with Cannot set properties of undefined (setting 'experimentalPlatform'), because the auto-config code unconditionally assumed SSR was configured.

    Angular projects without SSR are now treated as assets-only deployments: no wrangler.jsonc main entry is generated, angular.json is not modified, no src/server.ts is created, and no extra dependencies are installed.

  • #13036 0b4c21a Thanks @pbrowne011! - Fix wrangler deploy --dry-run skipping asset build-artifact validation checks

    Previously, --dry-run skipped the entire asset sync step, which meant it also skipped validation that runs during asset manifest building. This included the check that errors when a _worker.js file or directory would be uploaded as a public static asset (which can expose private server-side code), as well as the per-file size limit check.

    With this fix, --dry-run now runs buildAssetManifest against the asset directory when assets are configured, performing the same file-system validation as a real deploy without uploading anything or making any API calls.

  • #13061 535582d Thanks @petebacondarwin! - fix: resolve secondary worker types when environment overrides the worker name in multi-worker type generation

    When running wrangler types with multiple -c config flags and the secondary worker has named environments that override the worker name (e.g. a worker named do-worker with env staging whose effective name becomes do-worker-staging), service bindings and Durable Object bindings in the primary worker that reference do-worker-staging now correctly resolve to the typed entry point instead of falling back to an unresolved comment type such as DurableObjectNamespace /* MyClass from do-worker-staging */.

    The fix extends the secondary entries map to also register environment-specific worker names, so that lookups by the env-qualified name (e.g. do-worker-staging) resolve to the same source file as the base worker name.

  • #13058 992f9a3 Thanks @petebacondarwin! - fix: patch undici to prevent fetch() throwing on 401 responses with a request body

    Fetching with a request body (string, JSON, FormData, etc.) to an endpoint that returns a 401 would throw TypeError: fetch failed with cause expected non-null body source. This affected Unstable_DevWorker.fetch() and any other use of undici's fetch in wrangler.

    The root cause is isTraversableNavigable() in undici returning true unconditionally, causing the 401 credential-retry logic to run in Node.js where it should never apply (there is no browser UI to prompt for credentials). This is tracked upstream in nodejs/undici#4910. Until an upstream fix is released, we apply a patch to undici that returns false from isTraversableNavigable().

  • #13017 91b7f73 Thanks @petebacondarwin! - fix: prevent Docker container builds from spawning console windows on Windows

    On Windows, detached: true in child_process.spawn() gives each child process its own visible console window, causing many windows to flash open during wrangler deploy with [[containers]]. The detached option is now only set on non-Windows platforms (where it is needed for process group cleanup), and windowsHide: true is added to further suppress console windows on Windows.

  • #12996 f6cdab2 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.

  • #12931 ce65246 Thanks @dario-piotrowicz! - Improve error message when modules cannot be resolved during bundling

    When a module cannot be resolved during bundling, Wrangler now suggests using the alias configuration option to substitute it with an alternative implementation. This replaces esbuild's default suggestion to "mark the path as external", which is not a supported option in Wrangler.

    For example, if you try to import a module that doesn't exist:

    import foo from "some-missing-module";

    Wrangler will now suggest:

    To fix this, you can add an entry to "alias" in your Wrangler configuration
    to substitute "some-missing-module" with an alternative implementation.
    See https://developers.cloudflare.com/workers/wrangler/configuration/#bundling-issues
    

    This provides actionable guidance for resolving import errors.

  • #13049 7a5be20 Thanks @nikitassharma! - add library-push flag to containers registries credentials

    This flag is not available for public use.

  • #13018 9c5ebf5 Thanks @tgarg-cf! - Validate that queue consumers in wrangler config only use the "worker" type

    Previously, non-worker consumer types (e.g. http_pull) could be specified in the queues.consumers config. Now, wrangler will error if a consumer type other than "worker" is specified in the config file.

    To configure non-worker consumer types, use the wrangler queues consumer CLI commands instead (e.g. wrangler queues consumer http-pull add).

  • Updated dependencies [9fcdfca, 1faff35, f4ea4ac, 0386553]:

    • miniflare@4.20260317.3

Minor Changes

  • #13027 9fcdfca Thanks @G4brym! - feat: Add ai_search_namespaces and ai_search binding types

    Two new binding types for AI Search:

    • ai_search_namespaces: Namespace binding — namespace is required and auto-provisioned at deploy time if it doesn't exist (like R2 buckets)
    • ai_search: Single instance binding bound directly to a pre-existing instance in the default namespace

    Both are remote-only in local dev.

Patch Changes

  • #13018 9c5ebf5 Thanks @tgarg-cf! - Validate that queue consumers in wrangler config only use the "worker" type

    Previously, non-worker consumer types (e.g. http_pull) could be specified in the queues.consumers config. Now, wrangler will error if a consumer type other than "worker" is specified in the config file.

    To configure non-worker consumer types, use the wrangler queues consumer CLI commands instead (e.g. wrangler queues consumer http-pull add).

Mar 24, 2026

Patch Changes

  • #12851 86a40f0 Thanks @jamesopstad! - Fix a bug that prevented using subpath imports for additional module types

    You can now use subpath imports for additional module types (.html, .txt, .sql, .bin, .wasm) by defining them in your package.json imports field:

    // package.json
    {
      "imports": {
        "#templates/page": "./src/templates/page.html"
      }
    }
    
    import page from "#templates/page";
    
    export default {
      fetch() {
        return new Response(page, {
          headers: { "Content-Type": "text/html" },
        });
      },
    } satisfies ExportedHandler;
  • Updated dependencies [593c4db, b8f3309, 451dae3, 5aaaab2, 5aaaab2, f8516dd, 9c9fe30, 379f2a2, c2e9163, 6a6449e, 9a1cf29, 875da60]:

    • wrangler@4.77.0
    • miniflare@4.20260317.2

Patch Changes

Patch Changes

  • #12753 ea8b1a4 Thanks @petebacondarwin! - Replace deprecated promjs library with MetricsRegistry from @cloudflare/workers-utils/prometheus-metrics

    The promjs library has been unmaintained since 2022 and has a broken package.json requiring workarounds. It has been replaced with a lightweight MetricsRegistry class in @cloudflare/workers-utils/prometheus-metrics that produces byte-identical Prometheus text exposition format output.

Patch Changes

  • #11753 b8f3309 Thanks @ruifigueira! - Added the following improvements to local Browser Rendering binding in Miniflare:

    • Local Chrome version upgraded to 126.0.6478.182
    • Reciprocate browser websocket close events
  • #12986 5aaaab2 Thanks @petebacondarwin! - fix: allow mixed d1Databases records containing both string and object entries

    Previously, passing a d1Databases config that mixed plain string values and object entries (e.g. { MY_DB: "db-name", OTHER_DB: { id: "...", remoteProxyConnectionString: ... } }) would cause Miniflare to throw an error. Both forms are now accepted and normalised correctly.

  • #12986 5aaaab2 Thanks @petebacondarwin! - fix: allow mixed kvNamespaces records containing both string and object entries

    Previously, passing a kvNamespaces config that mixed plain string values and object entries (e.g. { MY_NS: "ns-name", OTHER_NS: { id: "...", remoteProxyConnectionString: ... } }) would cause Miniflare to throw an error. Both forms are now accepted and normalised correctly.

  • #12987 f8516dd Thanks @petebacondarwin! - fix: allow mixed pipelines records containing both string and object entries

    Previously, passing a pipelines config that mixed plain string values and object entries (e.g. { MY_PIPELINE: "pipeline-name", OTHER_PIPELINE: { pipeline: "...", remoteProxyConnectionString: ... } }) would cause Miniflare to throw an error. Both forms are now accepted and normalised correctly.

  • #12952 9c9fe30 Thanks @petebacondarwin! - fix: allow mixed r2Buckets records containing both string and object entries

    Previously, passing an r2Buckets config that mixed plain string values and object entries (e.g. { MY_BUCKET: "bucket-name", OTHER_BUCKET: { ... } }) would cause Miniflare to throw an error. Both forms are now accepted and normalised correctly.

  • #13015 6a6449e Thanks @petebacondarwin! - fix: disable undici Pool request timeouts for local dev

    Miniflare's undici Pool instances were using the default headersTimeout and bodyTimeout of 300 seconds (5 minutes). Any request taking longer than that — streaming responses, large uploads, long-polling, or compute-heavy Workers — would be silently killed with a "request failed" error.

    Setting both timeouts to 0 disables them entirely, which is the correct behaviour for a local development tool where there is no reason to enforce request timeouts.

Minor Changes

  • #12741 e8f62bb Thanks @penalosa! - Enable upload_source_maps by default for new projects

    All new projects created with C3 now have upload_source_maps set to true in their Wrangler configuration. This means source maps are automatically uploaded when you deploy, giving you meaningful stack traces in your Worker's logs and error reports without any extra setup.

Patch Changes

  • #12904 88c9471 Thanks @dependabot! - Update dependencies of "create-cloudflare"

    The following dependency versions have been updated:

    DependencyFromTo
    create-vike0.0.5920.0.599
  • #13003 ea13a78 Thanks @dependabot! - Update dependencies of "create-cloudflare"

    The following dependency versions have been updated:

    DependencyFromTo
    create-solid0.6.130.7.0
  • #13004 44d8f22 Thanks @dependabot! - Update dependencies of "create-cloudflare"

    The following dependency versions have been updated:

    DependencyFromTo
    create-next-app16.1.616.2.1
  • #13005 9a742b1 Thanks @dependabot! - Update dependencies of "create-cloudflare"

    The following dependency versions have been updated:

    DependencyFromTo
    @angular/create21.2.221.2.3
  • #13006 554d68b Thanks @dependabot! - Update dependencies of "create-cloudflare"

    The following dependency versions have been updated:

    DependencyFromTo
    create-astro5.0.05.0.3
  • #12569 379f2a2 Thanks @MattieTK! - Use qwik add cloudflare-workers instead of qwik add cloudflare-pages for Workers targets

    Both the wrangler autoconfig and C3 Workers template for Qwik were running qwik add cloudflare-pages even when targeting Cloudflare Workers. This caused the wrong adapter directory structure to be scaffolded (adapters/cloudflare-pages/ instead of adapters/cloudflare-workers/), and required post-hoc cleanup of Pages-specific files like _routes.json.

    Qwik now provides a dedicated cloudflare-workers adapter that generates the correct Workers configuration, including wrangler.jsonc with main and assets fields, a public/.assetsignore file, and the correct adapters/cloudflare-workers/vite.config.ts.

    Also adds --skipConfirmation=true to all qwik add invocations so the interactive prompt is skipped in automated contexts.

Patch Changes

  • #12985 17a57e6 Thanks @pombosilva! - Fix waitForEvent delivering events to stale waiters after timeout.

    When a step.waitForEvent() call timed out, its resolver was not removed from the workflow's internal waiters map. This meant the next step.waitForEvent() for the same event type would have its incoming event consumed by the dead resolver instead of the live one, causing the workflow to hang indefinitely.

Patch Changes

  • #12753 ea8b1a4 Thanks @petebacondarwin! - Replace deprecated promjs library with MetricsRegistry from @cloudflare/workers-utils/prometheus-metrics

    The promjs library has been unmaintained since 2022 and has a broken package.json requiring workarounds. It has been replaced with a lightweight MetricsRegistry class in @cloudflare/workers-utils/prometheus-metrics that produces byte-identical Prometheus text exposition format output.

Patch Changes

Patch Changes

  • #11899 9a1cf29 Thanks @hoodmane! - Remove cf-requirements support for Python workers. It hasn't worked with the runtime for a while now.

Minor Changes

  • #13023 593c4db Thanks @jamesopstad! - Add wrangler versions upload support for the experimental secrets configuration property

    When the new secrets property is defined, wrangler versions upload now validates that all secrets declared in secrets.required are configured on the Worker before the upload succeeds. If any required secrets are missing, the upload fails with a clear error listing which secrets need to be set.

    When secrets is not defined, the existing behavior is unchanged.

    // wrangler.jsonc
    {
      "secrets": {
        "required": ["API_KEY", "DB_PASSWORD"]
      }
    }
    
  • #12732 c2e9163 Thanks @jamesopstad! - Add deploy support for the experimental secrets configuration property

    When the new secrets property is defined, wrangler deploy now validates that all secrets declared in secrets.required are configured on the Worker before the deploy succeeds. If any required secrets are missing, the deploy fails with a clear error listing which secrets need to be set.

    When secrets is not defined, the existing behavior is unchanged.

    // wrangler.jsonc
    {
      "secrets": {
        "required": ["API_KEY", "DB_PASSWORD"]
      }
    }
    

Patch Changes

  • #12896 451dae3 Thanks @petebacondarwin! - fix: Add retry and timeout protection to remote preview API calls

    Remote preview sessions (wrangler dev --remote) now automatically retry transient 5xx API errors (up to 3 attempts with linear backoff) and enforce a 30-second per-request timeout. Previously, a single hung or failed API response during session creation or worker upload could block the dev session reload indefinitely.

  • #12569 379f2a2 Thanks @MattieTK! - Use qwik add cloudflare-workers instead of qwik add cloudflare-pages for Workers targets

    Both the wrangler autoconfig and C3 Workers template for Qwik were running qwik add cloudflare-pages even when targeting Cloudflare Workers. This caused the wrong adapter directory structure to be scaffolded (adapters/cloudflare-pages/ instead of adapters/cloudflare-workers/), and required post-hoc cleanup of Pages-specific files like _routes.json.

    Qwik now provides a dedicated cloudflare-workers adapter that generates the correct Workers configuration, including wrangler.jsonc with main and assets fields, a public/.assetsignore file, and the correct adapters/cloudflare-workers/vite.config.ts.

    Also adds --skipConfirmation=true to all qwik add invocations so the interactive prompt is skipped in automated contexts.

  • #11899 9a1cf29 Thanks @hoodmane! - Remove cf-requirements support for Python workers. It hasn't worked with the runtime for a while now.

  • #11800 875da60 Thanks @southpolesteve! - Add upgrade hint to unexpected configuration field warnings when an update is available

    When Wrangler encounters unexpected fields in the configuration file and a newer version of Wrangler is available, it now displays a message suggesting to update. This helps users who may be using configuration options that were added in a newer version of Wrangler.

  • Updated dependencies [b8f3309, 5aaaab2, 5aaaab2, f8516dd, 9c9fe30, 6a6449e]:

    • miniflare@4.20260317.2

Patch Changes

  • #12753 ea8b1a4 Thanks @petebacondarwin! - Replace deprecated promjs library with MetricsRegistry from @cloudflare/workers-utils/prometheus-metrics

    The promjs library has been unmaintained since 2022 and has a broken package.json requiring workarounds. It has been replaced with a lightweight MetricsRegistry class in @cloudflare/workers-utils/prometheus-metrics that produces byte-identical Prometheus text exposition format output.

  • #13021 973dfdd Thanks @penalosa! - Restore the /exchange preview session endpoint.

Mar 20, 2026

Minor Changes

  • #12972 cb71403 Thanks @NuroDev! - Add worker filtering to the local explorer UI

    When multiple workers share a dev registry, all their bindings were previously shown together in a single flat list. The explorer now shows a worker selector dropdown, letting you inspect each worker's bindings independently.

    The selected worker is reflected in the URL as a ?worker= search param, so deep links work correctly. By default the explorer selects the worker that is hosting the dashboard itself.

  • #12888 3a1c149 Thanks @emily-shen! - Add R2 support to the local explorer.

    The local explorer now supports the following:

    • Viewing, modifying & deleting objects
    • Uploading files
    • Creating directories / prefixes

    Note: The local explorer is an experimental WIP feature that is now enabled by default. This can still be opt-ed out of by using X_LOCAL_EXPLORER=false to disable it.

Patch Changes

  • #12918 3de3ce5 Thanks @NuroDev! - Fixed listing internal Cloudflare Durable Object tables.

    The internal _cf_KV table that is used when using Durable Objects KV storage is now hidden from the table list dropdown in the local explorer as it is not accessible.

Minor Changes

  • #12972 cb71403 Thanks @NuroDev! - Add worker filtering to the local explorer UI

    When multiple workers share a dev registry, all their bindings were previously shown together in a single flat list. The explorer now shows a worker selector dropdown, letting you inspect each worker's bindings independently.

    The selected worker is reflected in the URL as a ?worker= search param, so deep links work correctly. By default the explorer selects the worker that is hosting the dashboard itself.

  • #12888 3a1c149 Thanks @emily-shen! - Add R2 support to the local explorer.

    The local explorer now supports the following:

    • Viewing, modifying & deleting objects
    • Uploading files
    • Creating directories / prefixes

    Note: The local explorer is an experimental WIP feature that is now enabled by default. This can still be opt-ed out of by using X_LOCAL_EXPLORER=false to disable it.

  • #12848 ce48b77 Thanks @emily-shen! - Enable local explorer by default

    This ungates the local explorer, a UI that lets you inspect the state of D1, DO and KV resources locally by visiting /cdn-cgi/explorer during local development.

    Note: this feature is still experimental, and can be disabled by setting the env var X_LOCAL_EXPLORER=false.

  • #12881 8729f3d Thanks @pombosilva! - Workflow instances now support pause, resume, restart, and terminate in local dev.

    const instance = await env.MY_WORKFLOW.create({
      id: "my-instance",
    });
    
    await instance.pause(); // pauses after the current step completes
    await instance.resume(); // resumes from where it left off
    await instance.restart(); // restarts the workflow from the beginning
    await instance.terminate(); // terminates the workflow immediately

Patch Changes

  • #12960 3c988e2 Thanks @penalosa! - Exclude metadata.sqlite when listing Durable Object instances

    An upcoming version of workerd stores per-namespace alarm metadata in a metadata.sqlite file alongside per-actor .sqlite files. The local explorer's DO object listing was treating this file as a Durable Object instance, inflating counts and breaking pagination. This file is now filtered out.

Patch Changes

Minor Changes

  • #12848 ce48b77 Thanks @emily-shen! - Enable local explorer by default

    This ungates the local explorer, a UI that lets you inspect the state of D1, DO and KV resources locally by visiting /cdn-cgi/explorer during local development.

    Note: this feature is still experimental, and can be disabled by setting the env var X_LOCAL_EXPLORER=false.

Patch Changes

  • #12942 4f7fd79 Thanks @jamesopstad! - Avoid splicing into the middleware stack for Vite versions other than v6

    Previously, the plugin spliced its pre-middleware into the Vite middleware stack relative to viteCachedTransformMiddleware. In Vite 8, this middleware can be omitted in some scenarios, which would cause the splice to fail. The plugin now registers pre-middleware using server.middlewares.use() directly, which places it in the correct position for Vite 7+. For Vite 6, the middleware is moved to the correct position in a post hook.

  • Updated dependencies [782df44, 3c988e2, 62545c9, d028ffb, cb71403, 71ab981, 3a1c149, 7c3c6c6, ce48b77, 8729f3d]:

    • wrangler@4.76.0
    • miniflare@4.20260317.1
    • @cloudflare/unenv-preset@2.16.0
Latest
wrangler@4.83.0
Tracking Since
Jan 20, 2026
Last checked Apr 20, 2026