Make one real URL before you keep reading

Upload a file up to 10 MB. FilePost stores it, returns the public CDN URL, and creates your free API key in the same step.

Supabase Storage Alternative When You Only Need a Public URL

August 9, 2026 · 9 min read

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

DecisionFilePostSupabase Storage
Core jobUpload a file and return a public CDN URLObject storage integrated with a backend platform
SetupCreate API key, send multipart requestCreate project, create bucket, choose public/private, configure policies and client
Public URLReturned in the upload responseBuild from bucket/object path or request through the SDK
Private authorizationNot the standard use caseStrong fit through Auth and RLS policies
Billing modelUpload-count plans with storage limits and included deliveryPlatform plan with storage and egress allowances
Framework requirementAny HTTP clientREST is available; official client SDK is the common path
Large/resumable uploadUp to 500 MB on ProTUS, S3 and files much larger than 500 MB
Best fitPublic assets, workflow files, exports and mixed general filesApplication 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:

  1. Create or select a Supabase project.
  2. Create a storage bucket and choose whether it is public.
  3. Choose an object path and collision strategy.
  4. Configure RLS policies for upload, update and delete operations.
  5. Initialize a client with the project URL and key.
  6. Upload the object.
  7. Generate a public URL or a time-limited signed URL.
  8. 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

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

Pricing: Different Products, Different Meters

According to the official Supabase pricing page, checked August 9, 2026:

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.

  1. Inventory public and private buckets separately.
  2. Keep private/RLS-protected objects on Supabase unless you replace that authorization layer.
  3. For public objects, replace the SDK upload and getPublicUrl call with the FilePost request.
  4. Store the returned url and file_id in your existing database.
  5. Use the FilePost DELETE /v1/files/{file_id} route for lifecycle cleanup.
  6. 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