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
"r2_buckets": [
{ "binding": "ASSETS", "bucket_name": "my-shop-assets" }
]Keep bucket_name stable on child versions. Configure bindings.
2. Use it in the Worker
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:
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-1cache-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.