Vercel Blob Alternatives for Self-Hosted Apps
Cloud

Vercel Blob Alternatives for Self-Hosted Apps

Vercel Blob's SDK is genuinely pleasant to use. That's the part people miss when they leave Vercel and reach for raw S3 calls out of habit — the API shape is worth replicating, not just the storage underneath it.

Published September 2, 202611 min readUpdated Sep 6, 2026

Written by · Full-Stack Agentic AI Software Engineer — AI Agents, Automation & Revenue Systems for GTM/RevOps teams

In brief

If you're leaving Vercel, what replaces Vercel Blob, and what does the migration actually cost?

Vercel Blob is a managed, S3-adjacent object store with client-upload support and a genuinely clean SDK — put(), copy(), list(), head(), del(). What it costs is billed across five separate meters (storage, simple operations, advanced operations, data transfer, and CDN delivery), and its example bill shows those meters adding up fast once you're past the included allowances. The self-hosted equivalents are Cloudflare R2, Amazon S3, self-hosted MinIO, and — for genuinely small blobs — Postgres large objects. None of them hand you Vercel Blob's exact SDK, but all of them support the same presigned-upload shape that SDK is built on top of, so the migration is mostly re-implementing a thin wrapper, not redesigning your upload flow.

  • Vercel Blob bills five separate meters: storage ($0.023/GB beyond 5 GB included on Pro), simple operations ($0.40/million beyond 100K included), advanced operations ($5.00/million beyond 10K included), data transfer ($0.05/GB beyond 100 GB included), and Fast Origin Transfer ($0.06/GB beyond 100 GB included) — Vercel's own worked example totals $15.73/month on modest usage
  • Cloudflare R2 replaces the storage and egress meters directly, with zero egress fee at any volume — the data-transfer line that grows fastest on Vercel Blob simply doesn't exist on R2
  • Amazon S3 is the ecosystem-native choice if the rest of your infrastructure is already AWS, at the cost of a real egress bill past a small free allowance
  • Self-hosted MinIO removes the vendor bill entirely but inherits your own server's bandwidth allowance as its egress budget, and its 2026 maintenance status is worth knowing before committing to it
  • Postgres large objects (or simply a bytea column) are a legitimate option only for small blobs a database is already backing up — not a general file storage replacement
  • The migration cost across all four is mostly re-implementing Vercel Blob's client-upload flow as a presigned URL, since every alternative supports the same shape

Evidence notes

Vercel Blob pricing and worked example

Pro plan meters: storage $0.023/GB beyond 5 GB included; Simple Operations $0.40/million beyond 100K included; Advanced Operations $5.00/million beyond 10K included; Data Transfer $0.05/GB beyond 100 GB included; Fast Origin Transfer $0.06/GB beyond 100 GB included. Vercel's own worked example (50 GB storage, 2.5M downloads at 70% cache hit) totals $15.73/month. Checked September 2026.

Vercel Blob client vs server upload and public/private delivery costs

Uploads via Client Uploads do not incur data transfer charges; uploads via Server Uploads incur Fast Data Transfer charges. Private blob delivery pays Blob Data Transfer plus Fast Origin Transfer/Fast Data Transfer; public blob delivery pays only Blob Data Transfer plus Fast Origin Transfer on cache miss. Vercel states Blob Data Transfer is roughly 3x more cost-efficient than Fast Data Transfer on average. Checked September 2026.

Vercel Blob operation rate limits

Hobby: 1,200 simple operations/min, 900 advanced operations/min. Pro: 7,200/min and 4,500/min. Enterprise: 9,000/min and 7,500/min. Rate limits count individual operations, not HTTP requests — a batched delete of 100 blobs counts as 100 operations. Checked September 2026.

Cloudflare R2 pricing

Standard storage $0.015/GB-month, zero egress fee at any volume, free tier 10 GB-month storage plus 1M Class A and 10M Class B operations monthly. Checked September 2026.

Amazon S3 pricing

Standard storage $0.023/GB-month (first 50 TB, us-east-1); egress $0.09/GB beyond a 100 GB/month free allowance. Checked September 2026.

MinIO repository archived, community edition now source-only

github.com/minio/minio was archived 25 April 2026 with a 'no longer maintained' notice; the community edition ships as source only, with the vendor's stated future direction being a separate product, AIStor. Checked September 2026.

Continue with purpose

