| 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 | } |