What is Supabase?

And why should you use it?

Erfi Anugrah

The Backend AI Builds On

Supabase is one Postgres platform - the operational and AI backend that replaces a stack of vendors. It’s now the backend AI app-builders plug into.

  • >60% of new databases are created by an AI tool · 600% YoY launch growth
  • The backend integration behind Lovable · Bolt · Figma Make

Agenda

  1. What it is - the platform
  2. Why Supabase - and when it’s not
  3. Proof - traction + customers
  4. Live demo - what I built

The Platform

The open-source Postgres development platform

Product What it does
Database Fully managed Postgres + Row Level Security
Auth Email, OAuth, magic link, SSO/SAML
Storage S3-compatible object store + CDN
Realtime WebSocket subscriptions (presence, broadcast, CDC)
Edge Functions Deno runtime, globally distributed

One platform. One bill. Tightly integrated.

Supabase, End to End

Every product is a Postgres primitive - and each replaces a vendor you’d otherwise stitch in.

SB sb Supabase ab App backend sb--ab ai AI sb--ai an Analytics & data movement sb--an sc Scale sb--sc d1 Database · Postgres + RLS ab--d1 d2 Auth · OAuth / SAML / MFA ab--d2 d3 Data APIs · PostgREST + GraphQL ab--d3 d4 Realtime · Broadcast / Presence / CDC ab--d4 d5 Storage · S3-compatible + CDN ab--d5 d6 Edge Functions · Deno runtime ab--d6 d7 Cron & Queues · pg_cron / pgmq ab--d7 v1 pgvector · semantic + hybrid search ai--v1 n1 Analytics Buckets · Iceberg an--n1 n2 Pipelines · CDC → BigQuery an--n2 n3 Wrappers · FDW → Snowflake / ClickHouse an--n3 st today · GA sc--st sr roadmap sc--sr t1 Supavisor · connection pooler st--t1 t2 Read Replicas · read scaling st--t2 r1 Multigres · Vitess for Postgres sr--r1 r2 OrioleDB · storage engine sr--r2

One control plane, one bill - fewer vendors, less integration work, faster to ship.

Three Differentiators

Open Source

  • 106K+ GitHub stars
  • Self-hostable on your infra
  • Building in public

Postgres-Native

  • Standard SQL, not a proprietary query language
  • Full extension ecosystem
  • pgvector, pg_cron, PostGIS

No Lock-in

  • pg_dump anytime
  • Standard connection strings
  • Your data, your keys
  • Self-host or migrate whenever

Security at the Database Layer

Row Level Security - authorization enforced by Postgres, not your app code

CREATE POLICY "own posts" ON posts FOR ALL TO authenticated
USING     (user_id = auth.uid())   -- who can SEE / touch this row
WITH CHECK(user_id = auth.uid());  -- what can be WRITTEN into this row
Clause Applies to Guards against
USING SELECT, UPDATE, DELETE Reading or deleting someone else’s rows
WITH CHECK INSERT, UPDATE Writing a row with the wrong owner - or reassigning ownership to another user

If USING doesn’t check ownership you can reach rows you don’t own; without WITH CHECK you can write (or reassign user_id on) a row so it belongs to someone else.

Both together = you can only touch rows you own, and you can’t transfer ownership.

By the Numbers

Scale

  • ~10M developers - 2x in 8 months
  • 250,000+ customers
  • 600% YoY growth in database launches

AI-native

  • >60% of new databases created by an AI tool
  • Supabase for Platforms: fastest-growing product
  • Backend integration for Lovable, Bolt, Figma Make

$500M Series F · $10.5B valuation · >$1B raised since 2020

Sources: Series F announcement · PR Newswire · TechCrunch · accurate as of 4 Jun 2026

What Customers Are Building

Pattern Example Why Supabase
Startup greenfield Chatbase - $10M+ ARR, bootstrapped Zero to $10M on one stack
DB + Auth consolidation Good Tape - 60% cost cut Auth0 + Fly → Supabase
Multi-tenant SaaS Kayhan Space - 8x dev speed RDS + Auth0 → DB + Auth, RLS per tier
AI / vector Humata - 75% vector-cost cut Pinecone → one pgvector instance
EU compliance GDPR + residency 6 European regions (4 in the EU), SOC 2, DPA

