development
tsx 363 lines 15.4 KB
Raw
1 import type { Metadata } from "next";
2 import Link from "next/link";
3 import { StructuredData } from "@/components/structured-data";
4 import { absoluteUrl, genPageMetadata } from "../seo";
5
6 const comparisonRows = [
7 {
8 label: "What it is",
9 smbcloud:
10 "A data layer service that lives inside your smbCloud project alongside Deploy, Auth, and Mail.",
11 supabase:
12 "A full BaaS platform: Postgres, auth, storage, realtime, edge functions, all bundled together.",
13 },
14 {
15 label: "Best fit",
16 smbcloud:
17 "Teams that already use smbCloud and want the database managed in the same place.",
18 supabase:
19 "Teams that want a Firebase-like platform on top of Postgres and are happy to use the full suite.",
20 },
21 {
22 label: "Platform scope",
23 smbcloud:
24 "Narrow on purpose. Manages the data layer without becoming a platform of its own.",
25 supabase:
26 "Broad. Auth, storage, and realtime are first-class citizens alongside the database.",
27 },
28 {
29 label: "Auth story",
30 smbcloud:
31 "Auth is a separate smbCloud service. You pick what you need.",
32 supabase:
33 "Auth is built in. Supabase Auth ships with every project by default.",
34 },
35 {
36 label: "Why teams pick it",
37 smbcloud:
38 "Because they want less surface area and want the data layer close to the rest of the stack.",
39 supabase:
40 "Because they want one product that covers most backend needs out of the box.",
41 },
42 ];
43
44 const smbcloudFits = [
45 "You already use smbCloud Deploy or Auth and want the data layer in the same platform.",
46 "You want a focused data service, not a full BaaS.",
47 "You do not need Supabase Auth, Storage, or Realtime alongside your database.",
48 "You prefer fewer moving parts and a smaller blast radius when something goes wrong.",
49 ];
50
51 const supabaseStillFits = [
52 "You want Firebase-style convenience on top of Postgres.",
53 "You need auth, storage, and realtime out of the box.",
54 "Your team is already building around the Supabase SDK and tooling.",
55 "You want a generous free tier with Postgres included.",
56 ];
57
58 const faqs = [
59 {
60 question: "Is smbCloud GresIQ a Supabase replacement?",
61 answer:
62 "For teams that only need the data layer, it can be. If you are using Supabase mainly for its database and find the rest of the platform growing into something you manage instead of use, GresIQ is worth a look.",
63 },
64 {
65 question: "Does smbCloud GresIQ include auth or storage?",
66 answer:
67 "No. Auth is a separate smbCloud service. GresIQ focuses on the data layer. That is intentional: you add what you need instead of inheriting everything.",
68 },
69 {
70 question: "What type of database does GresIQ manage?",
71 answer:
72 "GresIQ is built for relational databases and is designed to run alongside the rest of the smbCloud stack in the same platform.",
73 },
74 {
75 question: "Who should consider switching from Supabase to GresIQ?",
76 answer:
77 "Teams using Supabase mainly as a managed Postgres instance who want fewer abstractions and a data layer that stays inside one platform with their app and auth.",
78 },
79 ];
80
81 export const metadata: Metadata = {
82 ...genPageMetadata({
83 title: "Supabase alternative for teams that want less BaaS",
84 description:
85 "Looking for a Supabase alternative? smbCloud GresIQ is a focused data layer that lives inside the same platform as your app, auth, and mail, without the full BaaS overhead.",
86 path: "/supabase-alternative",
87 keywords: [
88 "Supabase alternative",
89 "Supabase replacement",
90 "managed database platform",
91 "GresIQ database",
92 "smbCloud GresIQ",
93 "data layer service",
94 "Postgres alternative",
95 ],
96 }),
97 };
98
99 const structuredData = {
100 "@context": "https://schema.org",
101 "@graph": [
102 {
103 "@type": "WebPage",
104 "@id": absoluteUrl("/supabase-alternative#webpage"),
105 url: absoluteUrl("/supabase-alternative"),
106 name: "Supabase alternative for teams that want less BaaS",
107 description:
108 "Compare smbCloud GresIQ and Supabase for teams that want a focused data layer without the full BaaS platform.",
109 isPartOf: {
110 "@id": absoluteUrl("/#website"),
111 },
112 },
113 {
114 "@type": "BreadcrumbList",
115 itemListElement: [
116 {
117 "@type": "ListItem",
118 position: 1,
119 name: "Home",
120 item: absoluteUrl("/"),
121 },
122 {
123 "@type": "ListItem",
124 position: 2,
125 name: "Supabase alternative",
126 item: absoluteUrl("/supabase-alternative"),
127 },
128 ],
129 },
130 {
131 "@type": "FAQPage",
132 mainEntity: faqs.map((faq) => ({
133 "@type": "Question",
134 name: faq.question,
135 acceptedAnswer: {
136 "@type": "Answer",
137 text: faq.answer,
138 },
139 })),
140 },
141 ],
142 };
143
144 export default function SupabaseAlternativePage() {
145 return (
146 <div>
147 <StructuredData data={structuredData} />
148
149 <section className="relative overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20 lg:px-8">
150 <div className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[520px] bg-[radial-gradient(ellipse_75%_50%_at_50%_0%,rgba(99,102,241,0.18),transparent)] dark:bg-[radial-gradient(ellipse_75%_50%_at_50%_0%,rgba(99,102,241,0.12),transparent)]" />
151
152 <div className="mx-auto max-w-4xl">
153 <div className="mb-6 inline-flex items-center gap-2 rounded-full border border-indigo-200 bg-indigo-50 px-4 py-1.5 dark:border-indigo-500/30 dark:bg-indigo-500/10">
154 <span className="h-1.5 w-1.5 rounded-full bg-indigo-500" />
155 <span className="text-xs font-semibold uppercase tracking-widest text-indigo-700 dark:text-indigo-400">
156 GresIQ comparison
157 </span>
158 </div>
159
160 <h1 className="max-w-3xl text-4xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-6xl leading-[1.05]">
161 Looking for a Supabase alternative?
162 </h1>
163
164 <p className="mt-6 max-w-3xl text-lg leading-8 text-slate-600 dark:text-slate-400">
165 Supabase does a lot. That is exactly why some teams want something
166 smaller. smbCloud GresIQ is a data layer that lives inside the same
167 platform as your app, auth, and mail, without growing into its own
168 product you have to manage on top of everything else.
169 </p>
170
171 <div className="mt-8 flex flex-col gap-4 sm:flex-row">
172 <Link
173 href="https://console.smbcloud.xyz"
174 target="_blank"
175 rel="noopener noreferrer"
176 className="inline-flex items-center justify-center rounded-lg bg-indigo-600 px-8 py-3.5 text-sm font-semibold text-white shadow-lg shadow-indigo-500/20 transition-all hover:bg-indigo-500 hover:shadow-indigo-500/30 active:scale-[0.98]"
177 >
178 Try smbCloud GresIQ
179 </Link>
180 <Link
181 href="/services"
182 className="inline-flex items-center justify-center rounded-lg border border-slate-300 px-8 py-3.5 text-sm font-semibold text-slate-700 transition-colors hover:bg-slate-50 dark:border-white/[0.12] dark:text-slate-200 dark:hover:bg-white/[0.04]"
183 >
184 See all services
185 </Link>
186 </div>
187 </div>
188 </section>
189
190 <section className="px-6 pb-24 lg:px-8">
191 <div className="mx-auto max-w-5xl grid gap-8 lg:grid-cols-[0.95fr_1.05fr]">
192 <div>
193 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
194 Why teams look beyond Supabase
195 </p>
196 <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
197 Usually they only needed the database. The rest came along anyway.
198 </h2>
199 <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
200 Supabase is generous and well-built. But when you just need a
201 managed data layer, inheriting auth, storage, and realtime
202 alongside it adds surface area you did not ask for and will
203 eventually have to understand.
204 </p>
205 </div>
206
207 <div className="rounded-2xl border border-slate-200 bg-slate-50 p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
208 <p className="text-sm font-semibold text-slate-900 dark:text-white">
209 What GresIQ does well
210 </p>
211 <ul className="mt-5 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
212 <li className="flex gap-3">
213 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
214 <span>Database management inside the same platform as your app and auth.</span>
215 </li>
216 <li className="flex gap-3">
217 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
218 <span>Connection and service management without a separate dashboard to learn.</span>
219 </li>
220 <li className="flex gap-3">
221 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
222 <span>Built to stay focused: a data layer, not a backend platform.</span>
223 </li>
224 </ul>
225 </div>
226 </div>
227 </section>
228
229 <section className="border-t border-slate-200 px-6 py-24 dark:border-white/[0.06] lg:px-8">
230 <div className="mx-auto max-w-5xl">
231 <div className="mb-12 max-w-3xl">
232 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
233 smbCloud GresIQ vs Supabase
234 </p>
235 <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
236 Here is the trade, without the usual sales fog.
237 </h2>
238 </div>
239
240 <div className="overflow-hidden rounded-2xl border border-slate-200 dark:border-white/[0.06]">
241 <div className="grid grid-cols-[0.8fr_1fr_1fr] bg-slate-50 text-sm font-semibold text-slate-900 dark:bg-white/[0.03] dark:text-white">
242 <div className="border-b border-slate-200 px-5 py-4 dark:border-white/[0.06]">
243 Area
244 </div>
245 <div className="border-b border-l border-slate-200 px-5 py-4 dark:border-white/[0.06]">
246 smbCloud GresIQ
247 </div>
248 <div className="border-b border-l border-slate-200 px-5 py-4 dark:border-white/[0.06]">
249 Supabase
250 </div>
251 </div>
252 {comparisonRows.map((row) => (
253 <div
254 key={row.label}
255 className="grid grid-cols-[0.8fr_1fr_1fr] text-sm leading-7 text-slate-600 dark:text-slate-400"
256 >
257 <div className="border-b border-slate-200 bg-white px-5 py-5 font-semibold text-slate-900 dark:border-white/[0.06] dark:bg-white/[0.02] dark:text-white">
258 {row.label}
259 </div>
260 <div className="border-b border-l border-slate-200 bg-white px-5 py-5 dark:border-white/[0.06] dark:bg-white/[0.02]">
261 {row.smbcloud}
262 </div>
263 <div className="border-b border-l border-slate-200 bg-white px-5 py-5 dark:border-white/[0.06] dark:bg-white/[0.02]">
264 {row.supabase}
265 </div>
266 </div>
267 ))}
268 </div>
269 </div>
270 </section>
271
272 <section className="px-6 py-24 lg:px-8">
273 <div className="mx-auto grid max-w-5xl gap-6 lg:grid-cols-2">
274 <div className="rounded-2xl border border-slate-200 bg-white p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
275 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
276 Pick smbCloud GresIQ if
277 </p>
278 <ul className="mt-6 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
279 {smbcloudFits.map((item) => (
280 <li key={item} className="flex gap-3">
281 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
282 <span>{item}</span>
283 </li>
284 ))}
285 </ul>
286 </div>
287
288 <div className="rounded-2xl border border-slate-200 bg-slate-50 p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
289 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
290 Stay on Supabase if
291 </p>
292 <ul className="mt-6 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
293 {supabaseStillFits.map((item) => (
294 <li key={item} className="flex gap-3">
295 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-slate-400" />
296 <span>{item}</span>
297 </li>
298 ))}
299 </ul>
300 </div>
301 </div>
302 </section>
303
304 <section className="px-6 pb-24 lg:px-8">
305 <div className="mx-auto max-w-3xl">
306 <div className="mb-10">
307 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
308 FAQ
309 </p>
310 <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
311 Common questions
312 </h2>
313 </div>
314 <div className="space-y-4">
315 {faqs.map((faq) => (
316 <div
317 key={faq.question}
318 className="rounded-2xl border border-slate-200 bg-white p-6 dark:border-white/[0.06] dark:bg-white/[0.02]"
319 >
320 <h3 className="text-lg font-semibold text-slate-900 dark:text-white">
321 {faq.question}
322 </h3>
323 <p className="mt-3 text-sm leading-7 text-slate-600 dark:text-slate-400">
324 {faq.answer}
325 </p>
326 </div>
327 ))}
328 </div>
329 </div>
330 </section>
331
332 <section className="px-6 pb-20 lg:px-8">
333 <div className="mx-auto max-w-3xl">
334 <div className="relative overflow-hidden rounded-2xl bg-indigo-600 px-8 py-14 text-center shadow-2xl shadow-indigo-500/20">
335 <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_at_top,rgba(255,255,255,0.1),transparent)]" />
336 <h2 className="relative text-3xl font-bold tracking-tight text-white">
337 If Supabase feels like more platform than you need, try GresIQ.
338 </h2>
339 <p className="relative mt-4 text-indigo-200">
340 Run it on one project. That is usually enough to know.
341 </p>
342 <div className="relative mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
343 <Link
344 href="https://console.smbcloud.xyz"
345 target="_blank"
346 rel="noopener noreferrer"
347 className="inline-flex rounded-lg bg-white px-8 py-3.5 text-sm font-semibold text-indigo-700 shadow-sm transition-colors hover:bg-indigo-50"
348 >
349 Start with smbCloud
350 </Link>
351 <Link
352 href="/planetscale-alternative"
353 className="inline-flex rounded-lg border border-white/20 px-8 py-3.5 text-sm font-semibold text-white transition-colors hover:bg-white/10"
354 >
355 Compare PlanetScale alternative
356 </Link>
357 </div>
358 </div>
359 </div>
360 </section>
361 </div>
362 );
363 }