Files
hanzo.ai/components/marketing/ComparisonPage.tsx
zeekayandClaude Code fff270c488 Compare against the alternatives, with the provenance on every row
A buyer asking "Enso vs OpenRouter" found nothing to answer it. The winning
artifact in every category we lose is the vendor-level comparison page, and
we had none — /comparison is build-vs-buy, a different axis.

Two rules hold the page honest. A row is either measured or reported, never
both: mixing a number we produced with one a vendor published, under one
heading, is how a comparison lies without any single cell being false. The
page opens on measured and puts reported behind a toggle. And rows we lose
stay in — Enso reaches 600+ models against LiteLLM's 1,800+, and that is on
the page.

Reading the vendors' own pages also killed a claim we would otherwise have
made: all three already serve a native Anthropic /v1/messages, so dual
endpoint compatibility is table stakes, not a differentiator. What none of
them publish is a cost quoted before the call runs — all three only cap
after the fact, two of them at enterprise tier.

Co-Authored-By: Claude Code <[email protected]>
2026-10-04 17:04:34 -07:00

53 lines
2.2 KiB
TypeScript

import { Cta, Page, PageHero, Prose, Section } from '@/components/marketing/page-kit'
import { CompareTable } from './CompareTable'
import type { Comparison } from '@/lib/compare'
export function ComparisonPage({ comparison }: { comparison: Comparison }) {
const measured = comparison.rows.filter((r) => r.source === 'measured').length
const names = comparison.rivals.map((r) => r.name).join(', ')
return (
<Page>
<PageHero
eyebrow={comparison.category}
title={comparison.question}
lede={comparison.framing}
/>
<Section
title="Side by side"
lede={
measured
? `Opens on the ${measured} ${measured === 1 ? 'row' : 'rows'} we ran ourselves. Reported rows — what each vendor says about itself — are one click away.`
: 'Nothing in this category has been measured by us yet, so it opens on what each vendor publishes. Those are their claims, not ours.'
}
>
<CompareTable comparison={comparison} />
</Section>
<Section title="Reading this honestly">
<Prose>
<p>
A row marked <em>we ran this</em> is a number produced by our own harness, and the link goes
to the run. A row marked <em>they published this</em> is each vendor&rsquo;s own claim, taken
from the page linked and dated the day it was read — we relay those, we did not verify them,
and they are their numbers and not ours. Where a vendor has not published something the cell
says <em>not published</em> rather than being left blank, because a blank reads as zero.
</p>
<p>
This page is not arranged to make Hanzo look best. Where {names} are ahead, that is on the
page. The bet is that a comparison you can check is worth more than one that only says good
things about itself.
</p>
</Prose>
</Section>
<Section title="Go deeper">
<Cta href={comparison.subject.href}>Hanzo {comparison.subject.name}</Cta>{' '}
{comparison.rivals.map((r) => (
<Cta key={r.id} href={r.href}>
{r.name}
</Cta>
))}
</Section>
</Page>
)
}