429 API errors now auto-retried; local S3 for R2 workbenches
wrangler@4.115.0
Minor Changes
-
#14807
4dfb96eThanks @oOPa! - Add hidden--jurisdictionoption towrangler kv namespace createfor internal testingThis option creates a KV namespace within a specific jurisdiction (for example
us,eu, orfedramp), backing it with jurisdiction-scoped storage. It is experimental and currently gated to allow-listed accounts, so it is hidden from--helpuntil the feature is generally available. -
#14280
465c0fbThanks @tahmid-23! - Add experimentallocal_dev.experimental_s3_credentialstor2_bucketsconfigWhen 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'sbucket_name, or the binding name ifbucket_nameis 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" } } } ] } -
#14877
552bcfcThanks @jasoncabot! - Respect and surface theRetry-Afterheader on Cloudflare API responsesPreviously, 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 (only5xxerrors were, with a fixed linear backoff).Now:
429 Too Many Requestsresponses are automatically retried, alongside the existing5xxretry behaviour.- If a retried response includes a
Retry-Afterheader, Wrangler waits for that duration instead of the default backoff, and logs a message indicating how long it's waiting. To avoid blocking for an excessive amount of time, waits longer than 60 seconds fail fast instead — the surfacedRetry-Aftervalue lets the caller schedule its own retry. - If a retryable error is ultimately surfaced to the user (e.g. because retries were exhausted), the error message includes a note with the
Retry-Afterduration, and thecommand-failedentry written to the Wrangler output file (WRANGLER_OUTPUT_FILE_PATH/WRANGLER_OUTPUT_FILE_DIRECTORY) gains aretry_after_msfield. This lets scripts and CI/CD pipelines calling Wrangler repeatedly (for example,wrangler versions uploadon every commit) read the wait duration directly instead of regex-parsing stderr.
APIError.isRetryable()is unchanged (still5xxonly);retryOnAPIFailure()separately retries 429s.retryAfterMs, when present, is honoured for any retried error, not just 429s.retryAfterMsis also now populated onAPIErrors raised from direct R2 object requests, the Browser Rendering API, and errors surfaced from commands using the officialcloudflareSDK client. -
#14712
6e0bf6eThanks @mack-erel! - Supportconnect()on remote VPC Network and VPC Service bindings in local developmentRemote VPC Network and VPC Service bindings previously only supported HTTP and JSRPC, so calling
binding.connect(address)against a private TCP service (for example a database) failed in local dev withIncoming CONNECT on a worker not supported. Raw TCP connections through remote VPC Network and VPC Service bindings now work in local development.This feature is experimental. Existing HTTP and JSRPC usage of remote VPC Network and VPC Service bindings is unaffected, and no new configuration is required.
Patch Changes
-
#14833
773ead4Thanks @DiogoSantoss! - Color Email Routing plan change markersWrangler now highlights additions in green, updates in yellow, and deletions and conflicts in red so Email Routing deployment plans are easier to scan before confirmation.
-
#14833
773ead4Thanks @DiogoSantoss! - Apply Email Routing changes across independent zones concurrentlyWrangler now limits concurrent zone updates while preserving the Email Routing plan order within each zone. Deployments that configure addresses across multiple zones complete faster without breaking delete-before-add transitions at a zone's rule limit.
-
#14815
09b8a44Thanks @chinesepowered! - Fixwrangler cloudchamber curlmangling header values that contain a colonHeader values were split on every colon and only the segment between the first and second was sent, so
--header location:https://example.com/xarrived ashttps. Headers are now split on the first colon only. A header that is not in the documented--header <name>:<value>form previously threw an unhandledTypeError, and now reports a clear error. -
#14806
e8b3a9dThanks @akim136! - Handle and explain authentication failures from remote bindings during local developmentWrangler now recognizes authentication failures from remote preview sessions and reports that bindings which need to run remotely require Cloudflare authentication even when the rest of the Worker is developed locally.
-
#14801
b737676Thanks @emily-shen! - Speed up old debug log cleanup by reading each log file's date from its filename instead ofstat-ing every fileWrangler periodically deletes debug log files older than 30 days from its logs directory. Previously it made a filesystem
statcall for each file to read its modification time; it now derives the age from the timestamp already encoded in the log filename, avoiding that extra work. -
Updated dependencies [
1035f74,e426cb9,3a22ae5,465c0fb,6e0bf6e]:- miniflare@4.20260722.1
Fetched July 28, 2026


