Best storage
for vibe-coded apps

Updated 2026-09-18. Cloudflare R2 is the pick for most projects. Here is how the options compare, and how to run whichever you choose through a single Squiid key.

Short answer

  • Our pick: Cloudflare R2. S3 compatible, so every agent already knows the API, and there are no egress charges. For an app that serves user uploads, egress is the line item that surprises people.
  • Runner-up: Backblaze B2. Cheap storage per gigabyte with S3 compatible access and free egress to partner networks. A good fit for backups and large archives.
  • Pick something else when: Cloudinary or Bunny when you want uploads plus automatic image resizing, format conversion and a CDN in one call, and Mux when you are storing video that needs encoding, adaptive streaming and a player rather than a download link.

If your app accepts file uploads, put them in Cloudflare R2. It speaks the S3 API, which means your coding agent writes correct code without learning anything new, and it does not charge for bandwidth out. The alternatives are all better answers to the question of what happens to the file after it is stored.

How to choose a storage for an AI-coded app

Egress is the bill, not storage

Storing a hundred gigabytes costs a couple of dollars a month almost anywhere. Serving it repeatedly is what costs money. If your files are served to users rather than archived, compare egress pricing first and storage pricing second.

S3 compatible API or a bespoke one?

S3 compatibility is a practical advantage for agent-written code because the SDK, the signing scheme and the examples are all already in the training data. A bespoke upload API is fine, but expect more iterations before the code works.

Do you need transformation or just storage?

If every uploaded image has to be resized, cropped and converted to modern formats, a media platform that does that on the fly saves you a pipeline. If files are documents or archives, transformation is dead weight and plain object storage is cheaper.

Direct-to-storage uploads

Never route large uploads through your own server, especially not through a serverless function with a small body limit. Check the provider supports presigned URLs or a direct upload token so the browser talks to storage and your backend only issues permission.

Video is its own category

Video needs transcoding into multiple renditions, adaptive streaming and a player. Doing that on top of raw object storage is a project. If you have video, use a video platform and treat the storage question as already answered.

Compare the options

Every storage option Squiid carries in the Storage and media category, with what each one is best at and how it bills.

ServiceBest forPricingOn Squiid
Backblaze B2 Low-cost S3-compatible object storage with free partner egress usage Roadmap
Bunny CDN, edge storage, image optimiser and video streaming at low prices usage Roadmap
Cloudflare KV / D1 Edge key-value store and SQLite database bound to your Workers usage Next up
Cloudflare R2 S3-compatible object storage with no egress fees usage Live
Cloudflare Workers Serverless code on Cloudflare's edge network with near-zero cold starts Workers Paid $5/mo, both Next up
Cloudinary Image and video pipeline with URL-based transforms and optimisation Pay as you go $0/mo, usage Roadmap
Mux Video infrastructure with adaptive streaming, playback data and a player Pay as you go $0/mo, usage Roadmap

Why run your storage through Squiid

One login instead of one per vendor. Squiid carries 7 storage options here and every other layer of the stack beside it. You create one account, click the service you want, and Squiid provisions it upstream. No separate signup, no separate password, no second dashboard.

One bill, at the provider's price. Usage is paid from prepaid Squiid credits at par: $1 of credit is $1 at the provider, with no markup on what the provider charges. The free plan is $0/month with a 15% fee on credit top-ups and a $50 minimum top-up. Solo is $19.97/month and its top-up fee starts at 8%, falling to 6.5%, 5% and 3.5% as trailing 30-day API spend passes $100, $500 and $2,000. Team is $29.97 per seat per month for seats 1-5, $24.97 for seats 6-20 and $19.97 above that, with the same ladder one point lower. Custom pricing is 3% or less against a commitment. Services that are sold as a monthly subscription, such as Cloudflare R2's paid plan, pass through on your Squiid invoice at the provider's own price with no fee on top.

Squiid holds the upstream key. The provider credential lives in Squiid, not in your repo, not in a chat window and not in a screenshot. Your project gets one variable, SQUIID_API_KEY, and that is the only secret an agent ever needs to see. Rotating it is one click and does not touch the provider.

It works with every coding agent. Point the SDK base URL at https://api.squiid.io/v1/<service>/ and send Authorization: Bearer $SQUIID_API_KEY. Claude Code, Cursor, Codex, Gemini CLI, Copilot, Windsurf, Cline, Devin, Replit, v0 and Lovable all read environment variables the normal way. See the gateway convention.

Running out pauses, it never deletes. Squiid warns you at 75%, 90% and 100% of your balance. At zero, calls pause instead of overdrawing, and your data stays where it is. Auto top-up is optional and takes a hard monthly cap. See spend controls.

Set it up in 3 steps

STEP 1

Add Cloudflare R2 in the dashboard

Create a Squiid account, open the catalogue, and click add on Cloudflare R2. Squiid creates the upstream account or project for you and holds the credential.

STEP 2

Put one variable in .env

Copy your Squiid key and add SQUIID_API_KEY=sq_live_… to your project's .env. Delete any provider keys you were carrying. Nothing else changes.

STEP 3

Point your agent at the gateway

Tell your agent that calls go to https://api.squiid.io/v1/cloudflare-r2/ with Authorization: Bearer $SQUIID_API_KEY. Most SDKs take a base URL option, so it is a one-line change.

In practice that is one line in your project:

SQUIID_API_KEY=sq_live_xxxxxxxxxxxxxxxxxxxx

Then every call your app or your agent makes goes to the gateway with that one key:

curl https://api.squiid.io/v1/cloudflare-r2/... \
  -H "Authorization: Bearer $SQUIID_API_KEY"

Questions people ask

Where should I store user uploads in an app I built with AI?

Cloudflare R2. It is S3 compatible so agents write working code immediately, and there is no egress fee, which is the charge that surprises people once real users start downloading files. Add it through Squiid so the storage credential never enters your repo.

Is R2 really cheaper than S3?

For a serve-heavy workload, usually yes, because R2 does not charge for data transferred out while S3 does. For an archive nobody reads, the difference is small. Compare your expected egress in gigabytes per month, since that is the variable that moves.

Should I use Supabase storage instead?

If your app is already on Supabase and uploads are modest, yes. It is one less service and the access rules reuse your existing row level security policies. Move to R2 when file volume or bandwidth grows enough to matter.

How do I handle image resizing?

Either store originals in R2 and resize at the edge, or use Cloudinary or Bunny, which resize on request from the URL. For a small app the second is less code. Both are on Squiid under the same key.

Do uploads keep working if my credits run out?

No, and that is deliberate. Calls pause at a zero balance rather than running up a bill you did not fund. Your stored files are not deleted. Alerts arrive at 75%, 90% and 100%, and auto top-up with a monthly cap is available.

One key for your storage.
And everything else.

Add Cloudflare R2 and 107 other services to one account, one key, one bill and one dashboard.