Sources: Chatbase · Good Tape · Humata · Kayhan Space - Supabase customer stories.

Summary

What

  • Postgres + Auth + Storage
  • Realtime + Edge Functions
  • One platform, one bill

Why

  • Open source, self-hostable
  • Postgres-native, no lock-in
  • Security at the DB layer

Who

  • Startups shipping fast
  • Teams consolidating vendors
  • AI teams adding vector search

Pasteriser - paste.erfi.io

A production pastebin - every Supabase surface used deliberately.

Feature What I used
Data + search Postgres, 21 migrations, FTS via tsvector + GIN index
Access control 9 RLS policies - public read, owner write, burn-after-read
Auth Email, magic link, GitHub OAuth with PKCE in a CF Worker
Live feed Realtime broadcast from a Postgres trigger
Scheduled cleanup pg_cron - replaces Lambda + EventBridge entirely
Config as code supabase/config.toml + config push

381 tests - including race-condition tests under 100 concurrent hits.

Live demo: paste.erfi.io

Questions?

Built-In, Not Bolted-On

Search, scheduling, realtime, edge compute - each would normally be a separate vendor. Here they are part of the platform.

How Full-Text Search Works

Search that understands language - not just exact word matching.

Step What happens
1. Write a paste Postgres converts title + language to root words: "running tests"run test
2. Store the index The root words are stored in a tsvector column - automatically kept in sync
3. Build a GIN index A lookup table maps every root word to which rows contain it
4. Search User types "run" - Postgres checks the index, returns matching rows in milliseconds

No Elasticsearch. No separate search service. Built into Postgres.

Sources: Full-Text Search

pg_cron: Scheduled Tasks in Postgres

Run SQL on a schedule, from inside the database. No extra services.

-- Delete expired pastes every 5 minutes
SELECT cron.schedule(
  'cleanup-expired',
  '*/5 * * * *',
  $$ DELETE FROM pastes WHERE expires_at < now() $$
);
AWS Lambda + EventBridge pg_cron
Where it runs Separate serverless service Inside Postgres
Deployment Deploy function + create rule One SQL statement
Logs CloudWatch cron.job_run_details table
Cost Per invocation + rule Included with Postgres

Sources: Cron

Realtime: Database → Browser

A browser receives an update the moment a row is written - no polling.

User saves a paste
    ↓
Postgres commits the row
    ↓
AFTER INSERT trigger fires
    ↓
realtime.send() → Realtime server → all subscribed browsers

Two functions:

  • realtime.send() - you control the payload (Pasteriser: strips private columns)
  • realtime.broadcast_changes() - sends the full row change (a multi-tenant notes feed)

Edge Functions: Deno at the Edge

Serverless TypeScript/JavaScript on a globally distributed Deno runtime - for logic that doesn’t belong in the database.

Property Detail
Runtime Deno (TypeScript/JS, Web-standard APIs, WASM) - not Node
Deploy supabase functions deploy - no container, no cold-start config
Where it runs Distributed to the region nearest the user (pin DB-heavy functions near the DB region)

Edge Functions: Auth, Secrets, Fit

Property Detail
Auth Receives the caller’s JWT - can call the DB as that user (RLS applies)
Secrets supabase secrets set - env vars injected at runtime
Good for Webhooks, third-party API calls, payments, LLM calls, custom auth hooks

Rule of thumb: data-local work (triggers, scheduled jobs) stays in Postgres (pg_cron, triggers); network-facing / third-party glue goes in an Edge Function.

Data & AI

Postgres is the OLTP source of truth; analytics and AI read from it - no separate warehouse or vector vendor required.

The Data Platform: One Source of Truth

Postgres is the OLTP source of truth - analytics and AI read FROM it, not replace it.

