SupabasefabrizioAnnouncement
Supabase Storage: major performance, security, and reliability updates
Summary
Supabase Storage has shipped updates live in all regions for projects using Storage, targeting performance at scale, security vulnerabilities, and reliability issues. As projects reached tens of millions of objects, concurrent uploads exposed write bottlenecks, certain SQL deletes could orphan files, and a crafted path could escape the file backend’s storage root. The object-listing rewrite removes the prefixes table, six triggers, and twelve helper functions, derives folder structure from the objects table with a hybrid skip-scan algorithm, and uses cursor-based pagination; deep pagination on 60 million rows is up to 14.8 times faster without a write penalty. Direct SQL deletes are blocked by default through a statement-level trigger, while a configurable 30-second timeout supports cancellation of disconnected clients via native Postgres protocol. Idempotent migrations, TUS lock-race prevention, orphan-scanner fixes, OpenTelemetry metrics, and adapter and API bug fixes are included, with no code changes required.
Context
Storage projects now hold tens of millions of objects. At that scale, concurrent uploads degraded write performance, certain SQL delete patterns could orphan files, a path traversal vulnerability affected the file backend, and support issues arose from stuck migrations, TUS locks, and related behavior.
Approach / What changed
The release replaces the prefixes-table listing system with a hybrid skip-scan algorithm that derives folder structure from the objects table and uses cursor-based pagination. It adds path traversal prevention, statement-level protection against direct SQL deletes, query cancellation and timeouts, idempotent migrations, TUS lock checks, orphan-scanner controls, OpenTelemetry metrics, and multiple bug fixes.
Takeaways
Object listing no longer uses the prefixes table, six triggers, or twelve helper functions; cursor-based pagination on 60 million rows is up to 14.8 times faster for deep pages without a write penalty.
A statement-level trigger rejects direct DELETE statements on Storage schema tables unless storage.allow_delete_query is enabled; the Storage API sets the variable automatically for normal operations.
Storage metrics now use OpenTelemetry and can be pushed to any OTel-compatible backend, while Prometheus scraping remains available at /metrics through the OTel Prometheus exporter.
Source and freshness
- Source
- supabase.com
- Published
- Added to Yomu
- Last updated
Summaries are generated from the original by a language model. Check the original before relying on it.
Keep reading
Related reading
The Good Stuff
Paid picks we use ourselves. Links carry a referral code — a subscription through one earns us a commission at no extra cost to you.
The best engineering reads, once a week
One useful email. Unsubscribe anytime.