mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
/platform was MOVED to /cloud; now the page lives at /platform and /cloud forwards there. cloud.hanzo.ai's root is the same page: deploy.yml copies platform.html over that host's index.html, and the canonical names hanzo.ai/platform. /cloud keeps its route for go get hanzo.ai/cloud and draws the same page with its canonical on /platform, so an edge still forwarding /platform to /cloud cannot bounce a reader between the two. Every internal link, the nav's Overview and Platform, the landing's stack link, the local server and the gates now name /platform.
53 lines
2.2 KiB
TypeScript
53 lines
2.2 KiB
TypeScript
import type { Metadata } from "next"
|
|
import CloudLanding from "@/components/cloud/CloudLanding"
|
|
import { ogImages, twitterImages } from '@/lib/constants/og'
|
|
|
|
// The platform's one page: hanzo.ai/platform, and cloud.hanzo.ai's root, which
|
|
// deploy.yml makes by copying platform.html over that host's index.html (and
|
|
// scripts/canonical.mjs points that root back here). /cloud forwards to it;
|
|
// MOVED in lib/publish says so once. The CloudLanding body is served under the
|
|
// shared (marketing) header and footer. This server component owns the SEO.
|
|
//
|
|
// One title, three places: the page, its share card and its twitter card, so a
|
|
// share of either host announces the same page.
|
|
//
|
|
// IT SELLS THE ABSTRACTION, NOT THE INVENTORY. The description used to count
|
|
// the catalog's categories and argue an assembly tax, which was the page's
|
|
// argument at the time. The page argues the abstraction now — put a model, an
|
|
// agent, a database and a production application somewhere without assembling
|
|
// a hyperscaler out of parts first — so the card says that. A share card that
|
|
// sells a section the page no longer has is a lie nobody would notice.
|
|
//
|
|
// NO NUMBER IS BAKED HERE. A description is written at BUILD time and read by
|
|
// scrapers months later, which makes it the one place a count cannot be kept
|
|
// true: the served catalog's providers are switched on and off between builds.
|
|
// The page states its one number where it can ASK for it (`useSummary`), and
|
|
// the metadata states the breadth without asserting an arithmetic it has no way
|
|
// to recheck.
|
|
const TITLE = 'Hanzo Platform — one stack, down to the kernel'
|
|
const SUMMARY =
|
|
'Models, agents, applications, data and infrastructure on one operating plane, from GPU kernel to autonomous agent. Run it managed or on infrastructure you control.'
|
|
|
|
export const metadata: Metadata = {
|
|
title: TITLE,
|
|
description: SUMMARY,
|
|
openGraph: {
|
|
title: TITLE,
|
|
description: SUMMARY,
|
|
url: "https://hanzo.ai/platform",
|
|
siteName: "Hanzo Platform",
|
|
type: "website",
|
|
images: ogImages(TITLE),
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: TITLE,
|
|
description: SUMMARY,
|
|
images: twitterImages,
|
|
},
|
|
}
|
|
|
|
export default function PlatformPage() {
|
|
return <CloudLanding />
|
|
}
|