flowchart LR
  APP[App / users] -->|writes| PG[(Supabase Postgres<br/>OLTP source of truth)]
  PG -->|Pipelines · CDC| WH[(Warehouse<br/>BigQuery / Snowflake)]
  PG -->|Read replica · matviews| BI[Dashboards / BI]
  WH --> BI
  DOCS[Documents] -->|embeddings| VEC[pgvector]
  PG --- VEC
  Q[User question] -->|embed + search| VEC -->|top-k context| LLM[LLM] --> ANS[Grounded answer]
  classDef core fill:#2f6f4e,stroke:#8fdab5,color:#fff;
  classDef analytics fill:#2b6cb0,stroke:#8fc3ef,color:#fff;
  classDef ai fill:#6d4aa6,stroke:#c3a8e8,color:#fff;
  classDef neutral fill:#33333d,stroke:#777,color:#fff;
  class PG core;
  class WH,BI analytics;
  class VEC,LLM,ANS ai;
  class APP,DOCS,Q neutral;

The Data Platform: Two Reads, One Source

The same Postgres feeds both buying waves - analytics and AI read from it, neither replaces it.

  • Analytics: stream out via Pipelines (CDC) or replicas - the warehouse is downstream, not a replacement.
  • AI / RAG: embeddings live in the same Postgres (pgvector) - retrieval JOINs vectors to live rows, no separate vector vendor.

Postgres + Analytics: the Open Warehouse

Keep Postgres as the SQL front door; tier cold data into open Iceberg - not a second OLAP vendor.

Approach Product Status What it does
Isolate reads Read replica GA Offload heavy reads (optional 2nd region)
In-Postgres Matviews, partitioning, pg_partman GA Pre-aggregate / prune scans, zero infra
Tier cold data Analytics Buckets Alpha Iceberg/Parquet on S3; query via Iceberg FDW
Replicate out Pipelines (CDC) Alpha Rust ETL → external warehouse (BigQuery)
In-DB OLAP pg_duckdb (Hydra) Roadmap ~600x faster scans, in-Postgres

Today (GA): read replica + Postgres-native. The open-Iceberg lakehouse is direction, not shipping - not a petabyte-OLAP replacement.

Open Warehouse: One Query, Hot + Cold

The FDW makes cold Iceberg-on-S3 look like a Postgres table - so one SQL statement spans both tiers, and it runs both directions.

-- Cold history is Parquet/Iceberg on S3, exposed as a foreign table.
-- Join it to live Postgres rows in a single statement:
SELECT u.email, count(*) AS events_90d
FROM auth.users u
JOIN iceberg.events e            -- foreign table -> Analytics Bucket (S3)
  ON e.user_id = u.id
WHERE e.ts > now() - interval '90 days'
GROUP BY u.email;

Open Warehouse: Both Directions

The same FDW mechanism runs two ways - tier cold data out to open storage, or query an existing warehouse in place.

Direction What Status
Tier out hot Postgres -> Analytics Buckets (Iceberg/Parquet on S3), query via Iceberg FDW Alpha
Query in place an EXISTING warehouse (BigQuery, ClickHouse, Snowflake) as foreign tables GA (Wrappers; connector maturity varies)

Postgres stays the SQL planner; the warehouse is just another table - no second query engine for the app to learn.

Vector Storage: Hot + Cold

Same hot/cold tiering as the warehouse slide, for embeddings - Postgres stays the front door.

Tier Product Status When
Hot pgvector in Postgres GA Latency-sensitive, transactional
Cold Vector Buckets (S3-backed) Public Alpha 50M vectors/index, durable, sub-second
  • Query both from Postgres via a Foreign Data Wrapper - join embeddings to relational rows in one statement. Cosine / Euclidean / L2; metadata filtering.
  • Proof - Humata: Pinecone (20 pods) → one pgvector instance = 75% vector-cost cut.

One DB, two tiers - not a separate vector vendor.

Sources: Vector Buckets (Public Alpha, 1 Dec 2025) · limits · Humata.

Vector: pgvector vs Vector Buckets

