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.
- Get the connection details from Supabase.
- Create a Vulcbase project and run the import.
- Check the result.
- 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.
postgresql://postgres:<password>@db.<ref>.supabase.co:5432/postgreshttps://<ref>.supabase.co # project URL, for storage files<service_role key> # for storage files2. Run the import
- In Vulcbase, create a new project.
- Open Import data in the project sidebar and choose Supabase.
- Paste the connection string. Add the project URL and service_role key if you want storage files copied.
- Choose what to copy: data, auth users, storage. Optionally limit the schemas.
- Start the import. It runs in the background, shows progress, and keeps a log you can read line by line.
What is copied
| Item | Copied | Notes |
|---|---|---|
| Schema | Supported | Tables, views, types, functions, triggers, indexes and constraints in the schemas you choose. |
| Table data | Supported | Row data for the copied tables. |
| Row Level Security policies | Supported | Policies and the RLS setting of each table. |
| Auth users | Supported | Users keep their ids, metadata and password hashes. Nobody has to reset a password. |
| Storage buckets and files | Supported | Needs the project URL and service_role key. Bucket settings come across too. |
| Extensions | Partly | The 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 identities | Not yet | OAuth sign-in is not supported yet. Users who only ever signed in with a provider have no password to import. |
| Edge functions | Not yet | Not part of Vulcbase. Move the code to your own server or a worker. |
| AI features | Not yet | Not 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.
// 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
Compatibility with supabase-js
| Feature | Status | Notes |
|---|---|---|
| select, insert, update, upsert, delete | Supported | Including upsert with on_conflict and bulk inserts. |
| Filters | Supported | eq, neq, gt, gte, lt, lte, like, ilike, in, is, match, contains, containedBy, overlaps, range operators, not, or, and. |
| Full-text search | Supported | textSearch with plain, phrase, websearch and to_tsquery types. |
| order, limit, range, single, maybeSingle, count | Supported | Exact counts. |
| Embedded resources | Supported | One-to-many, many-to-one, many-to-many, !inner and aliases. |
| rpc() | Supported | Postgres functions in exposed schemas. |
| Email and password | Supported | signUp, signInWithPassword, updateUser, resetPasswordForEmail. |
| Magic links and email codes | Supported | signInWithOtp and verifyOtp. |
| Anonymous sign-ins | Supported | signInAnonymously; link an email later with updateUser. |
| PKCE flow | Supported | Code exchange with exchangeCodeForSession. |
| OAuth providers | Not yet | Google, GitHub and others are not available yet. |
| Phone and SMS sign-in | Not yet | Not available. |
| Multi-factor authentication for app users | Not yet | Not available. |
| Storage: buckets, upload, download, remove, move | Supported | With Row Level Security policies on objects. |
| Signed URLs, public URLs | Supported | createSignedUrl and getPublicUrl. |
| Image resizing | Supported | Width, height, resize mode and quality through transform options. |
| Resumable uploads (TUS) | Not yet | Use standard uploads. |
| Realtime: database changes | Supported | Row Level Security is applied before an event is delivered. |
| Realtime: broadcast and presence | Supported | Same channel() API. |
| Edge functions | Not yet | Not available. |
| GraphQL endpoint | Not yet | Not available. |
| AI features | Not yet | Not available, and not planned. |