mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
/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]>
99 lines
4.7 KiB
TypeScript
99 lines
4.7 KiB
TypeScript
'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" />
|
||
</>
|
||
)
|
||
}
|