{
  "slug": "wrangler-local-r2-development-adds-experimental-s3-compatible-credentials-f75831b2bc26",
  "title": "wrangler local R2 development adds experimental S3-compatible credentials",
  "tools": [
    "wrangler"
  ],
  "tags": [
    "agent"
  ],
  "introduced_at": "2026-07-28T19:42:23.000Z",
  "announced_at": "2026-07-28T19:42:23.000Z",
  "effective_at": null,
  "date_basis": "source-publication",
  "status": "unknown",
  "how": {
    "incantation": "For local development against an R2 bucket through the S3-compatible API, set `local_dev.experimental_s3_credentials` under its `r2_buckets` entry, with both credential fields. The local endpoint uses AWS SigV4; its bucket ID is `bucket_name`, or `binding` if `bucket_name` is unset.",
    "examples": [
      "{\n  \"r2_buckets\": [\n    {\n      \"binding\": \"<BINDING_NAME>\",\n      \"bucket_name\": \"<BUCKET_NAME>\",\n      \"local_dev\": {\n        \"experimental_s3_credentials\": {\n          \"accessKeyId\": \"<ACCESS_KEY_ID>\",\n          \"secretAccessKey\": \"<SECRET_ACCESS_KEY>\"\n        }\n      }\n    }\n  ]\n}"
    ],
    "gotchas": [
      "Version: 4.115.0",
      "Availability: Experimental.",
      "r2_buckets[].binding (required): Binding name for the R2 bucket; used as the bucket ID if `bucket_name` is unset.",
      "r2_buckets[].bucket_name (required): R2 bucket name; used as the local endpoint bucket ID when set.",
      "r2_buckets[].local_dev.experimental_s3_credentials: Enables local S3-compatible API credentials for this bucket.",
      "accessKeyId (required): Configured AWS SigV4 access key ID.",
      "secretAccessKey (required): Configured AWS SigV4 secret access key.",
      "Prerequisite: The local API is available during local development at `/cdn-cgi/local/r2/s3/<bucket-id>` and authenticates with AWS SigV4 credentials.",
      "The bucket is served through the S3-compatible API during local development.",
      "The API is 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.",
      "Docs conflict: The official PR page’s earlier configuration example uses a different field name and layout (`experimental_local_s3_credentials`); it conflicts with the Wrangler 4.115.0 release note’s `local_dev.experimental_s3_credentials`, so that PR example is not used here: https://github.com/cloudflare/workers-sdk/pull/14280"
    ]
  },
  "why_it_matters": "For local development against an R2 bucket through an S3-compatible API, configure the bucket's local development credentials.",
  "sources": [
    "https://github.com/cloudflare/workers-sdk/releases/tag/wrangler%404.115.0",
    "https://developers.cloudflare.com/workers/wrangler/configuration/"
  ],
  "rank": 0.91044,
  "judge": {
    "publish": true,
    "judge_model": "codex-cli/gpt-6-luna+typesafe/jev-1.13.0",
    "prompt_version": "extract-v7+enrich-v1+judge-v2x3+jev-publish-v1"
  },
  "review_state": "approved",
  "provenance": {
    "run_id": "backfill-20261007",
    "verdict_id": "backfill-20261007:backfill-20261007-81fd7fb9b2060b91-1:gate",
    "evidence_hash": "39dc0d621e41d6627ecc46524aa28ee155e4f70b6a6df3330002f5c29225c18e"
  },
  "review": {
    "draft_hash": "834f8be9f61d0bb8a76a373761835c2f83c5a1c3e3fc96d5b50ee63929ac707d",
    "reviewer": "publication-gate",
    "reviewed_at": "2026-10-07T00:00:00.000Z",
    "decision": "backfill-20261007:gate",
    "reason": "2 of 3 judge runs approved with p_yes >= 0.9 (mean 0.91 >= 0.9; 2 needed) and Jev gave 0.67 (>= 0.6 needed)."
  }
}
