Skip to content

[miniflare] Expose R2 via an S3-compatible API locally - #14280

Merged
emily-shen merged 24 commits into
cloudflare:mainfrom
tahmid-23:r2-local-s3-staged
Jul 27, 2026
Merged

[miniflare] Expose R2 via an S3-compatible API locally#14280
emily-shen merged 24 commits into
cloudflare:mainfrom
tahmid-23:r2-local-s3-staged

Conversation

@tahmid-23

@tahmid-23 tahmid-23 commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

This PR is based off of #14119, which laid the groundwork.

Motivation

R2 provides an S3 compatibility layer. This exposes R2 operations via S3. However, this is currently not replicated in wrangler.

This feature is especially useful for presigned requests, and in particular presigned uploads. Presigned uploads allows a user to directly upload a file to R2, rather than go indirectly through a worker (in production). However, wrangler does not currently support any S3 compatible API, meaning that using presigned uploads in production can't be tested locally (without making your own worker to implement this exact purpose). Otherwise, I do not believe an S3-compatible local API is strictly needed (although I could be mistaken).

Hence, the primary motivation for adding this S3-compatible local API is pre-signed uploads. However, if I'm going to add presigned upload support, I figured I ought to just support S3 to the maximum extent possible, since presigned uploads are fundamentally an S3 concept.

Regardless, having the S3-compatible API locally makes testing easier if using an S3 client is preferred.

Implementation

I realize that this is a sizable change. I did my best effort to split my commits into small chunks, so that each commit is realistically reviewable. The commits build upon each other sequentially / do not revert prior work (up to Add changesets for the local R2 S3 endpoint and public-bucket fixes, e.g. before any review feedback commits).

Public Worker Fixes

The first few commits are series of patches to the existing local public worker. These are minor bugs / inconsistencies with cloudflare's public R2 endpoints. (I wanted to drive parity here, since I didn't feel that the bugs necessarily warranted their own PR. The functionality of these fixes is also equally important for correctness in the S3 API.)

Configuration

We expose the following configuration field in wrangler.jsonc:

{
	"r2_buckets": [
		{
			"binding": "BUCKET",
			"bucket_name": "my-bucket",
			"experimental_local_s3_credentials": {
				"accessKeyId": "local-access-key-id",
				"secretAccessKey": "local-secret-access-key",
			},
		},
	],
}

If any bucket is configured with experimental_local_s3_credentials, it will launch the S3 worker at cdn-cgi/local/r2/s3, and use the credentials to authorize requests to the local S3 API.

Authorization

We implement AWS's SigV4 signing algorithm on the server-side. This is implemented for both Authorization header authorization (for using the standard s3 client), and for presigned query parameter authorization (for presigned requests). These are verified by using the standard @smithy/signature-v4 package in tests.

Operations

The cloudflare docs on S3 compatibility describes which operations are fully supported. We implement these to the maximum extent possible.

However, some features are not implementable in local development. For example, "SSE-C" cannot be supported, because miniflare does not internally expose any API to forward the SSE-C parameter to workerd R2. index.worker.ts contains a comment describing some of the limitations.

I used Claude to determine the error messages and conditions against my public R2-S3 endpoint. I tried to maintain parity with production R2-S3 as much as possible (error message formatting, error codes, order of checks, etc.)


  • Tests
    • Tests included/updated
    • Automated tests not possible - manual testing has been completed as follows:
    • Additional testing not necessary because:
  • Public documentation
    • Cloudflare docs PR(s):
    • Documentation not necessary because: I don't see any place/requirements to put documentation for these kinds of features (?)

A picture of a cute animal (not mandatory, but encouraged)


Open in Devin Review

@changeset-bot

