Skip to content

R2

Object storage from the Worker (env.<binding>). celld maps bindings to r2/<bucket_name>/ in the version fleet bucket on your RustFS (or local dev store). cellp branches object namespaces on child versions (overlay + tombstones); there is no Dashboard file browser.

Bindings overview · Binding guides · Platform data

1. Declare it

jsonc
"r2_buckets": [
  { "binding": "ASSETS", "bucket_name": "my-shop-assets" }
]

Keep bucket_name stable on child versions. Configure bindings.

2. Use it in the Worker

js
export default {
  async fetch(request, env) {
    if (request.method === 'POST') {
      const { note } = await request.json()
      const key = `notes/${Date.now()}.txt`
      await env.ASSETS.put(key, note, {
        httpMetadata: { contentType: 'text/plain; charset=utf-8' },
      })
      const listed = await env.ASSETS.list({ prefix: 'notes/', limit: 5 })
      return Response.json({
        key,
        recent: (listed.objects || []).map((o) => o.key),
      })
    }

    const obj = await env.ASSETS.get(new URL(request.url).pathname.slice(1))
    if (!obj) return new Response('not found', { status: 404 })
    return new Response(obj.body, {
      headers: { 'content-type': obj.httpMetadata?.contentType || 'application/octet-stream' },
    })
  },
}

3. Put objects in

There is no Dashboard file manager. Upload from the Worker, a one-off script, or the object store console in dev.

For operator imports, celld exposes a write-only CLI:

bash
celld r2 bulk put BUCKET_NAME \
  --filename cache-objects.json \
  --bucket s3://cellp-celld/<project>/<version> \
  --endpoint http://127.0.0.1:19000 \
  --region us-east-1

cache-objects.json uses Wrangler's bulk shape: a JSON array of { "key": "...", "file": "..." }. Relative file paths resolve from the manifest directory. Objects are written under r2/<BUCKET_NAME>/<key> in the version fleet bucket on RustFS.

This is the supported import path for OpenNext cache-population output on cellp. It is not an object browser and does not list or delete existing keys.

Child versions branch (overlay + tombstones): preview uploads do not change production objects. Platform data.

Operator surfaces

R2 bindings appear on GET …/bindings and in Dashboard Storage as a badge only. There is no cellp file browser.

celld vs Cloudflare

Objects are stored under r2/<bucket_name>/ in the version bucket. Multipart uploads have stricter limits (resume, ordering, 8 MiB streamed conditional writes). ssecKey and jurisdiction are not available.

Details: celld cloudflare-compat — R2.

Not Cloudflare R2

Platform buckets are RustFS on cellp stacks — not AWS S3 or Cloudflare R2 as a managed product. Your Worker may still fetch() any HTTP API; platform storage stays private to your deployment.

Self-hosted Workers control plane. Not affiliated with Cloudflare or Vercel.