Files
zeekayandHanzo Dev 4e4ef68a9e node and network were the last two copies of the product layout
/node and /network are one shape: tokenise every word to X in both and the
diff is a single line. They are also the shape /ledger, /docdb, /database and
/billing already had, so they were the fifth and sixth hand-written copies of
a hero, a card grid and a call to action that ProductLanding owns. Both now
pass one typed props object and carry zero layout classes.

Where this differs from that trio: those four each had TWO card sections, so
splitting six cards into 3 pillars + 3 features carried the source's own two
headings. This pair has ONE section of six, so a split would have needed a
heading nobody wrote. All six are pillars. Every word is the one that was
there.

One deletion each, with its reason: both ended with a "Get started with X"
card offering the docs and GitHub, which the hero already reaches and which
ProductFooter's own "Get Node" / "Get Network" block reaches again below it —
three trailing calls to action, the middle one carrying no destination of its
own. The surviving card is the one that does: "Put a machine on the fabric"
keeps the link to /network, "Two ends of the same fabric" keeps the API key.

The kit was rendering every CTA as a bare anchor, so an address on this site
threw the loaded app away and fetched the document again. These two cross-link
to each other, which is how that surfaced; /learn, /risk, /investors and
/playground were losing client navigation the same silent way. One Anchor
decides it from the href.

tailwind floor 55,919 -> 55,373 across 425 files. LLM.md was quoting 58,424
across 456 and had never mentioned the ratchet that now holds the line; both
corrected, with the note that the number is read off tailwind.json and not off
the paragraph.

Build green, 100/100 gates, both pages rendered at 1440 and 390 with no
overflow, and the /node -> /network click verified to stay in the app.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-23 18:59:56 -07:00

99 lines
4.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use client'
import { Activity, ArrowRight, Coins, Container, Cpu, Server, Shield } from 'lucide-react'
import { ProductLanding } from '@/components/product/ProductLanding'
import { ProductFooter } from '@/components/products/ProductFooter'
/**
* Node, through the ONE product kit.
*
* The fifth and sixth hand-rolled copies of the layout `ProductLanding` owns
* were /node and /network — one shape, as a token-blind diff of the two shows
* (tokenise every word to X in both and diff: one line differs). They are gone
* the same way /ledger, /docdb, /database and /billing went.
*
* WHERE THIS DIFFERS FROM THAT TRIO, AND WHY. Those four each had TWO card
* sections, so splitting their six cards into 3 pillars + 3 features carried
* the source's own two headings. This pair has ONE section of six under ONE
* heading, so a 3+3 split would need a second heading nobody wrote. All six
* are pillars instead, which is one section, one heading, six cards — what the
* page said. The kit numbers them 01–06; the hand-rolled grid did not, and
* that is the only visible addition.
*
* EVERY WORD IS THE ONE THAT WAS HERE.
*
* The one deletion, with its reason: the page ended with a "Get started with
* Node" card whose two buttons were the hero's two buttons at the same two
* addresses — a heading and no destination. The final card is the section that
* carried a destination the reader could not otherwise reach, "Put a machine
* on the fabric", and it keeps its link to /network.
*/
const DOCS = 'https://docs.hanzo.ai/docs/proof-of-ai/node-operator'
const GITHUB = 'https://github.com/hanzoai'
export default function NodePage() {
return (
<>
<ProductLanding
badge="Decentralized AI Compute"
badgeIcon={Server}
title="Hanzo Node"
lede="hanzod is the node that runs hanzo.network. It joins the fabric over a peer-to-peer transport, serves models to whatever the cluster routes to it, and settles the work on Lux. One Rust binary, started with hanzo fabric up."
ctas={[
{ label: 'Run a Node', href: DOCS, icon: ArrowRight },
{ label: 'View Source', href: GITHUB },
]}
what={{
eyebrow: 'Node Operator',
title: 'Why Run a Hanzo Node',
sub: 'What a machine starts doing once it is on the fabric',
pillars: [
{
icon: Server,
title: 'The hardware you already have',
body: 'Consumer cards, datacenter accelerators, or Apple Silicon. The node reports what it can serve and the cluster routes to it on that basis.',
},
{
icon: Coins,
title: 'Paid out of the block reward',
body: "A tenth of the block reward is set aside for AI compute. A provider's share is scaled by the level of the work — embeddings and small models, chat-sized models, large and multimodal, training, or specialized compute like proofs.",
},
{
icon: Cpu,
title: 'The cluster knows who has what',
body: 'Ask it for models and it lists everything served across the peers your node can see. Ask it to route and it names who would answer; ask for placement and it says where a model nobody serves should be loaded.',
},
{
icon: Shield,
title: 'Attested, then trusted',
body: "A node's confidential-compute tier is attested rather than declared, and its share is scaled by that tier and by a trust score. Claiming a capability is not the same as proving one.",
},
{
icon: Container,
title: 'Three commands, no orchestration',
body: 'up starts it on the active network, join switches network and starts it, stop signals the process this CLI started by its recorded pid — and never anything else that happens to share the name.',
},
{
icon: Activity,
title: 'Settled on Lux',
body: 'Work is ordered on the Hanzo L2 and committed to Lux as a Merkle root, so what a node did is anchored where it cannot quietly be rewritten later.',
},
],
}}
finalCta={{
icon: Container,
title: 'Put a machine on the fabric',
sub: 'Install the CLI, pick a network, run hanzo fabric up. The node binary is resolved from your PATH or an env var — the CLI runs it and never builds it for you.',
buttons: [
{ label: 'Quickstart', href: DOCS, icon: ArrowRight },
{ label: 'About the Network', href: '/network' },
{ label: 'View on GitHub', href: GITHUB },
],
}}
/>
<ProductFooter slug="node" name="Node" />
</>
)
}