Align marketing site with branding, positioning, and on-page SEO

- Header/footer: restore the Docs link (desktop + mobile); add siGit and Onde Inference to footer Resources. - Home: lead with the slogan "Enterprise power at startup velocity" and name all four services (Deploy, Auth, Mail, GresIQ); fix the broken service word-cycler ("Auth your app"); broaden global + page metadata beyond Deploy. - Voice: remove em dashes site-wide and tidy a negative-parallelism headline. - SEO fixes: - remove dead /supabase-auth-alternative link (empty route, 404) and repoint the clerk page CTA to /auth0-alternative - add 7 missing pages to the sitemap, including /auth - fix content-page canonical + JSON-LD + sitemap URLs to use slugAsParams (/about, not /pages/about) so self-canonicals stop pointing at 404s Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

keypair34 committed Jun 21, 2026 at 15:45 UTC 25cfa4677d2900855b884e01ddca45ab3e80f4c7
12 files changed +111 -48
app/[...slug]/page.tsx
+8 -6
@@ -29,7 +29,7 @@ export async function generateMetadata(props: PageProps): Promise<Metadata> {
29 return genPageMetadata({
30 title: page.title,
31 description: page.description,
32 - path: page.slug,
32 + path: `/${page.slugAsParams}`,
33 });
34 }
35
@@ -47,25 +47,27 @@ export default async function PagePage(props: PageProps) {
47 notFound();
48 }
49
50 + const pagePath = `/${page.slugAsParams}`;
51 +
52 const pageStructuredData = {
53 "@context": "https://schema.org",
54 "@graph": [
55 {
56 "@type": "WebPage",
55 - "@id": absoluteUrl(page.slug),
56 - url: absoluteUrl(page.slug),
57 + "@id": absoluteUrl(pagePath),
58 + url: absoluteUrl(pagePath),
59 name: page.title,
60 description: page.description,
61 isPartOf: {
62 "@id": absoluteUrl("/#website"),
63 },
64 breadcrumb: {
63 - "@id": `${absoluteUrl(page.slug)}#breadcrumb`,
65 + "@id": `${absoluteUrl(pagePath)}#breadcrumb`,
66 },
67 },
68 {
69 "@type": "BreadcrumbList",
68 - "@id": `${absoluteUrl(page.slug)}#breadcrumb`,
70 + "@id": `${absoluteUrl(pagePath)}#breadcrumb`,
71 itemListElement: [
72 {
73 "@type": "ListItem",
@@ -77,7 +79,7 @@ export default async function PagePage(props: PageProps) {
79 "@type": "ListItem",
80 position: 2,
81 name: page.title,
80 - item: absoluteUrl(page.slug),
82 + item: absoluteUrl(pagePath),
83 },
84 ],
85 },
app/auth/page.tsx
+2 -2
@@ -269,7 +269,7 @@ export default function AuthPage() {
269 </h2>
270 <p className="mt-4 text-base leading-7 text-slate-600 dark:text-slate-400">
271 smbCloud Auth covers the full auth lifecycle. Login flows,
272 - session tokens, user management, and access control — all from
272 + session tokens, user management, and access control, all from
273 one service with SDKs that work across platforms.
274 </p>
275
@@ -361,7 +361,7 @@ export default function AuthPage() {
361 Why smbCloud Auth
362 </p>
363 <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
364 - Because auth is not a feature — it is the foundation.
364 + Because auth is the foundation, not a bolted-on feature.
365 </h2>
366 <p className="mt-5 text-base leading-8 text-slate-600 dark:text-slate-400">
367 Every app needs login. Most teams build it from scratch, bolt on a
app/clerk-alternative/page.tsx
+2 -2
@@ -361,10 +361,10 @@ export default function ClerkAlternativePage() {
361 Create free account
362 </Link>
363 <Link
364 - href="/supabase-auth-alternative"
364 + href="/auth0-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
367 + Compare Auth0 alternative
368 </Link>
369 </div>
370 </div>
app/neon-alternative/page.tsx
+4 -4
@@ -26,7 +26,7 @@ const comparisonRows = [
26 label: "Branching",
27 smbcloud:
28 "Standard database management. Use your framework migration tooling the same way you always have.",
29 - neon: "Instant Postgres branching — a core feature for preview environments and development workflows.",
29 + neon: "Instant Postgres branching, a core feature for preview environments and development workflows.",
30 },
31 {
32 label: "Why teams pick it",
@@ -77,7 +77,7 @@ export const metadata: Metadata = {
77 ...genPageMetadata({
78 title: "Neon alternative for teams that want always-on managed Postgres",
79 description:
80 - "Looking for a Neon alternative? smbCloud GresIQ is an always-on data layer inside the same platform as your app, auth, and mail — no cold starts, no serverless trade-offs.",
80 + "Looking for a Neon alternative? smbCloud GresIQ is an always-on data layer inside the same platform as your app, auth, and mail, with no cold starts or serverless trade-offs.",
81 path: "/neon-alternative",
82 keywords: [
83 "Neon alternative",
@@ -160,7 +160,7 @@ export default function NeonAlternativePage() {
160 Neon built something clever with serverless Postgres. But
161 scale-to-zero and cold starts are the wrong trade-off for most
162 server-side apps. smbCloud GresIQ gives you an always-on data layer
163 - inside the same platform as your app, auth, and mail — with no
163 + inside the same platform as your app, auth, and mail, with no
164 serverless surprises.
165 </p>
166
@@ -209,7 +209,7 @@ export default function NeonAlternativePage() {
209 <ul className="mt-5 space-y-4 text-sm leading-7 text-slate-600 dark:text-slate-400">
210 <li className="flex gap-3">
211 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
212 - <span>Always-on relational database management — no cold starts, no wake-up latency.</span>
212 + <span>Always-on relational database management, with no cold starts or wake-up latency.</span>
213 </li>
214 <li className="flex gap-3">
215 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
app/page.tsx
+16 -22
@@ -6,10 +6,7 @@ import { FaApple, FaGooglePlay, FaWindows } from "react-icons/fa";
6 import { StructuredData } from "@/components/structured-data";
7 import siteMetadata from "@/content/siteMetadata";
8 import { absoluteUrl, genPageMetadata } from "./seo";
9 -import {
10 - ServiceWordCycler,
11 - FrameworkWordCycler,
12 -} from "@/components/word-cycler";
9 +import { FrameworkWordCycler } from "@/components/word-cycler";
10
11 const proofPoints = [
12 {
@@ -129,16 +126,6 @@ const authComparisonPages = [
126 "See when smbCloud Auth is a better fit and when Clerk still makes more sense",
127 ],
128 },
132 - {
133 - href: "/supabase-auth-alternative",
134 - eyebrow: "Auth comparison",
135 - title: "Supabase Auth alternative",
136 - description: "Just auth, without adopting a full backend platform.",
137 - bullets: [
138 - "Compare focused auth flows against auth bundled inside a larger platform",
139 - "See when smbCloud Auth is the cleaner fit for accounts and sessions",
140 - ],
141 - },
129 ];
130
131 const gresiqComparisonPages = [
@@ -211,11 +198,12 @@ const mailComparisonPages = [
198
199 export const metadata: Metadata = {
200 ...genPageMetadata({
214 - title: "Deploy apps, handle auth, and run domain mail from one platform",
201 + title: "Deploy, Auth, Mail, and GresIQ on one platform",
202 description:
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.",
203 + "smbCloud Platform brings four services together: ship Node.js, Rails, and Vapor apps with Deploy, handle sign-in and accounts with Auth, route domain email with Mail, and run your database with GresIQ.",
204 path: "/",
205 keywords: [
206 + "smbCloud Platform",
207 "SSH-first deploy platform",
208 "deploy Node.js app",
209 "deploy Ruby on Rails app",
@@ -223,6 +211,7 @@ export const metadata: Metadata = {
211 "hosted auth",
212 "authentication service",
213 "domain mail routing",
214 + "managed Postgres database",
215 "Heroku alternative",
216 "Auth0 alternative",
217 "Resend alternative",
@@ -318,12 +307,17 @@ export default function Home() {
307 </p>
308
309 <h1 className="text-5xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-7xl leading-[1.05]">
321 - <ServiceWordCycler />{" "}
322 - <span className="text-slate-900 dark:text-white">your app.</span>
310 + Enterprise power at{" "}
311 + <span className="text-indigo-600 dark:text-indigo-400">
312 + startup velocity
313 + </span>
314 + .
315 </h1>
316
317 <p className="mx-auto mt-8 max-w-2xl text-lg leading-8 text-slate-600 dark:text-slate-400">
326 - Don't just build. Deliver your <FrameworkWordCycler /> app.
318 + smbCloud Platform brings Deploy, Auth, Mail, and GresIQ together. Ship
319 + your <FrameworkWordCycler /> app without running four separate
320 + vendors.
321 </p>
322
323 <div className="mt-10 flex flex-col items-center justify-center gap-4 sm:flex-row">
@@ -333,13 +327,13 @@ export default function Home() {
327 rel="noopener noreferrer"
328 className="w-full 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] sm:w-auto"
329 >
336 - Start deploying →
330 + Start free →
331 </Link>
332 <Link
339 - href="/posts/cli"
333 + href="/services"
334 className="inline-flex w-full items-center justify-center rounded-lg border border-slate-300 dark:border-white/[0.12] px-8 py-3.5 text-sm font-semibold text-slate-700 dark:text-slate-200 transition-colors hover:bg-slate-50 dark:hover:bg-white/[0.04] sm:w-auto"
335 >
342 - Install the CLI
336 + Explore the platform
337 </Link>
338 </div>
339 </div>
app/planetscale-alternative/page.tsx
+3 -3
@@ -69,7 +69,7 @@ const faqs = [
69 {
70 question: "What happens to my schema migrations with GresIQ?",
71 answer:
72 - "You use your framework's standard migration tooling. GresIQ handles connection and service management — it does not add a new migration layer on top of your existing workflow.",
72 + "You use your framework's standard migration tooling. GresIQ handles connection and service management. It does not add a new migration layer on top of your existing workflow.",
73 },
74 {
75 question: "Who should consider switching from PlanetScale to GresIQ?",
@@ -82,7 +82,7 @@ export const metadata: Metadata = {
82 ...genPageMetadata({
83 title: "PlanetScale alternative for teams that want less tooling",
84 description:
85 - "Looking for a PlanetScale alternative? smbCloud GresIQ manages the data layer inside the same platform as your app, auth, and mail — no schema branching workflow required.",
85 + "Looking for a PlanetScale alternative? smbCloud GresIQ manages the data layer inside the same platform as your app, auth, and mail, with no schema branching workflow required.",
86 path: "/planetscale-alternative",
87 keywords: [
88 "PlanetScale alternative",
@@ -165,7 +165,7 @@ export default function PlanetScaleAlternativePage() {
165 PlanetScale is a serious platform for teams that need MySQL at
166 scale. But most teams do not need branch-based schema management.
167 smbCloud GresIQ manages the data layer inside the same platform as
168 - your app, auth, and mail — with your normal migration workflow and
168 + your app, auth, and mail, with your normal migration workflow and
169 nothing extra to learn.
170 </p>
171
app/sitemap.ts
+31 -1
@@ -21,6 +21,11 @@ export default function sitemap(): MetadataRoute.Sitemap {
21 changeFrequency: "weekly",
22 priority: 0.9,
23 },
24 + {
25 + url: absoluteUrl("/auth"),
26 + changeFrequency: "weekly",
27 + priority: 0.9,
28 + },
29 {
30 url: absoluteUrl("/posts"),
31 changeFrequency: "weekly",
@@ -56,6 +61,31 @@ export default function sitemap(): MetadataRoute.Sitemap {
61 changeFrequency: "weekly",
62 priority: 0.8,
63 },
64 + {
65 + url: absoluteUrl("/auth0-alternative"),
66 + changeFrequency: "weekly",
67 + priority: 0.8,
68 + },
69 + {
70 + url: absoluteUrl("/clerk-alternative"),
71 + changeFrequency: "weekly",
72 + priority: 0.8,
73 + },
74 + {
75 + url: absoluteUrl("/supabase-alternative"),
76 + changeFrequency: "weekly",
77 + priority: 0.8,
78 + },
79 + {
80 + url: absoluteUrl("/neon-alternative"),
81 + changeFrequency: "weekly",
82 + priority: 0.8,
83 + },
84 + {
85 + url: absoluteUrl("/planetscale-alternative"),
86 + changeFrequency: "weekly",
87 + priority: 0.8,
88 + },
89 ];
90
91 const postRoutes: MetadataRoute.Sitemap = allPosts
@@ -68,7 +98,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
98 }));
99
100 const pageRoutes: MetadataRoute.Sitemap = allPages.map((page) => ({
71 - url: absoluteUrl(page.slug),
101 + url: absoluteUrl(`/${page.slugAsParams}`),
102 lastModified: page.lastmod,
103 changeFrequency: "yearly",
104 priority: 0.5,
app/supabase-alternative/page.tsx
+5 -5
@@ -9,7 +9,7 @@ const comparisonRows = [
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.",
12 + "A full BaaS platform: Postgres, auth, storage, realtime, edge functions, all bundled together.",
13 },
14 {
15 label: "Best fit",
@@ -64,7 +64,7 @@ const faqs = [
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.",
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?",
@@ -82,7 +82,7 @@ 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.",
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",
@@ -164,7 +164,7 @@ export default function SupabaseAlternativePage() {
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
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
@@ -219,7 +219,7 @@ export default function SupabaseAlternativePage() {
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>
222 + <span>Built to stay focused: a data layer, not a backend platform.</span>
223 </li>
224 </ul>
225 </div>
components/footer.tsx
+17 -1
@@ -12,10 +12,26 @@ const companyLinks = [
12 const resourceLinks = [
13 { href: "/posts", label: "Blog" },
14 { href: "/kti", label: "KTI (ID)" },
15 + {
16 + href: "https://docs.smbcloud.xyz",
17 + label: "Docs",
18 + external: true,
19 + },
20 + {
21 + href: "https://sigit.si/",
22 + label: "siGit",
23 + external: true,
24 + },
25 + {
26 + href: "https://ondeinference.com/",
27 + label: "Onde Inference",
28 + external: true,
29 + },
30 {
31 href: "https://github.com/smbcloudXYZ",
32 label: "GitHub",
33 external: true,
34 + icon: FaGithub,
35 },
36 ];
37
@@ -73,7 +89,7 @@ export default function Footer() {
89 rel="noopener noreferrer"
90 className="flex items-center gap-1.5 hover:text-slate-900 dark:hover:text-slate-300 transition-colors"
91 >
76 - <FaGithub className="h-3.5 w-3.5" />
92 + {link.icon && <link.icon className="h-3.5 w-3.5" />}
93 {link.label}
94 </Link>
95 ) : (
components/header.tsx
+17
@@ -52,6 +52,14 @@ export default function Header() {
52 >
53 Mail
54 </Link>
55 + <Link
56 + href="https://docs.smbcloud.xyz"
57 + target="_blank"
58 + rel="noopener noreferrer"
59 + className="hover:text-slate-900 dark:hover:text-white transition-colors"
60 + >
61 + Docs
62 + </Link>
63 </nav>
64
65 {/* Right side */}
@@ -135,6 +143,15 @@ export default function Header() {
143 >
144 Mail
145 </Link>
146 + <Link
147 + href="https://docs.smbcloud.xyz"
148 + target="_blank"
149 + rel="noopener noreferrer"
150 + onClick={() => setMenuOpen(false)}
151 + 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"
152 + >
153 + Docs
154 + </Link>
155 <div className="pt-2 pb-1">
156 <Link
157 href="https://console.smbcloud.xyz"
content/posts/new-look.mdx
+1 -1
@@ -44,4 +44,4 @@ The platform itself. Deployments work the same way. Your SSH keys, projects, and
44
45 We are working on better docs, a smoother onboarding flow for new projects, and tighter links between the console and the CLI.
46
47 -— The smbCloud team
47 +The smbCloud team
content/siteMetadata.js
+5 -1
@@ -5,13 +5,17 @@ const siteMetadata = {
5 headerTitle: "smbCloud",
6 tagline: "Enterprise power at startup velocity",
7 description:
8 - "Enterprise power at startup velocity. smbCloud is an SSH-first cloud deploy platform for small teams shipping Node.js, Ruby on Rails, and Swift/Vapor apps with one-command deploys, live logs, and fast rollbacks.",
8 + "Enterprise power at startup velocity. smbCloud Platform brings four services together: Deploy ships your Node.js, Rails, and Vapor apps with one command, Auth handles sign-in and accounts, Mail routes your domain email, and GresIQ runs your database. One platform instead of four vendors.",
9 keywords: [
10 "smbCloud",
11 + "smbCloud Platform",
12 "SSH deploy platform",
13 "Node.js deployment",
14 "Ruby on Rails deployment",
15 "Swift Vapor deployment",
16 + "hosted auth",
17 + "domain mail routing",
18 + "managed Postgres database",
19 "developer platform",
20 "cloud deployment",
21 "app hosting for developers",