mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
The CLI lines on the product pages were written from the product name -- hanzo dns zones, hanzo kms keys -- and several were not commands the binary has. So the command moves into lib/product.ts, which assembles the rest from what is already stated: the catalog names the product and its route, pages.json names what the catalog does not carry, and products-metadata answers for docs, where null means docs publishes nothing and the link drops. Every CLI line in that table was run against the binary. A product absent from it has no command and its page prints none; nothing composes a verb out of a name. Both blocks that draw it import the Product type rather than declaring their own, which leaves the table the only place a command can be written. The catalog also moves out of package.json into pnpm-workspace.yaml, where pnpm reads it, so the versions are stated once.
80 lines
3.8 KiB
TypeScript
80 lines
3.8 KiB
TypeScript
'use client'
|
|
|
|
import { ArrowRight, GitBranch, Globe, Layers, Route, Server, Shield, Zap } from 'lucide-react'
|
|
import { ProductLanding } from '@/components/product/ProductLanding'
|
|
import { ProductFooter } from '@/components/products/ProductFooter'
|
|
|
|
/**
|
|
* Hanzo Ingress, 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 HanzoIngressPage() {
|
|
return (
|
|
<>
|
|
<ProductLanding
|
|
badge={"hanzoai/ingress"}
|
|
badgeIcon={Route}
|
|
title={"Hanzo Ingress"}
|
|
tagline={"The entry point of a Kubernetes cluster"}
|
|
lede={"It terminates TLS, matches the hostname, and forwards to the service behind it. It reads the Ingress resources you already write, so there is nothing new to declare and nothing to inject beside your pods."}
|
|
ctas={[
|
|
{ label: "View on GitHub", href: "https://github.com/hanzoai" },
|
|
]}
|
|
what={{
|
|
title: "What happens at the edge",
|
|
sub: "One static binary in front of every hostname the cluster answers for.",
|
|
pillars: [
|
|
{
|
|
icon: Layers,
|
|
title: "It reads what you already wrote",
|
|
body: "Standard networking.k8s.io/v1 Ingress is the primary source, alongside IngressRoute for the things a plain Ingress can't say, Gateway API, and TOML or YAML from disk. It registers as the cluster's default IngressClass, so an Ingress that names none is still picked up.",
|
|
},
|
|
{
|
|
icon: Shield,
|
|
title: "Certificates it fetches itself",
|
|
body: "Let's Encrypt provisioning and renewal, wildcards included. A new hostname gets a certificate without anyone filing a ticket for one.",
|
|
},
|
|
{
|
|
icon: GitBranch,
|
|
title: "Middleware you compose by annotation",
|
|
body: "Rate limiting, retry with exponential backoff, circuit breaking, compression, header rewriting, IP allowlists, redirects, prefix stripping. Name one in an annotation, or chain several into a named pipeline and name that.",
|
|
},
|
|
{
|
|
icon: Zap,
|
|
title: "Routes change without a restart",
|
|
body: "Edit an Ingress and the routing table follows — no reload, no dropped connection. A backend that stops answering health checks is taken out of rotation and put back when it recovers.",
|
|
},
|
|
{
|
|
icon: Globe,
|
|
title: "It can serve the files itself",
|
|
body: "The static middleware serves a site export straight from disk or from object storage — pricing.html, docs/index.html, hashed asset chunks, a 404 page. A SPA or a docs bundle needs no pod of its own.",
|
|
},
|
|
{
|
|
icon: Server,
|
|
title: "One binary, on the port",
|
|
body: "No runtime dependencies. It runs in host-network mode and binds 80 and 443 directly, with every Linux capability dropped except the one that lets it.",
|
|
},
|
|
],
|
|
}}
|
|
finalCta={{
|
|
title: "Get started with Hanzo Ingress",
|
|
buttons: [
|
|
{ label: "View on GitHub", href: "https://github.com/hanzoai" },
|
|
],
|
|
}}
|
|
/>
|
|
<ProductFooter slug={"ingress"} name={"Ingress"} />
|
|
</>
|
|
)
|
|
}
|