pgvector (Hot) Vector Buckets (Cold)
Where inside your Postgres table S3-backed Storage bucket
Status GA Public Alpha (1 Dec 2025)
Latency single-digit ms (tuned HNSW) sub-second (not ultra-low)
Scale RAM-bound 50M vectors/index
Distance ops <=> cosine, <-> L2, <#> neg. inner product (per query) one <==> operator; metric (cosine/euclidean/l2) fixed at index creation
-- Cold vectors via the S3 Vector FDW, JOINed to live relational rows:
SELECT v.key, d.full_text, embd_distance(v.data) AS similarity
FROM s3_vectors.documents_openai v
LEFT JOIN public.documents d ON v.metadata->>'doc_id' = d.id::text
WHERE v.data <==> '[ ...query embedding... ]'::embd   -- similarity search
  AND d.category = 'articles'                         -- metadata filter
ORDER BY embd_distance(v.data) ASC LIMIT 50;

One DB, two tiers, one query - not a separate vector vendor.

Auth & Identity

Email, magic link, phone OTP, SSO/SAML, and a full suite of OAuth providers - plus Supabase can itself be an OAuth 2.1 / OIDC provider.

Auth: Tier & Feature Matrix

Feature Free Pro Team Enterprise
MAU included 50K 100K 100K Custom
Custom Access Token Hook
Send SMS / Email Hook
SAML SSO
SSO MAUs included 50 50 Custom
MFA Verification Hook
Dashboard SSO
SOC 2 Type 2 (report Team+)
ISO 27001 certificate
Uptime SLA (99.9%)
24/7 Sev-1 support
BYO Cloud

Sources: Auth · Pricing

Auth: SAML SSO - Multi-Tenant Pattern

Each enterprise customer gets their own SAML connection. sso_provider_id scopes the JWT.

// Route user to their org's IdP by domain
const { data } = await supabase.auth.signInWithSSO({
  domain: 'customer-corp.com',
})
-- RLS policy using sso_provider_id as the tenant identifier
CREATE POLICY "tenant isolation"
  ON records AS RESTRICTIVE
  USING (
    provider_id = (auth.jwt() -> 'amr' -> 0 ->> 'provider')::uuid
  );

Sources: SAML SSO

Auth: Supabase as an OAuth Server

Supabase Auth can be an OAuth 2.1 / OIDC provider - for third-party apps and AI agents (not just consume one).

Capability Detail
Be an IdP OAuth 2.1 auth-code + PKCE; OIDC (ID tokens, discovery, JWKS)
AI agents / MCP OAuth discovery + dynamic client registration for MCP clients
Tokens Standard Supabase JWTs - RLS + Access Token Hooks apply; per-client aud
First-party apps Issue tokens to your own mobile / desktop clients
Consent You host the approval UI; Supabase issues the tokens

Make your app an identity provider - RLS-scoped, MCP-ready.

OAuth Server: Honest Gaps (beta)

Free during the beta, but not yet GA - what’s missing today:

  • Custom scopes not supported - only openid/email/profile/phone; fine-grained access is RLS, not scopes (custom scopes are roadmap).
  • Multi-tenant is DIY - separate clients via the aud claim + RLS; no first-class per-tenant client isolation.
  • Auth-code + PKCE only - no client_credentials or password grant (no user-less machine-to-machine).
  • You build the consent screen - Supabase issues the tokens; the approval UI is your frontend.
  • Redirect URIs need exact matches (no wildcards).

Access control is RLS-first today; custom scopes + native multi-tenancy are the maturity gaps.

Competitive: Auth Vendors

Supabase (BaaS) vs the dev-first field: Clerk, WorkOS (SSO-first), Auth0 (incumbent), Better Auth (OSS library).

Supabase Clerk WorkOS Auth0 Better Auth
Cost <50K MAU $25/mo flat $0-25/mo (50K MRU free) $0 (free to 1M MAU) ~$3,500/mo @ 50K $0 (self-host)
Ent. SSO (SAML) Pro+; $0.015/MAU; no SCIM 1 free, $75/conn; SCIM incl. $125/conn; SCIM per-conn Enterprise; inbound SCIM free plugin; you run it
Data residency many regions, any tier US (EU on Enterprise) WorkOS-hosted region at signup your infra, anywhere
Open source / self-host ✅ MIT
Platform beyond auth ✅ Postgres + Storage + Realtime ❌ (library only)

