Files
zeekayandGitHub 3df66c3990 i18n: /m* through /r* and the product kits draw their words through t (#70)
Pages from /machines to /risk, the model pages, and the kits they are made of
(page-kit, ProductLanding, LayerPage, Stack, the models kit, band's Head) mark
authored copy where it is written and draw it in the reader's language. A server
page marks a literal phrase('…') or wraps it in <T>; a client page calls t. The
kits translate a string prop through useSay (components/marketing/say), so a
page passes phrase('…') and markup passes as written. An arrow that points
turns over right to left (data-i18n-mirror).

Rebased on main: the fold-based heroes (Fold, PageHero, MachinesHero, the
product and layer pages) keep main's structure and copy, with their label,
title and lede marked phrase. /platform is main's CloudLanding; the deleted
/platform/layers and the old referral components stay deleted.

Claude-Session: https://claude.ai/code/session_015XYKLjZtDTJEnMo4eK3AFH
2026-10-30 00:18:44 -07:00

81 lines
4.2 KiB
TypeScript

'use client'
import { ArrowRight, FileCode, GitBranch, Layers, RefreshCw, Settings, ShieldCheck, Workflow } from 'lucide-react'
import { ProductLanding } from '@/components/product/ProductLanding'
import { ProductFooter } from '@/components/products/ProductFooter'
import { phrase } from '@hanzo/i18n'
/**
* Hanzo Operator, through the ONE product kit.
*
* The largest cluster left: TWELVE pages — engine, gateway, guard, ingress,
* jin, metrics, o11y, operator, sentinel, skills, telemetry, visor — at 85%+
* identical className sets, each a hero, a six-card grid and a call to action
* written out again. All twelve pass one typed props object to
* `ProductLanding`. See LLM.md, "Tailwind is NOT gone".
*
* EVERY WORD IS THE ONE THAT WAS HERE. ProductFooter came out of the final
* card's `max-w-3xl` wrapper, where it had been rendering narrower than on
* every other product page.
*/
export default function HanzoOperatorPage() {
return (
<>
<ProductLanding
badge={"hanzoai/operator"}
badgeIcon={Settings}
title={"Hanzo Operator"}
tagline={phrase("One binary that runs the stack on Kubernetes")}
lede={phrase("Declare a Service, a Datastore, a Gateway or an Ingress. The Deployment, StatefulSet, PVC, autoscaler, disruption budget, network policy and KMS-synced secret behind it get created — and stay that way, because one loop keeps checking.")}
ctas={[
{ label: phrase("View on GitHub"), href: "https://github.com/hanzoai" },
]}
what={{
title: phrase("Declare the thing, not the thirty objects"),
sub: phrase("One reconcile loop, an API group you choose at install, and Kinds that already know what a service in this stack needs."),
pillars: [
{
icon: Layers,
title: phrase("Kinds that know the stack"),
body: phrase("Service covers most workloads. Datastore covers the stateful ones and dispatches on its type, with SQL, KV, DocDB and S3 as thin facades over it. Gateway, Ingress, DNS, Base, IAM, KMS and MPC are their own Kinds, because each one wires up differently."),
},
{
icon: ShieldCheck,
title: phrase("Secrets come from KMS"),
body: phrase("A KMSSecret is materialized beside the workload and synced from kms.hanzo.ai. What lives in git is the path to a secret, never the secret."),
},
{
icon: RefreshCw,
title: phrase("Drift is reverted, and said out loud"),
body: phrase("Every sweep reads each object before it applies, then logs what it did to it: created, reverted, or already in sync. The resync interval is per-resource and clamped into a safe band, so a bad number can't turn the loop into a hot loop."),
},
{
icon: GitBranch,
title: phrase("Git is a source, and it never deletes"),
body: phrase("Point it at a repo and it applies what's there, on a tight poll a push webhook can interrupt for an instant sweep. A file removed from git is left alone — the plan type has no delete case, so pruning isn't something a bug can cause."),
},
{
icon: Workflow,
title: phrase("Every write is attributable"),
body: phrase("Server-side apply under its own field manager, so a git-driven apply never fights a per-Kind reconcile. Turn on autoscaling and the Deployment ships with no replica count at all — the autoscaler owns that field, alone."),
},
{
icon: FileCode,
title: phrase("Install is one command"),
body: phrase("operator install lays down the CRDs, namespace, RBAC and Deployment. operator up does that and applies your resources behind it. Both are server-side apply, so running either again changes nothing."),
},
],
}}
finalCta={{
title: phrase("Get started with Hanzo Operator"),
buttons: [
{ label: phrase("View on GitHub"), href: "https://github.com/hanzoai" },
],
}}
/>
<ProductFooter slug={"operator"} name={"Operator"} />
</>
)
}