September 2026
All articlesOnly some Bubble Privacy Rules translate directly into Supabase RLS. Compare every privacy permission with its migration equivalent, including fields, searches, files, and auto-binding.
TL;DR: Only some Bubble Privacy Rules translate directly into Supabase RLS. RLS can enforce conditions on which records a user may read, create, update, or delete. Bubble also controls individual fields, search permissions, attached files, and auto-binding. Those features need additional enforcement or application logic. Migrating your privacy rules therefore involves more than generating RLS policies.
A Bubble Privacy Rule combines two things: a condition, such as “This Project’s Creator is Current User,” and permissions that apply when that condition is true.
Both parts need a valid replacement. Translating the condition into SQL does not automatically reproduce every permission attached to it.
Here is how Bubble’s privacy permissions map to Supabase:
| Bubble privacy permission | Can RLS alone reproduce it? | Migration equivalent |
|---|---|---|
| Find this in searches | Partially. RLS filters accessible rows, but does not reproduce Bubble’s distinction between finding something in a search and accessing it through another reference. | Use a SELECT policy when search and direct-read permissions match. Otherwise, implement a controlled search endpoint or database function. |
| View all fields | Conditionally. RLS can allow access to a whole row, subject to database privileges. | A SELECT policy when full-row access is intended. Review search permissions before exposing unrestricted table queries. |
| View selected fields | No. RLS controls rows, not which columns are returned. | Use separately protected tables, column privileges, or a secured view/API that returns only authorized fields. Conditional visibility may require additional logic. |
Auto-binding illustrates the distinction. Supabase can enforce that a user may update only their own profile and only particular fields. But reproducing Bubble’s input binding, automatic saving, and separate permission for that update path requires more than an RLS policy.
Also, Bubble’s API permissions apply specifically to its Data API. They do not define authorization for ordinary workflow actions. Those workflows need their own migration review.
The conditions themselves need attention, too. “Current User” requires a reliable link between migrated Bubble users and Supabase Auth accounts. Related-record conditions may require joins or helper functions. A condition being possible in PostgreSQL does not mean a migration tool currently translates it.
Review the combined result. Bubble permissions are additive, and PostgreSQL’s default permissive policies also combine with OR. Test with actual user sessions, including users who should be denied access. A service-role credential bypasses RLS and cannot verify user permissions.
At unbub.dev, we translate a supported subset into reviewable RLS policies and flag behavior that needs additional implementation. Field visibility, file protection, and auto-binding should remain explicit migration tasks until their replacements are implemented and verified.
Sources: Bubble privacy permissions · Supabase RLS · Column privileges · Storage access control
Self-serve tools or a done-for-you service. Your app stays live while we move everything.
| No direct equivalent. RLS does not provide Bubble’s separate permission for using a field as a search constraint. |
| Restrict available filters through a controlled query API or database function. Account for Bubble’s Off, Automatic, or Strict search privacy mode. |
| View attached files | Requires separate Storage policies. RLS on the parent record does not automatically protect its files. | Use private Supabase Storage buckets and policies on storage.objects, with authorization linked to the owning record. |
| Allow auto-binding, including permitted fields | No direct equivalent. RLS does not distinguish an update from an auto-bound input from another update made with the same permissions. | Rebuild auto-save behavior in the frontend. Enforce allowed records and fields through a controlled update endpoint/function, column privileges, and appropriate RLS. |
| Create via API | Yes, if the condition translates. | An INSERT policy with WITH CHECK to validate the new row. |
| Modify via API | Conditionally. The checks before and after modification must preserve Bubble’s behavior. | An UPDATE policy using USING and WITH CHECK, with compatible read access where needed. Preserve Bubble’s same-rule requirement when combining permissions. |
| Delete via API | Yes, if the condition and required access translate. | A DELETE policy with USING, plus compatible read access for the application’s deletion flow. |