changeset-bot Bot commented Jun 12, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 930b57d

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 8 packages
Name Type
miniflare Minor
wrangler Minor
@cloudflare/deploy-helpers Patch
@cloudflare/pages-shared Patch
@cloudflare/remote-bindings Patch
@cloudflare/runtime-types Patch
@cloudflare/vite-plugin Patch
@cloudflare/vitest-pool-workers Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-project-automation github-project-automation Bot moved this to Untriaged in workers-sdk Jun 12, 2026
@workers-devprod
workers-devprod requested review from a team and penalosa and removed request for a team June 12, 2026 15:52
@workers-devprod

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • @cloudflare/wrangler
Show detailed file reviewers
  • .changeset/r2-local-public-fixes.md: [@cloudflare/wrangler]
  • .changeset/r2-local-s3-endpoint.md: [@cloudflare/wrangler]
  • .changeset/r2-local-s3-wrangler.md: [@cloudflare/wrangler]
  • packages/miniflare/package.json: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/core/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/r2/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/shared/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/shared/error.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/core/constants.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/core/entry.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/constants.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/public.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/account.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/auth.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/common.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/detect.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/dispatch.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/errors.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/index.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/operations.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/serve.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/test/plugins/r2/public.spec.ts: [@cloudflare/wrangler]
  • packages/miniflare/test/plugins/r2/s3.spec.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/environment.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/validation.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/worker.ts: [@cloudflare/wrangler]
  • packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/dev/miniflare/index.ts: [@cloudflare/wrangler]
  • pnpm-lock.yaml: [@cloudflare/wrangler]

@pkg-pr-new

pkg-pr-new Bot commented Jun 12, 2026

Copy link
Copy Markdown
@cloudflare/autoconfig

npm i https://pkg.pr.new/@cloudflare/autoconfig@14280

@cloudflare/config

npm i https://pkg.pr.new/@cloudflare/config@14280

create-cloudflare

npm i https://pkg.pr.new/create-cloudflare@14280

@cloudflare/deploy-helpers

npm i https://pkg.pr.new/@cloudflare/deploy-helpers@14280

@cloudflare/kv-asset-handler

npm i https://pkg.pr.new/@cloudflare/kv-asset-handler@14280

miniflare

npm i https://pkg.pr.new/miniflare@14280

@cloudflare/pages-shared

npm i https://pkg.pr.new/@cloudflare/pages-shared@14280

@cloudflare/unenv-preset

npm i https://pkg.pr.new/@cloudflare/unenv-preset@14280

@cloudflare/vite-plugin

npm i https://pkg.pr.new/@cloudflare/vite-plugin@14280

@cloudflare/vitest-pool-workers

npm i https://pkg.pr.new/@cloudflare/vitest-pool-workers@14280

@cloudflare/workers-auth

npm i https://pkg.pr.new/@cloudflare/workers-auth@14280

@cloudflare/workers-editor-shared

npm i https://pkg.pr.new/@cloudflare/workers-editor-shared@14280

@cloudflare/workers-utils

npm i https://pkg.pr.new/@cloudflare/workers-utils@14280

wrangler

npm i https://pkg.pr.new/wrangler@14280

commit: 930b57d

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

Open in Devin Review

Comment thread packages/miniflare/src/workers/r2/serve.worker.ts

@petebacondarwin petebacondarwin left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tahmid-23 - thanks for putting this together. It is indeed a lot of change. I think it is much more likely to be reviewed if we do break it up into the initial bug fixes, and then a second PR to add the S3 compatibility. Apart from anything we will need to get R2 product sign off on this as a feature, whereas bug fixes we can land more simply.

@github-project-automation github-project-automation Bot moved this from Untriaged to In Review in workers-sdk Jun 16, 2026
@petebacondarwin
petebacondarwin removed the request for review from penalosa June 16, 2026 07:14
@tahmid-23
tahmid-23 force-pushed the r2-local-s3-staged branch 2 times, most recently from 3703a8b to b14551c Compare June 16, 2026 11:06

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

Open in Devin Review

Comment thread packages/miniflare/src/workers/r2/serve.worker.ts
@tahmid-23

Copy link
Copy Markdown
Contributor Author

@tahmid-23 - thanks for putting this together. It is indeed a lot of change. I think it is much more likely to be reviewed if we do break it up into the initial bug fixes, and then a second PR to add the S3 compatibility. Apart from anything we will need to get R2 product sign off on this as a feature, whereas bug fixes we can land more simply.

@petebacondarwin fair enough. I reordered a bit and put the first 8 commits into #14323.

