Supabase compatibility
Each IvaraBase project speaks the same HTTP APIs as a Supabase project, so supabase-js (and the Swift, Flutter, Kotlin and Python clients, which use the same APIs) work by changing only the URL and the key. The end-to-end suites run the real @supabase/supabase-js against every release.
const supabase = createClient("https://shop.base.example.com", "<anon key>");// without a wildcard domain: createClient("https://base.example.com/proj/shop", "<anon key>")The URL and both keys (anon, service_role) are on the project’s API page and in ivarabase projects api --project shop.
What works
Section titled “What works”| Area | Supported |
|---|---|
Database / REST (/rest/v1, PostgREST 16) |
select with filters, embedding, ordering, ranges, counts, insert/upsert/update/delete, RPC, Prefer headers, RLS with anon / authenticated / service_role, auth.uid(), auth.jwt(), auth.role() |
Auth (/auth/v1) |
sign up, password sign-in, magic links, email OTP, password recovery, email change, refresh-token rotation, sign-out scopes, PKCE, OAuth (Google, GitHub, Apple, any OIDC provider), signInWithIdToken (Apple, Google, OIDC), anonymous users, phone OTP / phone + password, MFA (TOTP), admin API (auth.admin.*, including MFA factors) |
Storage (/storage/v1) |
buckets (public/private, size and mime limits), upload, download, list, move, copy, remove, signed URLs, signed upload URLs, RLS on storage.objects, resumable uploads (TUS) |
Realtime (/realtime/v1) |
postgres_changes (RLS-aware, filters), broadcast (self, ack, REST send), presence; alter publication supabase_realtime add table ... |
Functions (/functions/v1) |
supabase.functions.invoke(), Deno.serve() handlers, JWT verification per function, secrets as env vars, SUPABASE_URL / SUPABASE_ANON_KEY / SUPABASE_SERVICE_ROLE_KEY / SUPABASE_DB_URL |
| Database webhooks | insert/update/delete → URL or function, Supabase’s payload shape |
| Extensions | pgvector, pg_trgm, pgcrypto, uuid-ossp, citext, PostGIS, hstore, ltree and others, in the extensions schema |
| Schema | the auth.users, auth.identities and storage.objects tables use Supabase’s names, so references auth.users(id) and existing policies work |
Not supported
Section titled “Not supported”- GraphQL (
pg_graphql). - Point-in-time recovery, branching, read replicas. Backups are full logical snapshots (see Backups).
- Supabase CLI (
supabase db push,supabase functions deploy). Useivarabase applyorivarabase functions deployinstead (Config as code). - SAML SSO, web3 sign-in, phone MFA factors, auth hooks, captcha.
- Storage image transformations (
/render/image). - Realtime private channels (
config.private: truewith policies onrealtime.messages); they currently need the service_role key. - Supavisor/pgbouncer pooling. Apps connect to Postgres directly, which suits most self-hosted sizes.
- Less common extensions:
pg_cron,pg_net,pgsodium/Vault,wrappers.
Moving a project from Supabase
Section titled “Moving a project from Supabase”-
Schema and data. Dump from Supabase. The connection string is under Project Settings → Database:
Terminal window pg_dump "postgresql://postgres:...@db.xxxx.supabase.co:5432/postgres" \--schema=public --no-owner --no-privileges -Fc -f app.dumpCreate the project in IvaraBase, turn on the extensions it uses (Extensions page), then restore with the project’s own connection string from its API page:
Terminal window pg_restore --no-owner --no-privileges -d "postgresql://shop:...@base.example.com:54329/shop?sslmode=require" app.dumpThen re-create your RLS policies and grants if the dump didn’t include them (they’re in your migrations, usually).
-
Users.
auth.usershas the same columns. Copy the rows you need, includingencrypted_password(bcrypt hashes work as they are), usingpg_dump --table=auth.users --data-onlyand--table=auth.identities --data-only. Users keep their passwords. -
Storage. Download the buckets (for example with the Supabase CLI or rclone over S3), create the same buckets in IvaraBase, and upload with
supabase-jsor the Storage page. -
Functions. Copy
supabase/functions/<name>/and deploy it withivarabase functions deploy --project shop --dir ./supabase/functions/<name>. Code usingDeno.serveand theSUPABASE_*env vars runs unchanged. Set your secrets on the Secrets page. -
Auth settings. Copy the site URL, redirect URLs, SMTP and OAuth providers to the project’s Authentication page. Each OAuth provider’s callback URL changes to the one shown there.
-
Apps. Change the URL and anon key in your app.