Update pricing page and marketing page
keypair34 committed
May 24, 2026 at 17:47 UTC
34fede6ee925a1776655cec903417f938add6d73
4 files changed
+685
-23
app/auth/page.tsx
new
+527
@@ -0,0 +1,527 @@
1
+import type { Metadata } from "next";
2
+import Link from "next/link";
3
+import {
4
+ FaCheckCircle,
5
+ FaGlobe,
6
+ FaLock,
7
+ FaRocket,
8
+ FaShieldAlt,
9
+ FaUsers,
10
+} from "react-icons/fa";
11
+import { StructuredData } from "@/components/structured-data";
12
+import { absoluteUrl, genPageMetadata } from "../seo";
13
+
14
+const CONSOLE_URL = "https://console.smbcloud.xyz";
15
+
16
+const offerings = [
17
+ {
18
+ name: "Starter",
19
+ eyebrow: "Free forever",
20
+ description:
21
+ "Try smbCloud Auth with zero commitment. One auth app, 1,000 monthly active users, and the basics you need to ship login fast.",
22
+ bullets: [
23
+ "1 auth app with email/password and social login",
24
+ "Up to 1,000 monthly active users",
25
+ "Session management out of the box",
26
+ ],
27
+ cta: "Start for free",
28
+ href: `${CONSOLE_URL}?plan=starter`,
29
+ highlighted: false,
30
+ },
31
+ {
32
+ name: "smbCloud Auth Business",
33
+ eyebrow: "For production apps",
34
+ description:
35
+ "For apps that need real identity management. SSO, RBAC, audit logs, and an SLA your compliance team can live with.",
36
+ bullets: [
37
+ "Unlimited auth apps and collaborators",
38
+ "SSO/SAML and role-based access control",
39
+ "30-day audit logs with 99.9% SLA",
40
+ ],
41
+ cta: "Start business setup",
42
+ href: `${CONSOLE_URL}?plan=business`,
43
+ highlighted: true,
44
+ },
45
+];
46
+
47
+const plans = [
48
+ {
49
+ key: "starter",
50
+ name: "Starter",
51
+ price: "$0",
52
+ period: "/mo",
53
+ overage: "",
54
+ description:
55
+ "For side projects, prototypes, and apps that are just getting started.",
56
+ bullets: [
57
+ "1,000 monthly active users",
58
+ "1 auth app",
59
+ "Email/password + social login",
60
+ "Session management",
61
+ "Community support",
62
+ ],
63
+ highlighted: false,
64
+ cta: "Start for free",
65
+ href: `${CONSOLE_URL}?plan=starter`,
66
+ },
67
+ {
68
+ key: "pro",
69
+ name: "Pro",
70
+ price: "$29",
71
+ period: "/mo",
72
+ overage: "+ $0.005/MAU overage",
73
+ description: "For growing apps that need more control and room to scale.",
74
+ bullets: [
75
+ "10,000 monthly active users",
76
+ "5 auth apps, 3 collaborators",
77
+ "Custom domain",
78
+ "Webhooks + 7-day audit logs",
79
+ "Standard support",
80
+ ],
81
+ highlighted: true,
82
+ cta: "Choose Pro",
83
+ href: `${CONSOLE_URL}?plan=pro`,
84
+ },
85
+ {
86
+ key: "business",
87
+ name: "Business",
88
+ price: "$149",
89
+ period: "/mo",
90
+ overage: "+ $0.003/MAU overage",
91
+ description:
92
+ "For teams that need SSO, compliance controls, and enterprise-grade uptime.",
93
+ bullets: [
94
+ "100,000 monthly active users",
95
+ "Unlimited apps + collaborators",
96
+ "SSO/SAML + RBAC",
97
+ "30-day audit logs, 99.9% SLA",
98
+ "Priority support",
99
+ ],
100
+ highlighted: false,
101
+ cta: "Choose Business",
102
+ href: `${CONSOLE_URL}?plan=business`,
103
+ },
104
+ {
105
+ key: "scale",
106
+ name: "Scale",
107
+ price: "Custom",
108
+ period: "",
109
+ overage: "",
110
+ description:
111
+ "For high-traffic apps that need dedicated infrastructure and a direct line to the team.",
112
+ bullets: [
113
+ "Everything in Business",
114
+ "Custom MAU volume",
115
+ "99.99% SLA",
116
+ "Dedicated support",
117
+ "Custom integrations",
118
+ ],
119
+ highlighted: false,
120
+ cta: "Contact sales",
121
+ href: "mailto:sales@smbcloud.xyz",
122
+ },
123
+];
124
+
125
+const proofCards = [
126
+ {
127
+ title: "Own your auth stack",
128
+ description:
129
+ "No vendor lock-in, no black-box pricing. smbCloud Auth runs on your infrastructure, so your user data stays exactly where you put it.",
130
+ icon: FaLock,
131
+ },
132
+ {
133
+ title: "Ship faster",
134
+ description:
135
+ "SDK for Swift, web, and server. One integration covers login, sessions, and token refresh. Stop rebuilding auth for every project.",
136
+ icon: FaRocket,
137
+ },
138
+ {
139
+ title: "Scale without surprises",
140
+ description:
141
+ "Usage-based pricing tied to monthly active users. No per-seat gotchas, no hidden fees when your app starts growing.",
142
+ icon: FaGlobe,
143
+ },
144
+];
145
+
146
+export const metadata: Metadata = {
147
+ ...genPageMetadata({
148
+ title: "smbCloud Auth",
149
+ description:
150
+ "Authentication and identity management for your apps. Email/password, social login, SSO/SAML, RBAC, and session management with SDKs for Swift, web, and server.",
151
+ path: "/auth",
152
+ keywords: [
153
+ "smbCloud Auth",
154
+ "authentication service",
155
+ "identity management",
156
+ "SSO SAML",
157
+ "social login",
158
+ "auth SDK",
159
+ "user management",
160
+ ],
161
+ }),
162
+};
163
+
164
+export default function AuthPage() {
165
+ const structuredData = {
166
+ "@context": "https://schema.org",
167
+ "@graph": [
168
+ {
169
+ "@type": "WebPage",
170
+ "@id": absoluteUrl("/auth#webpage"),
171
+ url: absoluteUrl("/auth"),
172
+ name: "smbCloud Auth",
173
+ description: "Authentication and identity management for your apps.",
174
+ isPartOf: {
175
+ "@id": absoluteUrl("/#website"),
176
+ },
177
+ },
178
+ {
179
+ "@type": "Service",
180
+ name: "smbCloud Auth",
181
+ serviceType: "Authentication and identity management",
182
+ areaServed: "Worldwide",
183
+ url: absoluteUrl("/auth"),
184
+ offers: [
185
+ {
186
+ "@type": "Offer",
187
+ name: "smbCloud Auth Starter",
188
+ price: "0",
189
+ priceCurrency: "USD",
190
+ url: `${CONSOLE_URL}?plan=starter`,
191
+ },
192
+ {
193
+ "@type": "Offer",
194
+ name: "smbCloud Auth Pro",
195
+ price: "29",
196
+ priceCurrency: "USD",
197
+ url: `${CONSOLE_URL}?plan=pro`,
198
+ },
199
+ {
200
+ "@type": "Offer",
201
+ name: "smbCloud Auth Business",
202
+ price: "149",
203
+ priceCurrency: "USD",
204
+ url: `${CONSOLE_URL}?plan=business`,
205
+ },
206
+ {
207
+ "@type": "Offer",
208
+ name: "smbCloud Auth Scale",
209
+ price: "0",
210
+ priceCurrency: "USD",
211
+ url: "mailto:sales@smbcloud.xyz",
212
+ },
213
+ ],
214
+ },
215
+ ],
216
+ };
217
+
218
+ return (
219
+ <div>
220
+ <StructuredData data={structuredData} />
221
+
222
+ {/* Hero */}
223
+ <section className="relative overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20 lg:px-8">
224
+ <div className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[560px] bg-[radial-gradient(ellipse_75%_50%_at_50%_0%,rgba(99,102,241,0.22),transparent)] dark:bg-[radial-gradient(ellipse_75%_50%_at_50%_0%,rgba(99,102,241,0.16),transparent)]" />
225
+
226
+ <div className="mx-auto max-w-5xl">
227
+ <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">
228
+ <span className="h-1.5 w-1.5 rounded-full bg-indigo-500" />
229
+ <span className="text-xs font-semibold tracking-widest text-indigo-700 dark:text-indigo-300">
230
+ smbCloud Auth
231
+ </span>
232
+ </div>
233
+
234
+ <div className="grid gap-12 lg:grid-cols-[1.1fr_0.9fr] lg:items-start">
235
+ <div>
236
+ <h1 className="max-w-3xl text-4xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-6xl leading-[1.05]">
237
+ Auth that gets out of your way.
238
+ </h1>
239
+
240
+ <p className="mt-6 max-w-2xl text-lg leading-8 text-slate-600 dark:text-slate-400">
241
+ smbCloud Auth handles login, sessions, and identity so you can
242
+ focus on the product. Start free with{" "}
243
+ <span className="font-semibold">
244
+ 1,000 monthly active users
245
+ </span>
246
+ , then scale to SSO, RBAC, and enterprise compliance when your
247
+ app needs it.
248
+ </p>
249
+
250
+ <div className="mt-8 flex flex-col gap-4 sm:flex-row">
251
+ <a
252
+ href={CONSOLE_URL}
253
+ 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]"
254
+ >
255
+ Open Console
256
+ </a>
257
+ <Link
258
+ href="/services"
259
+ 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]"
260
+ >
261
+ Back to services
262
+ </Link>
263
+ </div>
264
+
265
+ <p className="mt-4 text-sm text-slate-500 dark:text-slate-500">
266
+ Free Starter tier includes 1,000 MAU. No credit card required.
267
+ </p>
268
+ </div>
269
+
270
+ <div className="rounded-2xl border border-slate-200 bg-white p-6 shadow-sm dark:border-white/[0.06] dark:bg-white/[0.02]">
271
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
272
+ What you get
273
+ </p>
274
+ <h2 className="mt-3 text-2xl font-semibold tracking-tight text-slate-900 dark:text-white">
275
+ Identity management, not identity crisis.
276
+ </h2>
277
+ <p className="mt-4 text-base leading-7 text-slate-600 dark:text-slate-400">
278
+ smbCloud Auth covers the full auth lifecycle. Login flows,
279
+ session tokens, user management, and access control — all from
280
+ one service with SDKs that work across platforms.
281
+ </p>
282
+
283
+ <ul className="mt-6 space-y-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
284
+ <li className="flex gap-3">
285
+ <FaCheckCircle className="mt-1 h-4 w-4 shrink-0 text-indigo-500" />
286
+ <span>Email/password and social login out of the box</span>
287
+ </li>
288
+ <li className="flex gap-3">
289
+ <FaShieldAlt className="mt-1 h-4 w-4 shrink-0 text-indigo-500" />
290
+ <span>SSO/SAML and role-based access control</span>
291
+ </li>
292
+ <li className="flex gap-3">
293
+ <FaUsers className="mt-1 h-4 w-4 shrink-0 text-indigo-500" />
294
+ <span>
295
+ Webhooks, audit logs, and team collaboration tools
296
+ </span>
297
+ </li>
298
+ </ul>
299
+
300
+ <div className="mt-6 flex flex-col gap-3 sm:flex-row">
301
+ <a
302
+ href={`${CONSOLE_URL}?plan=starter`}
303
+ className="inline-flex items-center justify-center rounded-lg bg-slate-900 px-5 py-3 text-sm font-semibold text-white transition-colors hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100"
304
+ >
305
+ Start for free
306
+ </a>
307
+ <a
308
+ href={`${CONSOLE_URL}?plan=pro`}
309
+ className="inline-flex items-center justify-center rounded-lg border border-slate-300 px-5 py-3 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]"
310
+ >
311
+ See Pro plan
312
+ </a>
313
+ </div>
314
+ </div>
315
+ </div>
316
+ </div>
317
+ </section>
318
+
319
+ {/* Offering cards */}
320
+ <section className="px-6 pb-10 lg:px-8">
321
+ <div className="mx-auto grid max-w-5xl gap-6 md:grid-cols-2">
322
+ {offerings.map((offering) => (
323
+ <div
324
+ key={offering.name}
325
+ className={`rounded-2xl border p-6 sm:p-8 ${
326
+ offering.highlighted
327
+ ? "border-indigo-200 bg-indigo-50/70 dark:border-indigo-500/25 dark:bg-indigo-500/10"
328
+ : "border-slate-200 bg-white dark:border-white/[0.06] dark:bg-white/[0.02]"
329
+ }`}
330
+ >
331
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
332
+ {offering.eyebrow}
333
+ </p>
334
+ <h2 className="mt-3 text-2xl font-semibold tracking-tight text-slate-900 dark:text-white">
335
+ {offering.name}
336
+ </h2>
337
+ <p className="mt-4 text-base leading-7 text-slate-600 dark:text-slate-400">
338
+ {offering.description}
339
+ </p>
340
+ <ul className="mt-5 space-y-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
341
+ {offering.bullets.map((bullet) => (
342
+ <li key={bullet} className="flex gap-3">
343
+ <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
344
+ <span>{bullet}</span>
345
+ </li>
346
+ ))}
347
+ </ul>
348
+ <a
349
+ href={offering.href}
350
+ className={`mt-6 inline-flex items-center gap-2 rounded-lg px-5 py-3 text-sm font-semibold transition-colors ${
351
+ offering.highlighted
352
+ ? "bg-indigo-600 text-white hover:bg-indigo-500"
353
+ : "bg-slate-900 text-white hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100"
354
+ }`}
355
+ >
356
+ {offering.cta}
357
+ </a>
358
+ </div>
359
+ ))}
360
+ </div>
361
+ </section>
362
+
363
+ {/* Why smbCloud Auth */}
364
+ <section className="px-6 py-16 lg:px-8">
365
+ <div className="mx-auto max-w-5xl">
366
+ <div className="max-w-3xl">
367
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
368
+ Why smbCloud Auth
369
+ </p>
370
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
371
+ Because auth is not a feature — it is the foundation.
372
+ </h2>
373
+ <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
374
+ Every app needs login. Most teams build it from scratch, bolt on a
375
+ third-party black box, or spend weeks wrestling with OAuth flows.
376
+ smbCloud Auth gives you the whole stack so you can move on to the
377
+ work that actually matters.
378
+ </p>
379
+ </div>
380
+
381
+ <div className="mt-10 grid gap-6 md:grid-cols-3">
382
+ {proofCards.map((card) => {
383
+ const Icon = card.icon;
384
+ return (
385
+ <div
386
+ key={card.title}
387
+ className="rounded-2xl border border-slate-200 bg-white p-6 dark:border-white/[0.06] dark:bg-white/[0.02]"
388
+ >
389
+ <div className="inline-flex rounded-xl bg-indigo-50 p-3 text-indigo-500 dark:bg-indigo-500/10">
390
+ <Icon className="h-5 w-5" />
391
+ </div>
392
+ <h3 className="mt-4 text-lg font-semibold text-slate-900 dark:text-white">
393
+ {card.title}
394
+ </h3>
395
+ <p className="mt-3 text-sm leading-7 text-slate-600 dark:text-slate-400">
396
+ {card.description}
397
+ </p>
398
+ </div>
399
+ );
400
+ })}
401
+ </div>
402
+ </div>
403
+ </section>
404
+
405
+ {/* Pricing */}
406
+ <section className="border-y border-slate-200 px-6 py-20 dark:border-white/[0.06] lg:px-8">
407
+ <div className="mx-auto max-w-5xl">
408
+ <div className="max-w-3xl">
409
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
410
+ smbCloud Auth pricing
411
+ </p>
412
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
413
+ Start free. Pay for what you use.
414
+ </h2>
415
+ <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
416
+ Every plan includes the full auth feature set. You only pay more
417
+ when your app has more users. Simple.
418
+ </p>
419
+ </div>
420
+
421
+ <div className="mt-10 grid gap-6 md:grid-cols-2 lg:grid-cols-4">
422
+ {plans.map((plan) => (
423
+ <div
424
+ key={plan.name}
425
+ className={`rounded-2xl border p-6 ${
426
+ plan.highlighted
427
+ ? "border-indigo-200 bg-indigo-50/70 shadow-sm dark:border-indigo-500/25 dark:bg-indigo-500/10"
428
+ : "border-slate-200 bg-white dark:border-white/[0.06] dark:bg-white/[0.02]"
429
+ }`}
430
+ >
431
+ <div className="flex items-start justify-between gap-4">
432
+ <div>
433
+ <h3 className="text-xl font-semibold text-slate-900 dark:text-white">
434
+ {plan.name}
435
+ </h3>
436
+ <p className="mt-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
437
+ {plan.description}
438
+ </p>
439
+ </div>
440
+ {plan.highlighted ? (
441
+ <span className="rounded-full bg-indigo-600 px-2.5 py-1 text-[11px] font-semibold text-white">
442
+ Popular
443
+ </span>
444
+ ) : null}
445
+ </div>
446
+
447
+ <div className="mt-6">
448
+ <div className="flex items-end gap-1">
449
+ <span className="text-4xl font-bold tracking-tight text-slate-900 dark:text-white">
450
+ {plan.price}
451
+ </span>
452
+ {plan.period ? (
453
+ <span className="pb-1 text-sm text-slate-500 dark:text-slate-500">
454
+ {plan.period}
455
+ </span>
456
+ ) : null}
457
+ </div>
458
+ {plan.overage ? (
459
+ <p className="mt-1 text-xs text-slate-500 dark:text-slate-500">
460
+ {plan.overage}
461
+ </p>
462
+ ) : null}
463
+ </div>
464
+
465
+ <ul className="mt-6 space-y-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
466
+ {plan.bullets.map((bullet) => (
467
+ <li key={bullet} className="flex gap-3">
468
+ <FaCheckCircle className="mt-1 h-4 w-4 shrink-0 text-indigo-500" />
469
+ <span>{bullet}</span>
470
+ </li>
471
+ ))}
472
+ </ul>
473
+
474
+ <a
475
+ href={plan.href}
476
+ className={`mt-8 inline-flex w-full items-center justify-center rounded-lg px-5 py-3 text-sm font-semibold transition-colors ${
477
+ plan.highlighted
478
+ ? "bg-indigo-600 text-white hover:bg-indigo-500"
479
+ : "border border-slate-300 text-slate-700 hover:bg-slate-50 dark:border-white/[0.12] dark:text-slate-200 dark:hover:bg-white/[0.04]"
480
+ }`}
481
+ >
482
+ {plan.cta}
483
+ </a>
484
+ </div>
485
+ ))}
486
+ </div>
487
+ </div>
488
+ </section>
489
+
490
+ {/* Bottom CTA */}
491
+ <section className="px-6 py-20 lg:px-8">
492
+ <div className="mx-auto max-w-5xl rounded-3xl border border-slate-200 bg-slate-50 p-8 sm:p-10 dark:border-white/[0.06] dark:bg-white/[0.02]">
493
+ <div className="grid gap-8 lg:grid-cols-[1.1fr_0.9fr] lg:items-center">
494
+ <div>
495
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
496
+ Get started
497
+ </p>
498
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
499
+ Start with Starter. Upgrade when your app takes off.
500
+ </h2>
501
+ <p className="mt-5 max-w-2xl text-base leading-8 text-slate-600 dark:text-slate-400">
502
+ Every smbCloud Auth plan includes the same core features. The
503
+ only thing that changes is how many users you can serve and the
504
+ level of support. Start free today and scale when you are ready.
505
+ </p>
506
+ </div>
507
+
508
+ <div className="flex flex-col gap-4 lg:items-end">
509
+ <a
510
+ href={`${CONSOLE_URL}?plan=starter`}
511
+ 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]"
512
+ >
513
+ Start for free
514
+ </a>
515
+ <Link
516
+ href="/services"
517
+ 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]"
518
+ >
519
+ Back to services
520
+ </Link>
521
+ </div>
522
+ </div>
523
+ </div>
524
+ </section>
525
+ </div>
526
+ );
527
+}
app/mail/page.tsx
+1
-1
@@ -191,7 +191,7 @@ export default function MailPage() {
191
<div className="mx-auto max-w-5xl">
192
<div className="mb-6 inline-flex items-center gap-2 rounded-full border border-orange-200 bg-orange-50 px-4 py-1.5 dark:border-orange-500/30 dark:bg-orange-500/10">
193
<span className="h-1.5 w-1.5 rounded-full bg-orange-500" />
194
- <span className="text-xs font-semibold uppercase tracking-widest text-orange-700 dark:text-orange-300">
194
+ <span className="text-xs font-semibold tracking-widest text-orange-700 dark:text-orange-300">
195
smbCloud Mail
196
</span>
197
</div>
app/page.tsx
+153
-18
@@ -52,6 +52,39 @@ const bestFit = [
52
"Teams that like SSH and fewer moving parts",
53
];
54
55
+const featuredServices = [
56
+ {
57
+ name: "smbCloud Auth",
58
+ eyebrow: "Accounts and access",
59
+ title: "Hosted auth that stays out of the way.",
60
+ description:
61
+ "Handle sign-in, signup, sessions, custom domains, collaborators, and billing without adopting a giant identity platform first.",
62
+ bullets: [
63
+ "Hosted auth apps for end-user accounts",
64
+ "Simple plans from Starter to Business",
65
+ "A calmer alternative to Auth0, Clerk, and bundled platform auth",
66
+ ],
67
+ href: "/auth",
68
+ cta: "Explore Auth",
69
+ accent: "indigo",
70
+ },
71
+ {
72
+ name: "smbCloud Mail",
73
+ eyebrow: "Domain mail routing",
74
+ title: "Mail built around the inbox, not just the send API.",
75
+ description:
76
+ "Route domain email, keep forwarding simple, and store inbound history without stitching together a bigger mail suite than you need.",
77
+ bullets: [
78
+ "One Mail app per project",
79
+ "Inbox routes, forwarding, and stored inbound messages",
80
+ "A cleaner fit for teams comparing Resend, useSend, or SendGrid",
81
+ ],
82
+ href: "/mail",
83
+ cta: "Explore Mail",
84
+ accent: "orange",
85
+ },
86
+];
87
+
88
const deployComparisonPages = [
89
{
90
href: "/heroku-alternative",
@@ -178,17 +211,21 @@ const mailComparisonPages = [
211
212
export const metadata: Metadata = {
213
...genPageMetadata({
181
- title: "Deploy Node.js, Rails, and Vapor apps with one command",
214
+ title: "Deploy apps, handle auth, and run domain mail from one platform",
215
description:
183
- "smbCloud is an SSH-first deploy platform for small teams shipping Node.js, Ruby on Rails, and Swift/Vapor apps. Deploy with one command, live logs, fast rollbacks, and a clean console.",
216
+ "smbCloud helps small teams deploy Node.js, Ruby on Rails, and Swift/Vapor apps, run hosted auth, and manage domain mail from one calm console.",
217
path: "/",
218
keywords: [
219
"SSH-first deploy platform",
220
"deploy Node.js app",
221
"deploy Ruby on Rails app",
222
"deploy Vapor app",
223
+ "hosted auth",
224
+ "authentication service",
225
+ "domain mail routing",
226
"Heroku alternative",
191
- "Railway alternative",
227
+ "Auth0 alternative",
228
+ "Resend alternative",
229
"small team deployment platform",
230
],
231
}),
@@ -226,6 +263,39 @@ const homepageStructuredData = {
263
audienceType: "Developers and small software teams",
264
},
265
},
266
+ {
267
+ "@type": "Service",
268
+ name: "smbCloud Auth",
269
+ serviceType: "Hosted authentication service",
270
+ provider: {
271
+ "@id": absoluteUrl("/#organization"),
272
+ },
273
+ areaServed: "Worldwide",
274
+ url: absoluteUrl("/auth"),
275
+ description:
276
+ "Hosted auth apps for sign-in, signup, sessions, collaborators, and account management.",
277
+ audience: {
278
+ "@type": "Audience",
279
+ audienceType: "Developers and software teams shipping user accounts",
280
+ },
281
+ },
282
+ {
283
+ "@type": "Service",
284
+ name: "smbCloud Mail",
285
+ serviceType: "Domain mail routing service",
286
+ provider: {
287
+ "@id": absoluteUrl("/#organization"),
288
+ },
289
+ areaServed: "Worldwide",
290
+ url: absoluteUrl("/mail"),
291
+ description:
292
+ "Domain inbox routes, forwarding, and stored inbound mail for teams that want calmer mail infrastructure.",
293
+ audience: {
294
+ "@type": "Audience",
295
+ audienceType:
296
+ "Businesses and software teams handling inbound domain email",
297
+ },
298
+ },
299
],
300
};
301
@@ -275,6 +345,70 @@ export default function Home() {
345
</div>
346
</section>
347
348
+ <section className="px-6 pb-14 lg:px-8">
349
+ <div className="mx-auto max-w-5xl">
350
+ <div className="mb-10 max-w-3xl">
351
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
352
+ Start here
353
+ </p>
354
+ <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-4xl">
355
+ Auth and Mail are two of the clearest ways into smbCloud.
356
+ </h2>
357
+ <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
358
+ If you're comparing auth vendors or trying to clean up your domain
359
+ mail setup, start with the product page that matches the job.
360
+ </p>
361
+ </div>
362
+
363
+ <div className="grid gap-6 lg:grid-cols-2">
364
+ {featuredServices.map((service) => (
365
+ <Link
366
+ key={service.name}
367
+ href={service.href}
368
+ className={`group rounded-2xl border p-8 transition-colors ${
369
+ service.accent === "orange"
370
+ ? "border-orange-200 bg-orange-50/70 hover:border-orange-300 hover:bg-orange-50 dark:border-orange-500/20 dark:bg-orange-500/10 dark:hover:border-orange-500/35 dark:hover:bg-orange-500/14"
371
+ : "border-indigo-200 bg-indigo-50/70 hover:border-indigo-300 hover:bg-indigo-50 dark:border-indigo-500/20 dark:bg-indigo-500/10 dark:hover:border-indigo-500/35 dark:hover:bg-indigo-500/14"
372
+ }`}
373
+ >
374
+ <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-500">
375
+ {service.eyebrow}
376
+ </p>
377
+ <h3 className="mt-4 text-2xl font-bold tracking-tight text-slate-900 dark:text-white">
378
+ {service.title}
379
+ </h3>
380
+ <p className="mt-4 text-base leading-8 text-slate-600 dark:text-slate-400">
381
+ {service.description}
382
+ </p>
383
+ <ul className="mt-6 space-y-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
384
+ {service.bullets.map((bullet) => (
385
+ <li key={bullet} className="flex gap-3">
386
+ <span
387
+ className={`mt-2 h-1.5 w-1.5 shrink-0 rounded-full ${
388
+ service.accent === "orange"
389
+ ? "bg-orange-500"
390
+ : "bg-indigo-500"
391
+ }`}
392
+ />
393
+ <span>{bullet}</span>
394
+ </li>
395
+ ))}
396
+ </ul>
397
+ <p
398
+ className={`mt-6 text-sm font-semibold ${
399
+ service.accent === "orange"
400
+ ? "text-orange-600 dark:text-orange-400"
401
+ : "text-indigo-600 dark:text-indigo-400"
402
+ }`}
403
+ >
404
+ {service.cta} →
405
+ </p>
406
+ </Link>
407
+ ))}
408
+ </div>
409
+ </div>
410
+ </section>
411
+
412
<section className="px-6 pb-12 lg:px-8">
413
<div className="mx-auto grid max-w-5xl gap-4 sm:grid-cols-2 lg:grid-cols-4">
414
{proofPoints.map((point) => (
@@ -405,19 +539,18 @@ export default function Home() {
539
<div>
540
<div className="mb-10 max-w-3xl">
541
<p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
408
- smbCloud Deploy
542
+ smbCloud Auth
543
</p>
544
<h3 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
411
- Heroku or Railway?
545
+ Auth0, Clerk, or Supabase Auth?
546
</h3>
547
<p className="mt-4 text-base leading-8 text-slate-600 dark:text-slate-400">
414
- Direct comparisons, honest about where smbCloud fits and where
415
- it doesn't.
548
+ Sign-in, signup, sessions. Hosted, out of the way.
549
</p>
550
</div>
551
419
- <div className="grid gap-6 lg:grid-cols-2">
420
- {deployComparisonPages.map((page) => (
552
+ <div className="grid gap-6 lg:grid-cols-3">
553
+ {authComparisonPages.map((page) => (
554
<Link
555
key={page.href}
556
href={page.href}
@@ -451,18 +584,18 @@ export default function Home() {
584
<div className="border-t border-slate-200 pt-16 dark:border-white/[0.06]">
585
<div className="mb-10 max-w-3xl">
586
<p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
454
- smbCloud Auth
587
+ smbCloud Mail
588
</p>
589
<h3 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
457
- Auth0, Clerk, or Supabase Auth?
590
+ Resend, useSend, or SendGrid?
591
</h3>
592
<p className="mt-4 text-base leading-8 text-slate-600 dark:text-slate-400">
460
- Sign-in, signup, sessions. Hosted, out of the way.
593
+ Domain routes, forwarding, stored inbound mail.
594
</p>
595
</div>
596
597
<div className="grid gap-6 lg:grid-cols-3">
465
- {authComparisonPages.map((page) => (
598
+ {mailComparisonPages.map((page) => (
599
<Link
600
key={page.href}
601
href={page.href}
@@ -496,18 +629,19 @@ export default function Home() {
629
<div className="border-t border-slate-200 pt-16 dark:border-white/[0.06]">
630
<div className="mb-10 max-w-3xl">
631
<p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
499
- smbCloud Mail
632
+ smbCloud Deploy
633
</p>
634
<h3 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
502
- Resend, useSend, or SendGrid?
635
+ Heroku or Railway?
636
</h3>
637
<p className="mt-4 text-base leading-8 text-slate-600 dark:text-slate-400">
505
- Domain routes, forwarding, stored inbound mail.
638
+ Direct comparisons, honest about where smbCloud fits and where
639
+ it doesn't.
640
</p>
641
</div>
642
509
- <div className="grid gap-6 lg:grid-cols-3">
510
- {mailComparisonPages.map((page) => (
643
+ <div className="grid gap-6 lg:grid-cols-2">
644
+ {deployComparisonPages.map((page) => (
645
<Link
646
key={page.href}
647
href={page.href}
@@ -537,6 +671,7 @@ export default function Home() {
671
))}
672
</div>
673
</div>
674
+
675
<div className="border-t border-slate-200 pt-16 dark:border-white/[0.06]">
676
<div className="mb-10 max-w-3xl">
677
<p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
components/header.tsx
+4
-4
@@ -47,10 +47,10 @@ export default function Header() {
47
Home
48
</Link>
49
<Link
50
- href="/services"
50
+ href="/auth"
51
className="hover:text-slate-900 dark:hover:text-white transition-colors"
52
>
53
- Services
53
+ Auth
54
</Link>
55
<Link
56
href="/mail"
@@ -135,11 +135,11 @@ export default function Header() {
135
Home
136
</Link>
137
<Link
138
- href="/services"
138
+ href="/auth"
139
onClick={() => setMenuOpen(false)}
140
className="flex items-center rounded-md px-3 py-2.5 text-sm font-medium text-slate-600 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-white/10 hover:text-slate-900 dark:hover:text-white transition-colors"
141
>
142
- Services
142
+ Auth
143
</Link>
144
<Link
145
href="/mail"