ArchVibe

A guide from ArchVibe, the software architecture course for people who build apps with AI and cannot code.

Vercel Blob, S3 or Supabase Storage? Where uploaded files should go

Tamir Magnezi, founder of ArchVibe
Tamir Magnezi · Founder of ArchVibe ·

For a first app deployed on Vercel, answer Vercel Blob. Choose Supabase Storage if your database and login already live on Supabase, and choose S3 or Cloudflare R2 only if you expect a lot of large files or a lot of downloads.

Here is why. Your app almost certainly lets people attach a few pictures or documents to something they made, and then shows those files back to them. Every service on your builder’s list does that same job: you hand it a file, it keeps the file and gives you back a web address for it. The one that wins is the one that adds nothing new to your account, your settings, or your bill, and when your app already runs on Vercel, that is Vercel Blob.

Why the files cannot just go where everything else goes

The instinct is to put uploads in the same place as the rest of your data, or on the server itself. Neither works for long. A database is built for small, structured records like a name, a date, and the id of the person who owns them. A photo is a large lump of pixels the database cannot search inside, and stuffing many of them in makes every query slower and every backup fatter.

The server is worse. On modern hosting like Vercel, your server code runs on short-lived machines that answer a request and disappear. A file written to one of them is gone the next time the code runs somewhere else. That is the exact bug where a user’s photo is there on Tuesday and a broken square on Wednesday. If your builder built uploads without naming a storage service, this is probably what it did.

So you need file storage either way. The only open question is which one.

What each name on the list actually is

Vercel Blob is file storage built into the Vercel platform, the same place your app is deployed. Vercel’s own page describes it as object storage for files uploaded at build time or when users submit them, served through Vercel’s network, and it says Vercel Blob is free on the Hobby plan within usage limits. Vercel restricts that free plan to personal, non-commercial use, so anything you sell belongs on a paid plan. Underneath, Vercel runs it on Amazon’s storage, so you get the big provider’s durability without opening an account there. Your app talks to it with a single call, and Vercel handles the connection details. Nothing new to sign up for.

Supabase Storage is the file side of Supabase, a platform that bundles a database, login and file storage. It stores the files, keeps a record of each file in the same Postgres database that holds your other data, and lets you write rules about who may see which file using the same login system. It is S3 compatible, meaning it speaks the standard language most file storage speaks. It shines when the rest of your app is already there.

Amazon S3 is the original object storage service, the one nearly every other one imitates. “Object storage” is the industry’s name for a service whose only job is to hold files and hand them back by address. S3 is enormous, dependable and connected to everything, and it also comes with the most setup: an AWS account, permissions, and a “bucket” (S3’s word for a folder) to configure before the first upload.

Cloudflare R2 is the same idea from Cloudflare, with one headline: it does not charge you when files are downloaded. Most storage does, under the name egress. R2 speaks the S3 language too, so code written for S3 works against it.

The two things that flip the answer

First, where the rest of your app lives. If your database and login are on Supabase, Supabase Storage keeps your ownership rules in one place, so “only the person who uploaded this can see it” is one rule, written once. If your app is on Vercel with a separate database, Vercel Blob keeps deployment and storage in one dashboard. Follow the platform you are already on.

Second, how heavy the files are and how often people view them. A trip app with a dozen photos per trip is light. A video app, a podcast host, or anything where thousands of people download large files every day is heavy, and that is where download charges start to matter. That is when R2’s no-egress promise, or S3 if you are already on AWS, is worth the extra setup. For a first app, you are almost never here yet.

What a wrong pick costs

Not much. Because they all do the same job, store a file and give back an address, the code that uploads and the code that displays barely change between them. Moving from Vercel Blob to R2 later means copying files across and swapping a few lines. Your database keeps the addresses it already has until you update them. This is one of the cheapest decisions to get wrong in your whole app.

The expensive mistake is the one above the list: files on the server’s disk or inside the database. That one loses real users’ real uploads, and there is no undo for a photo that was never kept.

What to tell your builder

Paste this back:

“Use Vercel Blob for uploaded files, save only the file’s address in the database, and never write uploads to the server’s own disk.”

If your app runs on Supabase, swap the first words for Supabase Storage and keep the rest exactly as it is. The second and third parts of that sentence are the part that protects your users.

You can learn more, and get the full prompts and the decision tables, in our course: Lesson 13, Users Want to Upload Photos. The first lesson is free, no card.

In the next ten minutes, answer your builder with that sentence and then run one check. Upload a file to your published app, wait an hour, and open it from a different device. If it is still there, the storage is right. If it is a broken image, your builder put the file somewhere temporary, and the sentence above is the fix it needs.

Questions people ask

Claude Code asked me Vercel Blob, S3 or Supabase Storage for uploads. What should I say?
Say Vercel Blob if your app is deployed on Vercel, and Supabase Storage if your database and login are already on Supabase. All three do the same job: they keep a file and give your app a web address for it. The right one is the one that adds no new account, no new settings and no new bill to what you already run.
Can I move my uploaded files to a different storage service later?
Yes, and it is one of the cheapest moves in an app. Every storage service takes a file and returns an address, so the upload and display code barely changes. Moving means copying the files across and updating the addresses your database holds. Apps usually do this only when download volume gets large enough for egress, the charge for files being downloaded, to matter.
What if my builder wants to store uploaded files in the database or on the server?
Say no to both. A database is built for small records, and large files make every query and backup slower. The server is worse: on hosting like Vercel, server code runs on short-lived machines, so a file saved there disappears when the next request runs elsewhere. That is why uploads look fine for an hour and then break.

Sources

Build a real app first, then learn why it breaks

The first lesson of the course is free and ends with an app that runs.

Start the free lesson

No card. No account needed to read it.

Related guides