Sources: Supabase · Clerk · WorkOS · Auth0 · Better Auth

Reference: Admin Impersonation Pattern

sequenceDiagram
    actor A as Admin
    participant EF as Edge Function
    participant API as Backend APIs

    A->>EF: POST /impersonate { target_user_id }
    Note over EF: verify admin JWT + is_admin claim
    Note over EF: fetch target user via service role,<br/>mint JWT - sub: target · act: admin · exp: +1h
    EF-->>A: impersonation token (short-lived, no refresh)
    A->>API: request + Bearer impersonation token
    Note over API: validates as target user · act claim for audit

Multi-Tenancy

One database, many tenants - isolation enforced by Postgres RLS, not application code.

Multi-Tenant: The Schema

One database, many companies - each seeing only their own data.

-- Every company is a tenant
CREATE TABLE tenants (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  name text NOT NULL
);

-- Every user belongs to one tenant
CREATE TABLE profiles (
  id uuid PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
  tenant_id uuid REFERENCES tenants(id)
);

-- Business data carries tenant_id on every row
ALTER TABLE notes ADD COLUMN tenant_id uuid REFERENCES tenants(id);

When a new user signs up, a database trigger automatically creates their tenant and profile. No application code needed.

Multi-Tenant: Pattern 1

Membership table lookup - look up the user’s tenant at query time

CREATE POLICY "view own tenant's notes" ON notes
  FOR SELECT
  USING (
    tenant_id IN (
      SELECT tenant_id FROM profiles WHERE id = (SELECT auth.uid())
    )
  );
  • Postgres auto-filters - wrong rows can’t be returned even if app code has a bug
  • User can belong to multiple tenants
  • Best practice: write (SELECT auth.uid()) not auth.uid() - caches the ID once per query instead of re-evaluating per row

Multi-Tenant: Pattern 2

Claim in the login token - tenant_id baked into the JWT at login

CREATE POLICY "view own tenant's notes" ON notes
  FOR SELECT
  USING (tenant_id = (auth.jwt()->>'tenant_id')::uuid);
  • No extra database lookup - reads straight from the login token
  • Requires an Access Token Hook: a Postgres function that injects tenant_id into the token at login
  • One tenant per session - user re-logins to switch organisations
Pattern 1 Pattern 2
Setup Simple, no hooks Needs an Access Token Hook
Speed Subquery per query Single equality check
Multi-org Yes One org per session

Migration

Moving onto Supabase - from Firebase, Auth0, or an existing Postgres - with minimal downtime.

Migrating Into Supabase

12 documented migration paths. Two lanes: move the database, move the users.

Source Path Method
Postgres - Azure Flexible Server, RDS, Heroku, Render, Neon, Vercel Lift-and-shift pg_dump/restore (any version), or logical replication → minutes of downtime (PG 10+)
MySQL / MSSQL Engine conversion Schema convert + load, then dump/restore
Firestore Remodel Document → relational - the real work
Auth0 / Firebase Auth User import bcrypt/Argon2 hashes preserved → no password reset; rolling = 0 downtime

Postgres gotchas: roles, privileges, and RLS-enabled status don’t carry - recreate them. Logical replication skips DDL, sequences, LOBs - freeze schema + sync sequences before cutover, and never re-enable writes on the source (split-brain).

Firebase → Supabase: Product Map

Firebase product What it does Supabase equivalent
Firestore NoSQL document database - nested collections/documents, no SQL Postgres - relational tables, standard SQL. Biggest conceptual shift.
Firebase Auth Email, Google/Apple login, phone OTP Supabase Auth - near 1:1 feature parity
Firebase Storage File uploads (photos, videos, docs) Supabase Storage - S3-compatible, RLS policies on files

Firebase → Supabase: Functions & Messaging