@tahmid-23
tahmid-23 force-pushed the r2-local-s3-staged branch 2 times, most recently from a6519e6 to dee1979 Compare June 16, 2026 12:40
tahmid-23 and others added 8 commits June 29, 2026 11:46
When set, the R2 bucket will be served over a local S3-compatible API
during local development, authenticated with the configured AWS SigV4
credentials. This commit adds the config surface and validation; the
endpoint itself and the wrangler dev wiring follow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pure refactor: namespace entries flow through verbatim instead of being
rebuilt from a fixed field list, so a plugin can carry extra per-entry
fields without forking the helper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Buckets configured with s3Credentials are served by a new r2:s3 service
at /cdn-cgi/local/r2/s3/<bucket-id>. This commit adds the plugin option,
the credential-conflict check, the entry-worker routing, and a stub
worker that resolves buckets and answers with S3-style XML errors; the
actual S3 protocol follows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…3 endpoint

Everything both SigV4 authentication methods (Authorization header and
presigned URL query parameters) share: canonical request construction
(with S3's single-encoded canonical URI), the signing-key derivation and
signature comparison, credential-scope and date parsing with R2's
validation order and error messages, and the SignatureDoesNotMatch
debug response. verifyRequest() is wired into dispatch but rejects
everything with R2's missing-authorization error until the two
verifiers land in the following commits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… S3 endpoint

Implements the Authorization-header authentication method on top of the
shared verification core: header field parsing, the x-amz-date /
date-header fallback, request-time skew bounds, payload-hash
verification, and R2's error responses for each failure. Authenticated
requests still answer NotImplemented; operations follow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…point

Implements the SigV4 query-parameter authentication method on top of
the shared verification core: required presigned parameters reported
together like R2, X-Amz-Expires bounds (403 ExpiredRequest past expiry,
a week at most), the UNSIGNED-PAYLOAD canonical request, and
X-Amz-Signature exclusion from the canonical query string. The
Authorization header keeps precedence over presigned query parameters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…'s errors for unimplemented surfaces

Adds the operation pipeline: detection yields either a terminal
Response or a BoundOperation whose screening rules are applied before
its handler runs. Detection reproduces R2's routing for the surfaces
its S3 endpoint recognizes but does not implement: object/bucket
subresource catch-alls with R2's templated "<name> not implemented"
errors (including the GetGetBucketPolicyStatus typo), bucket PUT/DELETE
subresource routing, the unsigned bucket-POST presigned-post 501, and a
header-screening skeleton (x-amz-security-token rejection). With no
operations implemented yet, everything else falls back to a screened
NotImplemented operation; each operation group replaces that fallback
as its detection lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pure refactor: move range parsing, object headers, conditional handling,
and range responses out of public.worker.ts into a serveR2Object()
shared with the upcoming S3 endpoint, parameterized by endpoint-specific
error handlers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tahmid-23 and others added 4 commits June 29, 2026 11:47
CreateMultipartUpload, UploadPart, UploadPartCopy,
CompleteMultipartUpload, and AbortMultipartUpload, built on the
binding's resumeMultipartUpload(). Binding errors are mapped back onto
R2's S3 error responses by their v4 codes (workerd only exposes them via
the error message), and the simulator's internal-error responses for
unknown upload ids are mapped onto NoSuchUpload.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The account-level route verifies the request against each configured
credential set (preferring the most specific auth error) and lists the
buckets matching the presented credentials.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…the local S3 endpoint

Pass the configured credentials through to miniflare's r2Buckets option
for local (non-remote) buckets, enabling the S3-compatible endpoint
during wrangler dev. With the endpoint now fully wired up, this also
adds the miniflare changeset, documents the known gaps vs real R2 in
the S3 worker's module header, and aligns the lockfile with the new
miniflare devDependencies.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@tahmid-23
tahmid-23 force-pushed the r2-local-s3-staged branch from dee1979 to b055770 Compare June 29, 2026 16:02
@workers-devprod

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • @cloudflare/wrangler
Show detailed file reviewers
  • .changeset/r2-local-s3-endpoint.md: [@cloudflare/wrangler]
  • .changeset/r2-local-s3-wrangler.md: [@cloudflare/wrangler]
  • packages/miniflare/package.json: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/core/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/r2/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/shared/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/shared/error.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/core/constants.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/core/entry.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/constants.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/public.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/account.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/auth.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/common.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/detect.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/dispatch.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/errors.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/index.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/operations.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/serve.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/test/plugins/r2/s3.spec.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/environment.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/validation.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/worker.ts: [@cloudflare/wrangler]
  • packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/dev/miniflare/index.ts: [@cloudflare/wrangler]
  • pnpm-lock.yaml: [@cloudflare/wrangler]

