page.tsx93 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 convex — feature comparison',
8 description:
9 'briven vs convex: reactive queries on plain postgres vs convex's proprietary engine. honest tradeoffs.',
10};
11
12const ROWS = [
13 {
14 feature: 'database',
15 briven: 'plain postgres 17 + pgvector. pg_dump is your escape hatch.',
16 other: "proprietary engine. exports to json but you can't pg_dump out.",
17 },
18 {
19 feature: 'query language',
20 briven: 'typed query functions with auto-generated client. raw sql when you want it.',
21 other: 'typed convex functions; no raw sql.',
22 },
23 {
24 feature: 'reactive subscriptions',
25 briven: 'listen/notify-based reactive queries on real postgres tables.',
26 other: 'first-class reactive queries (the pattern briven adopts).',
27 },
28 {
29 feature: 'self-host',
30 briven: 'agpl-3.0 core. self-host the full engine on your own postgres.',
31 other: 'no self-host. cloud-only.',
32 },
33 {
34 feature: 'pricing',
35 briven: '€0 free, €29 pro, €99 team. or free self-hosted forever.',
36 other: 'free tier + usage-based; team plan $25/mo + bandwidth + functions metering.',
37 },
38 {
39 feature: 'export',
40 briven: 'one command (`briven export`) gives you the whole project as pg_dump + bundles.',
41 other: 'json export of records. functions and schema do not export.',
42 },
43 {
44 feature: 'sql access',
45 briven: 'sql editor in studio. psql from the cli. postgres clients connect directly.',
46 other: 'no sql access. queries go through convex functions only.',
47 },
48 {
49 feature: 'open source',
50 briven: 'agpl-3.0 engine, mit cli + sdks. development happens in public.',
51 other: 'closed source. cli + client sdks are open.',
52 },
53 {
54 feature: 'auth',
55 briven: 'better-auth with magic link, oauth (google/github/discord), email+password built in.',
56 other: 'convex auth via clerk, auth0, or custom provider integration.',
57 },
58 {
59 feature: 'file storage',
60 briven: 'minio (s3-compatible) bundled. point at your own s3/r2 in self-host.',
61 other: 'convex file storage (own engine).',
62 },
63];
64
65const WHEN_OTHER_WINS = [
66 'you want a fully managed nosql-like store with zero postgres concepts to learn.',
67 'you prefer convex's richer ecosystem of templates, hosted demos, and pre-built integrations.',
68 'you need the convex action runtime's specific timing characteristics (we're close, but not bit-identical).',
69];
70
71const WHEN_BRIVEN_WINS = [
72 'you want your data in real postgres, exportable any day with pg_dump.',
73 'you want to self-host. briven runs anywhere docker runs; convex doesn't self-host.',
74 'you need sql, materialised views, triggers, extensions, or any other postgres feature.',
75 'you care about data residency. briven runs in eu, single-region, on your hardware if you want.',
76 'you want a flat fee, not usage-based pricing surprises.',
77];
78
79export default async function ConvexComparePage() {
80 const user = await getSessionUser().catch(() => null);
81 return (
82 <ComparePage
83 user={user}
84 otherName="convex"
85 oneline="reactive queries on plain postgres, not a proprietary engine."
86 intro="convex pioneered the reactive-queries pattern briven adopts. the difference is the floor: convex stores your data in its own engine, briven stores it in plain postgres. that one decision changes everything downstream — exports, self-host, sql access, data residency."
87 rows={ROWS}
88 whenOtherWins={WHEN_OTHER_WINS}
89 whenBrivenWins={WHEN_BRIVEN_WINS}
90 migrationGuideHref="https://docs.briven.tech/migration/convex"
91 />
92 );
93}