Install and bare hanzo on the landing, quickstart and coding guides; install,
hanzo login and the first command on product pages (generators); hanzo dev
--claude|--codex|--cursor|--agy and the own-account default in the coding
guides. Not built, not deployed.
Once these pages compile they are rendered, and React refuses a string
style prop: the prerender of /docs/projects/hanzoai/esign stopped the
export. Each style attribute is now the object form of the same
declarations.
The build skips a page its MDX fails to compile and still exits 0, so the
s3, kv, ci, ml, datastore and nine more project pages were not on the site.
Void tags (img, source, br) are self-closed, unquoted attribute values quoted,
HTML comments written as MDX comments, a stray </div> and an unclosed
<details> dropped, and the lowercase {name} placeholders in datastore's JSX
spaced so the project loader's escape leaves them alone.
One page per tool: install, sign in, what the wrapper routes and what it does
not (Cursor and Antigravity keep their own backend and are neither routed nor
metered), how to read a session's usage and savings, and how to keep the tool's
own plan with --no-route. coding.mdx now lists all five agents.
zen-embedding-2 serves on api.hanzo.ai: text in 768 dimensions, shorter
by `dimensions`, prefixes in the text, its own vector space. It is
EmbeddingGemma 2 by Google DeepMind (Apache-2.0), which the License &
attribution section names and zen.upstream keeps out of the rest.
Claude-Session: https://claude.ai/code/session_01SCPMGSQsLNF2YtHFL4bwyp
@hanzo/ui 8.27.83 reads POLICY_EVENT from @hanzo/event and declares
>=0.3.52; the catalog pinned 0.3.50, which has no such export, and
Turbopack refused the export at build.
The API keys page teaches PATCH and DELETE /v1/account/keys/KEY_ID, and
the pinned document (ec340375a) has no /v1/account/keys/{id}, so the
endpoint guard stopped every publish since that page landed. Cloud
e2d5eae3c (v8.5.647) serves it.
That document states the key classes on the `type` field a caller sends
and reads back, two levels under the schema, and the key-type reader
walked six deep and stopped at the schema. It walks eight now, enough to
reach a field's own sentence.
It also serves `train`, which files under Intelligence beside `ml`.
The theme is codeTheme from @hanzo/ui/core: Dracula on dark, GitHub
Light on light, the one every Hanzo surface draws. lib/shiki.ts and each
app's source.config.ts import it rather than naming a theme, so vesper
and github-dark are gone. @hanzo/ui moves to 8.27.83, the first release
that carries it.
A block's code area paints the theme's own ground and ink from the pre
shiki wrote, #282a36 in the dark, rather than the site's panel.
The docs home drew its hero and its eight domain snippets as plain text,
and so did the models page's fallback request. The hero highlights its
three doors in a server part (components/hero.tsx); the snippets and the
fallback are Example props in the MDX. No highlighter reaches the
browser.
A person holds as many keys as they like and creating one never touches
another. Document the new shape of /v1/account/keys (PATCH to edit,
DELETE /{id} to revoke one), the product/read permission entries and
read-only keys, budgets, rates and expiry, what an org admin sees, and
the corrected CSRF address and cache window.
models/kai: the results are kai-1's on the frozen harness, with
calibration error beside accuracy, the device the runs were measured
on, where Kai is behind, and the cardinality suite. The held-out
comparison named stage a5 only; kai-1 has not been run on held-out
rows, and the page says so. The architecture is described as built:
a factorized two-tower reader with a cross-attention head, and a
retrieval dual encoder above 160 options; score is a choice over the
levels, not an ordinal link. The paper link pointed at no public page.
decisions: 1 to 100 questions; a question and its state read 1,024
tokens together; checkpoint kai-1 and the routing fields v0.3.14 sends;
a noul's confidence; unrounded probabilities; Jev at $0.042 per million
input tokens; the errors with v0.3.14's statuses and messages.
guides/migrate/jev: the same limits; an over-long state is refused, not
truncated; options read to 512 tokens; Kai counts the request's text
once; kai-1's figures and an answer from its runtime; no latency until
one of the served build is published; Jev through Hanzo can answer 503
upstream_unavailable.
Cookbook: the recipes call api.hanzo.ai with a key, and the answers
they quote are kai-1's. models/index: Kai is served by API only.
Co-authored-by: Hanzo Dev <[email protected]>
Zen's verb is reasons, not generates or writes, and the trio reads in the
order a request meets it. The docs hero, the Models section's description,
its role table and its sidebar order, and the cookbook now say so, and the
Zen page drops "generative" from what the family is.
Co-authored-by: Hanzo Dev <[email protected]>
The landing opened on a pill and the CLI install; the three model families
and the catalogue they sit in were four screens down. They now follow the
headline: Enso routes, Kai decides, Zen reasons, each with its docs page
and its hanzo.ai page, and beneath them one full-width banner with the
model count, the maker count and a link to /docs/models.
The three cards are one row when three fit at 220px and one column
otherwise, never two and an orphan: the track floor is a third of the row
above 692px and the whole row below it, so the width alone picks.
Nothing on them is typed. gen-pricing-page already reads GET /v1/models for
the rates; it now also records the distinct ids, the distinct makers and
Kai's rate under `catalogue` in openapi-specs/pricing.json, and keeps the
committed copy when the catalogue does not answer. The count is floored to
the hundred so it stays true between builds, and the two "Over 400 models"
lines on the page read the same figure.
Co-authored-by: Hanzo Dev <[email protected]>
One page for Hanzo Dev in the browser, first in the Dev section: the composer's
choices, Templates (filters, the sheet, the copy published at <project>.hanzo.app,
a failed build's reason with Publish again and Fix it with Dev), Machines (install,
hanzo login, hanzo beat free, hanzo link for a shared shell paid from the balance,
and runs only on a machine whose runner claims them), and what needs a plan or credit.
Co-authored-by: Hanzo Dev <[email protected]>
On the forge runner the checkout carries the hanzo-docs/studio-docs submodule,
whose pages name its own /api/ paths, so no-api-prefix.test skips studio/ as it
skips the projects/ mirror. The runner's sandbox parses the API document slower
than vitest's 5s default, so the docs project allows a minute per test.
Co-authored-by: Hanzo Dev <[email protected]>
The forge's KMS identity is granted HANZO_DEPLOY_TOKEN at /deploy only
(hanzoai/universe kms-grants.yaml). deploy.yml published through hanzoai/ci
.github/actions/site@v1, which reads the flat /HANZO_DEPLOY_TOKEN, and KMS
answers that read 403. build.yml@v2 reads the token at /deploy.
- .hanzo/workflows/cicd.yml calls build.yml@v2 with submodules: recursive and
the org's KMS_CLIENT_ID/SECRET, one run per ref at a time, never cancelled.
- hanzo.yml declares site: (slug docs-hanzo-ai, dir apps/docs/out, build
scripts/site.sh, on main) and a test: that runs the docs vitest project
against the packages it imports, built first.
- scripts/site.sh does what deploy.yml did: bun 1.3.11, pnpm install, the
ingest key check, the package build, the export under a memory heartbeat,
check-export.sh and the key grep.
- deploy.yml is removed, so one lane publishes the prefix.
- images: is removed. No route serves the image, and its build_secrets read
PUBLISHABLE_KEY, which this identity is not granted.
Co-authored-by: Hanzo Dev <[email protected]>
hanzoai/ci's certclaims check refuses a framework named beside a certificate word
(attestation, here) unless the line says compatible with, compliant with or built to.
Co-authored-by: Hanzo Dev <[email protected]>
420b65d80 put a curl call on the landing hero, /docs, /docs/quickstart and
/docs/api-keys that sends `Authorization: Bearer guest_temp_key` with model
`zen-free`. /v1/chat/completions answers that key 401, and /v1/models lists no
`zen-free`. apps/docs/scripts/quickstart.test.ts refuses a first-call page that
names a model the catalogue does not list, so the docs test failed on it.
Co-authored-by: Hanzo Dev <[email protected]>
@hanzo/event 0.3.50's keyring gives the hanzo org one publishable key, the
project-1 key, so docs.hanzo.ai resolves it from its host with nothing
stated here. @hanzo/ui 8.27.35 is the release whose auth screens are
components with no stylesheet, and it asks for @hanzo/event 0.3.48 or later.
Every conversion CTA reads "Try Hanzo" and goes to sign-in; payment comes
after it. The landing's close now does that in place of "Choose plan".
It no longer fires plan_clicked: it is not a plan choice, and the page view
and the $click that <Hanzo> autocaptures already record it. That leaves the
EVENTS re-export in @hanzo/docs-analytics with no caller, so it goes too.
GA4 and the Meta Pixel went into the root layout's <head> and into
@hanzo/docs-analytics, loaded on every page before any consent was asked,
beside a second and third Hanzo stream with their own keys. A vendor tag
loads only through the @hanzo/event tag manager, after consent, so both go,
and the docs report on the one @hanzo/event stream again.
This reverts 81733ecc4a and 6f0e2b2533.
The lineup changed: Zen 6 is the 27B in zenlm/zen6, Zen 6 Flash its
ternary build in zenlm/zen6-flash, Zen 5.8 retires into Zen 6, and
zen6-coder is no longer published or served.
The Zen page's generations, weights table, downloads and fine print
say so, with every Zen 6 figure from the cards' own configs. The
landing's model list, the loop cookbook and the NeMo migration name
zen6 and zen6-flash.
The landing's "Sign up free" opened hanzo.id/signup, and "Sign in" opened
/login, whose authorize step sent the reader to hanzo.id too. No surface
sends a visitor there. Sign-in is hanzo.ai/login now (the /login address is
a redirect rule), sign-out clears the session in this browser instead of
carrying the reader to the issuer's end-session page, and the conversion
CTA reads "Choose plan" and opens hanzo.ai/pricing.
The click fires plan_clicked {source: 'docs'} on the client that counts the
page views, named from the @hanzo/events catalog that @hanzo/docs-analytics
now re-exports.
The ingest key comes from @hanzo/event's keyring, resolved from the page's
host, rather than a KMS value inlined at build. docs.hanzo.ai resolves the
hanzo org's key, the one the rest of the funnel reports under, and a sibling
docs site on a host no brand claims reports nothing rather than filing its
visitors under hanzo. The deploy resolves the same key, asks /v1/event
whether it names a project, and greps the export for it.
The Zen page called zen6 a 27B dense model and led with no reason to
pick Zen; the models index listed Zen 7 as "upcoming" and HIP-0904 as
"dense, coder and ternary checkpoints"; examples called zen5 and one
called zen5-coder-32b-instruct, which the gateway does not serve.
Zen is now told as the gateway serves it: Zen 7 in research preview
with Request access, Zen 6 the new Zen architecture (zen6,
zen6-coder), Zen 5.8 the one before, Zen 5 earlier. It leads with its
two jobs, agentic coding on your own machine and marketing work, and
names Zoo Labs Foundation, a 501(c)(3) non-profit, as its maker.
Examples call zen6.
Upstream base models appear only in the Architecture value and the
License & attribution section, both data-upstream. check-zen reads
every Zen page in pre-build and fails the build on a name from
zen.upstream anywhere else.
The router is embedded in every process that speaks ZAP and one is
elected; the browser joins over a paired loopback WebSocket. This page is
the how-to: pair, list the nodes, embed, where the files live. The design
is HIP-0069.
Claude-Session: https://claude.ai/code/session_01Dc8DXc3fEQCRHUa6XWK4Ku
console.hanzo.ai is Hanzo's staff console now, signed into the admin org
only, so every page that told a reader to mint a key, connect an account
or open a dashboard there names platform.hanzo.ai instead. The Console
page says where the console lives and that console.hanzo.ai and
admin.hanzo.ai are staff consoles, and no longer says the console is
embedded in the cloud binary.
RELEASING told maintainers to dist-tag, view and `npx -y` npm `bot`,
someone else's package; running the npx line executes it. The update page
checked `npm view bot version`. Both now name @hanzo/bot.
Co-authored-by: Hanzo Dev <[email protected]>
MDX leaves newline strings between the blocks inside a blockquote.
flow() set each one as an empty text block, and the column's gap still
spaced it, so a callout's first line sat 8px under its icon. Drop
whitespace-only strings there.
A key/value table written as `| | |` has a header row of empty cells;
it drew as a blank grey band above every operation page's address
table. Thead now renders nothing when no cell holds text.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
Every install, update and removal line said bot@latest or -g bot, which on npm
is an unrelated third-party package. @hanzo/bot is ours and ships the bot and
hanzo-bot commands.
Co-authored-by: Hanzo Dev <[email protected]>
Nothing apps/docs renders names a utility class, a Radix primitive or a
base-ui part any more, so the build stops carrying them. global.css is
plain CSS: the faces, the ground, the color-scheme the code tokens read
through light-dark(), and the shell footer. postcss.config.mjs goes
with the Tailwind plugin, and the app drops tailwindcss and its postcss
plugin and animate plugin, tailwind-merge, class-variance-authority,
every @radix-ui package, @hanzo/docs-base-ui, @hanzo/docs-ui and
lucide-react.
The MDX pipeline drops twoslash, the auto type table and ts2js, which
existed to emit base-ui and Radix parts and which no page uses, and the
graph view's d3 and force-graph go with the graph. base-ui's shiki
stylesheet no longer answers .t_dark; the docs were its only reason to.
The framework packages stay: each still has consumers among the other
apps and examples.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
What was left of Tailwind and base-ui in apps/docs was the pages around
the docs: the front page, the hero and product sections on /docs, the
catalogs, search, feedback, the 404, the blog and the sign-in screens.
Each is a gui part on the theme now, and the app source carries no
utility class, no Radix and no base-ui import.
The front page follows the reader's theme instead of forcing a dark
subtree, and its API Reference card pointed at /reference, which is not
a route; it goes to /docs/openapi. Search is one gui dialog opened
from the rail or with Cmd-K, over the same static index, with the jump
and the ask-an-agent rows it had. The feedback control sends a
docs.feedback event on the one telemetry stream; it used to hand the
reader's answer to a stub that logged it to their own console.
The blog sits in the docs shell on the same page frame, and a post no
longer prints its title twice. The registry build, the fork's preview
components, the unused AI-search dialogs, the API page and the tree's
icon plugin go: nothing rendered them, and the icons were an SVG tree
serialised into every page.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
/docs/decisions is the endpoint: POST api.hanzo.ai/v1/decisions on the
Decisions API wire, the three question types each with a request and an
answer, the response field by field, Kai or Jev by model id, and every error
with the runtime's own message. It is a page now, so its redirect goes.
/docs/models/kai: a multilingual encoder that scores each option alone, so
option order does not move the answer, noul is label-symmetric and score is
ordinal; pure Rust on hanzo-ml. The frozen-harness result for stage a5 (macro
0.851 over 11 suites against Laya 0.702 and Jev 0.770, best in 8 of 12, behind
Jev on jailbreak and MASSIVE and Laya on typed decisions and email spam) with
its link. The runtime serves the baseline as laya, laya-multilingual and
laya-agent, and kai is Kai: the agent program and the cookbook name the ids it
serves.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A page body was Tailwind's typography plugin reaching into compiled MDX
by selector, around base-ui's Callout, Cards, Tabs, Steps and code
blocks. Every markdown element and every part the content names is a
gui element now, chosen by tag through components/mdx.tsx. Blocks are
spaced by the body's gap rather than their own margins, so a list in a
callout or a table in a tab keeps its own rhythm, and tables keep the
browser's table layout so columns line up.
Code tokens carry color: light-dark(...) straight from shiki, so the
theme class picks the palette through color-scheme and no stylesheet
has to know which theme is on. remark-steps' marked divs become the
Steps parts, and a link to another page carries that page's title and
description instead of mounting a hover card per link.
Content no longer imports the framework's parts: the generators stop
writing the imports and the second "# title", 49 authored pages drop
theirs, and ported and studio pages reach the same parts through the
aliases they already used.
RELEASE.md says how a publish actually fires today: the forge mirror
does not pull on its own and a push queues no run, so sync and dispatch.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
The rail, the tree, the bar, the outline and the page header were
Fumadocs' base-ui layout: Tailwind utilities over a CSS grid, with the
width decisions made twice, once in classes and once in a JS media
query. They are gui stacks on theme tokens now, with every breakpoint a
media prop, so a phone hydrates the markup the export wrote. Atomic
rules ship as hoisted <style> tags and <html> carries t_dark, so a page
is styled before any script runs.
The theme has one authority, the t_dark/t_light class that gui's
NextThemeProvider writes before paint; <Hanzo> follows it and the
Tailwind dark variant answers it. The corner dock that covered content
on phones is gone; theme and help sit at the foot of the rail.
A body's leading "# heading" is dropped at compile time, since the
header already prints the frontmatter title: /docs/sdks and
/docs/openapi said their names twice. The /docs hero stops printing a
second title.
The rail narrows by tree path, so an operation page opens the reference
it belongs to, and the drawer carries the top nav a phone had no way to
reach.
LLM.md carries the four-phase plan and the inventory it is measured by.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8