Vercel Blob's SDK is genuinely good. `put()` a file, get back a URL. `list()`, `head()`, `del()`, all typed, all boring in the way infrastructure should be boring. That's worth saying plainly before picking it apart, because the usual reaction to leaving Vercel is to abandon the whole shape of that API along with the platform, drop straight into raw AWS SDK calls, and rebuild something clumsier than what was replaced. The API shape is worth keeping. Only the meter underneath it needs to change. `del()` being free, for what it's worth, is a genuinely nice detail worth noticing before you assume every operation on a managed store costs something.

What does Vercel Blob actually bill you for?

Five separate things, not one. Storage is the obvious one — a monthly average of your blob store's size, past a small included allowance. Simple Operations count every blob accessed by its own URL that results in a cache miss, plus every `head()` call. Advanced Operations count `put()`, `copy()`, and `list()` calls, and a multipart upload counts as several of these at once: one for starting, one per part, one for completing. Blob Data Transfer bills for the bytes actually downloaded. And Fast Origin Transfer bills separately, on cache misses, for pulling the blob from storage to the edge in the first place. Pair this with XenGrowth's growth engineering practice if Vercel blob alternatives for self-hosted apps sits inside a wider growth programme.

Meter

What it counts

Rate beyond included allowance

Storage

Monthly average blob store size

$0.023/GB (5 GB included)

Simple Operations

URL access on cache miss, plus head()

$0.40 per million (100K included)

Advanced Operations

put(), copy(), list() — multipart counts each part

$5.00 per million (10K included)

Blob Data Transfer

Bytes actually downloaded

$0.05/GB (100 GB included)

Fast Origin Transfer

Store-to-edge fetch on cache miss

$0.06/GB (100 GB included)

Vercel's own documentation walks through a worked example that's worth quoting directly because it shows how these meters compound: 50 GB of average storage, 2.5 million downloads at a 70% cache hit rate, and 120,000 uploads with some multipart activity comes out to $15.73 for that month. None of the individual line items look alarming — it's the five of them stacking that adds up, and it's exactly the kind of bill that's hard to predict from usage alone, because nobody's tracking cache hit rate as a cost variable until the invoice explains why it should have been.

Does it matter whether the upload goes through your server?

On Vercel Blob, yes, directly. Uploads made with Client Uploads — the browser talking straight to Blob storage — don't incur data transfer charges at all. Uploads routed through a Server Upload, where your own function receives the file first, do incur Fast Data Transfer charges for that hop. There's a second, less obvious distinction buried in the same documentation: private blob delivery (your function fetches the file, then streams it to the browser) pays both Blob Data Transfer and Fast Data Transfer, while public blob delivery (the browser fetches the file directly) only pays the first — and Vercel's own docs state Blob Data Transfer runs roughly three times more cost-efficient than Fast Data Transfer on average. None of this is a reason to avoid private storage when you need it; it's a reason to know which of these four paths a given file is taking before you're surprised by which meter it hit.

Option one: Cloudflare R2

R2 replaces the storage and transfer side of this directly, and it does it by deleting one of the five meters outright: there is no egress charge, at any volume. Standard storage runs $0.015/GB-month, undercutting Vercel Blob's $0.023 even before the transfer meters are counted. The operations pricing is genuinely comparable in structure — Class A (write-like) operations and Class B (read-like) operations, priced per million, mirroring Vercel's split between advanced and simple operations — so the mental model barely changes even though the exact numbers do. There is a longer treatment of the operations side of this in The XenGrowth resource library.

The migration itself is mostly mechanical: swap the Vercel Blob SDK calls for the AWS SDK pointed at R2's S3-compatible endpoint, replace `put()`'s return value with a presigned PUT URL your own code generates, and keep the rest of your upload flow intact. The part worth budgeting real time for isn't the API surface, it's re-testing every place in your app that assumed a Vercel Blob URL shape — image components, download links, anything that parsed or displayed the URL directly instead of treating it as an opaque string.

Option two: Amazon S3

S3 is the right answer specifically when the rest of your stack is already AWS — Lambda, CloudFront, IAM roles already wired up, and egress you can predict because you already run infrastructure at that scale. Storage runs $0.023/GB-month for the first 50 TB, and the tradeoff versus R2 is explicit: you get the broadest ecosystem integration in exchange for an actual egress bill, $0.09/GB beyond the first 100 GB each month. For a small self-hosted app with no other AWS dependency, that trade rarely pays for itself; for a team already inside AWS's blast radius, it usually does, if only because avoiding one more vendor relationship is worth something on its own.

Option three: self-hosted MinIO

MinIO removes the vendor bill entirely — no per-GB storage charge, no per-operation charge, nothing metered by a third party. What it doesn't remove is bandwidth: egress from a self-hosted bucket rides on whatever traffic allowance your VPS provider already sells you, throttled or overage-billed by that host, not itemized anywhere on a storage invoice. It's also worth knowing before adopting it now rather than after: MinIO's GitHub repository was archived in April 2026 with a "no longer maintained" notice, and the community edition currently ships as source code only, with no precompiled binaries. "Free and self-hosted" is still true; "actively maintained and easy to install" is a separate question you should answer for yourself before betting production uploads on it. On AI agents and marketing automation specifically, XenGrowth on governed AI marketing workflows is worth reading.

Option four: Postgres large objects, for the small cases

This one only belongs on the list for a narrow case, and it's worth naming so nobody reaches for it outside that case: small blobs, genuinely small, that a database you're already backing up can absorb without changing its own operational story — a user's avatar, a small generated PDF, a config blob. Postgres can store this as `bytea` directly in a row or via its large object facility, and the appeal is that it rides along with your existing database backups instead of needing a separate storage system at all. It stops being a good idea the moment file sizes grow past a few megabytes or upload volume grows past what a database row was ever meant to carry — at that point it's competing with your actual application data for the same disk and the same backup window, which is precisely the problem keeping uploads off your app server is meant to avoid in the first place.

There's a mechanical reason the size ceiling is real, not just a rule of thumb: Postgres stores oversized column values using TOAST, transparently compressing and splitting them into chunks behind the scenes so a table storing large `bytea` values doesn't grind to a halt. That mechanism works, but it means a growing blob table is quietly growing your main database's storage and vacuum workload right alongside your actual application rows, whether or not anyone's watching that table specifically. It's a fine trade for a handful of small files. It's the wrong trade for anything that looks like general file storage, which is exactly why this option stays fourth on the list rather than first.

Do rate limits change once you leave Vercel Blob?

Vercel Blob itself isn't unlimited, which is worth knowing before assuming any alternative needs to match some infinite bar. Its own operation rate limits scale by plan — Hobby is capped at 1,200 simple operations and 900 advanced operations per minute, Pro at 7,200 and 4,500, Enterprise at 9,000 and 7,500. A batch job that deletes a hundred files in one call counts as a hundred operations against that limit, not one — the unit being metered is the operation, not the request that triggered it, and that distinction is exactly the kind of detail a migration checklist skips if nobody reads the fine print first. Whichever alternative you move to will have its own version of this ceiling — R2 and S3 both rate-limit at the API level too — so the honest migration checklist includes checking your actual peak operation rate against the new provider's limits, not just assuming a bigger-sounding vendor has no ceiling at all. For the AI search, GEO and discovery angle, see XenGrowth on building one SEO and GEO content system.

Option

Egress model

Best fit

Watch out for

Cloudflare R2

Free at any volume

Most self-hosted apps replacing Vercel Blob

Slightly different operations pricing shape — re-check your own usage pattern

Amazon S3

Billed past 100 GB/mo free

Teams already committed to AWS

Egress is the one line item that can genuinely surprise you at scale

Self-hosted MinIO

Rides your VPS's own bandwidth allowance

Low-traffic, genuinely private storage on hardware you control

Archived upstream repo, source-only builds going forward

Postgres large objects / bytea

Whatever your DB connection already costs

Small blobs only, already inside your backup plan

Stops making sense past a few MB or meaningful upload volume

What actually changes in your upload code?

Less than switching storage vendors usually implies. Vercel Blob's client-upload feature — letting the browser upload directly to Blob storage without the request passing through your server — is the same presigned URL pattern every one of these alternatives already supports through its own S3-compatible API. Your server-side code that issues the upload permission is the part that changes; the flow the browser follows barely does. The bigger question every one of these options forces is whether uploads should stay public or move behind private, authenticated access — a decision Vercel Blob makes per-store, and one worth revisiting deliberately during a migration rather than carrying over by default just because that's how it worked before.

Vercel Blob was never the hard part to replace. The hard part was always going to be re-testing every place your app quietly assumed a specific URL shape, a specific cache behavior, or a specific upload path — and that work exists regardless of which storage backend replaces it.
  • Audit which of your uploads currently go through Client Uploads versus Server Uploads before migrating — that distinction changes which meter matters most on the new backend too

  • Decide public versus private access per bucket deliberately, rather than defaulting to whatever Vercel Blob happened to default to

  • Re-check any code that parses or constructs blob URLs directly instead of treating them as opaque strings — this is where migrations actually break, not in the SDK calls

For most apps leaving Vercel, R2 is the closest thing to a drop-in replacement for Blob's cost model — same rough storage price, no egress meter to worry about as traffic grows. S3 earns its place inside an existing AWS footprint. MinIO earns its place on hardware you already run, with eyes open about its current maintenance status. And Postgres large objects earn their place exactly once, for the small blobs that were never going to justify a separate storage system regardless of which one you picked. None of them ask you to give up the part of Vercel Blob actually worth keeping — a small, typed wrapper around presigned URLs is easy enough to rebuild against any of the four that there's no reason to fall back to raw, unwrapped SDK calls just because the managed version is gone.

Further reading from XenGrowth

Where this work meets go-to-market

If Vercel blob alternatives for self-hosted apps is part of a growth programme rather than a standalone build, XenGrowth's operator guides is the companion reading.

Where should the files go?

Four questions about your objects rather than your preferences. The answer is usually S3-compatible storage; which one depends on how the bytes leave again.

1 / 4
How much of what you store gets read back out?

Apply this article

How to turn insights into execution

A practical sequence for teams turning concepts into production outcomes.

Vercel BlobCloudflare R2Amazon S3MinIOPostgres large objectspresigned URLscloud

Audit your current state

Map the bottlenecks and constraints connected to the article’s core problem.

Choose one bounded change

Test the most useful recommendation on one workflow before widening the scope.

Measure what changed

Keep the parts that improve the work, document what failed, and make the next decision from evidence.

Next step

Need help applying this in your stack?

I can translate these patterns into a concrete implementation plan for your team.

Discuss implementationBack to blog

Replies usually within 24 hours.

Next Steps

Continue reading

Cloudflare R2 vs S3 vs MinIO for SaaS File Storage

The storage price per gigabyte is close enough across all three that it barely matters. Egress is where the decision actually gets made — and one of these three had a rough 2026 that changes the self-hosting math entirely.

Navigate

My Complete Self-Hosted Stack for SaaS in 2026

Contabo, Coolify, Docker, Cloudflare, Postgres, R2, Resend, Uptime Kuma, Turborepo and Docker Hub. Here's every piece of the stack I actually run, what each one replaced, and why I picked it over the alternatives.

Navigate

How I Serve Images Cheaply Without Vercel Image Optimization

The advice to rip out next/image the day you leave Vercel is wrong, and has been wrong since at least Next 16. Here's what actually costs money, and the four ways to keep it cheap.

Navigate

Why User Uploads Should Never Live on Your App Server

Every one of these failures traces back to the same decision: writing a user's file to the same disk your container runs on. Redeploys lose it, backups bloat with it, and scaling out becomes a session-affinity problem instead of a config change.

Navigate

How I Self-Host PostgreSQL for My SaaS (and When I Wouldn't)

Running Postgres in a container is easy. Running it in a way that survives a redeploy, a full disk, and an eventual major-version upgrade is the actual job. Here's the setup, tuned against Postgres's own defaults, and the honest list of where managed wins outright.

Navigate

10 Mistakes That Break a Self-Hosted SaaS

None of these ten show up as a single dramatic outage. They show up as a disk that quietly fills, a rollback that turns out to be impossible, a backup nobody ever restored. Here's the mechanism behind each one, and the fix.

Navigate

The Backup Strategy Every Self-Hosted SaaS Needs (3-2-1, Applied)

3-2-1 is easy to nod along to and easy to get wrong in the specific way that only shows up on the day you need it. Here's what it actually means for one VPS running Postgres and Docker volumes, not the generic version you've already skimmed past twice.

Navigate

Managed Postgres vs Self-Hosted: Supabase, Neon and a VPS Compared

Supabase bills you for compute whether anyone's querying it or not. Neon bills you almost nothing until someone is, then charges for the second it takes to wake up. A VPS charges you the same either way and hands you every operational job both of the others do for you. None of these is the right answer by default.

Navigate

My Rule for Deciding What to Self-Host and What to Keep Paying For

Self-hosting everything is a bad idea, and I can point to the exact service where I decided that on purpose. Here's the actual rule I use, not a survey of options — and the one counterexample that explains why the rule exists.

Navigate

The Simplest Production Architecture for a Bootstrapped SaaS

One box, a handful of managed pieces around the edges, and a very short list of things you're not allowed to build yet. Here's the architecture, priced out to $20 a month, and the exact signal that tells you when to add each thing you skipped.

Navigate