Firebase product What it does Supabase equivalent
Cloud Functions (HTTP) Serverless code triggered by HTTP calls Edge Functions - Deno runtime, same idea
Cloud Functions (events) Code triggered by DB changes, new users, etc. Database triggers - SQL functions that fire on row changes
Cloud Functions (scheduled) Code on a cron schedule pg_cron - SQL on a schedule, inside Postgres
FCM Push notifications to phones/browsers Edge Function + DB webhook → calls FCM or Expo - FCM still delivers, Supabase is the trigger

Self-Hosting & Sovereignty

Residency, vendor access, and jurisdiction - and where BYOC versus self-host actually help.

Self-Hosting Reality

Managed Cloud Self-Hosted
Officially supported deployment Docker Compose only
Kubernetes / Helm - Community (supabase-community/supabase-kubernetes)
Support Enterprise SLA / Team email Community only (GitHub Discussions, Discord)
Uptime SLA ✅ Enterprise ❌ None
Branching, PITR, metrics, ETL ❌ Unavailable
Data in your own infra ❌ AWS regions
BYO Cloud (Supabase manages in your cloud) Enterprise (negotiated) -

Sources: Self-hosting

Residency ≠ Sovereignty

Three distinct requirements buyers conflate. BYOC addresses only vendor sovereignty - the middle row.

Layer The question Solved by
Residency Where do the bytes physically sit? Region selection alone
Vendor sovereignty Can Supabase read / exfiltrate it? BYOC / self-host
Jurisdictional sovereignty Can a foreign state (US CLOUD Act) compel it - regardless of location or account owner? Operator outside US jurisdiction - not BYOC-on-AWS

Calling BYOC-on-AWS “data sovereignty” is a procurement risk. It solves residency and reduces vendor access; it does not escape the CLOUD Act.

Sovereignty: EU - CADA

EU Cloud & AI Development Act - proposal, 3 Jun 2026 (needs Parliament + 27 states). Four assurance levels:

Level Requirement US hyperscaler?
1 Data processed/stored on EU infrastructure ✅ reachable
2 EU personnel + assets; EUCS cert; prevent third-country data access ⚠️ structuring
3 EU owned and controlled; personnel citizenship ❌ CLOUD Act blocks
4 No third-country control; no derogation; software supply-chain control ❌ excluded

The European Commission’s tech VP, verbatim: “With the USA, with the Cloud Act, it is difficult for their companies to reach Level 3.”

Sovereignty: Middle East - the region gap

Supabase managed has zero ME regions (verified 2026-06-23) - closest is Mumbai, offshore for every Gulf rule.

Requirement Managed Supabase BYOC → customer AWS On-prem self-host
UAE residency + DESC (Dubai gov/semi-gov) ❌ no ME region me-central-1 (UAE) + DESC Tier-1
Saudi in-Kingdom residency (SAMA, NCA) ❌ no ME region ⚠️ needs AWS Riyadh me-central-2 (verify GA); UAE/Bahrain ≠ in-Kingdom
Saudi sensitive / gov data (sovereign control) ❌ AWS is US-operated

For the Gulf, BYOC / self-host is the only way Supabase runs there at all.

Does BYOC Solve It?

Residency Vendor access Jurisdictional (CLOUD Act)
Managed Supabase, EU region ❌ Supabase + AWS (US)
Managed Supabase, ME ❌ no region
BYOC → vanilla customer AWS ⚠️ control-plane caveat ❌ still AWS = US
BYOC → AWS Sovereign Cloud + EU control plane ⚠️ US-parent debated
On-prem self-host (control plane too)

BYOC is a delivery mechanism, not a sovereignty guarantee. Sovereignty comes from which jurisdiction the target sits in and who runs the control plane - never from BYOC itself. The honest answer for jurisdictional sovereignty is a sovereign operator or on-prem.

Ops & Scaling

Observability, backups, and the roadmap for scaling Postgres out and up.

Observability: Logs, Reports, Metrics

Every layer is inspectable without bolting on a third-party APM.

