Skip to content

Documentation

Migrate from Supabase

The importer copies your schema, data, auth users (with their passwords), storage files and policies. Then you change the URL and key in createClient.

Overview

The importer connects to your Supabase database, reads it, and rebuilds it in a new Vulcbase project. Your Supabase project is not changed. You can run an import as many times as you like into new projects while you test.

  1. Get the connection details from Supabase.
  2. Create a Vulcbase project and run the import.
  3. Check the result.
  4. Switch your app to the new URL and key.

1. What to get from Supabase

In the Supabase dashboard, open your project and go to Project Settings.

  • Connection string (Database section). Copy the URI form and replace the password placeholder with your database password. Use the direct connection or the session pooler; avoid the transaction pooler, which does not support everything a dump needs.
  • Project URL and service_role key (API section). They are only needed to copy storage files.
what you need
postgresql://postgres:<password>@db.<ref>.supabase.co:5432/postgreshttps://<ref>.supabase.co     # project URL, for storage files<service_role key>            # for storage files
If you forgot the database password, reset it in Supabase under Database settings. Reset it again after the import if you want to keep the old value private.

2. Run the import

  1. In Vulcbase, create a new project.
  2. Open Import data in the project sidebar and choose Supabase.
  3. Paste the connection string. Add the project URL and service_role key if you want storage files copied.
  4. Choose what to copy: data, auth users, storage. Optionally limit the schemas.
  5. Start the import. It runs in the background, shows progress, and keeps a log you can read line by line.

What is copied

ItemCopiedNotes
SchemaSupportedTables, views, types, functions, triggers, indexes and constraints in the schemas you choose.
Table dataSupportedRow data for the copied tables.
Row Level Security policiesSupportedPolicies and the RLS setting of each table.
Auth usersSupportedUsers keep their ids, metadata and password hashes. Nobody has to reset a password.
Storage buckets and filesSupportedNeeds the project URL and service_role key. Bucket settings come across too.
ExtensionsPartlyThe common ones are available (vector, pg_trgm, pgcrypto, citext, unaccent and more). Others may not be available; read the import log for any that were skipped.
OAuth providers and OAuth-only identitiesNot yetOAuth sign-in is not supported yet. Users who only ever signed in with a provider have no password to import.
Edge functionsNot yetNot part of Vulcbase. Move the code to your own server or a worker.
AI featuresNot yetNot part of Vulcbase. Embedding columns in your tables are plain data and are copied.

3. Check the result

  • Open the Table editor and compare row counts with Supabase.
  • In Authentication, check the user count and sign in with a test account.
  • In Storage, open a few files and a signed URL.
  • Run your test suite against the new URL.

Then set the Site URL and redirect URLs in the auth settings, and configure SMTP so confirmation, magic link and recovery emails are sent from your address.

4. Switch your app

Replace the two values passed to createClient and deploy.

before and after
// beforecreateClient("https://xyzcompany.supabase.co", SUPABASE_ANON_KEY); // aftercreateClient("https://<your-vulcbase-project-url>", VULCBASE_ANON_KEY);

If your server code uses the service_role key, replace it with the one from your Vulcbase project too. Users who are signed in will have to sign in once more, because sessions are signed with a different key.

Cutting over with live data

Import into a fresh project to rehearse. On the day, put your app in read-only mode or pause writes, import again into a new project, switch the URL and key, and resume.

Compatibility with supabase-js

FeatureStatusNotes
select, insert, update, upsert, deleteSupportedIncluding upsert with on_conflict and bulk inserts.
FiltersSupportedeq, neq, gt, gte, lt, lte, like, ilike, in, is, match, contains, containedBy, overlaps, range operators, not, or, and.
Full-text searchSupportedtextSearch with plain, phrase, websearch and to_tsquery types.
order, limit, range, single, maybeSingle, countSupportedExact counts.
Embedded resourcesSupportedOne-to-many, many-to-one, many-to-many, !inner and aliases.
rpc()SupportedPostgres functions in exposed schemas.
Email and passwordSupportedsignUp, signInWithPassword, updateUser, resetPasswordForEmail.
Magic links and email codesSupportedsignInWithOtp and verifyOtp.
Anonymous sign-insSupportedsignInAnonymously; link an email later with updateUser.
PKCE flowSupportedCode exchange with exchangeCodeForSession.
OAuth providersNot yetGoogle, GitHub and others are not available yet.
Phone and SMS sign-inNot yetNot available.
Multi-factor authentication for app usersNot yetNot available.
Storage: buckets, upload, download, remove, moveSupportedWith Row Level Security policies on objects.
Signed URLs, public URLsSupportedcreateSignedUrl and getPublicUrl.
Image resizingSupportedWidth, height, resize mode and quality through transform options.
Resumable uploads (TUS)Not yetUse standard uploads.
Realtime: database changesSupportedRow Level Security is applied before an event is delivered.
Realtime: broadcast and presenceSupportedSame channel() API.
Edge functionsNot yetNot available.
GraphQL endpointNot yetNot available.
AI featuresNot yetNot available, and not planned.