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]>
One app carried the Hanzo shell and twenty did not, so a reader crossing from
base.hanzo.ai to zen.hanzo.ai left the ecosystem and landed somewhere that only
resembled it. Five of those twenty had hand-rolled a footer of their own —
sixteen lines of copyright and a repo link, written five separate times.
Each app now loads the brand tokens before its own sheet, reports through
docs-analytics under its own product name, and renders HanzoFooter from
@hanzogui/shell — the same 6-column ecosystem footer, defined once, that
apps/docs already used.
A footer written inside a layout was chrome pretending to be content, and it is
gone. A footer written inside a page is content pretending to be chrome: those
keep their words and become sections, so each page has one contentinfo landmark
instead of two.
Three manifests listed @hanzo/font twice in the same object.
Builds verified across the four shapes this repo has: a static export, a
next.config.mjs app, a single-page app with no route groups, and one that
already reported analytics. Every one renders exactly one footer.
Co-authored-by: Hanzo Dev <[email protected]>
Thirteen shipped apps and every scaffold in packages/create-app pulled their
face from Google at request time — Inter through next/font/google in the
examples and the four Next templates, Geist and Geist_Mono in the apps, and in
the seven react-router roots a bare <link> to fonts.googleapis.com. That last
one never even applied what it fetched: nothing in those trees set a family, so
the browser downloaded Inter, spent two preconnects on it, and rendered
system-ui. So `create-app` handed a customer a new docs site whose first act was
a third-party font request for a face that is not ours.
The apps read the family back through --font-sans and --font-mono, which are
next/font's handles rather than names of anything, so those follow the binding
over to --font-zen-sans and --font-zen-mono. Eight of them had only ever bound
the mono and were leaning on Tailwind's default for the text face; they now name
both, or swapping the binding would have dropped the body copy to system-ui
without a word.
Zen and ZenMono are built faces, not constructors — subsetting, display: swap
and fallback metrics are already in them — so the call and its options go away.
Datastore, SQL, KV and DocumentDB — the four Kinds HIP-0401 through HIP-0404
define. 112 files.
Left as written: DSN schemes, the env an image reads, package and extension
names, version requirements a reader must match, the wire protocols DocumentDB
and KV implement, and the fork provenance and licence on the pages that are
about the fork.
Box art keeps its width.
The KMS docs were a 549-file vendored Infisical mirror documenting a v2/v3
API that exists nowhere in our estate. Ground truth, from source:
cloud/apps/kms/mount.go registers exactly seven routes --
GET/POST /v1/kms/health, /config, /auth/login
GET/POST/DELETE /v1/kms/secrets[/+]
lux/kms (the standalone binary) registers ZERO /api/ routes in Go; the
only /api/v3 strings live in a vendored SPA under cmd/kms/web/assets,
JS calling an API nobody serves.
So rewriting /api/v3/secrets/raw to /v1/kms/secrets/raw would have
fabricated a surface: probed live, /v1/kms/secrets/raw and
/v1/kms/secrets/zzz-not-real both return 403, i.e. secrets/* is a wildcard
behind an auth wall and "raw" is not demonstrated to exist. A doc that says
nothing beats a doc that 404s -- so the mirror is deleted, not translated.
549 files -> 7, and both meta.json nav files pruned to pages that exist.
This also retires app.kms.hanzo.ai, an NXDOMAIN host the mirror cited 351
times.
Two edits here look like damage and are not; both verified against source:
- base-docs k8s probe /api/health -> /healthz is CORRECT. base
apis/health.go:14 binds /healthz at root ("platform standard"), with
/health only under the API group.
- the ported ingress docs /api -> /v1/ingress is CORRECT. hanzoai/ingress
is our Traefik fork and it renamed the prefix: pkg/api/handler.go:94-120
serves /v1/ingress/rawdata, /overview, /entrypoints, ...
Co-authored-by: Hanzo Dev <[email protected]>
Replace hardcoded 3-tier pricing with dynamic fetch from
pricing.hanzo.ai/v1/pricing/cloud/plans. Shows all 6 canonical
PaaS compute tiers (Starter $6 through Enterprise $384) with
real vCPU/RAM/disk specs and hourly rates. Static fallback
ensures the page renders even when the API is unreachable.
New docs site for Hanzo Base following the monorepo docs framework pattern:
- Landing page with feature grid, quick start, and architecture highlights
- 9 documentation sections: getting-started, collections, auth, realtime,
file-storage, cloud-functions, SDK (JS + Go), and deployment
- K8s manifests for base.hanzo.ai (static docs) and api.base.hanzo.ai
(multi-tenant Base platform with IAM/KMS integration)
- Dockerfile with nginx for static export serving
- Monochrome Hanzo theme via neutral.css + Geist fonts