Surface What you get
Logs Explorer SQL over structured logs from every layer - Postgres, Auth, Storage, Edge, API (Logflare-backed)
Reports Built-in dashboards - DB load, API traffic, auth, storage
Query Performance pg_stat_statements surfaced in-dashboard - slowest / most-frequent queries
Metrics Prometheus-compatible metrics endpoint
Grafana Official dashboards on top of the metrics endpoint
Alerts PromQL-based alerting (Grafana / Prometheus)

The Postgres-native win: diagnostics are pg_stat_statements + EXPLAIN, not a proprietary APM.

Sources: Logs · Metrics / Grafana

Backups, Recovery & Read Scaling

The operational resilience story - and its honest limits.

Mechanism What you get Plan / caveat
Daily backups Restore to any of the last 7 / 14 / 30 days Pro / Team / Enterprise. Free tier: none - self-export via CLI
PITR Restore to any point, RPO 2 min (WAL archived every 2 min) Pro+ add-on; needs ≥ Small compute; replaces daily backups
Read replicas Read scaling + redundancy; geo-routed load balancer Pro+; GET REST + read-only RPCs only; not Auth/Storage/Realtime
Failover No one-click promote today - restore backup → re-point app Promote-to-primary on roadmap; no auto-failover below Enterprise SLA

Cross-region recovery = a replica elsewhere, or a manual restore - PITR clone stays in-region.

Sources: Backups · Read replicas

Scaling Roadmap: Multigres

“Vitess for Postgres” - an operating system for Postgres. v0.1 alpha shipped 4 Jun 2026.

Capability v0.1 alpha - today
HA / failover Consensus-based, split-brain-safe (no lost commits), on unmodified Postgres replication; automatic failover + gateway query-buffering
Durability User-defined policies (e.g. survive a single-AZ loss) - not locked to majority quorum
Connection pooling Context-aware (no transaction/session mode choice); per-user pools, no SET ROLE; prepared-statement dedup across gateways

Scaling Roadmap: Multigres (cont.)

Capability v0.1 alpha - today
Backups pgBackRest, taken from replicas; full / incremental / differential; S3
Deploy Kubernetes operator (EKS / local Kind)
Sharding Not yet - the flagship feature, a future release

Apache 2.0 · Go · open-source only today - Multigres for Supabase coming soon.

Companion track: OrioleDB - the storage-engine fix underneath Multigres (next slide).

Scaling Roadmap: OrioleDB

OrioleDB - a drop-in Postgres storage engine (pluggable storage) replacing Heap. Public Alpha, available self-hosted; targeting GA this year.

Property OrioleDB vs Heap
No VACUUM undo-log MVCC removes bloat + the VACUUM maintenance burden
Throughput up to 5.5x faster under load
Compression ~5x built-in
WAL row-level (groundwork for active-active)
Roadmap decoupled storage/compute on S3; columnar indexes (hybrid OLTP/OLAP); multi-master

Multigres scales out (HA, pooling, eventual sharding); OrioleDB fixes the engine underneath (bloat, VACUUM, throughput) - complementary tracks, both pre-GA.

Cost & Fit

What it costs to run - and the honest cases where Supabase is not the right tool.

Cost & Compute Reality

How Supabase pricing actually works - and the footgun.

Plan Base compute Connections The catch
Free Nano - shared, 0.5 GB RAM, 500 MB DB 60 direct / 200 pooled 2 projects max; paused after 7 days idle; no managed backups
Pro - $25/mo 1x Micro included, full-time 60 direct / 200 pooled Compute is per-project, 24/7

Scaling = bigger compute, not more projects: Micro (1 GB) → Small (2 GB) → … → 16XL (256 GB) → custom. Upgrades incur downtime; never automatic.

Footgun: “$25 Pro” is $25 plus per-project compute. 3 Micro projects ≈ $45/mo, not $25. The 60-direct-connection ceiling on Micro is the wall that pushes you to pooling: Supavisor (the GA pooler) today, Multigres per-user pooling on the roadmap.

Indicative pricing as of June 2026 - re-check supabase.com/pricing.

