page.tsx94 lines · main
1import type { Metadata } from 'next';
2
3import { ComparePage } from '../../../components/marketing/compare-page';
4import { getSessionUser } from '../../../lib/session';
5
6export const metadata: Metadata = {
7 title: 'briven vs supabase — feature comparison',
8 description:
9 'briven vs supabase: typed function layer + reactive queries vs postgrest + row-level security. both run on postgres.',
10};
11
12const ROWS = [
13 {
14 feature: 'database',
15 briven: 'postgres 17 + pgvector. one schema per project.',
16 other: 'postgres 15/16 + pgvector. one schema per project.',
17 },
18 {
19 feature: 'data access',
20 briven: 'typed query/mutation functions. the client only calls function names.',
21 other: 'postgrest exposes tables directly; the client constructs queries.',
22 note: 'biggest architectural difference between the two.',
23 },
24 {
25 feature: 'authorization',
26 briven: 'server-side function logic with project-scoped connections.',
27 other: 'row-level security policies in postgres + jwt claims.',
28 },
29 {
30 feature: 'reactive queries',
31 briven: 'listen/notify-based reactive subscriptions, deduped + cached server-side.',
32 other: 'realtime via wal replication; subscribe-to-changes, not subscribe-to-queries.',
33 },
34 {
35 feature: 'schema migrations',
36 briven: '`briven deploy` diffs schema.ts against live db, applies transactionally.',
37 other: 'sql migration files via supabase cli or your tool of choice.',
38 },
39 {
40 feature: 'auth',
41 briven: 'better-auth with magic link, oauth (google/github/discord), email+password.',
42 other: 'gotrue with the same providers + sso + mfa.',
43 },
44 {
45 feature: 'file storage',
46 briven: 'minio bundled (s3-compatible). point at your own s3/r2 self-hosted.',
47 other: 'supabase storage built on s3.',
48 },
49 {
50 feature: 'edge functions',
51 briven: 'deno runtime per project, warm-cached. one isolate per project.',
52 other: 'supabase edge functions via deno deploy.',
53 },
54 {
55 feature: 'self-host',
56 briven: 'agpl-3.0 core, single compose file, runs anywhere docker runs.',
57 other: 'apache 2.0, supabase self-host stack is ~12 containers but well-documented.',
58 },
59 {
60 feature: 'pricing',
61 briven: '€0 free, €29 pro, €99 team. flat fees, no compute surprises.',
62 other: '$0 free, $25 pro + usage. compute add-ons billed separately.',
63 },
64];
65
66const WHEN_OTHER_WINS = [
67 'you want postgrest's rest api directly — generated openapi spec, query builder in the client, etc.',
68 'you have a large supabase migration already and the cost of moving outweighs the gains.',
69 'you need first-class row-level security as your security boundary (briven uses functions instead).',
70 'you want supabase's pgrest tooling: pg_graphql, pg_hooks, native postgrest features.',
71];
72
73const WHEN_BRIVEN_WINS = [
74 'you want typed function calls instead of building queries on the client.',
75 'you want convex-style reactive queries (subscribe to a query, get pushed updates when underlying tables change).',
76 'you want a one-command export of your entire project (pg_dump + functions + env), portable to any host.',
77 'you want a simpler self-host story — one compose file, three containers in the minimal mode.',
78];
79
80export default async function SupabaseComparePage() {
81 const user = await getSessionUser().catch(() => null);
82 return (
83 <ComparePage
84 user={user}
85 otherName="supabase"
86 oneline="typed functions + reactive queries on the same postgres."
87 intro="both briven and supabase run on real postgres. the architectural split is at the api layer: supabase exposes the database via postgrest with row-level security, briven puts a typed function layer in front and adds query-level reactive subscriptions that supabase doesn&apos;t have."
88 rows={ROWS}
89 whenOtherWins={WHEN_OTHER_WINS}
90 whenBrivenWins={WHEN_BRIVEN_WINS}
91 migrationGuideHref="https://docs.briven.tech/migration/supabase"
92 />
93 );
94}