Store files in your region and serve them from the edge

Serve your users' files, images, and videos from a CDN while the data stays in the region that you choose. Storage checks the access roles on a file before each download and records every version, so you can restore a file after an overwrite.

Upload a file once and serve it from the CDN edge

Storage writes each upload, asset, backup, and media file to the region of its container and stores it there with 99.999999999% durability. Your application can then issue a signed URL for a private file, request a resized image by adding parameters to its URL, and give your users a global CDN URL for every file.

Upload and list avatars

Agent is ready

What Storage does with each file that you upload

Resumable uploads

Upload a file through the REST API, through a pre-signed URL, or as a resumable multipart upload of up to 4TB. When the connection drops partway through a resumable upload, your client resumes it from the last chunk that Storage confirms.

Resumable downloads

Storage serves each file from a CDN URL that accepts HTTP range requests. When a download stops partway, the client can request only the byte range that it is missing.

Regions and storage classes

Choose the US, EU, or Asia region for each container. Within that region, put the files that you serve every day in hot storage, and move older files through warm and cool storage to deep storage for long-term retention.

Image processing

Resize, crop, and convert an image by adding parameters to its URL. Storage returns AVIF, WebP, JPEG, or PNG and scales the image by device pixel ratio for high-density screens.

Fine-grained access control

Storage checks access through Conjoin Auth, which lets you grant the owner, editor, or viewer role on an object to an account, an organization, or a group.

Signed URLs

To share a private file, generate a signed URL with an expiry that you set. You can also put a rate limit on a signed URL to cap the bandwidth of each download through it.

Object versioning

Storage assigns a version ID to every version of an object. You can list those versions and roll the object back to any one of them during your retention window.

Archive and restore

Archive a container or an object to lower its storage cost, then restore it on demand with a retrieval time that you configure.

Lifecycle management

Storage removes an object once it passes the maximum age in its container's lifecycle policy, an age that can range from 1 day to 10 years. Before then, Storage can step objects down to colder storage classes at the ages in a transition policy.

Rate limiting and quotas

Storage enforces upload rate limits and quotas for each project. A container can also have its own quota, beyond which Storage refuses further uploads to that container, so a faulty integration can add to your bill only up to that quota.

Data integrity

Storage computes a CRC32C checksum for every upload, which you can compare with your source file. With MD5 hashing turned on, Storage can also match objects with identical content, so you can skip a duplicate upload.

Labels and metadata

Attach up to 50 labels and custom key-value metadata to an object, then filter the object list by a label or a metadata key.

No per-request fees

Storage charges for the bytes that you keep stored and for the bytes that it delivers, while each read and write request is free.

One flat delivery rate

Once you use up the delivery allowance in your plan, Storage charges one flat rate per gigabyte delivered, whether the CDN serves the bytes from its cache or fetches them from your region.

99.999999999%
Durability

Eleven nines of data durability

< 30ms
CDN latency

Average response time from edge

200+
Edge locations

Global CDN distribution points

Build faster with solutions designed for real-world needs

Create a private upload container with its region, class, and retention in one call

One call creates a container and sets its region, its storage class, its visibility, and its lifecycle policy. Storage applies those settings to every file that your application uploads to the container. For each upload, Storage returns a CDN URL, a CRC32C checksum that you can compare with the source file, and a version ID.

Impact

The sample creates a private container called mariposa-user-uploads in the EU region, in hot storage, with a lifecycle policy under which Storage deletes each file once it is 365 days old. That call is the only setup that your code performs, because Storage provisions the bucket, the CDN distribution, and the integrity checks behind it.

Prompt for a coding agent: Create a private EU container for user uploads that deletes each file after 365 days.

Conjoin IDE

Select a file to view its contents

Resume a large upload from the last chunk that Storage confirms

The useStorageUpload hook sends a file in chunks of the size that you pass, and Storage records each chunk that it receives. When a connection drops partway through, your client can resume the upload from the first chunk that Storage is missing, which is how Storage accepts files of up to 4TB over an unreliable network.

Impact

The UploadCut component sends a film cut to the tindale-film-masters container in 16 MB chunks and draws a progress bar from the bytes that the hook reports. Once the cut is in Storage, the finalize route calls objects.read on it and returns the object ID, checksum, and version ID to the editing app.

Prompt for a coding agent: Upload film cuts in 16 MB chunks with a progress bar, and return the checksum when they finish.

Conjoin IDE

Select a file to view its contents

Move aging files to colder storage classes on a schedule

Storage deletes each object in a container once the object reaches the age in the container's lifecycle policy, which you can set anywhere from 1 day to 10 years. Before that age, Storage moves the object to a colder storage class at each age that you list in the transition policy. You can also set a quota on the container to cap the storage that one project uses.

Impact

Under the sample's transition policy, Storage moves each file in the imaging archive from hot to warm storage at 30 days old, to cool storage at 180 days, and to deep storage at 730 days. Storage then deletes the file at 2,555 days, which is seven years, so the two policy calls in the sample are the only code that you write for the whole schedule.

Prompt for a coding agent: Move archive files to colder storage as they age, and delete each file after seven years.

Conjoin IDE

Select a file to view its contents

Common questions about Conjoin Storage

Build your next app on Conjoin

Conjoin will open with a free Build tier, while the pricing page already lists the launch prices for Pro and Business. If you tell us what you're building, we'll talk you through early access.