Add auth comparison pages for Auth0 and Clerk alternatives
keypair34 committed
May 8, 2026 at 23:24 UTC
cd19a8d3b07510f3e7071f3b154bbb58d169469e
6 files changed
+901
-50
app/auth0-alternative/page.tsx
new
+375
@@ -0,0 +1,375 @@
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: "Primary job",
9
+ smbcloud:
10
+ "Handle sign-in, signup, sessions, and hosted auth flows without extra platform sprawl.",
11
+ auth0:
12
+ "Provide a broad identity platform with many enterprise-oriented capabilities.",
13
+ },
14
+ {
15
+ label: "Best fit",
16
+ smbcloud:
17
+ "Small teams that want hosted auth to stay straightforward.",
18
+ auth0:
19
+ "Teams that need a broader identity stack and are willing to own the complexity.",
20
+ },
21
+ {
22
+ label: "Product shape",
23
+ smbcloud: "Focused auth service inside the smbCloud platform.",
24
+ auth0: "Large identity platform with more moving parts and deeper scope.",
25
+ },
26
+ {
27
+ label: "Why teams pick it",
28
+ smbcloud: "Because auth should not turn into its own side project.",
29
+ auth0: "Because identity is large enough to justify a larger toolset.",
30
+ },
31
+];
32
+
33
+const smbcloudFits = [
34
+ "You want hosted sign-in, signup, and session flows.",
35
+ "You want auth to stay out of the way of the product.",
36
+ "You do not want to spend half the week configuring identity plumbing.",
37
+ "You want a cleaner fit for a small team shipping quickly.",
38
+];
39
+
40
+const auth0StillFits = [
41
+ "You need a broader identity platform with deeper enterprise scope.",
42
+ "Your organization already runs substantial Auth0 workflows.",
43
+ "The extra complexity is acceptable because identity is a major internal system.",
44
+];
45
+
46
+const bestFor = [
47
+ "Small product teams",
48
+ "SaaS apps that need hosted auth fast",
49
+ "Projects that want auth close to deploy and mail inside one platform",
50
+ "Founders who want sessions and sign-in solved without a new platform problem",
51
+ "Teams that want hosted auth without a giant identity stack",
52
+];
53
+
54
+const faqs = [
55
+ {
56
+ question: "Is smbCloud Auth an Auth0 replacement?",
57
+ answer:
58
+ "For some teams, yes. If you want hosted sign-in, signup, sessions, and user management without adopting a broader identity stack, smbCloud Auth may fit better. If identity is large and complex enough to justify a bigger platform, Auth0 may fit better.",
59
+ },
60
+ {
61
+ question: "What is the biggest difference between smbCloud Auth and Auth0?",
62
+ answer:
63
+ "Auth0 is broader. smbCloud Auth is narrower on purpose.",
64
+ },
65
+ {
66
+ question: "Who should switch from Auth0 to smbCloud Auth?",
67
+ answer:
68
+ "Teams that feel like they bought a bigger identity platform than they actually needed.",
69
+ },
70
+];
71
+
72
+export const metadata: Metadata = {
73
+ ...genPageMetadata({
74
+ title: "Auth0 alternative for simpler hosted auth",
75
+ description:
76
+ "smbCloud Auth is an Auth0 alternative for teams that want hosted sign-in, signup, sessions, and auth flows without adopting a larger identity platform than they need.",
77
+ path: "/auth0-alternative",
78
+ keywords: [
79
+ "Auth0 alternative",
80
+ "hosted auth alternative",
81
+ "sign in and signup platform",
82
+ "session management platform",
83
+ "hosted auth flows",
84
+ "identity platform alternative",
85
+ "smbCloud Auth",
86
+ ],
87
+ }),
88
+};
89
+
90
+const structuredData = {
91
+ "@context": "https://schema.org",
92
+ "@graph": [
93
+ {
94
+ "@type": "WebPage",
95
+ "@id": absoluteUrl("/auth0-alternative#webpage"),
96
+ url: absoluteUrl("/auth0-alternative"),
97
+ name: "Auth0 alternative for simpler hosted auth",
98
+ description:
99
+ "Compare smbCloud Auth and Auth0 for simpler hosted auth workflows.",
100
+ isPartOf: {
101
+ "@id": absoluteUrl("/#website"),
102
+ },
103
+ },
104
+ {
105
+ "@type": "BreadcrumbList",
106
+ itemListElement: [
107
+ {
108
+ "@type": "ListItem",
109
+ position: 1,
110
+ name: "Home",
111
+ item: absoluteUrl("/"),
112
+ },
113
+ {
114
+ "@type": "ListItem",
115
+ position: 2,
116
+ name: "Auth0 alternative",
117
+ item: absoluteUrl("/auth0-alternative"),
118
+ },
119
+ ],
120
+ },
121
+ {
122
+ "@type": "FAQPage",
123
+ mainEntity: faqs.map((faq) => ({
124
+ "@type": "Question",
125
+ name: faq.question,
126
+ acceptedAnswer: {
127
+ "@type": "Answer",
128
+ text: faq.answer,
129
+ },
130
+ })),
131
+ },
132
+ ],
133
+};
134
+
135
+export default function Auth0AlternativePage() {
136
+ return (
137
+ <div>
138
+ <StructuredData data={structuredData} />
139
+
140
+ <section className="relative overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20 lg:px-8">
141
+ <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)]" />
142
+
143
+ <div className="mx-auto max-w-4xl">
144
+ <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">
145
+ <span className="h-1.5 w-1.5 rounded-full bg-indigo-500" />
146
+ <span className="text-xs font-semibold uppercase tracking-widest text-indigo-700 dark:text-indigo-400">
147
+ smbCloud Auth
148
+ </span>
149
+ </div>
150
+
151
+ <h1 className="max-w-3xl text-4xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-6xl leading-[1.05]">
152
+ Looking for an Auth0 alternative?
153
+ </h1>
154
+
155
+ <p className="mt-6 max-w-3xl text-lg leading-8 text-slate-600 dark:text-slate-400">
156
+ smbCloud Auth is for teams that want hosted auth flows without
157
+ turning identity into its own platform project. Sign-in, signup,
158
+ sessions, and hosted auth should not be heavier than the app.
159
+ </p>
160
+
161
+ <div className="mt-8 flex flex-col gap-4 sm:flex-row">
162
+ <Link
163
+ href="https://console.smbcloud.xyz"
164
+ target="_blank"
165
+ rel="noopener noreferrer"
166
+ 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]"
167
+ >
168
+ Create free account
169
+ </Link>
170
+ <Link
171
+ href="/services"
172
+ 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]"
173
+ >
174
+ Explore smbCloud Auth
175
+ </Link>
176
+ </div>
177
+ </div>
178
+ </section>
179
+
180
+ <section className="px-6 pb-24 lg:px-8">
181
+ <div className="mx-auto grid max-w-5xl gap-8 lg:grid-cols-[0.95fr_1.05fr]">
182
+ <div>
183
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
184
+ Why teams compare them
185
+ </p>
186
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
187
+ Usually this comes down to how much identity platform you actually want.
188
+ </h2>
189
+ <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
190
+ Some teams really do need a larger identity stack. Others mostly
191
+ need auth to work well and stay out of the way.
192
+ </p>
193
+ </div>
194
+
195
+ <div className="rounded-2xl border border-slate-200 bg-slate-50 p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
196
+ <p className="text-sm font-semibold text-slate-900 dark:text-white">
197
+ What smbCloud Auth does well
198
+ </p>
199
+ <ul className="mt-5 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
200
+ <li className="flex gap-3">
201
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
202
+ <span>Hosted sign-in and signup flows.</span>
203
+ </li>
204
+ <li className="flex gap-3">
205
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
206
+ <span>Sessions and account workflows that stay manageable.</span>
207
+ </li>
208
+ <li className="flex gap-3">
209
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
210
+ <span>A smaller auth product for teams that want less auth sprawl.</span>
211
+ </li>
212
+ </ul>
213
+ </div>
214
+ </div>
215
+ </section>
216
+
217
+ <section className="border-t border-slate-200 px-6 py-24 dark:border-white/[0.06] lg:px-8">
218
+ <div className="mx-auto max-w-5xl">
219
+ <div className="mb-12 max-w-3xl">
220
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
221
+ smbCloud Auth vs Auth0
222
+ </p>
223
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
224
+ One is broader. One is simpler. That is the trade.
225
+ </h2>
226
+ </div>
227
+
228
+ <div className="overflow-hidden rounded-2xl border border-slate-200 dark:border-white/[0.06]">
229
+ <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">
230
+ <div className="border-b border-slate-200 px-5 py-4 dark:border-white/[0.06]">
231
+ Area
232
+ </div>
233
+ <div className="border-b border-l border-slate-200 px-5 py-4 dark:border-white/[0.06]">
234
+ smbCloud Auth
235
+ </div>
236
+ <div className="border-b border-l border-slate-200 px-5 py-4 dark:border-white/[0.06]">
237
+ Auth0
238
+ </div>
239
+ </div>
240
+ {comparisonRows.map((row) => (
241
+ <div
242
+ key={row.label}
243
+ className="grid grid-cols-[0.8fr_1fr_1fr] text-sm leading-7 text-slate-600 dark:text-slate-400"
244
+ >
245
+ <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">
246
+ {row.label}
247
+ </div>
248
+ <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]">
249
+ {row.smbcloud}
250
+ </div>
251
+ <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]">
252
+ {row.auth0}
253
+ </div>
254
+ </div>
255
+ ))}
256
+ </div>
257
+ </div>
258
+ </section>
259
+
260
+ <section className="px-6 py-24 lg:px-8">
261
+ <div className="mx-auto grid max-w-5xl gap-6 lg:grid-cols-2">
262
+ <div className="rounded-2xl border border-slate-200 bg-white p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
263
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
264
+ Pick smbCloud Auth if
265
+ </p>
266
+ <ul className="mt-6 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
267
+ {smbcloudFits.map((item) => (
268
+ <li key={item} className="flex gap-3">
269
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
270
+ <span>{item}</span>
271
+ </li>
272
+ ))}
273
+ </ul>
274
+ </div>
275
+
276
+ <div className="rounded-2xl border border-slate-200 bg-slate-50 p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
277
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
278
+ Stay with Auth0 if
279
+ </p>
280
+ <ul className="mt-6 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
281
+ {auth0StillFits.map((item) => (
282
+ <li key={item} className="flex gap-3">
283
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-slate-400" />
284
+ <span>{item}</span>
285
+ </li>
286
+ ))}
287
+ </ul>
288
+ </div>
289
+ </div>
290
+ </section>
291
+
292
+ <section className="border-t border-slate-200 px-6 py-24 dark:border-white/[0.06] lg:px-8">
293
+ <div className="mx-auto max-w-5xl grid gap-8 lg:grid-cols-[0.95fr_1.05fr]">
294
+ <div>
295
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
296
+ Best fit
297
+ </p>
298
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
299
+ A good fit if you want hosted auth without giving auth its own empire.
300
+ </h2>
301
+ </div>
302
+ <ul className="rounded-2xl border border-slate-200 bg-white p-8 text-sm leading-7 text-slate-600 dark:border-white/[0.06] dark:bg-white/[0.02] dark:text-slate-400">
303
+ {bestFor.map((item) => (
304
+ <li
305
+ key={item}
306
+ className="flex gap-3 border-b border-slate-200 py-3 last:border-0 last:pb-0 first:pt-0 dark:border-white/[0.06]"
307
+ >
308
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
309
+ <span>{item}</span>
310
+ </li>
311
+ ))}
312
+ </ul>
313
+ </div>
314
+ </section>
315
+
316
+ <section className="px-6 pb-24 lg:px-8">
317
+ <div className="mx-auto max-w-3xl">
318
+ <div className="mb-10">
319
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
320
+ FAQ
321
+ </p>
322
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
323
+ Common questions
324
+ </h2>
325
+ </div>
326
+ <div className="space-y-4">
327
+ {faqs.map((faq) => (
328
+ <div
329
+ key={faq.question}
330
+ className="rounded-2xl border border-slate-200 bg-white p-6 dark:border-white/[0.06] dark:bg-white/[0.02]"
331
+ >
332
+ <h3 className="text-lg font-semibold text-slate-900 dark:text-white">
333
+ {faq.question}
334
+ </h3>
335
+ <p className="mt-3 text-sm leading-7 text-slate-600 dark:text-slate-400">
336
+ {faq.answer}
337
+ </p>
338
+ </div>
339
+ ))}
340
+ </div>
341
+ </div>
342
+ </section>
343
+
344
+ <section className="px-6 pb-20 lg:px-8">
345
+ <div className="mx-auto max-w-3xl">
346
+ <div className="relative overflow-hidden rounded-2xl bg-indigo-600 px-8 py-14 text-center shadow-2xl shadow-indigo-500/20">
347
+ <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_at_top,rgba(255,255,255,0.1),transparent)]" />
348
+ <h2 className="relative text-3xl font-bold tracking-tight text-white">
349
+ If auth keeps getting bigger than the app, try smbCloud Auth.
350
+ </h2>
351
+ <p className="relative mt-4 text-indigo-200">
352
+ Create an account and see if the smaller auth workflow is the better fit.
353
+ </p>
354
+ <div className="relative mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
355
+ <Link
356
+ href="https://console.smbcloud.xyz"
357
+ target="_blank"
358
+ rel="noopener noreferrer"
359
+ 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"
360
+ >
361
+ Create free account
362
+ </Link>
363
+ <Link
364
+ href="/clerk-alternative"
365
+ 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"
366
+ >
367
+ Compare Clerk alternative
368
+ </Link>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ </section>
373
+ </div>
374
+ );
375
+}
app/clerk-alternative/page.tsx
new
+375
@@ -0,0 +1,375 @@
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: "Primary job",
9
+ smbcloud:
10
+ "Handle hosted sign-in, signup, sessions, and auth flows without extra identity weight.",
11
+ clerk:
12
+ "Provide developer-friendly hosted auth with a broader auth product around it.",
13
+ },
14
+ {
15
+ label: "Best fit",
16
+ smbcloud:
17
+ "Teams that want auth to stay simple and boring.",
18
+ clerk:
19
+ "Teams that like a more opinionated developer auth platform and its workflow.",
20
+ },
21
+ {
22
+ label: "Product shape",
23
+ smbcloud: "Focused hosted auth inside the smbCloud platform.",
24
+ clerk: "Hosted auth product with more surrounding auth surface area.",
25
+ },
26
+ {
27
+ label: "Why teams pick it",
28
+ smbcloud: "Because the product is the app, not the auth stack.",
29
+ clerk: "Because they want a richer dedicated auth product.",
30
+ },
31
+];
32
+
33
+const smbcloudFits = [
34
+ "You want hosted auth to stay out of the way.",
35
+ "You need sign-in, signup, sessions, and user management without extra auth sprawl.",
36
+ "You want auth close to deploy, mail, and the rest of the stack.",
37
+ "You prefer a smaller auth surface area for a smaller team.",
38
+];
39
+
40
+const clerkStillFits = [
41
+ "Your team already likes Clerk and wants to keep its workflow.",
42
+ "You want a more feature-rich dedicated auth product around the app.",
43
+ "The added auth surface area is useful instead of distracting.",
44
+];
45
+
46
+const bestFor = [
47
+ "Small product teams",
48
+ "Founders who want hosted auth without ceremony",
49
+ "Apps that need sign-in and sessions solved quickly",
50
+ "Teams that want auth bundled close to deploy and mail",
51
+ "Projects that do not want auth to become its own category of work",
52
+];
53
+
54
+const faqs = [
55
+ {
56
+ question: "Is smbCloud Auth a Clerk replacement?",
57
+ answer:
58
+ "For some teams, yes. If you want hosted sign-in, signup, sessions, and auth flows with less auth surface area, smbCloud Auth may fit better. If you want a richer dedicated auth product and already like Clerk's workflow, Clerk may fit better.",
59
+ },
60
+ {
61
+ question: "What is the biggest difference between smbCloud Auth and Clerk?",
62
+ answer:
63
+ "Clerk is more of a dedicated auth product. smbCloud Auth is a simpler auth service inside a broader application platform.",
64
+ },
65
+ {
66
+ question: "Who should switch from Clerk to smbCloud Auth?",
67
+ answer:
68
+ "Teams that want hosted auth, but want the auth product to get out of the way faster.",
69
+ },
70
+];
71
+
72
+export const metadata: Metadata = {
73
+ ...genPageMetadata({
74
+ title: "Clerk alternative for simpler hosted auth",
75
+ description:
76
+ "smbCloud Auth is a Clerk alternative for teams that want hosted sign-in, signup, sessions, and auth flows with less auth surface area and less platform sprawl.",
77
+ path: "/clerk-alternative",
78
+ keywords: [
79
+ "Clerk alternative",
80
+ "hosted auth alternative",
81
+ "sign in and signup platform",
82
+ "session management platform",
83
+ "developer auth platform alternative",
84
+ "smbCloud Auth",
85
+ ],
86
+ }),
87
+};
88
+
89
+const structuredData = {
90
+ "@context": "https://schema.org",
91
+ "@graph": [
92
+ {
93
+ "@type": "WebPage",
94
+ "@id": absoluteUrl("/clerk-alternative#webpage"),
95
+ url: absoluteUrl("/clerk-alternative"),
96
+ name: "Clerk alternative for simpler hosted auth",
97
+ description:
98
+ "Compare smbCloud Auth and Clerk for simpler hosted auth workflows.",
99
+ isPartOf: {
100
+ "@id": absoluteUrl("/#website"),
101
+ },
102
+ },
103
+ {
104
+ "@type": "BreadcrumbList",
105
+ itemListElement: [
106
+ {
107
+ "@type": "ListItem",
108
+ position: 1,
109
+ name: "Home",
110
+ item: absoluteUrl("/"),
111
+ },
112
+ {
113
+ "@type": "ListItem",
114
+ position: 2,
115
+ name: "Clerk alternative",
116
+ item: absoluteUrl("/clerk-alternative"),
117
+ },
118
+ ],
119
+ },
120
+ {
121
+ "@type": "FAQPage",
122
+ mainEntity: faqs.map((faq) => ({
123
+ "@type": "Question",
124
+ name: faq.question,
125
+ acceptedAnswer: {
126
+ "@type": "Answer",
127
+ text: faq.answer,
128
+ },
129
+ })),
130
+ },
131
+ ],
132
+};
133
+
134
+export default function ClerkAlternativePage() {
135
+ return (
136
+ <div>
137
+ <StructuredData data={structuredData} />
138
+
139
+ <section className="relative overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20 lg:px-8">
140
+ <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)]" />
141
+
142
+ <div className="mx-auto max-w-4xl">
143
+ <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">
144
+ <span className="h-1.5 w-1.5 rounded-full bg-indigo-500" />
145
+ <span className="text-xs font-semibold uppercase tracking-widest text-indigo-700 dark:text-indigo-400">
146
+ smbCloud Auth
147
+ </span>
148
+ </div>
149
+
150
+ <h1 className="max-w-3xl text-4xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-6xl leading-[1.05]">
151
+ Looking for a Clerk alternative?
152
+ </h1>
153
+
154
+ <p className="mt-6 max-w-3xl text-lg leading-8 text-slate-600 dark:text-slate-400">
155
+ smbCloud Auth is for teams that want hosted auth to stay simple,
156
+ hosted, and out of the way. Sign-in, signup, sessions, and auth
157
+ flows should support the product, not steal the whole conversation.
158
+ </p>
159
+
160
+ <div className="mt-8 flex flex-col gap-4 sm:flex-row">
161
+ <Link
162
+ href="https://console.smbcloud.xyz"
163
+ target="_blank"
164
+ rel="noopener noreferrer"
165
+ 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]"
166
+ >
167
+ Create free account
168
+ </Link>
169
+ <Link
170
+ href="/services"
171
+ 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]"
172
+ >
173
+ Explore smbCloud Auth
174
+ </Link>
175
+ </div>
176
+ </div>
177
+ </section>
178
+
179
+ <section className="px-6 pb-24 lg:px-8">
180
+ <div className="mx-auto grid max-w-5xl gap-8 lg:grid-cols-[0.95fr_1.05fr]">
181
+ <div>
182
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
183
+ Why teams compare them
184
+ </p>
185
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
186
+ This is usually about whether you want more auth product than the team actually needs.
187
+ </h2>
188
+ <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
189
+ Some teams want a richer dedicated auth product. Others mostly
190
+ want auth flows that work well and stay out of the product team's
191
+ way.
192
+ </p>
193
+ </div>
194
+
195
+ <div className="rounded-2xl border border-slate-200 bg-slate-50 p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
196
+ <p className="text-sm font-semibold text-slate-900 dark:text-white">
197
+ What smbCloud Auth does well
198
+ </p>
199
+ <ul className="mt-5 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
200
+ <li className="flex gap-3">
201
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
202
+ <span>Hosted auth flows that stay straightforward.</span>
203
+ </li>
204
+ <li className="flex gap-3">
205
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
206
+ <span>Sessions, signup, and sign-in without the auth stack sprawling outward.</span>
207
+ </li>
208
+ <li className="flex gap-3">
209
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
210
+ <span>A better fit for teams that want auth solved, not celebrated.</span>
211
+ </li>
212
+ </ul>
213
+ </div>
214
+ </div>
215
+ </section>
216
+
217
+ <section className="border-t border-slate-200 px-6 py-24 dark:border-white/[0.06] lg:px-8">
218
+ <div className="mx-auto max-w-5xl">
219
+ <div className="mb-12 max-w-3xl">
220
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
221
+ smbCloud Auth vs Clerk
222
+ </p>
223
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
224
+ The trade is richer auth product versus calmer auth workflow.
225
+ </h2>
226
+ </div>
227
+
228
+ <div className="overflow-hidden rounded-2xl border border-slate-200 dark:border-white/[0.06]">
229
+ <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">
230
+ <div className="border-b border-slate-200 px-5 py-4 dark:border-white/[0.06]">
231
+ Area
232
+ </div>
233
+ <div className="border-b border-l border-slate-200 px-5 py-4 dark:border-white/[0.06]">
234
+ smbCloud Auth
235
+ </div>
236
+ <div className="border-b border-l border-slate-200 px-5 py-4 dark:border-white/[0.06]">
237
+ Clerk
238
+ </div>
239
+ </div>
240
+ {comparisonRows.map((row) => (
241
+ <div
242
+ key={row.label}
243
+ className="grid grid-cols-[0.8fr_1fr_1fr] text-sm leading-7 text-slate-600 dark:text-slate-400"
244
+ >
245
+ <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">
246
+ {row.label}
247
+ </div>
248
+ <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]">
249
+ {row.smbcloud}
250
+ </div>
251
+ <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]">
252
+ {row.clerk}
253
+ </div>
254
+ </div>
255
+ ))}
256
+ </div>
257
+ </div>
258
+ </section>
259
+
260
+ <section className="px-6 py-24 lg:px-8">
261
+ <div className="mx-auto grid max-w-5xl gap-6 lg:grid-cols-2">
262
+ <div className="rounded-2xl border border-slate-200 bg-white p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
263
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
264
+ Pick smbCloud Auth if
265
+ </p>
266
+ <ul className="mt-6 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
267
+ {smbcloudFits.map((item) => (
268
+ <li key={item} className="flex gap-3">
269
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
270
+ <span>{item}</span>
271
+ </li>
272
+ ))}
273
+ </ul>
274
+ </div>
275
+
276
+ <div className="rounded-2xl border border-slate-200 bg-slate-50 p-8 dark:border-white/[0.06] dark:bg-white/[0.02]">
277
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
278
+ Stay with Clerk if
279
+ </p>
280
+ <ul className="mt-6 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
281
+ {clerkStillFits.map((item) => (
282
+ <li key={item} className="flex gap-3">
283
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-slate-400" />
284
+ <span>{item}</span>
285
+ </li>
286
+ ))}
287
+ </ul>
288
+ </div>
289
+ </div>
290
+ </section>
291
+
292
+ <section className="border-t border-slate-200 px-6 py-24 dark:border-white/[0.06] lg:px-8">
293
+ <div className="mx-auto max-w-5xl grid gap-8 lg:grid-cols-[0.95fr_1.05fr]">
294
+ <div>
295
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
296
+ Best fit
297
+ </p>
298
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
299
+ A good fit if you want hosted auth to feel smaller than the auth category itself.
300
+ </h2>
301
+ </div>
302
+ <ul className="rounded-2xl border border-slate-200 bg-white p-8 text-sm leading-7 text-slate-600 dark:border-white/[0.06] dark:bg-white/[0.02] dark:text-slate-400">
303
+ {bestFor.map((item) => (
304
+ <li
305
+ key={item}
306
+ className="flex gap-3 border-b border-slate-200 py-3 last:border-0 last:pb-0 first:pt-0 dark:border-white/[0.06]"
307
+ >
308
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
309
+ <span>{item}</span>
310
+ </li>
311
+ ))}
312
+ </ul>
313
+ </div>
314
+ </section>
315
+
316
+ <section className="px-6 pb-24 lg:px-8">
317
+ <div className="mx-auto max-w-3xl">
318
+ <div className="mb-10">
319
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
320
+ FAQ
321
+ </p>
322
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
323
+ Common questions
324
+ </h2>
325
+ </div>
326
+ <div className="space-y-4">
327
+ {faqs.map((faq) => (
328
+ <div
329
+ key={faq.question}
330
+ className="rounded-2xl border border-slate-200 bg-white p-6 dark:border-white/[0.06] dark:bg-white/[0.02]"
331
+ >
332
+ <h3 className="text-lg font-semibold text-slate-900 dark:text-white">
333
+ {faq.question}
334
+ </h3>
335
+ <p className="mt-3 text-sm leading-7 text-slate-600 dark:text-slate-400">
336
+ {faq.answer}
337
+ </p>
338
+ </div>
339
+ ))}
340
+ </div>
341
+ </div>
342
+ </section>
343
+
344
+ <section className="px-6 pb-20 lg:px-8">
345
+ <div className="mx-auto max-w-3xl">
346
+ <div className="relative overflow-hidden rounded-2xl bg-indigo-600 px-8 py-14 text-center shadow-2xl shadow-indigo-500/20">
347
+ <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_at_top,rgba(255,255,255,0.1),transparent)]" />
348
+ <h2 className="relative text-3xl font-bold tracking-tight text-white">
349
+ If auth feels like too much product around the product, try smbCloud Auth.
350
+ </h2>
351
+ <p className="relative mt-4 text-indigo-200">
352
+ Create an account and see if the simpler auth workflow is the better fit.
353
+ </p>
354
+ <div className="relative mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
355
+ <Link
356
+ href="https://console.smbcloud.xyz"
357
+ target="_blank"
358
+ rel="noopener noreferrer"
359
+ 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"
360
+ >
361
+ Create free account
362
+ </Link>
363
+ <Link
364
+ href="/supabase-auth-alternative"
365
+ 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"
366
+ >
367
+ Compare Supabase Auth alternative
368
+ </Link>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ </section>
373
+ </div>
374
+ );
375
+}
app/page.tsx
+82
@@ -77,6 +77,41 @@ const deployComparisonPages = [
77
},
78
];
79
80
+const authComparisonPages = [
81
+ {
82
+ href: "/auth0-alternative",
83
+ eyebrow: "Auth comparison",
84
+ title: "Auth0 alternative",
85
+ description:
86
+ "If you want hosted auth flows without turning identity into its own platform project.",
87
+ bullets: [
88
+ "Compare hosted sign-in, signup, and session flows against a bigger identity stack",
89
+ "See where smbCloud Auth fits for smaller teams that want less auth sprawl",
90
+ ],
91
+ },
92
+ {
93
+ href: "/clerk-alternative",
94
+ eyebrow: "Auth comparison",
95
+ title: "Clerk alternative",
96
+ description: "If you want auth to stay simple, hosted, and out of the way.",
97
+ bullets: [
98
+ "Compare developer-friendly hosted auth against a calmer auth workflow",
99
+ "See when smbCloud Auth is a better fit and when Clerk still makes more sense",
100
+ ],
101
+ },
102
+ {
103
+ href: "/supabase-auth-alternative",
104
+ eyebrow: "Auth comparison",
105
+ title: "Supabase Auth alternative",
106
+ description:
107
+ "If you want hosted auth without adopting a bigger backend platform than you need.",
108
+ bullets: [
109
+ "Compare focused auth flows against auth bundled inside a larger platform",
110
+ "See when smbCloud Auth is the cleaner fit for accounts and sessions",
111
+ ],
112
+ },
113
+];
114
+
115
const mailComparisonPages = [
116
{
117
href: "/resend-alternative",
@@ -440,6 +475,53 @@ export default function Home() {
475
</div>
476
</div>
477
478
+ <div className="border-t border-slate-200 pt-16 dark:border-white/[0.06]">
479
+ <div className="mb-10 max-w-3xl">
480
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
481
+ smbCloud Auth
482
+ </p>
483
+ <h3 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
484
+ Looking at Auth0, Clerk, or Supabase Auth?
485
+ </h3>
486
+ <p className="mt-4 text-base leading-8 text-slate-600 dark:text-slate-400">
487
+ That is the smbCloud Auth side of the business. Some teams
488
+ want a giant identity stack. Others just want sign-in, signup,
489
+ sessions, and hosted auth flows that stay out of the way.
490
+ </p>
491
+ </div>
492
+
493
+ <div className="grid gap-6 lg:grid-cols-3">
494
+ {authComparisonPages.map((page) => (
495
+ <Link
496
+ key={page.href}
497
+ href={page.href}
498
+ className="group rounded-2xl border border-slate-200 dark:border-white/[0.06] bg-white dark:bg-white/[0.02] p-8 transition-colors hover:border-indigo-300 dark:hover:border-indigo-700/50 hover:bg-slate-50 dark:hover:bg-white/[0.04]"
499
+ >
500
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
501
+ {page.eyebrow}
502
+ </p>
503
+ <h4 className="mt-4 text-2xl font-semibold tracking-tight text-slate-900 transition-colors group-hover:text-indigo-600 dark:text-white dark:group-hover:text-indigo-400">
504
+ {page.title}
505
+ </h4>
506
+ <p className="mt-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
507
+ {page.description}
508
+ </p>
509
+ <ul className="mt-5 space-y-3 text-sm leading-6 text-slate-500 dark:text-slate-400">
510
+ {page.bullets.map((bullet) => (
511
+ <li key={bullet} className="flex gap-3">
512
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
513
+ <span>{bullet}</span>
514
+ </li>
515
+ ))}
516
+ </ul>
517
+ <p className="mt-6 text-sm font-semibold text-indigo-600 dark:text-indigo-400">
518
+ Read comparison →
519
+ </p>
520
+ </Link>
521
+ ))}
522
+ </div>
523
+ </div>
524
+
525
<div className="border-t border-slate-200 pt-16 dark:border-white/[0.06]">
526
<div className="mb-10 max-w-3xl">
527
<p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
app/services/page.tsx
-3
@@ -266,9 +266,6 @@ export default function ServicesPage() {
266
<h2 className="relative text-3xl font-bold tracking-tight text-white">
267
Start with one service. Add the rest when you need them.
268
</h2>
269
- <p className="relative mt-4 text-indigo-200">
270
- That is usually the better path anyway.
271
- </p>
269
<Link
270
href="https://console.smbcloud.xyz"
271
target="_blank"
components/footer.tsx
+69
-35
@@ -1,11 +1,29 @@
1
import Link from "next/link";
2
import { FaGithub } from "react-icons/fa";
3
4
+const companyLinks = [
5
+ { href: "/about", label: "About" },
6
+ { href: "/services", label: "Services" },
7
+ { href: "/contact", label: "Contact" },
8
+ { href: "/privacy-policy", label: "Privacy" },
9
+ { href: "/term-of-use", label: "Terms" },
10
+];
11
+
12
+const resourceLinks = [
13
+ { href: "/posts", label: "Blog" },
14
+ { href: "/kti", label: "KTI (ID)" },
15
+ {
16
+ href: "https://github.com/smbcloudXYZ",
17
+ label: "GitHub",
18
+ external: true,
19
+ },
20
+];
21
+
22
export default function Footer() {
23
return (
24
<footer className="border-t border-slate-200 dark:border-white/[0.06] px-6 py-12 lg:px-8">
25
<div className="mx-auto max-w-5xl">
8
- <div className="flex flex-col gap-8 sm:flex-row sm:items-start sm:justify-between">
26
+ <div className="flex flex-col gap-10 sm:flex-row sm:items-start sm:justify-between">
27
<div>
28
<Link href="/" className="mb-3 flex items-center gap-2">
29
<div className="flex h-6 w-[30px] items-center justify-center rounded bg-indigo-600 text-white">
@@ -18,42 +36,58 @@ export default function Footer() {
36
<p className="max-w-xs text-xs leading-relaxed text-slate-500 dark:text-slate-500">
37
Enterprise Power at Startup Velocity
38
</p>
39
+ <p className="mt-2 text-xs text-slate-400 dark:text-slate-600">
40
+ Built by Splitfire AB in Stockholm, Sweden.
41
+ </p>
42
</div>
43
23
- <div className="flex flex-wrap gap-x-8 gap-y-3 text-sm text-slate-500 dark:text-slate-500">
24
- <Link
25
- href="/about"
26
- className="hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
27
- >
28
- About
29
- </Link>
30
- <Link
31
- href="/privacy-policy"
32
- className="hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
33
- >
34
- Privacy
35
- </Link>
36
- <Link
37
- href="/term-of-use"
38
- className="hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
39
- >
40
- Terms
41
- </Link>
42
- <Link
43
- href="/contact"
44
- className="hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
45
- >
46
- Contact
47
- </Link>
48
- <Link
49
- href="https://github.com/smbcloudXYZ"
50
- target="_blank"
51
- rel="noopener noreferrer"
52
- className="flex items-center gap-1.5 hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
53
- >
54
- <FaGithub className="h-3.5 w-3.5" />
55
- GitHub
56
- </Link>
44
+ <div className="grid grid-cols-2 gap-x-12 gap-y-8 text-sm text-slate-500 dark:text-slate-500">
45
+ <div>
46
+ <p className="mb-3 text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
47
+ Company
48
+ </p>
49
+ <div className="flex flex-col gap-3">
50
+ {companyLinks.map((link) => (
51
+ <Link
52
+ key={link.href}
53
+ href={link.href}
54
+ className="hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
55
+ >
56
+ {link.label}
57
+ </Link>
58
+ ))}
59
+ </div>
60
+ </div>
61
+
62
+ <div>
63
+ <p className="mb-3 text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
64
+ Resources
65
+ </p>
66
+ <div className="flex flex-col gap-3">
67
+ {resourceLinks.map((link) =>
68
+ link.external ? (
69
+ <Link
70
+ key={link.href}
71
+ href={link.href}
72
+ target="_blank"
73
+ rel="noopener noreferrer"
74
+ className="flex items-center gap-1.5 hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
75
+ >
76
+ <FaGithub className="h-3.5 w-3.5" />
77
+ {link.label}
78
+ </Link>
79
+ ) : (
80
+ <Link
81
+ key={link.href}
82
+ href={link.href}
83
+ className="hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
84
+ >
85
+ {link.label}
86
+ </Link>
87
+ ),
88
+ )}
89
+ </div>
90
+ </div>
91
</div>
92
</div>
93
components/header.tsx
-12
@@ -42,18 +42,6 @@ export default function Header() {
42
>
43
Services
44
</Link>
45
- <Link
46
- href="/kti"
47
- className="hover:text-slate-900 dark:hover:text-white transition-colors"
48
- >
49
- KTI (ID)
50
- </Link>
51
- <Link
52
- href="/posts"
53
- className="hover:text-slate-900 dark:hover:text-white transition-colors"
54
- >
55
- Blog
56
- </Link>
45
</nav>
46
47
<div className="flex items-center gap-3">