Dreep vs Supabase Storage
Supabase Storage is file storage inside the Supabase platform: S3-compatible, secured with Postgres Row Level Security policies, with image resizing on paid plans and automatic WebP output. Dreep is a dedicated media API: image and video transformations, HLS, OCR, presets and storage in your own bucket. Stay on Supabase when auth, database and files belong together; add Dreep when media processing is the hard part.
Feature comparison
Supabase figures are from its pricing page and documentation at the time of writing (October 2026). Dreep figures are from the live plans on the pricing page.
| Capability | Supabase Storage | Dreep |
|---|---|---|
| Scope | One part of a platform that also includes Postgres, Auth and Realtime. | Media only: uploads, storage, transformations, OCR, background removal and delivery. |
| Pricing | Free: 1 GB storage, 5 GB egress. Pro from $25/mo: 100 GB storage then $0.0213 per GB, 250 GB egress then $0.09 per GB. | Free with 1 GB. Starter $2.99/mo with 10 GB. Pro $5.99/mo with 50 GB. Storage add-ons from $1.99/mo. |
| Image transformations | Pro plan and above. 100 origin images included, then $5 per 1,000 origin images. | Every plan: 100, 10,000 or 50,000 a month. One-time packs from $1.99 for 10,000. |
| Transform options | width and height 1 to 2,500 px, quality 20 to 100, resize cover, contain or fill. WebP served automatically. | width and height up to 4,000 px, five fit modes, jpeg, png, webp, avif, gif or tiff, quality, gravity including attention, blur, rotate, radius, bg, dpr. Presets. |
| Size limits | Uploads up to 50 MB on Free and up to 500 GB on Pro. Transformations take sources up to 25 MB and 50 megapixels. | Uploads up to 500 MB per file. |
| Video | Stored and served as uploaded. | Transcode to MP4, WebM or MOV, trim, HLS, GIF, thumbnails and audio extraction. |
| Access control | RLS policies on storage.objects, default deny for uploads. Service keys bypass RLS. Signed URLs. | Public, Private or Signed folders. HMAC-SHA256 signed URLs generated locally. Per-user rules live in your backend. |
| S3 access | S3-compatible endpoint with multipart uploads and SigV4 presigned URLs. No object versioning. | Not an S3 endpoint. With BYOB, media is written to your own S3, R2, Wasabi, Spaces or MinIO bucket. |
| OCR | Not part of Supabase Storage. | format=txt on an image or PDF, or POST /ocr. Billed per OCR page. |
Cost: origin images against transformation counts
Supabase includes image transformations from the Pro plan (from $25 a month) with 100 origin images, then charges $5 per 1,000 origin images. It counts distinct source images transformed, however many sizes you request. Dreep counts transformations against a monthly allowance on every plan, including Free.
Assumptions
- A marketplace with 40 GB of listing photos.
- 2,000 distinct photos transformed in a month, each at three sizes.
- 30,000 resized image responses a month.
- Supabase egress stays inside the 250 GB included with Pro.
- 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.
Supabase Pro
- Pro plan, includes 100 GB and 100 origin images
- $25.00
- 40 GB of photos, inside the 100 GB
- $0.00
- 1,900 extra origin images at $5 per 1,000
- $9.50
Dreep Pro
- Pro plan, 50 GB and 50,000 image transformations
- $5.99
- 40 GB of photos, inside the 50 GB
- $0.00
- 30,000 transformations, inside the 50,000
- $0.00
Most teams weighing this already pay for Supabase Pro for the database, Auth and the rest. Then the real comparison is the $9.50 transformation line against $5.99 for a separate Dreep plan, and keeping one platform may be worth the difference. The two meters also scale differently: Supabase charges per distinct origin image, so a large catalogue costs more there, while Dreep counts every transformed request, so heavy traffic on a small set of images costs more on Dreep.
Using Supabase Auth with Dreep for media
You do not have to choose one or the other. A common setup keeps Supabase for auth and data and hands media to Dreep: your server checks the Supabase session, creates a Dreep upload URL, and stores the returned asset ID in a table your RLS policies already protect.
Signed-in user
Supabase Auth session in the browser
Your server
Verifies the session, calls presignUpload
PUT and confirm
Bytes go to Dreep, asset becomes ready
Postgres row
Asset ID saved in a table under RLS
Deliver
dreep.url or dreep.signedUrl per request
The same tasks in each API
Upload, a resized URL and a short-lived signed URL with a transform, first with supabase-js and then with Dreep. Dreep adds the video case, which Supabase Storage does not process.
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
// Upload, allowed by an RLS policy on storage.objects
const { data, error } = await supabase.storage
.from("avatars")
.upload("public/avatar1.png", avatarFile);
// Resized public URL (Pro plan and above)
const { data: resized } = supabase.storage
.from("avatars")
.getPublicUrl("public/avatar1.png", {
transform: { width: 500, height: 600 },
});
// Signed URL with a transform, valid 60 seconds
const { data: signed } = await supabase.storage
.from("avatars")
.createSignedUrl("public/avatar1.png", 60, {
transform: { width: 200, height: 200 },
});import { Dreep } from "dreep";
const dreep = new Dreep({
apiKey: process.env.DREEP_API_KEY,
signingSecret: process.env.DREEP_SIGNING_SECRET,
});
// Upload, on your server after checking the user
const asset = await dreep.upload({ file: avatarFile, folder: "avatars" });
// Resized URL, any size up to 4000 px, explicit format
dreep.url(asset, { width: 500, height: 600, fit: "cover", format: "avif" });
// Signed URL with a transform, valid 60 seconds
dreep.signedUrl(asset, { expiresIn: 60, transform: { width: 200, height: 200 } });
// Video: the same asset model, served as HLS
const clip = await dreep.upload({ file: videoFile, folder: "clips" });
dreep.url(clip, { format: "hls" });client, err := dreep.New(
os.Getenv("DREEP_API_KEY"),
dreep.WithSigningSecret(os.Getenv("DREEP_SIGNING_SECRET")),
)
if err != nil {
log.Fatal(err)
}
asset, err := client.Upload(ctx, dreep.UploadOptions{
File: f,
Filename: "avatar1.png",
Destination: dreep.Destination{Folder: "avatars"},
})
if err != nil {
log.Fatal(err)
}
resized := client.URL(asset.ID, &dreep.Transform{Width: 500, Format: dreep.FormatWebP})
signed, err := client.SignedURL(asset.ID, time.Minute, nil)curl -X POST https://api.dreep.cloud/api/v1/upload \
-H "Authorization: Bearer $DREEP_API_KEY" \
-F file=@avatar1.png \
-F folder=avatars
# Resized and converted at delivery
https://cdn.dreep.cloud/api/v1/fetch/<ASSET_ID>.png?width=500&height=600&fit=cover&format=avif
# A video as HLS, and a thumbnail from 5 seconds in
https://cdn.dreep.cloud/api/v1/fetch/<VIDEO_ID>.mp4?format=hls
https://cdn.dreep.cloud/api/v1/fetch/<VIDEO_ID>.mp4?format=jpeg&time=5What Dreep adds on top of storage
Video your users can actually play
Uploads from phones arrive as MOV or large MP4 files. Dreep can transcode them, trim them, cut thumbnails and package HLS from the URL. Heavy jobs return 202 while processing; you re-request the URL until it returns 200.
More control over images
AVIF output, attention-based cropping that keeps the subject in frame, blur, rounded corners and sizes up to 4,000 px. Presets let you name a recipe once and change it without touching call sites.
Text from uploaded documents
Request format=txt on an image or PDF to get its text, billed per OCR page for the first extraction only. Useful for receipts, IDs and invoices that users already upload.
Media in a bucket you own
On Starter and Pro, BYOB stores originals and generated variants in your own S3-compatible bucket, connected while the project is empty.
Where Supabase Storage is the better choice
For many Supabase projects, built-in storage is enough and adding another vendor is not worth it. These are the cases where we would stay put.
One platform, one bill
Database, Auth and Storage share a dashboard, a client library and an invoice. Adding Dreep means a second vendor, a second key and a second set of limits.
Access rules next to your data
RLS policies on storage.objects can use the same user identity and SQL as your tables, so file permissions follow the same model as the rest of your app.
S3 tooling works
The S3-compatible endpoint means existing S3 clients, multipart uploads and SigV4 presigned URLs work against Supabase Storage directly.
Very large files
Supabase Pro allows uploads up to 500 GB per file. Dreep's limit is 500 MB, so large archives and raw footage belong elsewhere.
Who this is for
- Supabase apps that need video transcoding, HLS or thumbnails.
- Image-heavy apps that want AVIF, attention-based cropping or sizes above 2,500 px.
- Teams that want OCR on documents their users upload.
- Products that must keep media in their own S3-compatible bucket.
When Dreep is not the right fit
- Apps whose files are mostly documents served as uploaded.
- Teams that want RLS policies to govern every file request directly.
- Workloads with individual files larger than 500 MB.
- Small projects where a single vendor matters more than media features.
Moving media from Supabase Storage
Dreep has no Supabase importer, but Supabase's S3 compatibility makes the export simple. Plan the access rules first, because they move from SQL policies into your server code.
- 1
Decide where files will live
If you want media in your own bucket, connect it with BYOB before the first upload. A bucket can only be connected while the project is empty and cannot be changed later.
- 2
Move access rules into code
Translate each RLS policy into a check in the server route that presigns uploads or signs URLs. Use a Signed folder for anything that was private.
- 3
Export with S3 tooling
Enable S3 access in the Supabase Storage settings and copy objects out with any S3 client. Remember Supabase has no object versioning, so take the copy before deleting anything.
- 4
Upload and store asset IDs
Upload each file to Dreep and save the returned asset ID in the Postgres row that referenced the old storage path. Keep both columns until the switch is complete.
- 5
Swap URL calls
Replace getPublicUrl with dreep.url and createSignedUrl with dreep.signedUrl, mapping width and height directly and adding an explicit format.
Frequently asked questions
Can I keep Supabase Auth and use Dreep only for media?
Yes. Verify the Supabase session in your API route or server action, call Dreep's presignUpload, and store the asset ID in a table protected by your existing RLS policies. The Dreep API key never leaves your server.
Does Dreep enforce my Supabase RLS policies?
No. Dreep's access control is per folder: Public, Private or Signed. Per-user decisions happen in your backend before it presigns an upload or signs a delivery URL.
Which Supabase plans include image transformations?
At the time of writing, Pro and above. Pro and Team include 100 origin images a month, then $5 per 1,000. The Free plan does not include transformations. Every Dreep plan includes an image transformation allowance, starting at 100 a month on Free.
Which output formats does each support?
Supabase serves WebP automatically to browsers that support it, and format=origin returns the original format. Dreep has no automatic format: you set jpeg, png, webp, avif, gif or tiff explicitly.
Does Supabase Storage process video?
Supabase Storage stores and serves video files as uploaded; its transformations cover images. Dreep transcodes video, trims it, extracts audio and thumbnails, and packages HLS through URL parameters.
How large can uploads be?
Supabase allows up to 50 MB per file on Free and up to 500 GB on Pro. Dreep accepts up to 500 MB per file on every plan.
Related
All comparisons
How Dreep compares with other media and storage services.
Dreep vs Cloudflare Images
Per-image pricing and variants against flat plans and URL parameters.
Dreep vs UploadThing
Upload components and file routes against uploads plus processing.
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, signed URLs, video and SDK references.
Add video and OCR to your Supabase app
Keep Supabase for auth and data, and try Dreep for media on the Free plan: 1 GB of storage, 100 image and 20 video transformations a month.
Sources
Supabase facts on this page were checked against these official pages in October 2026.