Skip to main content

Is Supabase Vendor Lock-in a Problem? Debunking the Myths

· 6 min read
Serhii Hrekov
software engineer, creator, artist, programmer, projects founder

Supabase has minimal vendor lock-in by design because it's built on a foundation of popular open-source technologies, most notably PostgreSQL. This is a core part of their philosophy and a key differentiator from closed-source alternatives like Firebase. However, while minimal, some "stickiness" exists in their value-added services.

Understanding the Vendor Lock-in​

The best way to think about Supabase's vendor lock-in is to divide the platform into its two core layers:

  1. The Open-Source Core: This is the most important layer for portability. Your database is a standard, full-featured PostgreSQL instance. This means your data and schema are highly portable and can be exported using standard tools like pg_dump. Your database migrations are standard SQL files, making them easily transferable. The CLI allows you to run a local replica of the entire Supabase stack, including the database, Auth, and Storage services, using Docker. This ensures you can develop and test offline and provides a clear path to self-hosting or migrating to another provider.

  2. The Managed, Value-Added Services: This is where the "stickiness" lies. These services are powerful and convenient, but their tight integration with the Supabase platform makes a full migration require more effort.

    • Supabase Auth: The authentication service stores user data in the auth schema of your Postgres database. While the data is accessible, the authentication logic-like OAuth providers, magic links, and JWT issuance-is tightly coupled to the Supabase platform. Migrating this logic to another service or a custom solution will require a non-trivial amount of manual work.
    • Edge Functions: These are serverless functions powered by Deno. While the code itself is standard TypeScript, the deployment, secrets management, and triggering mechanisms are specific to Supabase.
    • Realtime: The Realtime service is built on PostgreSQL's LISTEN/NOTIFY system, but the client SDK and the managed service are specific to Supabase. Replicating this functionality with another provider requires reconfiguring client-side code and backend services.
    • Storage: The storage service is S3-compatible, which is a big win for portability. However, the metadata for your files is stored in a separate table within your database, and its integration with Row Level Security (RLS) is tied to the Supabase authentication system.

Thoughts and Usage​

My recommendation is to embrace Supabase's core strengths while being mindful of the potential for lock-in.

  • Lean on Postgres: Use PostgreSQL's robust features like Row Level Security (RLS) and stored procedures. This is a portable skill and a portable database.
  • Decouple your Auth logic: While it's tempting to use the convenient supabase.auth.signIn calls, consider writing a thin abstraction layer over your authentication logic. This makes it easier to swap out the underlying provider later if needed.
  • Use the CLI: Make the Supabase CLI an integral part of your workflow. By using supabase db push and supabase db pull, you are version-controlling your schema with standard SQL, which is the ultimate form of portability.

Code Examples for Mitigation​

Exporting your data and schema​

The Supabase CLI is your best friend for fighting vendor lock-in.

# Pulls the schema from your remote database into a local migration file
supabase db pull

# Dumps only the data from your database (excluding Supabase's internal tables)
supabase db dump --data-only --exclude-schemas auth,storage,realtime > my_data.sql

Self-hosting your project locally​

This command shows that you can run the entire Supabase stack locally, proving its portability.

# Starts a full local Supabase instance using Docker
supabase start

Sources​

  1. Supabase Blog: Supabase vs. Firebase: An Architectural Deep Dive
  2. Supabase Docs: Local Development and Migrations
  3. Supabase Docs: Auth Migration Guide