TL;DR: Cloudinary is excellent software with genuinely bad pricing transparency. For most headless web projects we build, it's overkill. Supabase Storage + a CDN handles 80% of use cases at 10% of the cost. imgix wins for image-heavy marketing sites. UploadThing wins for app upload DX. Self-hosting with sharp is still king if you have the ops muscle. Cloudinary earns its keep only when you need on-the-fly video transcoding or GenAI transformations at scale.

  • Comparison Table
  • Which Alternative Fits Your Use Case?
  • FAQ

  • What Is Cloudinary?

    Cloudinary is a cloud-based media management platform that handles image and video upload, storage, transformation, optimization, and CDN delivery through a URL-based API. You upload an asset, and Cloudinary gives you a URL. You modify that URL with path parameters -- /w_400,h_300,c_fill/ -- and Cloudinary returns a transformed version on the fly. It also offers SDKs for every major framework, a media library widget, AI-based tagging, background removal, and video transcoding.

    Founded in 2012, Cloudinary serves over 1.5 million developers and handles billions of media assets. It's legitimately good technology. But "good technology" and "right choice for your project" are different questions.

    How Much Does Cloudinary Actually Cost?

    The free tier gives you 25 credits per month. That sounds generous until you understand what a "credit" means. Cloudinary's credit system is opaque -- 1 credit equals roughly 1,000 transformations, or 1 GB of storage, or 1 GB of bandwidth, or 500 video processing seconds. These are consumed across multiple axes simultaneously, so a single user action (upload + transform + deliver) burns credits from three buckets at once.

    Here's what the tiers actually look like as of early 2026:

    Tier Monthly Cost Credits Storage (est.) Bandwidth (est.) Transformations (est.)
    Free $0 25 ~25 GB ~25 GB ~25,000
    Plus $89/mo 225 ~225 GB ~225 GB ~225,000
    Advanced $224/mo 600 ~600 GB ~600 GB ~600,000
    Enterprise Custom Custom Custom Custom Custom

    The Plus tier at $89/month is where it bites. You're paying $89/month before your first real user touches the product. For a marketing site with 50 pages and moderate traffic -- say 100,000 page views per month with an average of 4 images per page -- you'll hit bandwidth limits on the free tier within the first two weeks. The jump from $0 to $89 is steep, and the $89 tier still won't cover a busy e-commerce catalog.

    Overages on the Plus plan cost $0.40 per extra credit. If you accidentally serve unoptimized originals through Cloudinary URLs (we've seen this happen with misconfigured Next.js image loaders), a traffic spike can generate a surprise bill in the hundreds.

    Why Are Developers Looking for Cloudinary Alternatives?

    Three reasons come up repeatedly in our client projects:

    Pricing unpredictability. The credit system makes it genuinely hard to forecast monthly costs. We've had clients on the Plus plan get hit with $300+ overage charges after a product launch drove a traffic spike. With per-GB CDN pricing from Cloudflare or Fastly, you can model costs to the dollar.

    SDK bloat and lock-in. Cloudinary's React SDK (@cloudinary/react v2.x) adds ~45 KB gzipped to your client bundle. Their URL-based API is framework-agnostic, but the moment you adopt their upload widget, media library, or React components, you're coupled. Migrating 10,000+ assets with Cloudinary-specific transformations baked into URLs is a multi-week project.

    Overkill for common tasks. If all you need is "upload an image, resize it, serve it from a CDN" -- which describes 80% of projects we build -- Cloudinary's 300+ transformation options are overhead you're paying for but never using.

    Cloudinary's Own Take -- and Why We Disagree

    Cloudinary published a blog post titled "Is There Really a Cloudinary Alternative?" that concludes, verbatim: "if you're looking for an alternative to Cloudinary, there's none." They argue that no single competitor matches their full feature set across image optimization, video processing, DAM, and AI-powered enhancements.

    They're technically right and practically wrong.

    Yes, no single tool replicates every Cloudinary feature. But that's like saying there's no alternative to a Swiss Army knife because no single tool has a corkscrew, a saw, and tweezers. Most of us just need a good knife.

    Cloudinary also published a guide on using their service with Vercel Serverless Functions, demonstrating upload handling through their Node SDK. It's a solid tutorial. But it quietly locks you into Cloudinary's storage and transformation pipeline when Vercel's own Blob storage -- launched in 2023 and now stable -- handles the upload-and-serve pattern with zero additional vendor dependency. We wrote about this in our Vercel Blob guide.

    The Supabase team has been steadily building out their Storage product with image transformation support (launched in Supabase Storage v2). Their blog documents the approach: store in S3-compatible buckets, transform via URL parameters, cache at the edge. It's not as feature-rich as Cloudinary, but it's integrated with auth, RLS policies, and the rest of the Supabase stack. For apps already on Supabase, adding Cloudinary as a separate vendor is friction.

    The Six Alternatives We've Actually Used

    We've shipped production projects with every option below. This isn't a feature-matrix copy-paste from marketing pages -- it's what we've learned building with these tools.

    Supabase Storage

    Best for: Full-stack apps already using Supabase for auth and database.

    Supabase Storage sits on top of S3-compatible object storage with built-in RLS (Row Level Security) policies. Since Supabase Storage v2, you get on-the-fly image transformations via URL parameters: /render/image/public/bucket/image.jpg?width=400&height=300&resize=cover.

    Transformations are limited compared to Cloudinary -- you get resize, crop, and format conversion (WebP, AVIF). No text overlays, no face detection cropping, no video processing. But the auth integration is the killer feature. You can write a Postgres policy that says "only the user who uploaded this file can delete it" and it just works. Try doing that with Cloudinary without a middleware layer.

    Pricing: The free tier includes 1 GB storage and 2 GB bandwidth. The Pro plan at $25/month includes 100 GB storage and 200 GB bandwidth, with $0.021/GB overage on storage. Image transformations are billed separately at $5 per 100 origin images transformed.

    DX: The @supabase/supabase-js client makes uploads a one-liner. TypeScript types are generated from your project schema. No separate SDK to install.

    Lock-in: Low. Storage is S3-compatible. You can point any S3 client at it and pull your files out. Transformation URLs are Supabase-specific but simple to replicate with sharp.

    Vercel Blob

    Best for: Next.js apps that need simple file uploads without managing infrastructure.

    Vercel Blob is a managed object store backed by Cloudflare R2. It gives you a put() function that returns a public URL served from Vercel's edge network. No transformation pipeline -- it stores and serves files, period.

    We covered this in depth in our Vercel Blob guide. The short version: it's the fastest path from "I need file uploads" to "it's in production" for Next.js apps. Pair it with next/image for on-demand resizing via the Next.js image optimization API, and you get 90% of what Cloudinary offers for image delivery.

    Pricing: Included in Vercel Pro ($20/month per team member) with 1 GB storage and 5,000 reads per month. Additional storage is $0.023/GB/month, reads are $0.40 per 100,000. This is cheap for most apps but can get expensive at scale due to read pricing.

    DX: Excellent for Next.js. The @vercel/blob SDK is 4 KB gzipped, and server-side uploads are ~10 lines of code. We have a full walkthrough in our Next.js file upload guide.

    Lock-in: Medium. Files are stored in Cloudflare R2 under Vercel's account. You can download them via the API, but there's no S3-compatible endpoint. If you leave Vercel, you're re-uploading.

    UploadThing

    Best for: App uploads with complex validation, type safety, and React integration.

    UploadThing is a TypeScript-first file upload service built by Theo Browne's Ping Labs. It provides a type-safe file router where you define upload endpoints with zod-like validation, file type restrictions, and middleware hooks. The client component handles drag-and-drop, progress bars, and error states out of the box.

    We've used UploadThing on three client projects in the past year. The DX is outstanding -- defining a file route feels like defining a tRPC procedure. The tradeoff is that it's upload-focused, not transformation-focused. You get file storage and CDN delivery but no image resizing or format conversion. Pair it with next/image or a separate image CDN.

    Pricing: Free tier includes 2 GB storage and 2 GB bandwidth. The $30/month plan gets you 100 GB storage and 100 GB transfer. The $60/month plan bumps that to 500 GB each. Pricing is predictable and transparent -- no credit system.

    DX: Best-in-class for TypeScript/React apps. The uploadthing package is ~12 KB gzipped. File route definitions are fully typed. The React components (<UploadButton>, <UploadDropzone>) work with minimal configuration.

    Lock-in: Medium. Files are stored in UploadThing's infrastructure. You can bulk-export via their API, but there's no S3-compatible layer.

    imgix

    Best for: Image-heavy marketing sites, e-commerce catalogs, and media publishers.

    imgix is a dedicated image CDN and transformation service. You point it at your existing storage (S3, Google Cloud Storage, Azure Blob, or a web folder), and imgix serves optimized, transformed versions via URL parameters. It doesn't handle uploads or storage -- just processing and delivery.

    This separation of concerns is actually imgix's strength. You own your originals. imgix just transforms and caches them. If you stop paying imgix, your files are still exactly where they were. The Brandfolder team noted this in their 2023 buyer's guide -- imgix is specifically built for "teams with a high volume of images and videos."

    imgix's rendering pipeline is best-in-class for images. Auto-format detection, responsive image generation with srcset, face detection, blur-hash placeholders -- it does everything Cloudinary does for images, often faster. We've measured imgix TTFB at 15-40ms from edge vs. 50-120ms from Cloudinary for equivalent transformations, though this varies by region.

    Pricing: Starts at $10/month for 1,000 origin images (unique source images, regardless of how many transformations or requests). The $50/month plan covers 10,000 origin images. Bandwidth is unmetered on all plans. This is the key pricing difference -- imgix charges per source image, not per transformation or per GB delivered.

    For an e-commerce site with 5,000 product images serving 500,000 page views per month, imgix costs $50/month. Cloudinary would cost $89-224/month depending on transformation complexity.

    DX: URL-based API, similar to Cloudinary. https://your-source.imgix.net/photo.jpg?w=400&h=300&fit=crop&auto=format. SDKs available for React, Vue, and vanilla JS. The React SDK (@imgix/react v1.x) is ~8 KB gzipped.

    Lock-in: Very low. imgix doesn't store your files. You can switch to any other image CDN by changing your URL prefix. Your originals never leave your own storage.

    ImageKit

    Best for: Teams wanting Cloudinary-like features at a lower price point.

    ImageKit is the closest feature-for-feature Cloudinary competitor in this list. It offers upload, storage, real-time image and video transformations, a media library UI, and CDN delivery. The transformation API covers overlays, face detection, smart cropping, GIF-to-video conversion, and PDF-to-image rendering.

    Pricing: Free tier includes 20 GB bandwidth per month (generous compared to Cloudinary's credit-based equivalent). The $49/month plan includes 75 GB bandwidth and 150 GB storage. The $99/month plan includes 200 GB bandwidth and 300 GB storage. No credit system -- you know exactly what you're paying for.

    The free tier is particularly notable. 20 GB of bandwidth handles roughly 200,000 page views per month with moderate image usage. That's enough for many production sites.

    DX: URL-based transformations similar to Cloudinary and imgix. The React SDK (imagekitio-react v4.x) is ~15 KB gzipped. Upload API supports direct uploads from the browser with signed URLs. Documentation is thorough if occasionally dated.

    Lock-in: Medium. ImageKit stores your files (or can proxy from existing storage like imgix). If you use their storage, migration requires downloading and re-uploading. If you use external storage with ImageKit as a proxy, lock-in is minimal.

    Self-Hosting with sharp + a CDN

    Best for: Teams with DevOps capacity who want zero vendor lock-in and maximum control.

    sharp is a high-performance Node.js image processing library built on libvips. It handles resize, crop, format conversion (WebP, AVIF, JPEG XL), quality adjustment, and metadata extraction. It processes a 3000x2000 JPEG in ~30ms on a modern CPU.

    The pattern we use: upload originals to S3 or R2, process on upload (or on-demand via a serverless function), cache processed variants on Cloudflare or Fastly. We typically deploy a small Hono or Express API on Fly.io or Railway that accepts transformation parameters and returns processed images.

    Here's what a minimal on-demand image resizer looks like with Hono + sharp:

    import { Hono } from 'hono'
    import sharp from 'sharp'
    import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3'
    
    const app = new Hono()
    const s3 = new S3Client({ region: 'auto' })
    
    app.get('/img/:key', async (c) => {
      const width = parseInt(c.req.query('w') || '800')
      const format = c.req.query('f') || 'webp'
    
      const obj = await s3.send(new GetObjectCommand({
        Bucket: 'originals',
        Key: c.req.param('key'),
      }))
    
      const buffer = await sharp(await obj.Body?.transformToByteArray())
        .resize(width)
        .toFormat(format as keyof sharp.FormatEnum, { quality: 80 })
        .toBuffer()
    
      c.header('Cache-Control', 'public, max-age=31536000, immutable')
      c.header('Content-Type', `image/${format}`)
      return c.body(buffer)
    })
    

    Put Cloudflare in front of this and you have a DIY Cloudinary for images. Cache hit ratio in production is typically 95%+, meaning the origin only processes each unique variant once.

    Pricing: S3 storage is $0.023/GB/month. Cloudflare's free plan includes unlimited bandwidth with caching. A Fly.io machine for the processing API costs ~$5-15/month. Total cost for a site with 10,000 images and 1 million monthly requests: roughly $10-20/month.

    DX: Requires writing and maintaining code. No dashboard, no media library, no drag-and-drop widget. You're building infrastructure, not consuming a service. We typically budget 2-3 days of engineering time for the initial setup and 1-2 hours per month for maintenance.

    Lock-in: None. You own every layer. S3 is commodity storage. sharp is open source (Apache-2.0 license, maintained by Lovell Fuller). CDN is swappable.

    This approach pairs well with our Core Web Vitals optimization work since you control every aspect of image delivery -- format, quality, dimensions, caching headers, and preloading hints.

    Comparison Table

    Feature Cloudinary Supabase Storage Vercel Blob UploadThing imgix ImageKit sharp + CDN
    Upload handling Yes Yes Yes Yes No Yes DIY
    Image transforms 300+ Basic (resize, crop) None (use next/image) None 100+ 200+ Whatever you code
    Video processing Yes No No No Limited Yes DIY (ffmpeg)
    CDN included Yes Yes Yes Yes Yes Yes Add your own
    Free tier bandwidth ~25 GB (credits) 2 GB Included in Vercel 2 GB Unlimited (1K images) 20 GB Unlimited (Cloudflare)
    Paid plan starts at $89/mo $25/mo $20/mo (Vercel Pro) $30/mo $10/mo $49/mo ~$10-20/mo
    Client SDK size ~45 KB gz ~30 KB gz (full client) ~4 KB gz ~12 KB gz ~8 KB gz ~15 KB gz 0 KB (server-side)
    Lock-in risk High Low Medium Medium Very low Medium None
    Auth integration No Yes (RLS) Via Vercel auth Middleware hooks No No DIY
    Best for Video-heavy apps Supabase full-stack Next.js apps Type-safe uploads Image CDN Cloudinary replacement Full control

    Which Alternative Fits Your Use Case?

    Different projects have fundamentally different media needs. Here's how we'd decide:

    Image-Heavy Marketing Site (50-500 pages, 10K+ images)

    Our pick: imgix

    Store originals in S3, point imgix at the bucket, and let it handle responsive image generation with auto-format detection. The per-origin-image pricing model means you pay for your catalog size, not your traffic. A 10,000-image site costs $50/month regardless of whether you get 100 or 10 million page views.

    Runner-up: ImageKit if you also need a media library UI for content editors.

    App with User-Generated Uploads (SaaS, social features, profiles)

    Our pick: UploadThing or Supabase Storage

    If you're on the Supabase stack, use Supabase Storage for the auth integration alone -- RLS policies on file access are worth more than any image transformation feature. If you're on a different stack, UploadThing's type-safe file routing and built-in validation prevent the "someone uploaded a 50 MB BMP" class of bugs.

    See our Next.js file upload guide for implementation details with both options.

    Runner-up: Vercel Blob if you're already on Vercel Pro and want zero additional vendors.

    Video-Heavy Application (courses, streaming, user video uploads)

    Our pick: Cloudinary or Mux

    This is where Cloudinary actually earns its price tag. On-the-fly video transcoding, adaptive bitrate streaming, thumbnail generation, and video-specific transformations (trim, concatenate, overlay) are hard to self-host reliably. Mux is the other serious option -- it's video-only and priced at $0.007/minute of video stored plus $0.005/minute of video delivered.

    If your video needs are simpler (just host and play MP4s), Vercel Blob + a <video> tag works fine.

    Agency Building Multiple Client Sites

    Our pick: sharp + Cloudflare (or imgix if you don't want to maintain infrastructure)

    We run a shared image processing service across client projects. The sharp + Cloudflare setup costs us roughly $15/month total, serving millions of images across a dozen sites. Each client's originals live in their own S3 bucket, so handoff is clean.

    For clients who need to manage images themselves (drag-and-drop, crop, etc.), we use their CMS's built-in media library (Sanity, Contentful, or Payload) and skip the separate image service entirely. Most headless CMSs already handle image transformations through their own CDN.

    Decision Matrix Summary

    Use Case Recommended Monthly Cost (typical) Setup Time
    Marketing site, 5K images imgix $50 2-4 hours
    SaaS app, user uploads UploadThing $30 1-2 hours
    Supabase full-stack app Supabase Storage $25 (part of Pro) 30 min
    Next.js app, simple uploads Vercel Blob $20 (part of Pro) 30 min
    E-commerce, 20K+ products ImageKit or imgix $49-100 4-8 hours
    Video-heavy platform Cloudinary or Mux $89-500+ 1-2 days
    Max control, budget-conscious sharp + CDN $10-20 2-3 days

    FAQ

    Is the Cloudinary free tier enough for a production site?

    Rarely. The 25 monthly credits translate to roughly 25 GB of bandwidth. A moderately trafficked site with optimized images (200 KB average, 4 images per page) will exhaust that at around 30,000 page views per month. Most production sites outgrow it within weeks of launch.

    Can I use Next.js Image Optimization instead of Cloudinary?

    Yes, for most cases. Next.js's next/image component handles responsive sizing, format conversion to WebP/AVIF, and lazy loading. Combined with Vercel Blob or S3 for storage, it replaces Cloudinary's core image delivery features. See our Next.js file upload guide for implementation details.

    What's the cheapest Cloudinary alternative for image transformations?

    Self-hosting with sharp and Cloudflare's free CDN tier costs approximately $10-20/month for most sites. imgix at $10/month is the cheapest managed option. Both are dramatically less expensive than Cloudinary's $89/month Plus plan for equivalent workloads.

    Does imgix handle video like Cloudinary?

    imgix added video support with their Rendering API, but it's limited to GIF-to-video conversion and basic video thumbnail extraction. For full video transcoding, adaptive streaming, and video transformations, Cloudinary or Mux remain the stronger choices.

    How hard is it to migrate away from Cloudinary?

    It depends on how deeply you've integrated. If you're only using URL-based transformations, migration means downloading originals via the Admin API and updating URL patterns -- typically 1-2 days of work. If you've built around the upload widget, media library, and React SDK, expect 1-3 weeks of refactoring for a medium-sized app.

    Is UploadThing production-ready?

    Yes. UploadThing has been stable since v6 and is used in production by thousands of apps. It's backed by Ping Labs and actively maintained. The main limitation is that it's upload-and-serve only -- no image transformations. Pair it with next/image or imgix for transformations.

    Should I use Cloudinary for a headless CMS project?

    Probably not. Most headless CMSs -- Sanity, Contentful, Hygraph, Payload -- include built-in image transformation and CDN delivery. Adding Cloudinary on top means paying for two image pipelines. We typically skip Cloudinary entirely on CMS-driven projects unless the client has specific video processing needs.

    What about Uploadcare as an alternative?

    Uploadcare is a solid option we didn't cover in depth because its pricing ($25/month for 3,000 uploads) makes it more expensive per-upload than UploadThing or Supabase Storage for most app use cases. It shines for form-heavy sites where you need a polished upload widget with built-in image editing and moderation -- but that's a narrower use case.