SupabasevsConvex
TL;DR
Supabase is Postgres with bundled services and RLS as authz. Convex is a reactive backend with TypeScript queries / mutations / actions, where the database is part of the framework. Pick Supabase for SQL + portability. Pick Convex for real-time-everywhere apps where you'd otherwise build a custom server.
SQL workflow
Supabase
Real-time-everywhere UX
Convex
Portability / open source
Supabase
End-to-end TypeScript types
Convex
| Feature | Supabase | Convex |
|---|---|---|
| Database | Postgres | Proprietary document store |
| Query language | SQL | TypeScript queries (custom DSL) |
| Live subscriptions | Postgres replication via Realtime | Every query is reactive by default |
| Schema | SQL DDL | TypeScript schema (validators) |
| Authorization | RLS (database-level) | Server-side function checks |
| Self-hostable | Yes (full stack) | No (Convex Cloud only) |
| Migrations | Drizzle / Prisma / Atlas | Convex CLI |
| AI-agent friendliness | Postgres introspection | TS types are excellent |
| Vendor lock-in | Low (Postgres is portable) | High (proprietary platform) |
When Supabase wins
- You want SQL and the Postgres ecosystem. Period.
- You care about portability and self-hosting. Supabase is open; Convex isn't.
- You're building a CRUD-style B2B app where real-time is nice but not essential. RLS does the authz work for you.
- You want pgvector, pg_partman, PostGIS, or any of the other Postgres extensions Convex can't replicate.
When Convex wins
- Real-time is core to your product UX. Collaborative editors, multiplayer apps, dashboards that should never need a refresh. Convex's "every query is live" default eliminates a whole class of bugs.
- You want end-to-end TypeScript without a database mental model in the middle. Convex's query/mutation/action functions are TS all the way down.
- You don't want to think about a database at all and you're OK with the proprietary platform.
- Your shape is genuinely document-y and the schema-as-Zod-validators feel is what you want.
Honest take
Convex is a beautifully-designed product for a specific shape of app: reactive-by-default UIs with a TypeScript-first team. The trade-off is real lock-in. Supabase is the more boring, more-portable, more-flexible choice; if your app doesn't need every query to be live, you're usually better off with Postgres. The decision often comes down to how much you value real-time as a product feature vs. how much you value portability as an engineering one.