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
3.7 KiB
TypeScript

'use client'
import { ArrowRight, Activity, BarChart3, Flame, LineChart, ScrollText, Search, Workflow } from 'lucide-react'
import { ProductLanding } from '@/components/product/ProductLanding'
import { ProductFooter } from '@/components/products/ProductFooter'
import { phrase } from '@hanzo/i18n'
/**
* Hanzo O11y, 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 HanzoO11yPage() {
return (
<>
<ProductLanding
badge={"o11y.hanzo.ai"}
badgeIcon={LineChart}
title={"Hanzo O11y"}
tagline={phrase("Traces, metrics and logs, in one place")}
lede={phrase("Your services send OpenTelemetry; it lands in one column store and comes back as APM, logs, traces, metrics and exceptions. Because it is one store, a span and the log line it produced are one query rather than two tabs and a copied timestamp.")}
ctas={[
{ label: phrase("View on GitHub"), href: "https://github.com/hanzoai/o11y" },
]}
what={{
title: phrase("One store, one query language"),
sub: phrase("Every panel scopes to your org from the token, so a shared deployment still answers one tenant at a time."),
pillars: [
{
icon: Workflow,
title: phrase("Traces and APM"),
body: phrase("Follow one request across services, queues and databases. Sort by the slow tail rather than the average, and open the span that spent the time."),
},
{
icon: BarChart3,
title: phrase("Metrics"),
body: phrase("Write PromQL if you already have it, or build the query in the UI if you do not. Both run against the same store the traces are in."),
},
{
icon: ScrollText,
title: phrase("Logs"),
body: phrase("Search structured logs by field, not by regex over a blob. A span carries the id its log lines were written with, so the pivot is a click."),
},
{
icon: Flame,
title: phrase("Exceptions"),
body: phrase("Errors are grouped and counted rather than listed, so a thousand of the same stack trace is one row with a number on it — and it links to the trace that raised it."),
},
{
icon: Search,
title: phrase("Dashboards and alerts"),
body: phrase("An alert rule is a saved query, so what fires at three in the morning is something you already looked at. It reaches PagerDuty, Opsgenie, Slack, Teams, email or a webhook."),
},
{
icon: Activity,
title: phrase("OpenTelemetry on the wire"),
body: phrase("OTLP over gRPC on 4317 and HTTP on 4318. Any OTel SDK or collector points at it by setting one endpoint variable — there is no agent of ours to install."),
},
],
}}
finalCta={{
title: phrase("Point an OTLP endpoint at it"),
buttons: [
{ label: phrase("View on GitHub"), href: "https://github.com/hanzoai/o11y" },
],
}}
/>
<ProductFooter slug={"o11y"} name={"O11y"} />
</>
)
}