Files
zooqueen 75c4f1f641 One product answers with one name, route, command and docs page
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.
2026-09-06 23:18:24 -07:00

93 lines
4.4 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 { ArrowRight, Apple, Bot, Brain, Cloud, Lock, MonitorSmartphone, Settings, Wifi, Zap } from 'lucide-react'
import { ProductLanding } from '@/components/product/ProductLanding'
import { ProductFooter } from '@/components/products/ProductFooter'
/**
* Hanzo Desktop, through the ONE product kit.
*
* A fourth cluster of the same duplicated shape — computer, desktop, gallery
* and world scored 83–97% identical on their className sets. Hero, a six-card
* grid, a call to action, written out four times. They now pass one typed
* props object to `ProductLanding` and carry zero layout classes of their own.
* See LLM.md, "Tailwind is NOT gone".
*
* EVERY WORD IS THE ONE THAT WAS HERE, with the same one deletion /node and
* /network took: a trailing "Get started with X" card whose two links were the
* docs and GitHub, both of which the hero and the card above it already reach.
* ProductFooter was nested inside it, so it also rendered narrower than on
* every other product page; out here it is the width it is everywhere else.
*/
export default function HanzoDesktopPage() {
return (
<>
<ProductLanding
badge={"Native Desktop Client"}
badgeIcon={MonitorSmartphone}
title={"Hanzo Desktop"}
tagline={"Build agents on your own machine"}
lede={"A window for making agents and letting them work together. Each one runs on a model you pick — local or on Hanzo Cloud — and what it touches stays on the machine unless you send it somewhere. macOS, Windows and Linux; 4GB of memory and 2GB of disk."}
ctas={[
{ label: "Download", href: "https://docs.hanzo.ai/docs/apps/desktop", icon: ArrowRight },
{ label: "GitHub", href: "https://github.com/hanzoai" },
]}
what={{
title: "What you can build in it",
sub: "Free and open source. Download it, and the first agent is a few minutes of clicking.",
pillars: [
{
icon: Cloud,
title: "Nothing to scaffold",
body: "An agent is made in the window: give it a job, some tools, and a model. There is no project to create first and no file to check in before it exists.",
},
{
icon: Brain,
title: "Local model or cloud model, per agent",
body: "Point one agent at a model running on your machine and another at one on Hanzo Cloud. It is a setting on the agent, not a decision about the whole install.",
},
{
icon: Bot,
title: "They work together",
body: "Agents share context and hand steps to each other, so a job that needs several of them is one workflow instead of you copying between three chat windows.",
},
{
icon: Wifi,
title: "It works with the network off",
body: "With a local model pinned, an agent keeps running when the connection goes. Nothing has to be uploaded for it to do its job.",
},
{
icon: Lock,
title: "Your keys stay on your machine",
body: "Keys and the data an agent touches stay local. An agent that has to pay for something spends from a key you hold, on hardware you own.",
},
{
icon: Settings,
title: "MCP is how it reaches your tools",
body: "Agents speak the Model Context Protocol, so a tool you have already connected elsewhere works here without a second integration written for this app.",
},
],
}}
stats={{
title: "Available everywhere you work",
sub: "Native installers for macOS (Apple Silicon + Intel), Windows, and Linux.",
items: [
{ icon: Apple, value: "macOS", label: "arm64 + intel" },
{ icon: MonitorSmartphone, value: "Windows", label: "x64 + arm64" },
{ icon: Zap, value: "Linux", label: "deb + rpm + AppImage" },
],
}}
finalCta={{
title: "Download it and build one",
sub: "Pick a model, describe the job, hand it the tools. If the model is a local one, the whole thing runs without an account.",
buttons: [
{ label: "View on GitHub", href: "https://github.com/hanzoai" },
],
}}
/>
<ProductFooter slug={"desktop"} name={"Desktop"} />
</>
)
}