@tahmid-23

tahmid-23 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

rebased on top of the merged fix commits. doesn't do much to reduce the diff though...

@helloimalastair helloimalastair left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few small nits here, but otherwise approved by R2 Team Member.

cc @emily-shen

Comment thread .changeset/r2-local-s3-endpoint.md Outdated
Comment thread .changeset/r2-local-s3-wrangler.md Outdated
tahmid-23 and others added 2 commits July 18, 2026 01:25
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@workers-devprod

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • @cloudflare/wrangler
Show detailed file reviewers
  • .changeset/r2-local-s3-endpoint.md: [@cloudflare/wrangler]
  • .changeset/r2-local-s3-wrangler.md: [@cloudflare/wrangler]
  • packages/miniflare/package.json: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/core/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/r2/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/plugins/shared/index.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/shared/error.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/core/constants.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/core/entry.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/constants.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/public.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/account.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/auth.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/common.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/detect.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/dispatch.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/errors.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/index.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/s3/operations.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/src/workers/r2/serve.worker.ts: [@cloudflare/wrangler]
  • packages/miniflare/test/plugins/r2/s3.spec.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/environment.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/validation.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/worker.ts: [@cloudflare/wrangler]
  • packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/dev/miniflare/index.ts: [@cloudflare/wrangler]
  • pnpm-lock.yaml: [@cloudflare/wrangler]

@tahmid-23

tahmid-23 commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

nits addressed, merged main to fix conflicts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@emily-shen emily-shen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry about the long delay getting back to you! This is very much appreciated 🧡

I'm basically ready to approve this, we just happen to be currently working out what we want dev-only resource config to look like for another resource, and i'd like experimental_local_s3_credentials to be consistent with that.

In terms of next steps:

  • docs - this should definitely have docs, probably under a 'local development' page for R2, which is long overdue anyway. If you could submit a PR, that'd be great - I'm very happy to help as well.
  • once this is out in a release, i'll post a comment on the original feature request to get people testing, and tag you with credit.

@emily-shen emily-shen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would you also be able to add an e2e test in wrangler (e2e/dev.test.ts) and vite (either in packages/vite-plugin-cloudflare/playground/bindings or a new fixture)? specifically it would be good to have a regression test to ensure that the sigv4 verification is interacting correctly with the routing we do in our different dev servers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@workers-devprod

workers-devprod commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • ✅ @cloudflare/wrangler
Show detailed file reviewers

Regression tests that SigV4 verification interacts correctly with the
request routing in wrangler dev (e2e/dev.test.ts) and the Vite plugin
(playground/bindings): header-auth round-trip, presigned URL query
auth, and rejection of bad signatures through each dev server.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@tahmid-23

Copy link
Copy Markdown
Contributor Author

@emily-shen added test + cloudflare/cloudflare-docs#32319

@petebacondarwin
petebacondarwin dismissed their stale review July 27, 2026 11:44

Things have moved on

@emily-shen emily-shen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just the config change then lgtm :)

Comment thread .changeset/r2-local-s3-wrangler.md Outdated
Renames experimental_local_s3_credentials to
local_dev.experimental_s3_credentials per review, aligning with the
direction for dev-only resource config. Also validates that local_dev
is an object and rejects unknown fields within it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@tahmid-23
tahmid-23 requested a review from emily-shen July 27, 2026 14:34

@workers-devprod workers-devprod left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codeowners reviews satisfied

@github-project-automation github-project-automation Bot moved this from In Review to Approved in workers-sdk Jul 27, 2026
@emily-shen
emily-shen merged commit 465c0fb into cloudflare:main Jul 27, 2026
74 of 76 checks passed
@github-project-automation github-project-automation Bot moved this from Approved to Done in workers-sdk Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants