The reason people go looking for a Cloudinary alternative is rarely the product. It is that the free tier ended, the next plan starts around eighty dollars a month, and the project makes zero. So here is the map, with the cases where switching is a mistake marked as such.
Stay where you are if
You use the transformation URLs as a design tool: cropping to faces, overlaying text, generating a dozen variants from one source, deciding sizes as you build. That is the product you are paying for, and nothing cheap replaces it. Nothing in this article does, either.
S3 plus your own code
The floor for cost, and the ceiling for work. Storage is fractions of a cent per gigabyte, and everything else is yours: a bucket policy, an upload endpoint, a resizing step with sharp, somewhere to run it, thumbnails for the things that are not images, a cache, cleanup.
Right when your team already runs infrastructure, or when uploads are so central that you want them entirely under your control. Wrong when the thing you were avoiding was operational work, because you have just bought a lot of it.
An upload API
Services like Filemon sit in the middle: you POST a file and get back a finished URL, and the transformation happens once, on the way in, rather than on every cache miss. Less flexible than Cloudinary by design, because the shapes are decided when the template is created rather than in the URL.
The pricing shape is different too. One credit is a gigabyte served, a gigabyte stored for a month, or a thousand operations, and you spend it whichever way your traffic falls, so a project with a lot of storage and no traffic is not billed as if it had both. The free plan is one credit a month, and the first paid tier is ten dollars for a hundred.
Object storage with a CDN in front
Backblaze B2 or Cloudflare R2, plus a CDN, no transformations at all. Cheap and boring, which are both good, and it means your app resizes images itself before uploading. If your uploads already arrive from a phone camera at the right size, or you are storing documents rather than pictures, this is often all you needed.
The thing to actually compare
Not the price per gigabyte. Compare what you pay per view of an image that has not changed since 2024.
Transform-on-download services bill you for a transformation every time the cache misses: a purge, an eviction, a cold region, a new size. Transform-on-upload services bill you once, at upload, and after that it is bytes. Doing it yourself bills you in engineering time, which is the most expensive of the three and the easiest to leave out of the spreadsheet.
For a side project with a few thousand images and modest traffic, the transformation line is usually the one that grew, not storage and not bandwidth. That is the number to take with you when you compare.