Short answer
A public bucket skips access control for reading files: anyone with a file’s URL can open it. Uploads, deletes and moves are still checked by your policies. Keep public buckets for files meant to be public, move private files to a private bucket with row-level security policies, and serve them through signed URLs or signed-in downloads.
What public means, and the fix
01
Private files in a public bucket
“This means that anyone who possesses the asset URL can readily access the file.” Supabase, Storage Buckets
Anyone who has or guesses a file’s URL can open it, signed in or not. If the bucket holds documents, receipts, exports or anything users expect to be private, make it private, then check every file in it was meant to be shared.
02
Private buckets need policies to work
“When a bucket is set to Private all operations are subject to access control via RLS policies.” Supabase, Storage Buckets
Buckets are private by default, and then every operation, downloads included, goes through row-level security policies on Storage. Write policies that let each user read only their own files, for example by storing files in a folder named after the user’s id.
03
Links that stop working after the switch
“Create a signed URL with the createSignedUrl method that can be accessed for a limited time.” Supabase, Storage Buckets
Public file URLs won’t open once the bucket is private. Use a signed URL that expires, or download with the signed-in user’s session, and update anywhere the app stored the old public URL. Old public links may already be shared or saved elsewhere, so for anything sensitive that was exposed, upload it again under a new name.
04
Uploads are still checked
“Access control is still enforced for other types of operations including uploading, deleting, moving, and copying.” Supabase, Storage Buckets
Public doesn’t mean anyone can upload or delete. Those still go through your policies, so check them too: a policy that lets any signed-in user write anywhere in the bucket lets them overwrite other people’s files.
Checked against the vendor’s docs on : Supabase docs: Storage Buckets (access model); Supabase docs: Storage Access Control.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
Related: Free AI app check · RLS is on: is the data safe now? · Is Lovable safe for a real app?