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 firebase — feature comparison',
8 description:
9 'briven vs firebase: real sql on postgres vs firestore documents. when you outgrow nosql.',
10};
11
12const ROWS = [
13 {
14 feature: 'data model',
15 briven: 'relational. tables, columns, foreign keys, transactions.',
16 other: 'document. collections of json-like documents with nested subcollections.',
17 note: 'the fundamental shape of your data lives here.',
18 },
19 {
20 feature: 'query language',
21 briven: 'sql, plus typed query functions. joins are free.',
22 other: 'firestore queries; joins require fan-out reads or denormalisation.',
23 },
24 {
25 feature: 'transactions',
26 briven: 'postgres acid transactions. multi-table, multi-row, fully isolated.',
27 other: 'firestore transactions limited to a small set of documents.',
28 },
29 {
30 feature: 'reactive queries',
31 briven: 'subscribe to a typed query; get pushed updates on any underlying-table change.',
32 other: 'snapshot listeners on document/collection paths.',
33 },
34 {
35 feature: 'security',
36 briven: 'server-side typed functions with project-scoped db connections.',
37 other: 'security rules evaluated on every request; runs on client query.',
38 },
39 {
40 feature: 'export',
41 briven: 'pg_dump. one command, the whole project.',
42 other: 'firestore export to gcs. binary format, not directly importable elsewhere.',
43 },
44 {
45 feature: 'self-host',
46 briven: 'agpl-3.0. runs anywhere docker runs.',
47 other: 'no self-host. google cloud only.',
48 },
49 {
50 feature: 'auth',
51 briven: 'better-auth with magic link, oauth, email+password — bundled.',
52 other: 'firebase auth with broad oauth + phone auth + anonymous accounts.',
53 },
54 {
55 feature: 'file storage',
56 briven: 'minio (s3-compatible) bundled.',
57 other: 'cloud storage for firebase (gcs underneath).',
58 },
59 {
60 feature: 'pricing',
61 briven: '€0 free, €29 pro, €99 team. flat fees, predictable.',
62 other: 'pay-as-you-go: per read, per write, per delete, per gb. famously hard to predict.',
63 },
64];
65
66const WHEN_OTHER_WINS = [
67 'you're building a quick mobile prototype and want phone-number auth + offline-first sync out of the box.',
68 'your data is genuinely document-shaped (nested, schemaless, varying per record).',
69 'you're already on google cloud and want everything in one billing line.',
70];
71
72const WHEN_BRIVEN_WINS = [
73 'you outgrew nosql and want joins, transactions, and a proper relational model.',
74 'you want predictable monthly pricing instead of per-operation billing.',
75 'you want your data in a format you can move anywhere (pg_dump → any postgres host).',
76 'you want server-side authz logic in typescript, not security-rule dsl evaluated on each query.',
77 'you need eu data residency or your own hardware.',
78];
79
80export default async function FirebaseComparePage() {
81 const user = await getSessionUser().catch(() => null);
82 return (
83 <ComparePage
84 user={user}
85 otherName="firebase"
86 oneline="when you outgrow nosql, briven is real sql with the same realtime ergonomics."
87 intro="firebase shines at mobile prototypes and document-shaped data. once your data picks up relations, transactions, and predictable scale, briven is the postgres-shaped version of the same idea — typed queries, reactive subscriptions, server-side authz, and a bill you can predict."
88 rows={ROWS}
89 whenOtherWins={WHEN_OTHER_WINS}
90 whenBrivenWins={WHEN_BRIVEN_WINS}
91 migrationGuideHref="https://docs.briven.tech/migration/firebase"
92 />
93 );
94}