Files
hanzo.ai/app/(marketing)/enterprise/page.tsx
zeekay 1a332a2e43 The calculator is linked again
bbbf0800 took /pricing's line to the calculator, the last link to /calculator
in any page's HTML, so the sitemap offered a page nothing linked (sitemap.spec).
/enterprise's savings band, which runs the same token calculator, links the
whole operating-cost model under it.

Claude-Session: https://claude.ai/code/session_01BLLMyBFSvAfCt7ZGqYuiEz
2026-10-22 13:05:18 -07:00

272 lines
13 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'
/**
* /enterprise — the page a large organization reads before it talks to us.
*
* One call to action, "Talk to sales" (/contact-sales), at the top and again at
* the end; the closing call the marketing layout mounts is quiet here
* (components/marketing/Closing `QUIET`).
*
* Every claim has a record behind it:
* - what Enterprise includes: the `enterprise` plan of GET /v1/billing/plans,
* and Team's "Single sign-on, roles and an audit log" under it;
* - where it runs: the same plan (components/sales/Deploy);
* - security: the mechanisms /trust states from the code, and the Privacy
* Policy's Service Only default for business accounts (content/legal/privacy.md);
* - proof: the research runs and the data room's case studies
* (components/sales/Proof);
* - savings: the same tokens at list, on Hanzo Cloud and on the reader's
* own GPUs, every rate read from the price list and the plan list when the
* page opens (components/sales/Savings);
* - own GPUs: Zen 6's prefill as Hanzo measured it on one DGX Spark
* (lib/data/zen6-spark.json) and what a Zen 6 Max rack is made of, from
* NVIDIA's own pages (components/enterprise/Rack);
* - working with Hanzo: the affiliate programme, the White-label and agency
* plans as the plan list sells them, and the clouds Hanzo deploys on
* (components/sales/Partners). No partner is named: none is on record.
*
* The cards are the funnel's (components/sales/kit): the `--muted` ground, the
* hairline, the 56px pill.
*/
import type { ReactNode } from 'react'
import dynamic from 'next/dynamic'
import { useAnalytics } from '@hanzo/event/react'
import { Check, Cpu, FileCheck, Headphones, KeyRound, Lock, ScrollText, Server, Sparkles, UserCheck, Users } from 'lucide-react'
import type { LucideIcon } from 'lucide-react'
import { Text, View, XStack, YStack } from '@hanzo/ui'
import { Grid } from '@hanzo/ui/grid'
import { Display, Eyebrow, Faq, Lede, More, TextLink, Title } from '@hanzo/ui/marketing'
import { motion } from '@/components/motion'
import { Band, Head } from '@/components/marketing/band'
import { FaqJsonLd } from '@/components/marketing/FaqJsonLd'
import Deploy from '@/components/sales/Deploy'
import Proof from '@/components/sales/Proof'
import { MAILBOX, Mark, Talk, Tile } from '@/components/sales/kit'
// Below the first screen, so each is prerendered into the HTML and its script
// loads at low priority, outside the first load perf.budget.json holds.
const Savings = dynamic(() => import('@/components/sales/Savings'))
const Own = dynamic(() => import('@/components/enterprise/Own'))
const Partners = dynamic(() => import('@/components/sales/Partners'))
type Point = { icon: LucideIcon; title: string; body: string }
/** What the Enterprise plan includes, in the plan's own terms. */
const INCLUDES: readonly Point[] = [
{ icon: Server, title: 'Your infrastructure', body: 'Run Hanzo in your cloud, on your own servers, or fully offline.' },
{ icon: Cpu, title: 'Dedicated compute', body: 'Compute set aside for your organization alone.' },
{ icon: Sparkles, title: 'Your own models', body: 'Train and host your own models, on your own data.' },
{ icon: FileCheck, title: 'Commitments in writing', body: 'An uptime guarantee and a security review, both in your contract.' },
{ icon: Headphones, title: '24/7 engineering support', body: 'Engineering support around the clock, and hands-on onboarding to get your teams started.' },
{ icon: Users, title: 'Your whole company', body: 'Unlimited members, single sign-on, roles and an audit log.' },
]
/** What a security review finds, each a mechanism /trust states from the code. */
const SECURITY: readonly Point[] = [
{ icon: KeyRound, title: 'Single sign-on', body: 'Sign in through your own OpenID Connect provider. SCIM 2.0 creates, updates and removes accounts from your directory.' },
{ icon: Lock, title: 'Your data, apart', body: "On Hanzo Base, each organization's data is its own database file, kept apart from every other organization. Identity comes only from a verified token." },
{ icon: ScrollText, title: 'Audit log', body: 'Every request is recorded: who acted, from where, what they called and the status it returned.' },
{ icon: UserCheck, title: 'Roles and second factors', body: 'Grant access by organization, workspace and project. Every account can add an authenticator app, or a code by SMS or email.' },
]
const FAQ: readonly { q: string; a: ReactNode }[] = [
{
q: 'How is Enterprise priced?',
a: (
<>
Each contract is priced for your organization: where Hanzo runs and the compute you need. Members are unlimited.{' '}
<TextLink href="/contact-sales">Talk to sales</TextLink> for a quote.
</>
),
},
{
q: 'Where do the savings figures come from?',
a: 'Every rate is read from our price list and our plan list when the page opens; the volumes, the people and the GPUs are yours. The figure for your own GPUs counts them on all month at an hourly rate and leaves out the Enterprise agreement, which our team prices with you.',
},
{
q: 'Can Hanzo run fully offline?',
a: 'Yes. Hanzo runs air-gapped on your own servers, with models served on machines you control.',
},
{
q: 'How is our data used?',
a: (
<>
Your data is used to run your service. Training Hanzo models on it takes your administrator&apos;s choice or a
written agreement. <TextLink href="/privacy">Read the Privacy Policy</TextLink>.
</>
),
},
{
q: 'Which identity providers work?',
a: 'Your own OpenID Connect provider, for single sign-on. SCIM 2.0 creates, updates and removes accounts as your directory changes.',
},
{
q: 'Can we start on Team and move up?',
a: (
<>
Yes. Team covers 2 to 100 people today, with single sign-on, roles and an audit log. Move to Enterprise when you
want your own infrastructure, dedicated compute or more people. <TextLink href="/pricing">Compare plans</TextLink>.
</>
),
},
]
/** The entrance the hero's lines make, one beat apart. */
const rise = (delay = 0) => ({ initial: { opacity: 0, y: 16 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.4, delay } })
export default function Enterprise() {
const events = useAnalytics()
return (
<>
{/* The hero: the outcome, what it is, and the one call. */}
<YStack render="section" position="relative" overflow="hidden" pt={112} pb={72} px="$4" $md={{ px: '$6' }} $lg={{ pt: 152, pb: 96 }}>
<View
aria-hidden
position="absolute"
t={0}
l={0}
r={0}
height={560}
pointerEvents="none"
backgroundImage="radial-gradient(ellipse 60% 100% at 50% 0%, var(--white-08), transparent 70%)"
/>
<YStack position="relative" width="100%" maxW={880} mx="auto" items="center" gap={24} $platform-web={{ textAlign: 'center' }}>
<Eyebrow render={<motion.p {...rise()} />}>Hanzo Enterprise</Eyebrow>
<Display render={<motion.h1 {...rise(0.05)} />}>
Give every team AI.{' '}
<br />
Run it where you choose.
</Display>
<Lede render={<motion.p {...rise(0.1)} />} maxW={680}>
Models, agents and one shared workspace for everyone in your company, in your cloud, on your servers or fully
offline. Hands-on onboarding, and engineering support around the clock.
</Lede>
<XStack render={<motion.div {...rise(0.15)} />} flexWrap="wrap" justify="center" items="center" gap={16} mt={8}>
<Talk onClick={() => events.capture('enterprise_cta', { at: 'hero' })} />
</XStack>
<XStack render={<motion.div {...rise(0.2)} />} flexWrap="wrap" justify="center" columnGap={24} rowGap={8} mt={8}>
{['Unlimited members', '24/7 engineering support', 'Runs fully offline'].map((t) => (
<XStack key={t} items="center" gap={6}>
<Check width={14} height={14} color="var(--foreground)" aria-hidden />
<Text fontSize="$2" color="var(--muted-foreground)">
{t}
</Text>
</XStack>
))}
</XStack>
</YStack>
</YStack>
<Band id="includes" rule={false} pad="$11" measure={1152}>
<Head loud eyebrow="What you get" title="What Enterprise includes." lede="Your own infrastructure, dedicated compute, and engineering support around the clock." />
<Grid columns={{ min: 280, max: 3 }} gap={16}>
{INCLUDES.map(({ icon: Icon, title, body }) => (
<Tile key={title}>
<Mark>
<Icon width={20} height={20} aria-hidden />
</Mark>
<Text render="h3" fontSize="$5" lineHeight="1.75rem" fontWeight="600" color="$ink">
{title}
</Text>
<Text render="p" fontSize="$3" lineHeight="1.5rem" color="var(--muted-foreground)">
{body}
</Text>
</Tile>
))}
</Grid>
</Band>
<Band id="deploy" pad="$11" measure={1152}>
<Head loud eyebrow="Deployment" title="Run it where your data lives." lede="One platform, four places to run it. Choose one, or start in our cloud and move when you are ready." />
<Deploy />
</Band>
<Band id="savings" pad="$11" measure={1152}>
<Head
loud
eyebrow="Savings"
title="What the same tokens cost."
lede="Put in what your teams use today. The page prices it at the providers’ list rates, on Hanzo Cloud, and on GPUs of your own, every rate read from our price list as you look."
/>
<Savings />
<XStack justify="center" mt={32}>
<More href="/calculator">The whole operating-cost model</More>
</XStack>
</Band>
<Band id="gpus" pad="$11" measure={1152}>
<Head
loud
eyebrow="Your own GPUs"
title="Run the models on machines you own."
lede="Zen 6 runs on one DGX Spark. Zen 6 Max wants a rack of Blackwell servers. What we measured, and what a rack is made of."
/>
<Own />
</Band>
<Band id="proof" pad="$11" measure={1152}>
<Head
loud
eyebrow="Proof"
title="Results on the record."
lede="Our models' scores come from research runs anyone can open. Customer results come from the case studies of launches Hanzo ran."
/>
<Proof />
<XStack justify="center" mt={32}>
<More href="/customers">All customer stories</More>
</XStack>
</Band>
<Band id="partners" pad="$11" measure={1152}>
<Head loud eyebrow="Partners" title="Work with Hanzo." lede="Refer customers, resell Hanzo under your own brand, or have Hanzo’s agency build it with you." />
<Partners />
</Band>
<Band id="security" pad="$11" measure={1152}>
<Head loud eyebrow="Security" title="Ready for your security review." lede="A security review is part of every Enterprise contract. We answer your questionnaire against the code, and the engineers who wrote it walk your reviewers through it." />
<Grid columns={{ min: 260, max: 2 }} gap={16}>
{SECURITY.map(({ icon: Icon, title, body }) => (
<Tile key={title} flexDirection="row" gap={16}>
<Mark>
<Icon width={20} height={20} aria-hidden />
</Mark>
<YStack gap={6} minW={0} shrink={1}>
<Text render="h3" fontSize="$5" lineHeight="1.75rem" fontWeight="600" color="$ink">
{title}
</Text>
<Text render="p" fontSize="$3" lineHeight="1.5rem" color="var(--muted-foreground)">
{body}
</Text>
</YStack>
</Tile>
))}
</Grid>
<XStack justify="center" flexWrap="wrap" columnGap={32} rowGap={12} mt={32}>
<More href="/security">How Hanzo is secured</More>
<More href="/trust">Trust center</More>
</XStack>
</Band>
<Band id="faq" pad="$11" measure={880}>
<FaqJsonLd path="/enterprise" items={FAQ.map((f) => ({ name: f.q, answer: f.a }))} />
<Faq heading="Questions" items={FAQ} onOpen={(q) => events.capture('faq_opened', { q, page: 'enterprise' })} />
</Band>
{/* The call again, where the page ends. */}
<Band id="talk" pad="$12" measure={880}>
<YStack items="center" gap={20} $platform-web={{ textAlign: 'center' }}>
<Title>Tell us what you want to build.</Title>
<Lede maxW={600}>Share a few details about your company. We come back with a plan: where Hanzo runs, what it costs and how you start.</Lede>
<XStack mt={8}>
<Talk onClick={() => events.capture('enterprise_cta', { at: 'end' })} />
</XStack>
<Text render="p" fontSize="$2" color="var(--muted-foreground)">
Or email <TextLink href={`mailto:${MAILBOX}`}>{MAILBOX}</TextLink>
</Text>
</YStack>
</Band>
</>
)
}