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.