Dreep vs Cloudflare Images
Cloudflare Images bills per image stored, delivered and transformed, and handles video through a separate product, Cloudflare Stream. Dreep uses flat monthly plans that bundle storage, image and video transformations, OCR and presets, and on paid plans it can store originals and variants in your own S3-compatible bucket. Pick Cloudflare for very high image delivery volumes; pick Dreep for one media API across formats.
Feature comparison
Cloudflare figures are from Cloudflare's own documentation at the time of writing (October 2026). Dreep figures are from the live plans on the pricing page.
| Capability | Cloudflare Images | Dreep |
|---|---|---|
| Pricing model | Usage-based: $5 per 100,000 images stored, $1 per 100,000 images delivered, $0.50 per 1,000 unique transformations after 5,000 a month. | Flat plans: Free $0, Starter $2.99/mo, Pro $5.99/mo. One-time image transformation packs from $1.99 for 10,000. |
| Free allowance | 5,000 unique transformations a month for images stored elsewhere. Storing images in Cloudflare Images needs the Images Paid plan. | 1 GB storage, 100 image and 20 video transformations a month, 3 presets. |
| Resizing model | Named variants (up to 100) or flexible variants on imagedelivery.net. Comma-separated options in /cdn-cgi/image/ URLs on your own zone. | Query parameters on one asset URL: width, height, fit, format, quality, gravity, dpr, blur, rotate, radius, bg. Saved presets. |
| Images in your own bucket | Transforms images from any origin you allow, served through a Cloudflare zone with transformations enabled. | BYOB on Starter and Pro: AWS S3, Cloudflare R2, Wasabi, DigitalOcean Spaces, MinIO or any S3-compatible bucket. Originals and variants live in your bucket. |
| Upload size | Hosted images up to 10 MB and 100 megapixels. | Up to 500 MB per file, images and video. |
| Video | Cloudflare Stream, a separate product billed per minute stored and per minute delivered. | Same URL model as images: resize, trim, MP4, WebM, MOV, HLS, GIF, thumbnails and audio extraction. |
| OCR | Not part of Cloudflare Images. | format=txt on an image or PDF, or POST /ocr. Billed per OCR page. |
| Private media | Signed delivery URLs for private images. Flexible variants cannot be used with signed URLs. | Public, Private or Signed folders. HMAC-SHA256 signed URLs generated locally by the SDKs, with any transform. |
| Tooling | REST API, dashboard and an Images binding for Workers. | JavaScript/TypeScript and Go SDKs with zero dependencies, plus REST. |
Pricing models and a worked example
Cloudflare Images charges for three things: images stored ($5 per 100,000, sold in 100,000-image blocks on the Images Paid plan), images delivered ($1 per 100,000) and unique transformations ($0.50 per 1,000 after the first 5,000 each month). Dreep charges a flat plan price with monthly allowances, and you buy add-ons when you run out instead of paying overage.
Assumptions
- An online shop with 8,000 product photos averaging 500 KB, about 4 GB of originals.
- Three sizes per photo: thumbnail, listing card and detail view.
- 40,000 resized image responses a month.
- Dreep counts every request for a transformed variant against the monthly image transformation allowance; originals are never counted.
- Published USD prices at the time of writing (October 2026), before tax.
Cloudflare Images (hosted)
- Storage, one 100,000-image block
- $5.00
- 40,000 deliveries at $1 per 100,000
- $0.40
- Three variants (not counted as stored images)
- $0.00
Dreep Pro
- Pro plan, 50 GB and 50,000 image transformations
- $5.99
- 4 GB of originals, inside the 50 GB
- $0.00
- 40,000 transformations, inside the 50,000
- $0.00
At this size the two land within a dollar of each other. The picture changes with traffic: at 1,000,000 deliveries a month Cloudflare's delivery line is $10, while Dreep would need about 950,000 extra transformations from one-time packs (roughly $50 at $4.99 per 100,000). For image-only sites with heavy traffic, Cloudflare's per-delivery model is likely to cost less. Dreep's plan is better value when the same budget also covers video, OCR and storage.
How Dreep handles an image in your own bucket
Cloudflare can transform images from any origin, provided they are served through a zone on Cloudflare with transformations enabled. Dreep's Bring Your Own Bucket (BYOB) works differently: Dreep handles the upload, writes the original and every generated variant to your bucket, and delivers through Dreep CDN URLs. Your domain does not need to move anywhere.
Upload
SDK upload or presigned URL from your backend
Your bucket
S3, R2, Wasabi, Spaces or MinIO
Transform URL
width, height, fit, format, quality
First request
Variant generated, stored, then cached
Dreep CDN
Same URL serves every later request
Variants against URL parameters, in code
Cloudflare hosted images are served through named variants you define in advance (up to 100), or through flexible variants once you enable them. Dreep has no variant list: every asset URL accepts transform parameters, and presets give a stable name when you want one.
# Upload an image
curl --request POST \
https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/images/v1 \
--header "Authorization: Bearer $API_TOKEN" \
--form file=@./hero.jpg
# Deliver through a named variant you defined first
https://imagedelivery.net/<ACCOUNT_HASH>/<IMAGE_ID>/thumbnail
# Or, with flexible variants enabled on the account
https://imagedelivery.net/<ACCOUNT_HASH>/<IMAGE_ID>/w=400,sharpen=3import fs from "node:fs";
import { Dreep } from "dreep";
const dreep = new Dreep({ apiKey: process.env.DREEP_API_KEY });
const asset = await dreep.upload({
file: fs.createReadStream("hero.jpg"),
folder: "products",
});
// Any size on demand, no variant to define first
dreep.url(asset, { width: 400, height: 400, fit: "cover", format: "webp" });
// A saved preset when you want a stable name
dreep.url(asset, { preset: "thumbnail" });
// Video uses the same URL model
const clip = await dreep.upload({ file: fs.createReadStream("demo.mp4") });
dreep.url(clip, { format: "hls" });client, err := dreep.New(os.Getenv("DREEP_API_KEY"))
if err != nil {
log.Fatal(err)
}
f, _ := os.Open("hero.jpg")
defer f.Close()
asset, err := client.Upload(ctx, dreep.UploadOptions{
File: f,
Filename: "hero.jpg",
Destination: dreep.Destination{Folder: "products"},
})
if err != nil {
log.Fatal(err)
}
// Build a resized URL, no network call
thumb := client.URL(asset.ID, &dreep.Transform{Width: 400, Format: dreep.FormatWebP})curl -X POST https://api.dreep.cloud/api/v1/upload \
-H "Authorization: Bearer $DREEP_API_KEY" \
-F file=@hero.jpg \
-F folder=products
# Transform at delivery, full parameter names
https://cdn.dreep.cloud/api/v1/fetch/<ASSET_ID>.jpg?width=400&height=400&fit=cover&format=webp
# Extract text from an image or PDF (OCR)
https://cdn.dreep.cloud/api/v1/fetch/<ASSET_ID>.txtWhat the differences mean in practice
No variant list to maintain
When design asks for a new size, you change a query string rather than create a variant in a dashboard first. Presets exist for the sizes you want to name and change centrally, and they work on video too.
One product for images and video
A product video is resized, trimmed or packaged as HLS with the same URL pattern and API key as your images. Heavy video jobs return 202 while they process; you re-request the URL until it returns 200. There is no player, so use hls.js or Safari's native support.
Originals stay in your account
With BYOB, both originals and generated variants are written to your own bucket. If you leave Dreep, the files are already where you control them, rather than behind an export API.
Text out of receipts and documents
Request .txt on an image or PDF asset and Dreep returns the extracted text. You are billed per OCR page for the first extraction of a document only, so you do not need a second vendor for document capture.
Where Cloudflare Images is the better choice
Cloudflare Images is a mature product and the right answer for a lot of teams. These are the cases where we would point you to it.
Very high delivery volume
At $1 per 100,000 images delivered, Cloudflare's model scales well for image-heavy sites with millions of monthly requests and a stable set of sizes.
A large, mature global network
Cloudflare Images is a long-established product on Cloudflare's global network. If your domain is already proxied by Cloudflare, URL transformations work on your existing zone.
Workers integration
The Images binding lets a Worker resize and re-encode images in code, which suits teams that already build request logic on Workers.
Automatic format choice
Cloudflare can pick the best format per browser. Dreep needs an explicit format, so you choose avif or webp yourself or list sources in a picture element.
Who this is for
- Teams that want images, video, OCR and storage on one fixed monthly price.
- Apps that must keep originals in their own S3, R2, Wasabi, Spaces or MinIO bucket.
- Developers who prefer readable query parameters and typed SDKs in JavaScript or Go.
- Products that need video transcoding and HLS alongside image resizing.
When Dreep is not the right fit
- Image-only sites serving millions of requests a month, where per-delivery pricing wins.
- Stacks built around Workers that want image processing inside Worker code.
- Teams that rely on automatic per-browser format negotiation.
- Anyone needing live streaming, a hosted video player or DRM.
Migrating from Cloudflare Images
Dreep has no importer for Cloudflare Images (its dashboard importers cover Cloudinary, Amazon S3 and Cloudflare R2), so a move is a scripted export and re-upload.
- 1
Map variants to presets
List your Cloudflare variants and create a Dreep preset for each, with the same width, height and fit. Call sites can then switch from a variant name to the same preset name.
- 2
Decide on BYOB before uploading
A bucket can only be connected while the project is empty, and it cannot be changed later. Connect your S3 or R2 bucket first if you want originals there.
- 3
Export the originals
Cloudflare's API returns the stored file for each image at GET /accounts/{account_id}/images/v1/{image_id}/blob. Very large images may come back as a near-lossless version.
- 4
Upload and record the mapping
Upload each file with the SDK or the presigned flow, and store the Cloudflare image ID next to the new Dreep asset ID so you can rewrite URLs in one pass.
- 5
Switch URLs, then retire
Replace imagedelivery.net URLs with dreep.url(asset, { preset }) and keep both live until traffic to Cloudflare stops. Videos on Stream are re-uploaded from your source files.
Frequently asked questions
Can Dreep transform images that are already in my R2 or S3 bucket?
Not in place. BYOB means new uploads made through Dreep are stored in your bucket, connected while the project is empty. For existing objects, the dashboard's S3 and R2 importers run a one-off background job that copies the files you choose into a Dreep project, after which they can be transformed. Cloudflare's URL transformations, by contrast, read existing images directly from any origin you allow.
Does Dreep have an equivalent of Cloudflare's automatic format?
No. Dreep has no format=auto, so you set format=avif, webp, jpeg or png explicitly. A picture element with an avif source and a webp fallback gives most of the benefit.
How does Dreep video compare with Cloudflare Stream?
Stream is a separate product priced at $5 per 1,000 minutes stored and $1 per 1,000 minutes delivered, with free encoding, at the time of writing. Dreep video transforms are URL parameters counted against a monthly video transformation allowance (20 on Free, 1,000 on Starter, 4,000 on Pro). Dreep has no player and no live streaming.
What happens when I reach a limit?
On Dreep, requests beyond an allowance return LIMIT_EXCEEDED and nothing is billed automatically: you buy an add-on or upgrade. On Cloudflare's free tier, new transformations beyond 5,000 a month return error 9422 while cached ones keep working.
Can I use both?
Yes. Some teams keep Cloudflare Images for high-traffic marketing images and use Dreep for user uploads, video and OCR. They are separate URL hosts, so the two do not interfere.
Related
All comparisons
How Dreep compares with other media and storage services.
Dreep vs UploadThing
Upload components and file routes against uploads plus processing.
Dreep vs Supabase Storage
Storage with Postgres policies against a dedicated media API.
Cloudinary alternative
Moving from Cloudinary, with the built-in importer.
Image CDN API
Every image transform parameter, with examples.
Pricing
Plans, allowances and add-on packs in full.
Documentation
Uploads, transformations, BYOB and SDK references.
Test Dreep against your current variants
The Free plan includes 1 GB of storage and 100 image transformations a month: enough to upload a sample of your catalogue and compare output side by side before you move anything.
Sources
Cloudflare facts on this page were checked against these official pages in October 2026.