Packages

wrangler

4.151.3 · 20 Oct 2026MIT OR Apache-2.018.1M / weekRepositoryHomepagenpmAtom feed

541 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.

  1. 4.151.3

    20 Oct 2026
    • Allow wrangler dev to start module Workers without a default export

      Previously, wrangler dev failed to start module Workers that exported only named entrypoints, such as RPC services, unless an unused default export was added. These Workers now start normally in local development without that workaround.

    • Fetch the remote config diff from the configured compliance region

      When a Worker was last deployed from the dashboard, wrangler deploy and wrangler versions upload download its remote configuration to compare with the local one. These requests ignored the compliance_region field in the Wrangler configuration file and only honoured the CLOUDFLARE_COMPLIANCE_REGION environment variable. A FedRAMP High Worker configured through the config file would send them to api.cloudflare.com instead of api.fed.cloudflare.com, and the deploy would fail with authentication errors. They now use the same compliance region as the rest of the deploy.

    • Fail with an error instead of hanging when local dev requests can't work under Bun

      Bun's fetch() ignores the undici dispatcher that Miniflare routes requests through (oven-sh/bun#39247). Under Bun, createTestHarness()'s server.fetch() and server.getWorker()'s fetch(), email() and scheduled() now throw a UserError, requests to the dev server URL get a 503 naming the cause, and starting remote bindings throws a UserError. Each of these used to hang with no error. server.getWorker().getEnv() and getExport() keep working under Bun.

  2. 4.151.2

    19 Oct 2026

    Only updates a dependency:miniflare 5.20261019.0-beta

  3. 4.151.1

    16 Oct 2026
    • Keep remote dev sessions alive through transient network failures

      wrangler dev --remote and getPlatformProxy() refresh their preview token before it expires, but a single failed refresh — for example while the network was briefly down — stopped refreshing for good, leaving the session broken until restart. A failed refresh now retries every minute until it succeeds. Rebuilds also no longer push the refresh past the session's expiry.

    • Fix wrangler rollback reporting success after the changed secrets confirmation is declined

      Previously, declining the "The following secrets have changed…" confirmation printed "Aborting rollback..." and then also printed a success message and the target version as the "Current Version ID", even though no deployment was made and the original version was still live. Wrangler now stops after aborting, so the output matches what is actually deployed.

    • Hide the wrangler dev hotkey bar when Turborepo does not forward input

  4. 4.151.0

    14 Oct 2026
    • Include source maps by default in wrangler build --experimental-cf-build-output

      Build Output now matches wrangler deploy and wrangler versions upload, which upload source maps by default, so Workers built for tools like cf get stack traces that point at the original source. Source maps that can't be resolved are skipped rather than failing the build. Set upload_source_maps = false to opt out.

    • Support local D1 queries through the experimental d1_binding_jsrpc compatibility flag

      Local D1 bindings now implement the RPC query backend used by D1Database.query() and prepared-statement methods when the flag is enabled. Queries reuse local SQLite execution, including transactional batches, execution metadata, and session bookmarks, while bindings without the flag continue to use HTTP. Update the bundled workerd runtime to 1.20261012.1 and align the default compatibility date with that release.

  5. 4.150.0

    13 Oct 2026
    • Upload source maps by default for wrangler deploy, wrangler versions upload and wrangler preview

      When upload_source_maps isn't set in config or via --upload-source-maps, Wrangler now generates and uploads source maps so stack traces in logs and wrangler tail point at your original source without extra setup. In this default mode, source maps that can't be resolved (for example inline data: maps or missing .map files from a custom build) are skipped rather than failing the upload. Setting upload_source_maps = true keeps the existing strict behaviour, and upload_source_maps = false (or --no-upload-source-maps for deploy and versions upload) opts out.

      wrangler build --experimental-cf-build-output is unchanged and still only includes source maps when upload_source_maps = true.

    • Stop wrangler deploy, wrangler versions upload and wrangler preview in projects that build for the Cloudflare CLI (cf)

      If your project builds through cf, deploying it with Wrangler reads a different configuration, so it could update the wrong Worker or fail without explaining why. These commands now stop before uploading anything, name the .cloudflare/output directory they found, and tell you to run cf deploy instead. If that directory is just left over from an earlier build, deleting it restores the Wrangler workflow.

      Ordinary Wrangler projects are unaffected, and --dry-run still works on deploy and versions upload. This is a new guard for the experimental Build Output Specification rather than a fix, and it gives three stable commands a failure mode they did not have before, so it is a minor.

    • Clarify the Worker not found error during CI deploy validation

      Wrangler now reports that the configured Worker could not be found in the account instead of incorrectly describing the failure as a name mismatch.

  6. 4.149.0

    8 Oct 2026
    • Support temporary event accounts in R2 and Containers commands

      wrangler r2 and wrangler containers commands now accept the hidden --temporary flag, so accounts created for an event can manage buckets, objects and containers directly. Every command that supports --temporary now also accepts a hidden --event-code flag, so the first command a participant runs can create the event account:

      wrangler r2 bucket create my-bucket --temporary --event-code <code>

      R2 and Containers are only available on event accounts. R2 custom domains, Sippy, external container registries and wrangler cloudchamber commands still require a logged-in account.

    • Honor Retry-After directives during static asset uploads

      Static asset uploads now pause retries and pending uploads until the latest outstanding deadline requested by the API. A per-request limiter also keeps gateway retries at the reduced concurrency after the pause ends, preventing a deployment from immediately overloading a constrained asset service again.

    • Document that addresses catch-all entries must use the zone apex

      A *@domain entry in addresses must use the zone apex, such as *@example.com. The zone catch-all also receives mail for every subdomain in the zone that has no literal rule.

  7. 4.148.0

    6 Oct 2026
    • Add --source-namespace and --source-repo-name to wrangler queues subscription create for the artifacts.repo source

      The Event Subscriptions API requires source.namespace and source.repo_name for artifacts.repo subscriptions, but Wrangler had no way to pass them, so --source artifacts.repo always failed with a validation error. Both flags are now required for this source, and wrangler queues subscription get shows the subscription's resource as <namespace>/<repo-name>.

    • Add assets.base_path support to Workers Assets

      Serve an asset directory from a public URL prefix without changing its on-disk layout:

      {
        "assets": {
          "directory": "./public",
          "base_path": "/docs"
        }
      }

      Wrangler, preview, Miniflare, and generated build configuration preserve the explicitly selected value, while the Asset Worker normalizes it and strips the prefix only for asset lookup. Requests passed to a user Worker, request-facing headers, and redirects retain the public path. Relative pathname inputs are interpreted as root-relative prefixes, URL-shaped values are rejected, and omitting the option preserves existing root-path behavior.

      Authored _headers and _redirects rules continue to match full public paths. In particular, both the source and destination of an authored 200 asset rewrite must include the configured public prefix; Asset Worker-generated redirects are prefixed automatically.

    • Add a --experimental-mode instant option to wrangler kv namespace create

      This lets entitled accounts create Workers KV Instant namespaces while the feature is in private beta.

  8. 4.147.0

    2 Oct 2026
    • Allow "us" as a jurisdiction for Container applications

      Container placement constraints now accept constraints.jurisdiction: "us" in Wrangler and typed Cloudflare configuration. This makes the US jurisdiction available alongside "eu" and "fedramp".

    • Fix wrangler containers list to report live instances

      The LIVE INSTANCES column now reports each application's active runtime instances instead of its configured instance count, matching the Cloudflare dashboard. JSON output continues to expose the configured count through the existing instances field.

    • Accept Durable Object application IDs in Containers commands

      wrangler containers instances and wrangler containers delete now accept the 32-character hexadecimal application IDs returned for Durable Object-backed applications, in addition to legacy dashed UUIDs.

  9. 4.146.0

    1 Oct 2026
    • Support the new Workflows createBatch() API in local development

      Local Workflows bindings now accept object-form batches that create instances from a count or a list of instance options. The result includes handles for created instances and indexed per-instance errors, matching the runtime API while preserving the deprecated array form.

    • Add --allowed-mail to the experimental wrangler tunnel quick-start command

      The option forwards exact email addresses, comma-separated lists, and wildcard domains to cloudflared. It can be specified more than once to combine multiple recipient rules.

      Email-protected tunnels require cloudflared 2026.9.2 or later. Wrangler checks the selected binary before starting the tunnel and reports an upgrade error when it is incompatible.

    • Mark wrangler artifacts commands as open beta

      Artifacts has entered open beta, so the wrangler artifacts commands no longer display a "private beta" label in help output and warnings.

  10. 4.145.0

    30 Sep 2026
    • Add native support for the Analytics SQL binding

      Declare the zero-configuration binding in wrangler.json with "analytics": { "binding": "ANALYTICS" }. Wrangler uploads the analytics binding type and proxies it to the remote service during local development, so wrangler dev can call the binding without unsafe.bindings.

    • Graduate SQL, Catalog, and Pipelines under wrangler basin out of beta to stable

      Basin SQL is now available under wrangler basin sql, Basin Catalog operations are available under wrangler basin catalog, and Pipelines operations are available under wrangler basin pipelines. These commands are now stable, while the previous wrangler r2 sql, wrangler r2 bucket catalog, and wrangler pipelines command paths remain available as hidden compatibility aliases.

      The Basin SQL authentication environment variable is now WRANGLER_BASIN_SQL_AUTH_TOKEN. Update any existing WRANGLER_R2_SQL_AUTH_TOKEN configuration to use the new name. The fallback to CLOUDFLARE_API_TOKEN remains available.

    • Add beta K2 producer bindings for existing streams

      Configure a stream created through Wrangler, the Dashboard, or the API in wrangler.json:

      {
        "k2": [
          {
            "binding": "ORDERS",
            "stream": "0123456789abcdef0123456789abcdef"
          }
        ]
      }

      The binding supports env.ORDERS.send([{ content: new TextEncoder().encode("order"), headers: { event: "order.created" } }]). Batches use either all ArrayBuffer or all Uint8Array content. Check the returned success value, handle rejected RPC promises, and retry only when the returned error explicitly allows it. Generated environment types describe this producer contract without requiring a separate application dependency.

      K2 requires an enabled account. Deployment credentials need Worker deployment and K2 configuration-read access. Default Wrangler logins now request the K2 OAuth scopes; existing OAuth users should run wrangler login again to grant the new permissions. Development always uses a real K2 stream and may incur usage charges; no local simulator is provided. The remote setting can be omitted, remote: true suppresses the usage warning, and remote: false is rejected. Consumption is not part of this Worker binding.

  11. 4.144.0

    29 Sep 2026
    • Add --tty (-t) flag to wrangler containers ssh to force pseudo-terminal allocation

      OpenSSH only allocates a pseudo-terminal when no remote command is given, so interactive commands such as wrangler containers ssh <ID> -- bash previously ran without a prompt or line editing. Pass --tty to force one:

      wrangler containers ssh <ID> --tty -- bash

    • Support SSH settings for Durable Object-managed Containers in the configuration API

      defineContainer now accepts ssh and authorizedKeys with schedulingPolicy: "durable-object", matching the ssh and authorized_keys fields that Wrangler already supports for these Containers. Previously the schema rejected them, so they could not be set from cloudflare.config.ts.

      defineContainer({
        name: "sandbox",
        schedulingPolicy: "durable-object",
        ssh: { enabled: true },
        authorizedKeys: [{ name: "laptop", publicKey: "ssh-ed25519 AAAA..." }],
      });
  12. 4.143.1

    29 Sep 2026
    • Fix wrangler dev remote bindings for workers.dev subdomains protected by Access

      Running wrangler dev with remote bindings on an unpublished worker protected by Access (e.g. using a wildcard on your workers.dev domain) previously failed with a redirect loop. Wrangler now correctly authenticates remote bindings with Access in this situation.

    • Upgrade the bundled capnweb implementation to 0.12.0

      This updates the RPC implementation shipped in Miniflare and remote-binding proxy workers to the latest capnweb release.

    • 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.

  13. 4.143.0

    28 Sep 2026
    • Use cf/config for cloudflare.config.ts authoring

      Experimental cloudflare.config.ts projects must now import defineConfig, bindings, triggers, and related helpers from cf/config. Generated declarations from Wrangler and the Vite plugin also reference this package, so projects using the experimental configuration flow must add cf as a dependency.

      The Vite plugin no longer exports @cloudflare/vite-plugin/experimental-config. wrangler/experimental-config remains available for defineWranglerConfig, but no longer re-exports Cloudflare configuration helpers.

  14. 4.142.0

    27 Sep 2026
    • Support Workflows declared in exports on ctx.exports in local development

      A Workflow declared in a Worker's exports is now available on ctx.exports in wrangler 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.exports and workflows bindings with the same Workflow name share their instances, including instances created before the Workflow was declared in exports. 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 in exports, since it doesn't run the Worker's code.

      wrangler workflows commands run with --local also work with Workflows declared only in exports, without a workflows binding.

      In the Vitest plugin, introspectWorkflow() and introspectWorkflowInstance() still need a Workflow binding, and now explain how to add one when passed a Workflow from ctx.exports. Instances created through ctx.exports are introspected too. A workflows binding whose script_name is the Worker's own name now resolves to the Worker itself again.

  15. 4.141.0

    25 Sep 2026
    • Add Durable Objects code update strategies to Worker deployments

      Use --durable-objects-code-update-mode immediate with wrangler deploy, wrangler versions deploy, and wrangler rollback to update code without waiting for active instances to hibernate. Use --durable-objects-code-update-mode deferred 30s to set a maximum delay, or configure durable_objects.code_update_strategy with mode and max_delay. When unset, the strategy defaults to deferred with a 5-minute maximum delay; delays cannot exceed 24 hours and must use millisecond precision.

    • Add Browser Run as an event source for Queue subscriptions

      You can now create Queue subscriptions with --source browserRun.

    • Show the stack and cause of failed proxied requests in wrangler dev debug logs

      When a request proxied to the local Worker fails, running with --log-level debug now shows the underlying error's stack and cause chain.

  16. 4.140.0

    25 Sep 2026
    • Support Containers in Worker Preview deployments with the Build Output.

  17. 4.139.0

    24 Sep 2026
    • Configure SSH for experimental Durable Object-managed Containers

      Set containers.ssh and containers.authorized_keys when using scheduling_policy: "durable_object". These are application-wide settings that follow the same rules as the existing Durable Object-managed Container settings: normal deployments create missing applications and update explicitly configured values, while omitted settings preserve the existing application configuration.

      // wrangler.jsonc
      {
        "containers": [
          {
            "name": "sandbox",
            "class_name": "Sandbox",
            "scheduling_policy": "durable_object",
            "ssh": { "enabled": true },
            "authorized_keys": [
              { "name": "laptop", "public_key": "ssh-ed25519 AAAA..." }
            ]
          }
        ]
      }
    • Expose configured Cron Triggers to local development consumers

      Wrangler now passes the active environment's exact Cron Trigger expressions to Miniflare so Local Explorer can display them. Headless agent sessions also advertise the Local Explorer scheduled invocation API.

    • Support UDP connect handlers in local development

      The experimental connect configuration now accepts protocol: "udp", with optional idle_timeout_ms and max_pending_bytes settings. UDP datagrams are delivered to the Worker's connect() handler using workerd's value-mode socket streams, and can be tested with Miniflare#dispatchConnect({ protocol: "udp" }).

  18. 4.138.0

    24 Sep 2026
    • Add event-code support to temporary Worker deployments

      Use wrangler deploy --temporary --event-code <code> to provision an account for an event. Wrangler requires explicit server acknowledgement before caching the account and keeps the event code out of its cache and telemetry.

    • Allow framework commands to produce Preview Build Output with the experimental config

      When cf previews deploy invokes a framework build command, Preview intent is now preserved. Function-based cloudflare.config.ts files receive isPreview: 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.

  19. 4.137.0

    23 Sep 2026
    • Generate types during development and supported builds with Vite's experimental.newConfig option or Wrangler's --experimental-new-config flag (and --experimental-cf-build-output for builds)

      When Wrangler's --experimental-new-config flag or Vite's experimental.newConfig option 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-config and --experimental-cf-build-output. In the experimental wrangler.config.ts format, the types option 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.

    • Match D1 SQL statement splitting to the local SQLite runtime

      Wrangler now uses SQLite's statement-completion state machine when splitting D1 SQL files. This keeps trigger, quoted identifier, comment, and keyword handling consistent with local execution.

  20. 4.136.3

    22 Sep 2026
    • Update smol-toml to 1.8.0

      This updates the bundled TOML parser that reads wrangler.toml to a version that addresses two advisories against 1.5.2: GHSA-7w5x-hrqm-74c2 (a value followed by a comment with no trailing newline, such as a=[1 #, put the parser in an infinite loop) and GHSA-v3rj-xjv7-4jmq (thousands of consecutive comment lines overflowed the stack). On the old version, wrangler deploy against a wrangler.toml ending in a=[1 # never returned; it now fails with Invalid TOML document: cannot find end of structure.

    • Warn when wrangler preview returns only non-custom-domain URLs even though custom-domain Preview URLs are configured.

    • Fix Preview output artifacts to always include the resolved parent Worker name

      Preview artifacts now use Wrangler's resolved Worker name instead of relying on the Preview API response to include it.

  21. 4.136.2

    22 Sep 2026
    • Fix wrangler types generating runtime headers with trailing whitespace

      Runtime type headers without compatibility flags now end at the compatibility date, keeping generated types reproducible when tools remove trailing whitespace.

    • Improve Container image listing and deletion

      List all image pages using read-only credentials, validate tags before deletion, and report successful deletion when the garbage-collection request fails.

    • Fix Container SSH connection setup and shutdown

      Prevent SSH connections from stalling during setup and ensure proxy processes exit when sessions close.

  22. 4.136.1

    21 Sep 2026
    • Improve wrangler preview onboarding guidance

      Wrangler now displays placeholder replacement guidance directly beneath the suggested Preview configuration instead of as a separate warning. JSON output continues to include the guidance in its structured onboarding messages.

    • Read workers.dev URLs from the Worker resource during deployment

      Wrangler no longer requires account-level subdomain permission to display Worker and version-preview URLs. It now uses the Worker-scoped URL fields while preserving account-level registration for accounts without a workers.dev subdomain.

  23. 4.136.0

    21 Sep 2026
    • Identify experimental Build Output resource configs by filename and location

      The root remains config.json, Worker configs are now worker.config.json, and Container configs are now container.config.json. Resource configs no longer contain top-level type discriminators, while settings and build context are stored together in the root config.

    • Define experimental Cloudflare configuration with a single default export

      Experimental cloudflare.config.ts files now define settings and resources together in a default-exported defineConfig() call. Add a Worker under worker, add Containers to the containers array, 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,
          },
      });
    • Add experimental --zone and --zone-id flags to wrangler deploy and wrangler triggers deploy to attach a zone to routes passed via --route

      Routes passed on the command line were always sent to the Cloudflare API as bare patterns. Zones with an SSL for SaaS entitlement reject such routes with error 10082 ("When using wildcard host ssl for saas entitlement you must specify the zone per route using zone_id or zone_name"), and until now the only way to set a zone was in the config file, which --route overrides.

      The new flags are experimental and must be enabled with --experimental-route-zones (alias --x-route-zones). Pass a single zone to apply it to all routes, or one zone per route in the same order as the --route flags:

      wrangler deploy --x-route-zones --route "app.example.com/*" --route "api.example.com/*" --zone example.com

      wrangler deploy --x-route-zones --route "a.example.com/*" --zone example.com --route "b.example.net/*" --zone example.net

      --zone sets zone_name and --zone-id sets zone_id on each route. The two flags cannot be combined, and passing more than one zone requires exactly one per --route. Routes without zone flags behave exactly as before.

  24. 4.135.0

    18 Sep 2026
    • 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/containers with 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: true on 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 --local to read and update the local store directly.

    • Pass Preview intent to defineWorker and upload its resolved configuration

      Preview builds now evaluate programmatic Worker configuration with ctx.isPreview set to true and 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.

  25. 4.134.0

    17 Sep 2026
    • Add support for configuring real-time Issues with observability.issues.enabled

      Wrangler now validates and uploads the Issues setting alongside the existing logs and traces observability options. The experimental configuration format supports the equivalent observability.issues.enabled option.

    • Mark wrangler preview commands as open beta

      Wrangler now labels Preview commands as open beta in help output and command warnings, matching the feature's public availability.

    • Support explicit named Container image selection in Wrangler local development

      Wrangler builds or pulls named images configured through Wrangler JSON or TOML and exposes their local tags through ctx.container.images. Pass one of those references to ctx.container.start({ image }) to select the image.

      This extends the experimental Durable Object-managed Containers interface. Named images are opt-in and do not become the Container's default image. A Container without a default image must supply an image or full Container snapshot when starting.

  26. 4.133.0

    16 Sep 2026
    • Add placement configuration for Previews

      You can now configure placement in the previews block. Preview-specific placement overrides the top-level placement configuration for Preview Defaults and deployments.

    • Improve onboarding guidance for Previews (when previews block is missing from configuration file)

      When a local previews block is absent, Wrangler writes the Preview Base configuration to the local config file. When no Preview Base configuration exists, Wrangler prints a placeholder configuration derived from production bindings and warns against reusing production binding configuration.

    • Align Local Explorer Workflow instance status requests with production

      Local Explorer and Wrangler local mode now use the production-compatible status request field for pausing, resuming, restarting, and terminating Workflow instances. Direct Local Explorer API consumers must replace the previous action field with status.

      Successful Local Explorer status updates now return the production-compatible instance status and response timestamp instead of the local-only result.success acknowledgement.

  27. 4.132.0

    15 Sep 2026
    • Categorise the positional path argument to wrangler deploy and wrangler versions upload in command telemetry

      Command telemetry now records a coarse category for the entry-point/assets positional (wrangler deploy <path>) under sanitizedArgs.path, so we can understand whether people pass a file, a directory, or a relational reference such as . or ../example. The possible values are file, directory, current-dir, parent-relative, and not-found, or null when no positional is provided. The raw path is never sent — only the category.

    • Configure application-wide logs for experimental Durable Object-managed Containers

      Set containers.observability.enabled or containers.observability.logs.enabled when using scheduling_policy: "durable_object". Normal deployments create missing applications and update explicitly configured log settings without a Container rollout. Omitted settings preserve the application configuration; root Worker observability is not inherited for this policy.

      Version uploads may initialize missing applications but preserve existing settings. Deploying or rolling back Worker versions also preserves existing application settings, and --containers-rollout=none skips their updates.

    • Support per-image build options for experimental Durable Object-managed Containers

      Set build_context and build_vars alongside dockerfile in a Container's named images entries. Context paths resolve relative to the Wrangler configuration file and default to the Dockerfile's directory. Build variables are passed as Docker build arguments. Entries using the same Dockerfile with different contexts or variables are built separately.

      {
        "containers": [
          {
            "class_name": "Sandbox",
            "scheduling_policy": "durable_object",
            "images": {
              "app": {
                "dockerfile": "./docker/Dockerfile",
                "build_context": ".",
                "build_vars": { "APP_ENV": "production" }
              }
            }
          }
        ]
      }
  28. 4.131.2

    14 Sep 2026

    Only updates a dependency:miniflare 5.20260911.1-alpha

  29. 4.131.1

    11 Sep 2026
    • Add a provisioning delay note when custom domain Preview URLs change

      Wrangler now explains that DNS and TLS certificate provisioning may continue after a deploy adds a custom domain or enables its Preview URLs. Stable redeploys don't repeat the note.

      This assumes that a request which matches the stored custom domain state doesn't restart provisioning. The client infers this from the API changeset and current domain record because this repository can't verify the backend behavior.

    • Clarify production status labels for custom domain routes

      Wrangler now prefixes explicit custom domain production states with production: so they match Preview labels. The updated labels appear in deployed trigger output and WRANGLER_OUTPUT_FILE_PATH.

    • Avoid replacement prompts for custom domains already on the Worker

      Wrangler now updates Preview settings without asking to replace a custom domain when that domain already belongs to the deployed Worker. It still asks before replacing domains attached to another Worker.

  30. 4.131.0

    10 Sep 2026
    • Add Durable Object-managed Containers to top-level container configuration

      Wrangler now accepts scheduling_policy: "durable_object" in the top-level containers array and creates its namespace-backed application after the Worker upload resolves the Durable Object namespace ID. The namespace ID is also the application ID, so repeated deploys idempotently ensure the same application without name-based lookup, modification, or a Containers rollout.

      Durable Object-managed entries accept class_name, scheduling_policy, an optional name, and an optional named images map. Scheduler-only fields are rejected. Each image provides either a local dockerfile or a digest-pinned managed-registry image. Wrangler builds or resolves each image, waits while Cloudflare prepares it for the Containers runtime, and uploads the resulting references with the Worker version for access through ctx.container.images and env.EXPERIMENTAL_CLOUDFLARE_CONTAINER_IMAGES. Local development support for these entries is deferred to a follow-up.

      Existing scheduler-backed entries and Durable Object migrations continue to work unchanged.

      With --containers-rollout=none, existing Workers retain their deployed Container metadata and image binding even when local containers is omitted or empty; local scheduler edits are also ignored. The upload stops if the deployed versions cannot be recovered. Existing Workers for Platforms dispatch scripts reject this flag before upload because their API does not expose enough metadata to preserve Container associations safely. First deployments can still skip Container preparation and rollout. Without this flag, removing managed Containers, including by omitting containers entirely, clears the experimental image binding even with keep_vars.

      versions deploy validates the selected versions before changing traffic and creates their Durable Object-managed applications only after deployment succeeds. Both deploy and versions deploy report partial completion if application creation fails afterward, with instructions to retry the same command.

      EXPERIMENTAL_CLOUDFLARE_CONTAINER_IMAGES is a temporary, reserved Wrangler binding until native Container image metadata is available. Its class keys identify managed applications during versions deploy, including classes with empty image maps. User configuration cannot declare a binding with this name; existing versions that already use it are treated as Container configuration.

    • Remove wrangler preview settings commands

      The private-beta wrangler preview settings and wrangler preview settings update commands are no longer available.

    • Fail wrangler versions upload early when a Worker has a pending Durable Object migration

      Wrangler now directs users to run wrangler deploy to apply the migration instead of sending a version upload request that the API will reject.

  31. 4.130.0

    8 Sep 2026
    • Add containers.observability support to wrangler deploy

      Wrangler now accepts container-specific observability settings via containers.observability, including application-level targeting fields for Containers. Root observability continues to work as a fallback when a container does not define its own observability settings.

      wrangler deploy now preserves legacy configuration.observability for existing container apps that still use rollout-based observability, while using top-level application observability for new or already-migrated apps.

      Existing application diffs are now normalized even when stored resource limits cannot be mapped to a named instance type. API-only metadata and equivalent managed-registry image names no longer appear as edits or affect whether deployment changes require a rollout.

    • Delegate agent Pages project creation with a production branch to Workers

      When run by an AI agent, wrangler pages project create --production-branch <name> is now eligible for delegation to a Workers static-assets deploy. The production branch names the target that a Workers deploy would publish to, so it does not need to disqualify a brand-new project from delegation.

      wrangler pages deploy --branch <name> remains on Pages because an interactive new-project flow separately prompts for its production branch. The deployment branch may therefore represent a preview and cannot safely be converted into a production Workers deployment.

    • Widen agent Pages-to-Workers delegation to new projects on accounts that already use Pages

      When run by an AI agent, wrangler pages deploy and wrangler pages project create now delegate a brand-new static Pages project to a Workers static-assets deploy even when the account already has other Pages projects. The gate is now per-project rather than per-account: a command targeting a project that already exists stays on Pages, but a new project is delegated regardless of the account's other Pages projects.

      A project name restored from the Pages configuration cache is only used when the cache belongs to the currently authenticated account. An account-matching cached name remains on Pages even when the project is missing remotely, preserving the user's recorded Pages intent. After switching accounts, an otherwise unnamed deploy stays on Pages rather than treating a stale cached project name as a new project on the selected account.

  32. 4.129.1

    7 Sep 2026
    • Prevent Wrangler from exiting when a process capturing its output closes the pipe.

      Wrangler now ignores broken-pipe errors from stdout and stderr while preserving the existing failure behavior for other output errors.

    • Update bundle size warning thresholds to use uncompressed size instead of gzip size

      The compressed script size limits (3 MiB free / 10 MiB paid) have been removed server-side in favor of a single 64 MiB uncompressed limit. The bundle size reporter now compares the uncompressed bundle size against this 64 MiB limit for its color-coded warnings, instead of comparing gzip size against the old 3 MiB compressed limit.

    • Honor Workers Builds name overrides in wrangler preview

      Preview commands now target the Worker name supplied by Workers Builds instead of the name in local Wrangler configuration. This prevents preview builds from failing when the two names differ.

  33. 4.129.0

    3 Sep 2026
    • Support gzip compression for JSON Pipelines sinks

      Pipelines is in open beta. wrangler pipelines sinks create and the interactive setup flow now pass the selected JSON compression to the Pipelines API. JSON sinks accept uncompressed or gzip, while Parquet retains its existing compression options and zstd default.

    • Add a --json flag to the wrangler workflows commands

      Every wrangler workflows command now accepts --json, which emits the raw API payload instead of the human-readable rendering. The formatted output remains the default, so existing usage is unaffected:

      wrangler workflows instances list my-workflow --json

      The JSON output carries raw values rather than a serialisation of the formatted view: ISO timestamps instead of locale-formatted dates, plain status strings instead of emojified labels, and no presentation-only derived fields.

    • Tolerate missing permissions during wrangler delete cleanup checks

      wrangler delete now warns and continues when it cannot inspect Worker dependencies or clean up legacy Workers Sites KV namespaces because of missing permissions. The Worker delete request itself still fails normally if the token cannot delete the Worker.

  34. 4.128.0

    1 Sep 2026
    • Move binding utilities into @cloudflare/workers-utils

      Binding conversion, printing, and local-development validation are now exported from @cloudflare/workers-utils so they can be shared by Wrangler, the Cloudflare Vite plugin, and other consumers.

      The corresponding exports have been removed from @cloudflare/deploy-helpers. Consumers should import them directly from @cloudflare/workers-utils instead.

      Wrangler's unstable_printBindings API now accepts the bindings and an options object instead of five positional parameters.

    • Add --date-start and --date-end filters to wrangler workflows instances list

      You can now narrow an instance listing to a creation-time window:

      wrangler workflows instances list my-workflow --date-start 2026-01-01 --date-end 2026-01-31

      Either flag can be used independently. Both accept an ISO 8601 date or timestamp and are normalised to UTC before being sent, so a date-only value such as 2026-01-01 works as well as a full 2026-01-01T13:00:00Z. The bounds are inclusive and compose with the existing --status filter.

    • Add query string redaction to Workers observability configuration

      Set observability.redact_query_string in wrangler.json or observability.redactQueryString in the experimental cloudflare.config.ts format to remove query strings from request URLs in logs and traces.

  35. 4.127.1

    28 Aug 2026

    Only updates a dependency:miniflare 5.20260828.0-alpha

  36. 4.127.0

    27 Aug 2026
    • Add support for configuring a per-workflow max concurrency limit via workflows.concurrency.limit in your Wrangler config.

      The limit is the maximum number of Workflow instances that can run concurrently. It is validated as a positive integer and persisted on deploy; the ceiling is enforced server-side. Concurrency is ignored in local development.

      {
        "workflows": [
          {
            "binding": "MY_WORKFLOW",
            "name": "my-workflow",
            "class_name": "MyWorkflow",
            "concurrency": { "limit": 10 }
          }
        ]
      }
    • Upload wrangler preview modules as multipart form data

      wrangler preview used to base64 the bundle, its modules, and any sourcemaps into a single JSON request body. Base64 inflates content by a third, so a Worker with a large sourcemap could exceed the API request size limit and fail to deploy.

      The preview deployment request is now multipart/form-data. The deployment settings travel in a metadata part and each module follows as its own part carrying raw bytes, matching how wrangler deploy already uploads a Worker.

  37. 4.126.0

    25 Aug 2026
    • Add default_retention to Workflow bindings for configuring how long instances are retained

      Workflow instances are retained for an account-wide default period after they finish. You can now set a per-Workflow default in your Wrangler configuration, applied to instances that do not specify their own retention:

      {
        "workflows": [
          {
            "binding": "MY_WORKFLOW",
            "name": "my-workflow",
            "class_name": "MyWorkflow",
            "default_retention": {
              "success_retention": "3 days",
              "error_retention": "7 days"
            }
          }
        ]
      }

      Each side is optional and accepts either a duration string such as "3 days" or a whole number of milliseconds. Durations are interpreted by the Workflows API, which also caps them at your account's retention limit.

    • Include a chronological list of handler events in email test harness results, so programmatic local email tests can assert the order in which messages are received, forwarded, replied to, or rejected.

      const result = await server.getWorker().email({
        from: "sender@example.com",
        to: "inbox@example.com",
        raw: [
          "From: Sender <sender@example.com>",
          "To: Inbox <inbox@example.com>",
          "Message-ID: <test@example.com>",
          "Subject: Test email",
          "",
          "Hello from the test harness",
        ].join("\r\n"),
      });
      
      expect(result.events).toEqual([
        { type: "received", timestamp: expect.any(String) },
        {
          type: "forward",
          timestamp: expect.any(String),
          messageId: expect.any(String),
        },
        {
          type: "reply",
          timestamp: expect.any(String),
          messageId: expect.any(String),
        },
      ]);
    • Add experimental wrangler hyperdrive planetscale signature for provisioning Cloudflare-billed PlanetScale databases

      wrangler hyperdrive planetscale signature prints a signed authorization as JSON, proving to PlanetScale that Cloudflare will be billed for the database you are about to create:

      npx wrangler hyperdrive planetscale signature | \
        pscale database create <name> \
          --org <org> \
          --engine postgresql \
          --cloudflare-billing @- \
          --format json

      pscale database create defaults to Vitess, so pass --engine postgresql for a Postgres database, and --format json is recommended when the output is consumed by an agent.

      This requires pscale v0.313.0 or newer. Wrangler authorizes the Cloudflare billing side only, so your PlanetScale credentials stay between you and pscale.

      The signature is a cryptographically signed token that authorizes creating a database billed to your Cloudflare account. Treat it as a credential and do not share it. Piping it, as above, is recommended over passing it as a command line argument.

      This command is experimental and its interface may change.

  38. 4.125.0

    20 Aug 2026
    • Add connect trigger for raw sockets

      You can now configure a Worker to receive raw socket connections during wrangler dev, delivered directly to the Worker's connect(socket, env, ctx) handler:

      {
        "connect": [{ "protocol": "tcp", "port": 5432 }]
      }

      Each entry opens a listening socket on 127.0.0.1 (or the given address) that forwards incoming connections straight to the Worker, bypassing the local dev HTTP entry point. This requires the experimental compatibility flag. Only "tcp" is supported at the moment.

      @cloudflare/config also supports declaring this trigger via triggers.connect(...), which lowers to the connect field above:

      import { defineWorker, triggers } from "@cloudflare/config";
      
      export default defineWorker({
        triggers: [
          triggers.connect({ protocol: "tcp", port: 5432, address: "127.0.0.1" }),
        ],
      });
    • Add container support to worker previews

      Worker previews now support containers through a new previews.containers configuration block. Container configuration doesn't inherit, so declare containers explicitly in the previews block to enable them for previews. This mirrors how previews.durable_objects works today. Wrangler names each preview container application {worker_name}_{preview_slug}_{class_name}, normalising and shortening the result to what the API accepts. Either change appends a short digest of the composed name, so two names that would otherwise land on one stay distinct. An entry cannot set its own name, because application names are unique to an account and a fixed name would collide between two previews of the same Worker. A Durable Object class is backed by at most one container application, so the validator rejects two entries that share a class_name. Wrangler skips container applications bound to Durable Object classes that another Worker implements through script_name, because the implementing Worker owns its own container application. A binding is not required: a Durable Object declared through migrations or exports and reached only over ctx.exports can still back a container. Every entry must set class_name. A previews.containers entry whose class_name matches no Durable Object class at all is rejected before the preview deployment is created, so a typo fails loudly instead of producing a preview with no container.

      Wrangler creates the container applications on wrangler preview. Deleting a preview tears them down server side, so wrangler preview delete doesn't remove them.

      Container build and deploy progress prints to stdout. wrangler preview --json suppresses wrangler's own output so it doesn't interleave with the payload, and warnings and errors still go to stderr. Docker's build output and the progress spinner write to stdout directly and bypass that suppression, so parse --json from a non interactive shell, where the spinner is skipped, and prefer a prebuilt image over a Dockerfile.

    • [private beta]: Create the parent Worker automatically when wrangler preview targets one that doesn't exist yet

      Previews hang off a parent Worker, so running wrangler preview before the Worker had ever been deployed failed with a raw API error naming the Preview endpoint. Wrangler now offers to create an empty parent Worker and then carries on creating the Preview. The parent uses the same workers.dev and Preview URL settings that wrangler deploy would resolve, without applying routes or cron triggers. In non-interactive environments, Wrangler creates the Worker without asking.

  39. 4.124.0

    18 Aug 2026
    • Allow containers to be attached to a Durable Object from its exports entry

      A container can now be linked to its Durable Object from the export side, using a new container field that names an entry in the containers array. As a result containers.class_name is now optional — a container that is referenced this way only needs a name:

      {
        "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_name direction 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.

      container is only valid on live durable-object exports (created and expecting-transfer) and requires storage: "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.dev when running Workers with @cloudflare/vitest-pool-workers, so ctx.access.getIdentity() returns the configured identity just as it does with wrangler dev.

    • Fix .env loading on Windows leaking stale, differently-cased duplicate keys

      On Windows, wrangler loads .env values through a case-insensitive Proxy wrapper so lookups like env.PATH and env.Path resolve to the same value, and this object is assigned directly to process.env. When a key was set again under a different casing (e.g. a value in .env.local overriding one from .env with different casing), the previous casing was never removed from the underlying object. env.PATH/env.Path still returned the correct, latest value, but anything that enumerates process.env — Object.keys, for...in, JSON.stringify, object spread, or a spawned subprocess inheriting the environment — would see both the stale and current key.

      Duplicate entries no longer appear, so environment variables passed to subprocesses and any code that lists the environment now see only the latest value for each variable.

  40. 4.123.0

    13 Aug 2026
    • Add local dev simulation for Cloudflare Access ctx.access.getIdentity()

      You can now configure a mock Cloudflare Access identity in wrangler.json so that ctx.access.getIdentity() returns it during local development.

      // wrangler.json
      {
        "access": {
          "dev": {
            "aud": "my-app-aud-tag",
            "identity": {
              "email": "user@example.com",
              "name": "Test User"
            }
          }
        }
      }
    • [private beta]: Updates the --ignore-defaults flag to --ignore-base-config on wrangler preview commands.

      --ignore-base-config now only takes effect on Preview creation, rather than on each deployment, since Preview base configuration is now copy-on-create rather than inherit-on-deploy.

    • Add automatic update prompts for out-of-date Cloudflare agent skills

      When Cloudflare skills were previously installed by Wrangler and the upstream cloudflare/skills repository has newer content, Wrangler now offers to update them after eligible commands complete.

      To reduce prompt fatigue, the update check only runs once a month (30 days since the last install or update). Declining suppresses the prompt until the next upstream change.

      When declining an update, Wrangler offers the option to permanently disable future update prompts. This preference is stored globally in ~/.wrangler/agents-skills-install.jsonc. The WRANGLER_NO_SKILLS_UPDATE_PROMPTS=true environment variable can also be used to suppress prompts. The --install-skills flag remains available regardless of these settings.

  41. 4.122.0

    12 Aug 2026
    • Detect Node.js compatibility from the compatibility date, now that nodejs_compat is enabled by default

      As of compatibility date 2026-08-04, workerd enables the nodejs_compat and nodejs_compat_v2 compatibility 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 of 2026-08-04 or later without the flag would get Node.js APIs from the runtime but no Node.js polyfills from the bundler, and process.env could be substituted with an empty object at build time. They now resolve these flags the same way workerd does, and honour no_nodejs_compat to opt out.

      To keep Node.js compatibility switched off on a newer compatibility date, specify both no_nodejs_compat and no_nodejs_compat_v2, since each flag has its own default.

      @cloudflare/vitest-pool-workers needs nodejs_compat_v2 for 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 types also no longer attributes its @types/node suggestion to "the nodejs_compat flag", which it can now make for Workers that do not set the flag at all.

    • Ignore a nodejs_compat compatibility flag that the compatibility date already enables

      workerd rejects a compatibility flag that its compatibility date enables by default, so a Worker configured with both a compatibility date of 2026-08-04 or later and nodejs_compat failed 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_compat and nodejs_compat_v2 flags are now dropped when starting the runtime, which has no effect on the resulting Worker because the compatibility date enables both anyway. no_nodejs_compat and no_nodejs_compat_v2 still 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.

    • Stop adding a redundant nodejs_compat flag to generated Wrangler configurations

      create-cloudflare and wrangler setup write today's date as the compatibility_date, and from 2026-08-04 that already enables nodejs_compat. Adding the flag as well made the generated project fail to start with "The compatibility flag nodejs_compat became the default as of 2026-08-04 so does not need to be specified anymore", so the flag is now only added for earlier compatibility dates.

      create-cloudflare also removes the flag when a template, or a framework's own scaffolder, already wrote it into a configuration that ends up using such a compatibility date, and still installs @types/node for these projects even though there is no longer a flag to detect them by.

      wrangler setup does the same for a wrangler.json(c) that is already in the project: it writes today's date over whatever date that configuration was written for, so a nodejs_compat it finds there is removed as part of writing the file.

  42. 4.121.0

    11 Aug 2026
    • Add Preview base config secret commands

      Wrangler now manages Worker Preview base config secrets with wrangler preview base-config secret put, delete, list, and bulk. These commands update the Worker's previews_base_config.env, keeping shared defaults scoped to all of that Worker's Previews. wrangler preview base-config secret list reads from the Worker's Preview base config and prints secret names with values masked. wrangler preview base-config secret bulk deletes a secret when its value is null, matching wrangler secret bulk.

    • Allow Wrangler projects to build a Worker once and reuse it in createTestHarness()

      Build the Worker once:

      wrangler deploy --dry-run --outdir ./worker-output

      Then reuse the emitted Worker during test harness startup and reset:

      const server = createTestHarness({
        workers: [
          {
            configPath: "./wrangler.jsonc",
            prebuiltWorkerDir: "./worker-output",
          },
        ],
      });
    • Add email.sending as an event subscription source for queues

      wrangler queues subscription create now accepts --source email.sending alongside two new flags, --zone-id and --domain, which identify the zone and the sending domain (zone apex or a verified subdomain) to subscribe to. Both flags are required for this source. The subscription's resource is displayed as the sending domain in wrangler queues subscription get.

  43. 4.120.1

    10 Aug 2026
    • Update local development for Miniflare's config-based options

      Wrangler now converts the Miniflare options it creates for local development to Miniflare's config-based workers shape.

      Users should not expect to notice any changes.

  44. 4.120.0

    7 Aug 2026
    • Adds the ability to find container instances by exact ID or name

      wrangler containers instances <application_id> --search <instance_id_or_name> now searches every page and returns exact matches in human-readable or JSON output. JSON returns a top-level array, including an empty array when there is no match, while human-readable output prints a no-match message. If multiple instances have the same exact name, every matching instance is returned.

    • Add explicit pagination to container instance JSON output

      Use wrangler containers instances <application_id> --json --per-page <size> to return one page with machine-readable result_info, then pass its next_page_token to --page-token to retrieve the next page. Plain --json remains backward-compatible: it requests the complete list and returns the existing top-level array.

    • 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__.

  45. 4.119.0

    5 Aug 2026
    • Add --parse-type flag to wrangler ai-search create

      wrangler ai-search create now accepts --parse-type to control how a website data source discovers URLs. sitemap (the default) reads XML sitemaps; discover follows links recursively.

      Previously the parse type could only be chosen through the interactive wizard, which was skipped whenever --source was supplied — so it was impossible to create a discover instance from a script.

      wrangler ai-search create my-instance \
        --type web-crawler \
        --source https://example.com \
        --parse-type discover

      The interactive wizard now offers Discover alongside Sitemap. --parse-type is only valid with --type web-crawler; passing it with --type builtin or --type r2 is rejected, since the API stores the value for those source types but never reads it. When the flag is omitted in non-interactive mode the field is left unset and the API default (sitemap) applies.

    • Improve the Local Explorer's Observability views

      console.log messages 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).

    • Add support for OAuth 2.0 Device Authorization Grant to wrangler login

      Run wrangler login --device to authenticate without a local callback server. Useful in containers, remote SSH sessions, Codespaces, and any other environment where localhost:8976 is unreachable from your browser.

      The new flow:

      The verification URL is supplied by the authorization server, so it is rejected unless it is an https URL on the same auth domain the device code was requested from — it is never printed or opened otherwise.

      --callback-host and --callback-port cannot be combined with --device, since this flow does not start a local callback server.

  46. 4.118.0

    31 Jul 2026
    • Add --json flag to wrangler containers info for consistent JSON output with sibling commands list and instances

    • Enable local observability capture by default in dev

      wrangler dev and 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 behind X_LOCAL_OBSERVABILITY=true. Set X_LOCAL_OBSERVABILITY=false to opt out (for example if the extra per-worker collector/streaming-tail services cause trouble in a multi-process dev-registry setup).

    • Add additional triggers to Workflows

      Workers can now declaratively start a locally defined Workflow. Configure event subscriptions under triggers.events; Wrangler validates each target and updates the script's event triggers during deployment.

      {
        "triggers": {
          "events": [
            {
              "type": "cf.artifacts.repo.pushed",
              "filter": {
                "namespace": "my-namespace",
                "repo_name": "my-repo"
              },
              "targets": [
                {
                  "type": "workflow",
                  "workflow_name": "my-workflow"
                }
              ]
            }
          ]
        }
      }
  47. 4.117.0

    31 Jul 2026
    • removed

      Remove containerEngine from the worker options returned by unstable_getMiniflareWorkerOptions

      unstable_getMiniflareWorkerOptions no longer includes containerEngine in the returned workerOptions, since the container engine is a Miniflare instance-wide setting rather than a per-worker one. Callers that build a Miniflare instance from these options should set containerEngine at the top level instead.

    • 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 dev and 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:

  48. 4.116.0

    30 Jul 2026
    • Avoid Worker and workers.dev naming prompts in agent-driven deploys

      Wrangler now derives the Worker name from the project and automatically registers the same project-derived workers.dev account subdomain on a first deploy when running in a detected agent environment. The deploy output explains how to change both names.

    • The experimental build output directory now includes the Worker's configuration at .cloudflare/output/v0/workers/default/config.json instead of .cloudflare/output/v0/workers/<worker-name>/worker.config.json

    • Graduate wrangler check startup from alpha and show bundle size and a local timing summary

      The command no longer prints an alpha warning. It now reports its local profile window, sampled active, garbage collection, and idle time alongside the raw and compressed bundle sizes. The existing measurement warning continues to distinguish these local measurements from startup time measured on Cloudflare.

  49. 4.115.0

    28 Jul 2026
    • Add hidden --jurisdiction option to wrangler kv namespace create for internal testing

      This option creates a KV namespace within a specific jurisdiction (for example us, eu, or fedramp), backing it with jurisdiction-scoped storage. It is experimental and currently gated to allow-listed accounts, so it is hidden from --help until the feature is generally available.

    • Add experimental local_dev.experimental_s3_credentials to r2_buckets config

      When set, the R2 bucket is served over a local S3-compatible API at /cdn-cgi/local/r2/s3/<bucket-id> during local development, authenticated with the configured AWS SigV4 credentials. <bucket-id> is the bucket's bucket_name, or the binding name if bucket_name is not set:

      {
        "r2_buckets": [
          {
            "binding": "BUCKET",
            "bucket_name": "my-bucket",
            "local_dev": {
              "experimental_s3_credentials": {
                "accessKeyId": "local-access-key-id",
                "secretAccessKey": "local-secret-access-key"
              }
            }
          }
        ]
      }
    • Respect and surface the Retry-After header on Cloudflare API responses

      Previously, if a Wrangler command (e.g. wrangler versions upload, wrangler deploy) hit the Cloudflare API's rate limit, the resulting error gave no indication of how long to wait before trying again, and 429 responses weren't retried at all (only 5xx errors were, with a fixed linear backoff).

      Now:

      APIError.isRetryable() is unchanged (still 5xx only); retryOnAPIFailure() separately retries 429s. retryAfterMs, when present, is honoured for any retried error, not just 429s.

      retryAfterMs is also now populated on APIErrors raised from direct R2 object requests, the Browser Rendering API, and errors surfaced from commands using the official cloudflare SDK client.

  50. 4.114.0

    23 Jul 2026
    • Add local-dev observability

      wrangler dev and the Vite plugin now capture a trace for every local Worker invocation - spans, logs, and console.* 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=true to turn it on. It will be on by default in the public release.

    • Improve the D1 database-limit error message

      When creating a D1 database fails because the account has hit its database limit, the error now points to the relevant next steps — upgrading on the Workers Free plan or requesting a higher limit on a paid plan — alongside the existing commands to list and delete databases. Previously it only suggested deleting unused databases. This applies both to wrangler d1 create and to the D1 database that is created during resource provisioning on deploy.

    • Fix grammar in the container image-too-large error

      The error thrown when a container image exceeds the available disk size ended with "Your need more disk for this image." It now reads "You need more disk for this image."