When Supabase Is the Wrong Fit

Supabase isn’t the right fit for every requirement - here’s where another tool wins.

If the requirement is… Better answer
Auth only, Azure-native shop Entra External ID - free ≤ 50K MAU, first-party .NET
Hard jurisdictional sovereignty (CLOUD Act) Sovereign operator or on-prem self-host - not managed
Heavy OLAP / warehouse analytics A warehouse (BigQuery / Snowflake) - Supabase feeds it, isn’t it
Middle East data residency (managed) BYOC / self-host - no managed ME region
Deep B2B org modelling, SSO-first Auth0 has the richer org / enterprise model

I’d rather point you to the right tool than force a fit.

Whiteboard Scenarios

Scenario A: Consolidation / Migration

Two motions: consolidate several vendors (Auth0 + RDS + Pinecone) onto one platform, or migrate a Firebase app. Either way, migrate incrementally - Auth first (users are portable), then data, then functions.

The biggest conceptual shift is Firestore → Postgres: document collections become relational tables. Everything else maps 1:1.

Scenario A: Firebase → Supabase Map

Firebase Supabase
Firestore (NoSQL docs) biggest shift → Postgres (SQL tables)
Firebase Auth 1:1 → Supabase Auth
Firebase Storage 1:1 → Supabase Storage
Cloud Functions (HTTP) Edge Functions
Cloud Functions (events) Database Triggers
Cloud Functions (scheduled) pg_cron
FCM (push notifications) more setup → Edge Function + DB webhook calls FCM/Expo

Scenario B: Auth + Existing IdP

SAML assertion in - enriched JWT out. The IdP authenticates; Supabase issues the token.

The Access Token Hook runs before the JWT is signed, injecting custom claims (tenant_id, role, plan) without a round-trip to the application.

Scenario B: JWT Flow

sequenceDiagram
    actor U as User
    participant IdP as Company IdP
    participant Auth as Supabase Auth
    participant Hook as Access Token Hook
    participant DB as Postgres + RLS

    U->>IdP: Sign in with company account
    IdP-->>Auth: SAML assertion
    Auth->>Hook: Raw JWT payload
    Hook-->>Auth: + tenant_id, role
    Auth-->>U: Signed JWT
    U->>DB: API request + JWT
    DB->>DB: RLS policy filters rows
    DB-->>U: Filtered rows only

Scenario B: BYO Backend

Supabase Auth as a standalone identity layer - any backend validates the JWT via a standard JWKS endpoint.

No Supabase SDK required server-side. RS256-signed JWT; standard library support in .NET, Go, Java, Python, Node.

Scenario B: BYO Backend JWT Flow

sequenceDiagram
    actor U as User
    participant Auth as Supabase Auth
    participant Hook as Access Token Hook
    participant API as Customer API (any backend)
    participant DB as Customer DB (SQL Server / DB2 / etc.)

    U->>Auth: Sign in (email / SAML)
    Auth->>Hook: Raw JWT payload
    Hook-->>Auth: + tenant_id, role
    Auth-->>U: Signed JWT
    U->>API: Request + Bearer JWT
    API->>API: Validate via JWKS endpoint
    API->>DB: Query (tenant-scoped)
    DB-->>API: Rows
    API-->>U: Response

Scenario C: Multi-Tenant SaaS

Row Level Security enforces tenant isolation at the database layer - authorization that can’t be bypassed by application code.

Two patterns: JWT claim (fast, single-tenant-per-session) or membership table (flexible, multi-org users).

Scenario C: Schema

erDiagram
    auth_users {
        uuid id PK
        text email
    }
    tenants {
        uuid id PK
        text name
    }
    profiles {
        uuid id PK
        uuid tenant_id FK
        text full_name
    }
    notes {
        uuid id PK
        uuid user_id FK
        uuid tenant_id FK
        text content
    }

    auth_users ||--|| profiles : "trigger on signup"
    tenants ||--o{ profiles : "belongs to"
    tenants ||--o{ notes : "belongs to"
    auth_users ||--o{ notes : "creates"