install/migrate-from-openclaw and cli/migrate are converted from hanzoai/bot's docs (branch migrate-openclaw) with the converter that copies the bot's words as written, and sit in the Installation and CLI Reference nav. The docs home's Start here and the landing page's quickstart point OpenClaw users at the guide.
Co-authored-by: Hanzo Dev <[email protected]>
/docs/models is a folder: the families (Zen generates, Enso routes, Kai
decides, Policy governs) with status, the live catalogue, and the HIPs.
Enso is the router: how it picks, the X-Max-Cost and X-Max-Latency-Ms
headers, /v1/ai/feedback, the enso-* ids. Kai: /v1/decisions with real
responses from the decision runtime serving the kai-1 baseline, programs,
policy gates and modes; status honest. Cookbook: route, triage, gate, loop.
Models in the sidebar and top nav; /docs/enso, /docs/zen, /docs/kai and
/docs/decisions redirect. Glossary, landing and docs hero say the same.
Routing page: SLO is headers, strategies are enso and heuristic. Dev
config docs: the default model is enso-auto on provider hanzo.
Claude-Session: https://claude.ai/code/session_018Gt5TvrE2rxXuZikWSauv3
Next 16 keeps the cache for builds by default. The export runs once on a
fresh runner, so nothing reads it back, and under visor the files it
writes are cached in the sandbox's memory and charged to the pod. With it
on, the only run under the 24Gi cap passed 18.5G mid-compile, climbing
3G every 15 seconds, when the log stopped.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
The forge mirror of this repo (git.hanzo.ai/hanzoai/docs) reads
.hanzo/workflows and runs them: the last docs.hanzo.ai publish was
deploy.yml building 1d4202206c. With them gone, nothing publishes the site.
This reverts commit 891b8cc999.
Claude-Session: https://claude.ai/code/session_01HuMDfgFssPUptYUzgZ6Cp8
The console's Docs buttons open docs.hanzo.ai/docs/<product> — agents, crawl,
edge, embeddings, gateway, functions, kms, machines — and none of those pages
exists, so each button opened the 404 page. The product cards on /docs linked
the same shape for twenty-one more before they moved into the reference.
_redirects now sends each to its capability page, and emit-redirects writes the
stub the static host serves. Five old slugs have no page to land on (docdb, mpc,
pipelines, sessions, vector) and stay unlisted rather than point at a 404. The
eight console addresses are in export.require, so a rule that stops emitting
fails the export instead of leaving a dead button.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
8.5.162 files /v1/link under `hanzo auth link`: `hanzo link` now links a
machine to Hanzo ZT. The pages named a group by its tag, so they would
have kept teaching `hanzo link list` for the account registry.
Claude-Session: https://claude.ai/code/session_01TUxvfuta1Z44KVNYuAz71F
deploy.yml checks apps/docs/out directly and publishes it to the Sites
plane; there is no finished image to copy /public out of. This push also
starts the docs deploy on the 24Gi runner cloud 62e7a1c made live, which
06022ce31 held back for.
Co-authored-by: Hanzo Dev <[email protected]>
Measured to completion, neither a 4G heap nor evicting after every cache
snapshot lowers the compile's peak: it holds 14-16G in one process either
way, and under visor the 4G heap died sooner. The lane keeps two tasks,
two page workers, no source maps and no server minifying, which peaks at
about 16.8G locally, and names the 24Gi runner cap the platform now sets
for it. The heartbeat's comment says what the in-sandbox figure leaves out.
This push starts no run: the runner that fits the job ships with cloud
62e7a1c, and the lane is dispatched once it is live.
[skip ci]
Co-authored-by: Hanzo Dev <[email protected]>
Both READMEs now link crates.io/crates/hanzo-client, so the next project sync leaves these pages as they are.
Co-authored-by: Hanzo Dev <[email protected]>
The locked document was cloud's of 2026-09-11. Its waterfall span
described db_name with a link to o11y.io, which resolves to no server,
and the waterfall API's page printed it. cloud 9a70ae8 reads o11y
v1.5.75, which describes the calculated fields in words.
The document moved in the twelve days between. cloud renamed three
capabilities and added one, so the taxonomy follows: tasks is workflow,
the durable engine, and stays in Streams; integration is provider, with
a person's own connectors at /v1/connection; todo is task, the board, in
Applications; patrol, which watches over an estate, joins Applications.
The pages that linked the old names link the new ones, and the Composio,
Centaur, Firebase and migration index guides name /v1/provider and
/v1/connection, since /v1/integration answers 404.
Co-authored-by: Hanzo Dev <[email protected]>
The build cache is where Turbopack puts a task it takes out of memory.
With the cache off it has nowhere to evict to, and the compile kept every
task resident. With it on and eviction set to full, each snapshot of the
cache is followed by dropping every task the build can reload from it.
The heartbeat prints every 15 seconds instead of 30.
Co-authored-by: Hanzo Dev <[email protected]>
The export build keeps no Turbopack build cache, makes no source maps,
leaves the server bundle unminified, runs two Turbopack tasks and two
page workers, and gives each Node process a 4GB heap. next dev is
unchanged apart from the build cache, which it never used.
setup-bun installs 1.3.11 from its release by name. Asking for latest
reads the tag list from api.github.com first, which refuses the runner's
shared address once its anonymous limit is spent.
The heartbeat also names the five largest processes by resident memory.
Co-authored-by: Hanzo Dev <[email protected]>
The forge reads the first of .hanzo/workflows and .github/workflows that
exists, so every workflow moves at once: moving one would have left the
other twelve unread. Each lane's own path filter names its new path, and
hanzo.yml no longer lists deploy.yml as an image builder, since it
publishes files to the Sites plane and tags no image.
Nothing runs differently. The rename alone would match every deploy
lane's path filter and fire all nine, so this commit skips them.
[skip ci]
Co-authored-by: Hanzo Dev <[email protected]>
A fence with an info string (```typescript tab="TypeScript") threw the
parser out of step, so prose between fences was read as code. `hanzo host
serve` is a native command, `hanzo --help` and `hanzo billing --help` run
nothing, a trailing `# comment` is not an argument, and hanzoai.cloud.api is
the Python client's API module.
Co-authored-by: Hanzo Dev <[email protected]>
The home page's "Make your first call" and the games page's "Get Started"
linked /docs/getting-started, which is not a page. Both go to the
quickstart. Authentication showed three clients no published package
has — `from hanzoai import Hanzo`, a default export from @hanzo/ai, a
go-sdk with no version — and now shows the generated ones taking the key
as their bearer. The quickstart's Go line used hanzoai.New, whose
transport refuses without an IAM client id, for a read that needs no
credential; it uses the generated client. Authentication says which
origins a browser may call from.
quickstart.test.ts holds these pages to the generated clients' imports and
methods, and to pages the site has.
Co-authored-by: Hanzo Dev <[email protected]>
It named zen-1, which the catalogue does not serve, and passed --model and
--messages, which `hanzo chat completions` does not take; its SDK tabs used
a Hanzo client class no published package exports, and `pip install hanzo`
is not the API client. The call is now zen5 over --data and over HTTP, the
SDK tabs are the generated clients' own GetModels, a graph assert and
resolve follow the completion, and the home page mints a key with
`hanzo account keys create`. agents and budgets name zen5.
scripts/quickstart.test.ts holds these pages to the CLI's command table
and to the catalogue in pricing.json.
Co-authored-by: Hanzo Dev <[email protected]>
docs.hanzo.ai still serves an export from before the gui move, with 41
dead links on its root and /docs pages, because no run of this lane has
ever published. The last one asked for arm64, which on the AWS cluster
is a 4-core, 16Gi sandbox node: the export starved it until its kubelet
missed its own heartbeats, the runner pod was torn down at 14:35Z
mid-compile, and the run sat "in progress" for three hours holding the
deploy-docs group. linux-amd64 is the runner node, 8 cores and 32Gi.
The timeout was 90 minutes for a build whose export alone took 47 on a
10-core workstation; this job gets 6 cores. And the heartbeat printed
mem=? under visor, which exposes no cgroup file, so it now reads the
sandbox's own /proc/meminfo there.
Co-authored-by: Hanzo Dev <[email protected]>
Every link below answered a reader 404 or nothing, measured against the
export this repo builds today:
- The Rust SDK page and the iam and ml footers named hanzo-rs/sdk, which
is private. They now name the published crates on docs.rs and
crates.io, where the source of each release can be read.
- iam's page linked hanzoai/iam-v1, private and archived. It names it.
- The provenance list in the sovereign-apps post linked three commits
that no longer exist where it pointed. luxfi/consensus and
hanzoai/sqlite were rewritten, so it names the same first commits
under their new hashes (same message, same author date). luxfi/node's
history now starts in 2026 and holds no 2020 commit, so that line
names the repo.
- The survey feature table wrapped 33 "in progress" wrenches in links
to github.com/Insights/insights-*, a rename of trackers that were
never ours. The wrench stays; the links go.
- govaluate's gocover.io badge and go-fuse's two upstream credits point
at services and repos that are gone. The credits keep their names.
Co-authored-by: Hanzo Dev <[email protected]>
- Python: `pip install "hanzoai>=8"`, and the page says 3.12 or newer. PyPI
still serves hanzoai 2.1.3 to Python 3.9 to 3.11, so unpinned, pip on Ubuntu
22.04, Debian 12 or macOS's python3 installed 2.1.3 and the quickstart's
`from hanzoai.cloud import ...` died with ModuleNotFoundError. With the
floor, pip 21 on 3.9 answers "No matching distribution found for hanzoai>=8".
- Install picker: the HTML row loaded cdn.hanzo.ai/event.js, a 404, and the
WordPress, Shopify, Bubble, Segment, Zapier and n8n rows named listings that
do not exist; Webflow, Framer, GTM and Retool pasted the missing snippet or
free text. They are gone, and Docusaurus joins the web rows.
- Kotlin: the snippet called KeysApi.getKeys, which hanzo-kotlin/sdk has never
had; it is AccountApi.getAccountKeys.
scripts/installs.test.ts holds the first two: 15 failures before, 235 passing
after.
Co-authored-by: Hanzo Dev <[email protected]>
- Java said it was not on Maven Central. Central serves
ai.hanzo:hanzo-java-cloud 8.5.156, so the page gives the dependency line
instead of a clone-and-build detour.
- Kotlin named ai.hanzo:sdk:8.0.0 (404 on Central), a JitPack line whose
build answers "No build artifacts found", a coroutine client under
ai.hanzo.sdk and the hanzo-kt/sdk repository from July. The client is
ai.hanzo:hanzo-kotlin-cloud under ai.hanzo.cloud, on OkHttp and blocking,
published nowhere yet; the page builds it from hanzo-kotlin/sdk.
- Python called `hanzo` on PyPI the CLI and said `pip install hanzo` then
`hanzo auth login`. That distribution installs `hanzo-py`; the `hanzo`
command is the native CLI from hanzo.sh.
Co-authored-by: Hanzo Dev <[email protected]>
Four of its lines installed nothing or installed someone else's code, each
checked against its registry:
- gem install hanzo rubygems: mirego/hanzo, a Heroku deploy tool
- flutter pub add hanzo pub.dev: andresaraujo/hanzo, a Dart git-hooks library
- composer require hanzo/hanzo Packagist: 404
- pod "Hanzo" CocoaPods trunk: 404
They are gem install hanzoai (8.5.156), flutter pub add hanzoai (8.5.156),
composer require hanzoai/hanzoai (v8.5.156) and the SwiftPM line the Swift
page gives (hanzo-swift/sdk, tagged v8.5.156). Android's
implementation("ai.hanzo:hanzo") and Elixir's {:hanzo, "~> 1.0"} resolve on
neither Maven Central nor Hex, and nothing is published for either, so the
rows go.
Co-authored-by: Hanzo Dev <[email protected]>
The Go SDK's module path has been github.com/hanzoai/go-sdk/v8 since
August. Every Go line here still said github.com/hanzoai/go-sdk, which the
proxy resolves to v1.0.5, and the snippets called methods v8 does not have
(NewClient, ModelsAPI.AiListModels). Measured: the Go page as written, built
against what that line fetches, fails with `ModelsAPI.AiListModels
undefined`; the corrected line fetches v8.5.158 and the corrected snippet
vets clean. The install picker also offered `cargo add hanzo`, the umbrella
crate, where the SDK index and the Rust page name hanzo-client.
Co-authored-by: Hanzo Dev <[email protected]>
Every installer the Extensions section listed sat on the releases of
hanzoai/extension and hanzoai/desktop, both private, so each download
and "latest release" link answered a reader 404. The pages now say the
builds are not public and give what works today: editors and Claude
Desktop connect through the Hanzo MCP server, models through the
OpenAI-compatible endpoint. /docs/services, linked from the welcome
post, is the API reference at /docs/openapi now.
Co-authored-by: Hanzo Dev <[email protected]>
app/api/hanzo-docs/deployment asked GitHub for a docs-ui tag and Vercel
for the deployment built from it, reading request.url in a GET handler.
A static export cannot render that, so `next build` stopped on it —
"Route /api/hanzo-docs/deployment/ ... couldn't be rendered statically
because it used request.url". That is where the last deploy run failed,
and no run of this lane has published, so docs.hanzo.ai still serves an
older export whose links point at pages that no longer exist. Nothing
links the route and this site has no Vercel project. Measured after:
5907 pages generated, 3069 HTML pages exported, the export gate passes.
Co-authored-by: Hanzo Dev <[email protected]>
The hero is a one-column grid whose implicit auto track grows to its
widest child's min-content. The cards grid below reports three 288px
columns there, so at 390px the track was 896px and the docs layout's
overflow-x clip hid everything past the right edge. minmax(0, 1fr)
makes the track the section's own width.
Claude-Session: https://claude.ai/code/session_01TUxvfuta1Z44KVNYuAz71F
cloud computes the catalog in Go and serves it at /v1/pricing, so the
docs apps and the zen-models package read the endpoint directly rather
than a host that forwards to it. The Base page links to the pricing page
a reader can actually open.
Co-authored-by: Hanzo Dev <[email protected]>
Both are pages nothing links to, so both can stop being emitted while every
other check stays green: 404.html has no inbound link by definition, and
emit-redirects skips a rule whose target is not served without failing. The
gate that already runs in the Dockerfile and the forge lane now asks for them
by name.
Co-authored-by: Hanzo Dev <[email protected]>
A runner that fills its ephemeral storage stops as quietly as one that runs out
of memory, and this build writes a 460MB checkout, a 3GB node_modules and a
.next of its own. The heartbeat now carries both numbers.
Co-authored-by: Hanzo Dev <[email protected]>
The first run of this lane failed with a log that stopped seven minutes before
the job did and named no step: turbo holds a task's output until the task ends,
so a build that dies mid-way reports nothing at all.
The packages and the export are two steps now, and the export prints the
cgroup's own memory every thirty seconds while it runs. A run that hits the
runner's 12Gi says so in its last line; one that dies for another reason still
says which half it was in.
Co-authored-by: Hanzo Dev <[email protected]>
The page carried its title in the frontmatter and again as an H1, so the
rendered page opened with the word twice. Every other page here states it once.
Co-authored-by: Hanzo Dev <[email protected]>
app/layout.tsx imported TreeContextProvider from @hanzo/docs/ui/contexts/tree,
which the gui rewrite repointed at @hanzo/docs-gui — a two-line context with a
TreeContext and a useTree and no provider at all. So the root layout named an
export that does not exist, which is a hard module error, and the site could not
build at all.
Every other consumer in this app — the search dialog, the registry layouts — and
the DocsLayout it renders read @hanzo/docs-base-ui/contexts/tree. One provider,
one context, the one the layout consumes.
Co-authored-by: Hanzo Dev <[email protected]>
Making them parse is not enough to make them render. With the HTML rewritten,
ten of the thirteen render and three fail — a README's <img> carries no width,
and the img component is next/image, which requires one; a style string is not a
React style object. In a static export a render error is a FAILED BUILD, not one
bad page, so this trade sends the site backwards: today those pages ship an
article shell with no body, which is bad and safe.
What it takes, for whoever picks it up: the parse fixes in the reverted commit
(void elements closed, attribute values quoted, HTML comments converted), plus a
decision about dimensionless images and inline styles in ported markup. The
build cannot be the place that discovers it.
Co-authored-by: Hanzo Dev <[email protected]>
Ten project pages shipped as an article shell with nothing in it, because MDX is
JSX and an upstream README is not: `<img src=x>` left open swallows the rest of
the page, `<!-- … -->` stops the parser at the `!`, and `width=95%` is not a JSX
attribute value. The reader saw a title, a sidebar and blank space, and every
link checker called the page fine.
The sanitizer now closes void elements, quotes attribute values with a scanner
that knows when it is inside one, and turns HTML comments into MDX ones. Local
edits per tag and nothing structural: an earlier cut of this dropped closing
tags it thought were orphans and took a page of hand-written JSX apart.
Two upstream imbalances are fixed in the snapshot because nothing mechanical
can: helpdesk carries one `</div>` too many and zen-dub never closes its
`<details>`. A re-port brings them back until upstream fixes its README.
Co-authored-by: Hanzo Dev <[email protected]>
The six canonical flows are operationIds in call order, and four of them —
post_agents, post_agents_by_ref_run, get_agents_by_ref_runs, get_tools — are
spelled in the singular now, so gen-flow-pages refused the whole build rather
than write a page calling an operation nobody serves.
The flow pages that come out of it move with the document: the SDK snippets are
regenerated from the published clients, which name the package hanzoai and
hanzo_client where these still said cloud.
Co-authored-by: Hanzo Dev <[email protected]>
The console's CMS button pointed into the ported-projects snapshot at a repo the
sync no longer carries. The capability it means is content.
Co-authored-by: Hanzo Dev <[email protected]>
/tutorials pointed at /docs/start, which is now /docs/guides, and its wildcard
half pointed into /docs/services, a section this site has not had for months —
a redirect onto a 404 is worse than the 404 it replaces. /docs/apps is a page of
its own, so the rule naming it could never fire.
Co-authored-by: Hanzo Dev <[email protected]>
The reference is named for the capability, so renaming nine of them moved nine
section URLs that hanzo.id, the console and search engines all link. Each old
name now lands on the page that answers for it, and /docs/nodes points at
compute rather than the retired visor.
Co-authored-by: Hanzo Dev <[email protected]>
The root sidebar said `...guides` and the six task pages still sat in
content/docs/start, named by no meta.json — published, unreachable from the rail,
and already promised to /docs/guides by public/_redirects. They are in guides
now, with a meta.json that orders them ahead of integrations and migrate.
check-routes could not read `...guides` either: the `...` inlines a folder's
children and the `!` hides one, so both name a real directory and neither marker
is part of the name. It was reporting the same folder as missing AND as
unlisted.
Co-authored-by: Hanzo Dev <[email protected]>
Twenty-five curls and tables across thirteen guides named /v1/agents,
/v1/tools, /v1/flags, /v1/functions, /v1/channels, /v1/integrations and
/v1/visor. Cloud renamed all of them, so each was a 404 a reader would run.
/v1/projects is left alone: that app answers on both spellings.
The Stripe guide charged a card at /v1/commerce/payments, which the public
contract does not carry. The documented way to charge a browser token is
POST /v1/billing/topup with the idempotency key as a header, so that is what it
teaches now, and the receipt fields are the ones that endpoint answers with.
Co-authored-by: Hanzo Dev <[email protected]>
The document was pinned at cloud 529be4ccb from 08-28 and the fleet runs
v8.5.179, which renamed nine capabilities to the singular word each answers at —
agents to agent, tools to tool, flags to flag, functions to function, channels
to channel, integrations to integration, projects to project — retired visor for
compute and crm outright, and added ci, market and space. So every reference page
under those names printed a route that answers 404 today.
capabilities.yaml follows the manifest, as it says it must: the renames in place,
`space` beside `s3` because it is the product over the same backend, `market`
beside web3 and explorer because it reads pools and token prices on a public
ledger, `ci` in the fabric beside deploy, and crm gone because no row serves it.
120 products, 2324 operations, every one grouped and paged.
Co-authored-by: Hanzo Dev <[email protected]>
Four cases, each one a way the check could be quietly wrong: an absolute link to
our own host is ours, an off-site one is not, a page whose last segment carries a
dot resolves through its flat .html sibling, and a directory index answers a path
with no extension. Removing the .html rung fails two of them.
Co-authored-by: Hanzo Dev <[email protected]>