Supabase Storage Alternative When You Only Need a Public URL
The short answer: Supabase Storage is a good choice when your files belong inside a Supabase application. FilePost is a better fit when adding a database project, bucket, access policy and client SDK would be infrastructure for infrastructure's sake.
Supabase combines object storage with Postgres, authentication, row-level security and a generated API. That combination is its advantage. It can also be unnecessary coupling for a script, automation, static site or small SaaS feature whose only output is a public file URL.
Supabase Storage vs FilePost
| Decision | FilePost | Supabase Storage |
|---|---|---|
| Core job | Upload a file and return a public CDN URL | Object storage integrated with a backend platform |
| Setup | Create API key, send multipart request | Create project, create bucket, choose public/private, configure policies and client |
| Public URL | Returned in the upload response | Build from bucket/object path or request through the SDK |
| Private authorization | Not the standard use case | Strong fit through Auth and RLS policies |
| Billing model | Upload-count plans with storage limits and included delivery | Platform plan with storage and egress allowances |
| Framework requirement | Any HTTP client | REST is available; official client SDK is the common path |
| Large/resumable upload | Up to 500 MB on Pro | TUS, S3 and files much larger than 500 MB |
| Best fit | Public assets, workflow files, exports and mixed general files | Application files connected to users, database rows and access policies |
The Hidden Setup Behind "Just Store This File"
A correct Supabase implementation commonly requires these decisions:
- Create or select a Supabase project.
- Create a storage bucket and choose whether it is public.
- Choose an object path and collision strategy.
- Configure RLS policies for upload, update and delete operations.
- Initialize a client with the project URL and key.
- Upload the object.
- Generate a public URL or a time-limited signed URL.
- Track storage and egress against the project plan.
Those steps are appropriate when storage is part of the application's security model. They are overhead when the destination is simply a public URL.
FilePost reduces that public-file path to:
curl -X POST https://upload.filepost.dev/v1/upload \
-H "X-API-Key: $FILEPOST_API_KEY" \
-F "file=@invoice.pdf"
The response already contains the durable URL:
{
"file_id": "8f4d...",
"url": "https://cdn.filepost.dev/file/filepost/uploads/.../invoice.pdf",
"name": "invoice.pdf",
"size": 82412,
"content_type": "application/pdf"
}
Where Supabase Storage Is Better
- Authorization is part of the feature. Supabase private buckets and RLS can connect object access to authenticated users and database records.
- You already run on Supabase. One platform for database, auth, edge functions and files may be simpler operationally than another vendor.
- You need resumable or very large uploads. Supabase recommends TUS for files above 6 MB and supports much larger plan limits than FilePost.
- You want raw object-storage control. Bucket layout, cache headers, object paths, S3 compatibility and policies are features, not chores, for infrastructure-oriented teams.
- Your delivery must be private. FilePost's standard URLs should not replace signed URLs or policy-protected objects.
Supabase's official bucket documentation states that a public bucket bypasses access controls for retrieving and serving files. Private files can instead use signed URLs that expire. That is a valuable distinction FilePost intentionally avoids by focusing on public delivery.
Where FilePost Is Better
- No backend platform dependency. Use cURL, Python, Go, PHP, Ruby, Zapier, n8n, Make or a serverless function.
- The URL is the product output. No separate
getPublicUrlcall or bucket/path assembly. - Predictable small plans. Lite is $4 per month for 300 uploads, 100 MB files and 10 GB storage.
- Delivery is included. FilePost plans are not metered by cached versus uncached egress.
- Hosted intake links. Give a customer a constrained upload page without giving them your API key or building a form.
- Upload-complete webhooks. Send a signed event to your automation after each authenticated upload.
Pricing: Different Products, Different Meters
According to the official Supabase pricing page, checked August 9, 2026:
- Free included 1 GB file storage, 5 GB egress and 5 GB cached egress.
- Pro started at $25 per month and included 100 GB file storage, 250 GB egress and 250 GB cached egress.
- Usage beyond the included storage and egress was charged separately.
FilePost's paid entry is smaller because it is not selling a database, authentication, compute and backup platform. Lite is $4 per month for 300 uploads. Starter is $9 for 1,500 uploads. If you need the rest of Supabase, comparing those prices directly is misleading. If you only need public files, the broader platform plan may be unnecessary.
Code Comparison
Supabase JavaScript upload
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY);
const path = `reports/${crypto.randomUUID()}-report.pdf`;
const { error } = await supabase.storage
.from("public-files")
.upload(path, file, { contentType: "application/pdf" });
if (error) throw error;
const { data } = supabase.storage
.from("public-files")
.getPublicUrl(path);
console.log(data.publicUrl);
Supabase's standard upload documentation recommends this method for small files and TUS resumable uploads above 6 MB for reliability.
FilePost JavaScript upload
const form = new FormData();
form.append("file", file);
const response = await fetch("https://upload.filepost.dev/v1/upload", {
method: "POST",
headers: { "X-API-Key": FILEPOST_API_KEY },
body: form,
});
if (!response.ok) throw new Error(await response.text());
const { url } = await response.json();
console.log(url);
Migration Checklist
A Supabase-to-FilePost migration is safe only for assets that may be public to anyone with the URL.
- Inventory public and private buckets separately.
- Keep private/RLS-protected objects on Supabase unless you replace that authorization layer.
- For public objects, replace the SDK upload and
getPublicUrlcall with the FilePost request. - Store the returned
urlandfile_idin your existing database. - Use the FilePost
DELETE /v1/files/{file_id}route for lifecycle cleanup. - Keep old Supabase URLs active until consumers have migrated.
The Decision Rule
Choose Supabase Storage when files are part of your authenticated data model. Its policies, buckets and backend integration are the reason to use it.
Choose FilePost when files are public workflow outputs and the storage layer should disappear behind one HTTP request.
Find out whether one request is enough
Upload a harmless test file with the form above. If the returned public URL is the complete outcome your feature needs, you may not need a backend storage project.
Get a free API key