73 Commits
Author SHA1 Message Date
zooqueenandHanzo Dev a8f698c45c The global-batch load balance post's frontmatter is valid YAML, so zen-docs builds
Co-authored-by: Hanzo Dev <[email protected]>
2026-09-23 02:59:23 -07:00
zooqueenandHanzo Dev f79dd3b6d4 The Zen enso names its animations with useId, so a page that shows it hydrates without a text mismatch
Co-authored-by: Hanzo Dev <[email protected]>
2026-09-23 02:54:18 -07:00
zeekayandHanzo Dev 5a779c7088 Pricing reads come from api.hanzo.ai
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]>
2026-09-16 23:53:10 -07:00
zeekayandHanzo Dev 85c835b7cd Merge github/main
Keeps the thirty-two files migrate/nemo: Data Designer maps to gym synth
deleted. That commit says it edits one guide and removes LICENSE,
Dockerfile, Makefile, turbo.json, renovate.json, the k8s manifests, the
changesets and every screenshot — 39,655 lines under a subject about
naming `gym synth`. Without turbo.json the monorepo has no build.

The lockfile stays too. hanzo.yml gates on `pnpm install
--frozen-lockfile`, which needs one, and the root `version` script ends
by writing one.

waku moves off `>=1`, which matches nothing published — 1.0.0-rc.0 is a
prerelease — back to the `^0.26.0 || ^0.27.0` the remote carries.

The create-app templates keep this side's Zen wiring, which is the later
of the two, and gui-docs loses the last file each side left behind.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 16:32:20 -07:00
zeekayandHanzo Dev be5c7e8e15 State a version once
A version written into a manifest is written into every manifest that wants it,
which is how eslint came to exist in a hundred and four forms across this estate
and how a package came to resolve twice at run time. The catalog moves the number
out of the manifest: a manifest names the package, the workspace names the
version.

Four are held below their latest because the newer release cannot be used, and
the reason is recorded rather than the version alone: @noble/hashes 2 renamed
every subpath the web3 stack imports, @splinetool/runtime 2 depends on a package
that was never published, @dynamic-labs 5.4.1 the same, and react-resizable-panels
3 points its types condition at the bundle.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 16:21:17 -07:00
zeekayandHanzo Dev 5313260909 Every docs site wears the same chrome
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]>
2026-08-29 14:29:19 -07:00
zeekay 37616d44ec the corporate name is Lux Industries Inc
Lux Partners Limited is the Isle of Man company and does not appear on a
public surface. Lux Industries Inc, a Delaware C corporation, is the name
these sites, packages and notices carry.
2026-08-28 18:21:58 -07:00
zooqueen 3d682b6fcd Each docs site renders on one adapter
The two UI packages are adapters over different headless primitive
libraries: base-ui wraps @base-ui/react, radix-ui wraps @radix-ui/*. They
are meant to be alternatives. Every app here had been pulling from both.

Each package builds its own React contexts, so a provider from one is
invisible to a consumer from the other. insights-docs, pulsar-docs and
zen-docs mounted RootProvider and the CSS preset from base-ui but took
DocsLayout and the MDX map from radix-ui, so the layout's search trigger
read radix's SearchContext default -- enabled:false, setOpenSearch a
no-op. SearchTrigger returns null when disabled, so the control was not
dead -- it was ABSENT. Measured on a built insights-docs: [data-search]
0 -> 1, the mobile header gaining a 34x34 search button. The keyboard
path still worked, because base-ui's SearchProvider was mounted and
registers its own keydown listener: Meta+K opened the dialog at base.
So the defect was an undiscoverable search with no affordance and no
kbd hint (hotKey: []), not a search that could not be reached.

apps/docs was consistent in its app code (layout, provider, MDX map, CSS
all base-ui) but 28 hand-written MDX pages and the two resolveAlias
entries reached for radix Callout, Card, Files and Tabs, which loaded the
whole second library alongside the first.

Tabs draws ONE frame before this and one after, and the earlier claim
that it drew two was wrong. quickstart.mdx already imported base-ui
tabs, and base-ui's tabs.tsx already carried the collapse logic -- a
file this change does not touch. The alias repoint removes a latent
trap for the next upstream sync; it fixes no observed defect.

Callout, Card and Files are byte-identical across the two packages, so
this moves no pixels.
Nothing in apps/ imports docs-ui now, and its dependency entry goes with
it. The registry generator still names both -- it publishes both.
2026-08-27 17:05:17 -07:00
zeekay 7685d2b693 fix(brand): the tab shows our mark, not the framework we built on
zen-docs and pulsar-docs both shipped Apache Pulsar's purple mark, the astro
and react-router examples shipped their upstream's, so a reader with two of our
docs sites open saw another project in both tabs. They are @hanzo/logo's
favicon now — and the examples matter most, because a template someone copies
carries whatever brand it was scaffolded with into their project.
2026-08-25 11:58:23 -07:00
zooqueen 647fb3e865 retire the hk- key prefix: sk- is what the gateway verifies
Cloud verifies two key shapes, pk- and sk-, and IAM has minted sk-
since v1.33.9. Nothing mints hk-, so every curl, env var and SDK
snippet carrying it handed the reader a credential that resolves to
no principal.

Server-side examples become sk-. The one publishable case is the
Console tracing client, whose constructor field is publicKey; that
becomes pk-.

Where a page taught the taxonomy rather than just used it, the prose
is rewritten rather than character-swapped. api-keys and
getting-started listed "API Key (hk-)" and "Secret Key (sk-)" as two
prefixes; after the retirement that is one row, and scope -- not
prefix -- is what separates a project key from an org key.

apps/spec is generated from hanzoai/HIPs, which carried the same
claim; fixed there. The vendored openapi document has no hk-, so the
pin is untouched.
2026-08-19 21:08:34 -07:00
zeekayandzooqueen a24dd7697b Fix zen5 page skipped by the MDX loader; record the UI-framework debt
The Latency column wrote bare "<50ms", "<200ms", "<2s". MDX reads "<5" as the
start of a JSX tag and fails with "Unexpected character 5 before name", and the
loader's response is to skip the whole page: /docs/models/zen5 returned HTTP 200
with the chrome and none of the content. Nothing caught it, because zen-docs
passes types:check either way — tsc does not compile MDX. Verified by rendering:
128KB and no body before, 208KB with every section after. The values are fenced
in backticks, which is also how a latency belongs in a table.

LLM.md gets the measurements rather than a separate report file: tailwind is
LIVE here (21 postcss pipelines, 60 CSS entrypoints, and the published
radix-ui/base-ui tarballs ship "@import tailwindcss"), 39,433 class tokens over
537 source files, and the reason it cannot be patched away is that the UI layer
is two parallel Fumadocs forks that every app consumes. Also recorded: the
radix->@hanzo/gui primitive map with the two that genuinely do not exist
(navigation-menu, scroll-area), that @zenlm/ui ships tailwind classes with no
CSS in its tarball, and that types:check fails 50/72 and vitest 13/216 at rest
so changes are judged on the delta.
2026-08-19 21:07:55 -07:00
zeekayandzooqueen 13abc4145f Remove shadcn integration; convert commerce docs examples to @hanzo/gui
packages/shadcn (@hanzo/docs-shadcn) existed to emit
"npx shadcn@latest add <component>" snippets into rendered docs, and
examples/next-shadcn existed to demo it. A docs page that emits an install
command for a DOM-only component library puts that library in the reader's
app, which is the same defect as depending on it here. Nothing else in the
workspace imported either one, so both are deleted rather than repointed.

The commerce recipes and storefront pages taught the same thing more quietly:
every code block a reader copies was styled with tailwind utility classes.
Tailwind classes and raw <div>/<button>/<select> are DOM-only, so a storefront
built from these pages could never run on iOS or Android. They now use
@hanzo/gui components with style props — XStack/YStack instead of flex and
grid classes, Card/Button/Input/Select/Form instead of bare elements, theme
tokens ($color2, $borderColor, $red10) instead of gray-500 and red-500. The
product grid becomes a wrapping XStack because Tamagui targets flexbox on
native, where CSS grid does not exist.

zen5.mdx hand-rolled a highlighted box out of tailwind on fumadocs CSS vars;
it uses the framework's own <Callout>, which is what that box already was.

Authored-docs tailwind goes 17 files / 467 class tokens -> 0. What the counter
still reports is not tailwind: Bootstrap classes in a Thymeleaf template in the
Java/Spring IAM guide, custom CSS class names paired with <style> blocks in the
IAM login-customization guide, one CHANGELOG entry, and content/docs/projects/**,
which is gitignored and regenerated by sync-project-docs.ts from upstream repos.
2026-08-19 21:07:54 -07:00
zooqueen 7df26e55b3 the docs call our services by their names
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.
2026-08-14 20:57:34 -07:00
zeekayandHanzo Dev 01a12d457b sidebar: give every section separator an icon
Measured across apps/*/content/**/meta.json: 76 separators, 2 with an
icon, 74 without. A bare "---Title---" renders as naked text between
icon-bearing rows, so the majority case looked like the broken one.

72 of 76 now carry one. The remaining 4 are in
content/docs/projects/hanzoai/python-sdk/, which is gitignored upstream
content mirrored by scripts/sync-project-docs.ts — this repo's rule for
ported docs is "port, don't re-author", and an edit there is overwritten
on the next sync anyway.

11 of the 72 could not be fixed by editing the file. services/meta.json
is REGENERATED from the @hanzo/products catalog on every build:pre, so a
hand-added icon survives until the next build and no further. The map
lives in the generator instead. It lives there and not in @hanzo/products
because the catalog owns the taxonomy while how a category is DRAWN is a
docs concern; putting it upstream leaks presentation into the product
catalog. A category with no entry now warns by name rather than quietly
shipping a bare separator again.

One vocabulary, reused on purpose: the same idea takes the same mark
everywhere (Getting Started/Setup -> Rocket, Commands -> Terminal,
Reference -> BookOpen, Security -> ShieldCheck, ...). Every name is a
verified lucide export; an unknown one would not fail the build, it would
warn and render nothing, which is the state this commit removes.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-06 00:36:31 -07:00
zeekayandHanzo Dev cbc7903b9b docs: collapse the KMS Infisical mirror to the surface we actually serve
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]>
2026-08-05 15:07:33 -07:00
zeekayandHanzo Dev 012a1a2d4e fix(collections): generate the content collections into one place
`@hanzo/docs-mdx` writes the collection modules to its outDir, `.docs/`.
Nothing read them there. Apps read a committed `docs/` copy instead, reached
three different ways:

  13 apps  `@hanzo/mdx:collections/server` + a webpack alias -> ./docs/*.ts
   3 apps  `@/docs/server`, straight into the committed copy
   2 apps  the alias, with no committed copy at all

The two with no copy — bootnode-docs and tasks-docs — could not build:

    ./lib/source.tsx
    Module not found: Can't resolve '@hanzo/mdx:collections/server'

and four more built from a copy that no longer matched the content beside it:

    ./docs/server.ts
    Module not found: Can't resolve
      '../content/docs/reference/templates/USER.mdx?collection=docs&only=frontmatter'

That is what committing generated code buys: the build reads a snapshot of
the content rather than the content.

One name, one location, every app: `@hanzo/mdx:collections/*`, resolved to
`.docs/` — the generator's own output, rewritten on every build, gitignored.
`tsconfig` gains the matching `paths` entry so the specifier type-checks
instead of relying on `ignoreBuildErrors`; apps/docs stops overriding outDir
in both `next.config.mts` and `gen:collections`; turbo caches `.docs/**`. The
16 committed mirrors are deleted. Examples already did it this way.

`.source` goes with them — this fork's outDir has been `.docs` for a while,
leaving `.source` in the vite plugin's JSDoc, an example's import map, an
oxlint ignore and `.gitignore` pointing at a directory nothing writes.

Also declares in `globalEnv` the env vars the build scripts actually read
(HANZO_DOCS_SYNC, HIPS_REPO_DIR, DOCS_SECTION, the search vars...). Turbo
does not forward undeclared vars, so `HANZO_DOCS_SYNC=0 turbo run build` had
no effect on the sync it names.

  turbo run build --filter='./apps/*' --continue
    before  Tasks: 33 successful, 40 total
            Failed: bootnode-docs, docs, engine-docs, ml-docs, router-docs,
                    spec, tasks-docs
    after   Tasks: 38 successful, 40 total
            Failed: docs, spec        (both for unrelated reasons, fixed next)

(cherry picked from commit 3d11394b092530489b60931e46b4938a88a2bdd5)

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-04 18:39:19 -07:00
zeekayandHanzo Dev 409784ec52 docs: stop describing our own models as someone else's
Zen and enso are Hanzo's own families. Several surfaces described them by
whose API they imitate, or filed them under a competitor's namespace.

- zen-docs embeddings: drop the "Upstream: text-embedding-3-large by OpenAI"
  row that presented zen-embedding as a rebadge; correct dimensions to the
  1024 the gateway actually returns.
- zen-docs pricing: Zen was priced as "3x the upstream Fireworks inference
  cost", with a claim that every model page discloses its upstream model and
  provider. Rates are per model; state that instead. Same framing removed
  from platform pricing.
- bot-docs gateway config: "anthropic/zen5" -> "hanzo/zen5"; hanzo is the
  provider id Bot actually uses (src/commerce/tier-model.ts).
- zen-docs: curl and the Hanzo SDKs lead; upstream-SDK samples move below a
  labelled wire-compatibility section. Anthropic Messages page keeps its
  substance, loses the drop-in framing.
- Marketing sites: replace provider/model resell counts used as positioning
  with what the product is. Our families lead the model grid; third-party
  rows stay, since those integrations are real.
- Neutral placeholder for a proxy key in our own samples.

Provider lists Bot genuinely connects to (LM Studio, vLLM, LiteLLM) are left
alone, as is the zen5 expert-pool table, which is real architecture lineage.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-01 16:09:01 -07:00
zooqueenandHanzo Dev b86b6f1f97 ui: one spelling of the fork in apps/docs, and a types:check that runs
apps/docs imported the same component library under three names — 11 files
from `@hanzo/docs/ui/*` (a pure re-export shell), 10 from `@hanzo/docs-ui`
(the Radix fork), plus 5 hand-copied shadcn files under components/ui.
All of it now resolves to `@hanzo/docs-base-ui`.

The 5 local copies are deleted. badge, hover-card, select and the container
card move into base-ui on `@base-ui/react` — preview-card is the hover-card
analog and Select.Value already takes `placeholder`, so the swap is 1:1 and
introduces no Radix. buttonVariants gains `xs`/`md`/`lg` and `link`, purely
additive, so no existing caller changes. Three Radix packages leave
apps/docs; `presence` and `tooltip` stay because non-shadcn code uses them.

global.css now takes base-ui's preset rather than the Radix fork's. The two
are not duplicates: `neutral.css` defines the colours, `preset.css` carries
base styles plus the `@source inline` safelists. Only `default-colors.css`
declares a `--color-fd-*` value, and it is byte-identical across both forks,
so no colour moves.

`types:check` never ran. pnpm installs the mdx bin scope-stripped as
`docs-mdx`, so `@hanzo/docs-mdx &&` died at `sh: no such file` and took
`tsc` with it — silently, in every app, for `lint` too. Fixed in all 32
scripts. apps/docs reports 107 first-party errors; that is the real number,
unchanged by this commit.

Also unbreaks two undefined references in openapi's server entry that a
large upstream merge left behind: PlaygroundAuthProvider was used but never
imported, and pickSchema/encodeInternalRef were orphaned utilities. Both
crashed the docs export. More remain in that package (renderResponse is a
missing function, not an import) — noted, not guessed at.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-31 18:42:18 -07:00
zooqueenandHanzo Dev ed3285d93d deps: one set of versions, and a transpile list that actually applies
Three things the workspace disagreed with itself about.

Versions. apps/docs ran ahead on next 16.2.6 / react 19.2.6 / TS 6, the other
21 apps trailed on next 16.1.6 / react 19.2.3 / TS 5.9.3, and the packages sat
somewhere between with five different @types/react pins. Everything is now on
the newest patch of the line it was already on — react 19.2.8, next 16.2.12,
@types/react 19.2.18, @types/react-dom 19.2.4 — and the TS-5 stragglers join
the TS 6.0.3 the root and every package already used. No majors were invented:
6.0.3 IS the top of the 6.x line, and TS 7 is blocked because [email protected]
declares `typescript: ^5.5.0 || ^6.0.0`.

The duplicate key. next.config.mts declared `transpilePackages` twice in one
object literal, so the later list won and @hanzogui/shell and @hanzo/brand had
never been transpiled — the comment explaining why they must be outlived the
setting it described. tsc had been reporting this the whole time as
next.config.mts(193,3) TS1117; the app's `types:check` never reaches tsc (its
script starts with a bare `@hanzo/docs-mdx`, which is not the bin's name and
fails immediately), so nobody saw it. One list now, both groups in it.

Dead weight. Twelve packages apps/docs declared and no file, config, script or
browserslist field referenced: @radix-ui/react-dialog, @floating-ui/react-dom,
@mixedbread/sdk, @orama/orama, openapi-sampler, react-remove-scroll,
algoliasearch, gray-matter, tinyexec, tinyglobby, @types/three (types for a
package that isn't installed) and shadcn (no components.json exists anywhere in
the repo, so the CLI was never initialized). The ones that are real
dependencies of packages/openapi, packages/core and packages/cli keep their own
copies — pnpm's node_modules is isolated, so nothing lost a resolution.
@orama/core stays: apps/docs/app/static.json/route.ts pulls OramaDocument
through @hanzo/docs-core/search/orama-cloud, which types against it.

Verified against a clean worktree at HEAD, since the working tree carries
gigabytes of untracked synced project docs that CI never checks out:

  turbo build, apps + packages    43/52 before, 43/52 after, same 9 failures
  docs export                     1764 html pages, byte-identical page count
  deploy.yml gate                 index/docs/services present, /docs has nav
  tsc --noEmit in apps/docs       325 errors before, 324 after (the TS1117)
  vitest                          169 passed / 13 failed, both sides

The 9 build failures and 13 test failures are unchanged from HEAD and none are
version-related: 7 sibling apps cannot resolve @hanzo/mdx:collections/server
under `next build --webpack`, zen-docs has a committed docs/server.ts importing
a deleted zen5-coder-flash.mdx, and packages/preview cannot resolve its own
@/lib/source alias under waku/vite.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-31 17:41:08 -07:00
zeekay c28fad9afc fix(docs): every published quickstart was dead on arrival
Two independent defects made every documented 'first API call' fail:

1. FICTIONAL MODEL IDS. `zen-omni` and `zen-coder` appear ZERO times in the
   live catalog (api.hanzo.ai/v1/models, 440 models). Every SDK sample -
   python, typescript, go, cpp, swift, kotlin - told the customer to call a
   model that does not exist, so even a correct request 400s. Corrected to the
   real ids: zen5 and zen5-coder.

2. DEAD HOST + STALE PINNED MODEL. llm.hanzo.ai is retired and 301s (a POST
   returns the literal string 'Permanent Redirect', not a completion), and
   `claude-sonnet-4-5-20250929` is long superseded. Both removed: the host is
   gone from customer-facing docs entirely rather than documented as retired,
   and pinned upstream ids give way to our own current zen5.

50 files. Verified against the live catalog, not assumed.
2026-07-25 16:11:04 -07:00
zeekayandHanzo Dev eec172cbc2 feat(analytics): every docs site on the ONE /v1/event door, not the Umami tag
The <script src="analytics.hanzo.ai/script.js" data-website-id> tag is a shim:
it talks to a read LENS instead of the one ingestion front door, so a docs site
could only ever produce pageviews — no errors, no product events, and a separate
per-site id to keep in sync. Replaced across all 12 sites with @hanzo/event
POSTing api.hanzo.ai/v1/event, which Cloud fans server-side into the web
(analytics), product (insights) and error (sentry) lenses. `product` is the only
per-site knob; Cloud resolves the tenant, so no site carries an id any more.

One implementation, not twelve: packages/analytics (@hanzo/docs-analytics)
mounts the provider, adds a pageview per client-side route change, and honors
Global Privacy Control / Do-Not-Track by disabling the client outright. The main
hub's inline Insights snippet goes too — that lens is already fed by the one
stream.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-25 13:34:22 -07:00
zeekay 8e231e92ee fix(brand+serve): docs is not an AI gateway; pin canonical static v0.5.1
Our own docs branded a Hanzo product as an 'AI Gateway' (/docs/llm title+H1,
skills index, and ~90 files across docs/bot-docs/cloud). Renamed to 'AI API'
to match hanzo.ai/app/bot. Third-party product names are facts about someone
else's product and are NOT rewritten: 'Vercel AI Gateway' restored verbatim
(same carve-out as LiteLLM); HanzoBot's own 'Gateway' transport untouched.

Pins ghcr.io/hanzoai/static 0.4.1 -> v0.5.1: only v0.5.1 carries 79ac4f9
(serve directory index in place), so docs was the last host 301ing /docs/x/
-> /docs/x/index.html, which poisons Next's router into prefetching
.../index.html/__next._tree.txt — 8 failed requests per page load.
2026-07-25 12:56:52 -07:00
zeekayandHanzo Dev 2f166e678c docs(brand): reframe "LLM Gateway"/LiteLLM copy → Hanzo AI Gateway; canonical SDK links
Purge "LLM gateway" / "unified proxy" / vs-LiteLLM framing across all
Hanzo-authored docs, marketing, and skill copy per SDK-ARCHITECTURE brand
rules. Hanzo is a full AI SDK / AI cloud, not a proxy.

- "LLM Gateway" → "AI Gateway"; hero/positioning copy → "one API for every
  model". "unified proxy"/"unified gateway" removed from Hanzo copy.
- Drop "Fork of LiteLLM" / LiteLLM-as-backbone positioning. Keep genuine
  third-party LiteLLM integration docs, the bot's own WebSocket Gateway
  protocol, and functional config keys (litellm_params, LITELLM_MASTER_KEY)
  intact.
- SDK links → canonical homes: zen-docs API table (go get
  github.com/hanzo-go/sdk, pip install hanzo, npm i @hanzo/ai, cargo add
  hanzo); org preset SDK entries point js-sdk→hanzo-js/sdk,
  python-sdk→hanzoai/python-sdk (flagship).

Generated/synced trees (apps/spec/content/docs HIP corpus and
projects/hanzoai/bot, both gitignored) are out of this repo's committable
scope — their brand fix belongs in the source repos.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-24 12:56:00 -07:00
zeekay ada2f3d2ab rebrand: complete white-label — all packages @hanzo/docs-* (one brand)
Finish the fumadocs→Hanzo Docs rebrand: rename the remaining fuma-named
workspace packages and every reference so the framework is uniformly
@hanzo/docs-*. One brand, no Fuma in package names or product surface.

Package renames (name field + all refs: deps, imports, CSS @import,
configs, .changeset, next/vite build config):
  fumadocs-core        → @hanzo/docs-core
  fumadocs-mdx         → @hanzo/docs-mdx
  fumadocs-ui          → @hanzo/docs-ui          (packages/radix-ui)
  fumadocs-openapi     → @hanzo/docs-openapi
  fumadocs-preview     → @hanzo/docs-preview
  @fumadocs/base-ui    → @hanzo/docs-base-ui
  @fumadocs/basehub    → @hanzo/docs-basehub
  @fumadocs/language   → @hanzo/docs-language
  @fumadocs/local-md   → @hanzo/docs-local-md
  @fumadocs/sanity     → @hanzo/docs-sanity
  @fumadocs/shadcn     → @hanzo/docs-shadcn
  @fumadocs/vite       → @hanzo/docs-vite
  @fumari/stf          → @hanzo/docs-stf
  create-fumadocs-app  → @hanzo/create-docs
  create-fumadocs-versions → @hanzo/docs-create-versions

Stale @fumadocs/{cli,story,tailwind,mdx-remote,...} references collapsed to
their existing @hanzo/docs-* canonical packages (no dup created).

De-branded product strings: Fumadocs/Fuma prose → Hanzo Docs/Hanzo; site
branding, CLI output, doc copy, AI-assistant name, metadata. URLs
fumadocs.dev → docs.hanzo.ai, repo fuma-nama/fumadocs → hanzoai/docs.
Filesystem renames: packages/python/fumapy → hanzodocs_py, preview config,
what-is-fumadocs.mdx → what-is-hanzo-docs.mdx, api/fumadocs-ui route.

KEPT (real external npm deps / attribution — NOT renamed):
  fuma-cli, fuma-content, @fumari/json-schema-ts (published upstream pkgs),
  typesense-/trieve-fumadocs-adapter (3rd-party search adapters),
  LICENSE "Copyright (c) 2023 Fuma" (OSS attribution, all 7 LICENSE files
  untouched), CHANGELOG.md history (accurate release records, left as-is).

Build: node 24, pnpm install clean; all 4 target apps next build GREEN
(spec, gui-docs, zen-docs, base-docs) + full package closure (18/18 turbo).
Gate: zero @hanzo-package fumadocs-/@fumadocs/ references remain.
2026-06-24 23:21:42 -07:00
zeekay 4dd003d791 fix(docs): repair fumadocs i18n context + page-tree $ref + docs registry/config wiring
Unblocks app-build-green for the content-docs apps (spec, gui-docs, zen-docs,
base-docs) and advances the docs registry/config app integration.

Root causes (upstream-merge artifacts from the 16.x restructure), with the
authoritative fix matched to upstream [email protected]:

- packages/{base-ui,radix-ui}/src/contexts/i18n.tsx: file was partially
  overwritten with an older shape — it referenced `defaultTranslations`,
  `use`, `renderTranslation`, `TranslationValue`, `TranslationObject`
  without importing/defining any of them, and redeclared a stale local
  `Translations`. Restored the upstream 16.9.3 context: import the i18n
  primitives from `fumadocs-core/i18n` + `@/i18n`, use React `use`. This was
  the `ReferenceError: defaultTranslations is not defined` prerender crash.

- packages/core/src/source/page-tree/builder.ts: item `$ref` was emitted as
  an object `{ file: path }`, violating `PageTree.Item.$ref?: string` and
  breaking the sort (`aT.localeCompare` on an object → `c.localeCompare is
  not a function`). Restored upstream string `$ref: path`.

- packages/shared/registry.ts: `glob` was imported from `node:fs/promises`
  (an async generator → `await glob()` is non-iterable → `{} is not
  iterable`) and `Component` was double-imported. Restored upstream
  `import { glob } from 'tinyglobby'`.

- apps/docs registry codegen aligned to the real `@hanzo/docs-cli/build`
  (=`fuma-cli/compiler`) API: `components/registry/index.ts` split the
  merged duplicate `export const registry` back into `compileOptions` +
  `registry` (restoring the dropped `baseUi`/`sanity` registry imports);
  `scripts/build-registry.ts` uses `compile({ root, ...compileOptions })` +
  `writeRegistry` instead of a non-existent `RegistryCompiler`/
  `combineRegistry`/`writeDocsRegistry` surface. Restored the dropped
  `lib/inkeep/inkeep-qa-schema.ts` and declared the inkeep files in the
  `ai/hanzo` component.

- apps/docs/next.config.mts: ESM `__dirname` shim via
  `fileURLToPath(import.meta.url)`; removed orphaned `createNextStory()`
  dead line; declared the `@hanzo/docs` workspace dep the config imports.

- apps/docs/package.json build:pre/post/lint run via `bun` (resolves `@/`
  tsconfig aliases) to match every other app — `node` cannot resolve `@/`.

- apps/zen-docs/[[...slug]]/page.tsx: reuse the canonical `getMDXComponents()`
  factory instead of an inline components map whose `next/dynamic` wrappers
  produced an over-specific `ComponentType` incompatible with
  `NestedMDXComponents`.

Verified `next build` GREEN (exit 0, full static gen): spec 245/245,
gui-docs 103/103, zen-docs 129/129, base-docs 19/19. 29/29 packages build
green (fumadocs-preview leaf excluded). The `docs` registry/demo app remains
blocked only on external `@hanzo/iam`/`@hanzo/logo` packages not present in
this tree (the in-flight subject of this branch).
2026-06-24 18:50:54 -07:00
zeekay c49aa996fd fix(docs): normalize phantom names in CSS/astro/changeset/next-config (red review)
Follow-up to 903b1c38: the package-name normalization covered JS/TS imports +
package.json but missed four other surfaces that name the same phantom packages,
relocating the breakage from 'pnpm install' to 'next/vite/astro build':
- H1: 46 CSS @import strings (@hanzo/docs-{base-ui,ui,openapi}/css/*) → real pkgs
  (preserved legit @hanzo/docs-{twoslash,story} CSS)
- H2: examples/astro .astro imports (base-ui/mdx→fumadocs-ui/mdx, docs-core/toc→fumadocs-core/toc)
- L1: .changeset/config.json fixed-array lockstep names
- L2: removed apps/docs/next.config.mts dead phantom→phantom self-alias + dup keys
Found by adversarial red review of 903b1c38.
2026-06-24 15:52:22 -07:00
zeekay 868938c48b fix(docs): normalize phantom workspace package names — monorepo installs again
The fumadocs-fork rebrand left ~13 apps + examples referencing packages under
names that don't exist in the workspace (in BOTH directions: some kept
fumadocs-*, some became @hanzo/docs-*). pnpm install failed outright. Mapped
every reference (deps + imports, 607 source + 61 package.json) to the package
that actually exists, by suffix:
  @hanzo/docs-{core,mdx,ui,base-ui} → fumadocs-{core,mdx,ui} / @fumadocs/base-ui
  @fumadocs/{story,cli,mdx-remote,tailwind} → @hanzo/docs-{story,cli,...}
  fumadocs-{docgen,epub,twoslash,typescript} → @hanzo/docs-{...}
  drop phantom eslint-config-custom
Guarded @hanzo/docs-mdx vs -mdx-remote. Also fixes a pre-existing cli bug
(createConfigSchema referenced undefined isSrc) that blocked the package build.

Verified: pnpm install resolves clean (46.8s, was broken); package dist
regenerates phantom-free from the corrected source (hanzo-docs 430→0). Full
app build-green is blocked only by a node v26 toolchain bug in fumadocs-mdx's
config loader (repo targets node >=24.14; CI node builds it).
2026-06-24 15:17:27 -07:00
github-actions[bot] 148489dc34 Version Packages 2026-03-25 01:42:39 +00:00
zeekay 2bf39d6edb docs(zen): add Anthropic Messages API compatibility docs 2026-03-22 13:35:56 -07:00
zeekay b18c8703a3 feat: add Hanzo analytics tracking to zenlm.org 2026-03-12 01:45:04 -07:00
zeekay c550ffbb28 fix: force new chunk hash for ZenEnso circle logo
CF CDN was serving cached JS chunks with old bezier path.
Adding data-v attribute to force a new webpack chunk hash
so the CDN serves the updated circle-based SVG.
2026-03-03 13:39:39 -08:00
zeekay 42a7e89a62 chore: regenerate zen-docs collection maps
Add open-training-hanzo-network blog post, reorder docs entries.
2026-03-03 12:50:15 -08:00
zeekay 413711b882 docs: update zen5 MoDE page with architecture details
Add expert pool specs (3.1T across 6 model families), complexity
tiers (T0-T4), training efficiency (394M/0.013%), model lineup,
training phases, and GitHub link.
2026-03-03 08:25:17 -08:00
zeekay 22c0779435 fix: ZenEnso uses SVG <circle> for geometrically perfect logo
Replace hand-drawn bezier path (M256 74 C154...) with SVG <circle>
element. The old path had a visible bend near the top. The new
implementation uses r=172, stroke-dasharray for the draw animation,
and starts drawing from 12 o'clock via rotate(-90).
2026-03-03 08:08:29 -08:00
zeekay ee08d3105c rename @hanzo/zen-models → @zenlm/models; fix Distilled → Diverse everywhere
- packages/zen-models: rename package to @zenlm/models, update all source comments
- zen-docs: fix "Mixture of Distilled Experts" → "Mixture of Diverse Experts" across
  all blog posts and docs content (models.mdx, index.mdx, zen-mode-architecture.mdx,
  zen4-ultra.mdx, zen5-release.mdx, drop-upcycling-zen-mode.mdx)
- apps/docs: fix brand copy on home page
2026-03-01 18:12:13 -08:00
zeekay 7b2d929bd5 fix: remove 2T+ spec; position Zen 5 as largest open-source LLM ever
- zen5.mdx: replace '2T+ parameters' with 'The largest open-source LLM ever'
- zen5.mdx: update description + status banner to goal-first framing
- open-training post: same 2T+ → 'largest open-source LLM ever' fix
- homepage card: tease without parameter count
- zen-models: fix header comment Distilled → Diverse Experts
2026-03-01 17:22:54 -08:00
zeekay d40fff883d feat(zen-docs): Zen 5 research preview + open training program
- Add prominent Zen 5 banner to homepage with live training badge,
  three-pillar summary (Zen MoDE / verifiable compute / community data),
  and CTAs to research preview, data submission, and live dashboard
- Rewrite docs/models/zen5.mdx: full research preview with architecture
  details, Zen MoDE (Mixture of Diverse Experts), open training explainer,
  data submission guide with code examples, community rewards, timeline
- Add blog/open-training-hanzo-network.mdx: deep dive on how Hanzo Network
  works (TEE, stake bonds, gradient aggregation), what data we want,
  submission format + Python API, quality filtering, contributor rewards
- Expand Research section on homepage to feature 3 posts with preview cards
- Add Research footer column: Zen 5, Hanzo Network, Submit data, Blog, Papers
- Import FlaskConical, Network, Database icons for new UI elements
2026-03-01 17:13:28 -08:00
zeekay 18f5936fcd fix(zen-docs): AI safety research positioning, Zen MoDE = Diverse Experts
- Replace all 'abliterated/uncensored' language with 'safety research variant'
- Reframe research variants as AI safety research program (red-teaming,
  alignment evaluation, robustness testing)
- Fix Zen MoDE scope: Mixture of Diverse Experts, Zen 5 only (not Zen 1-4)
- Remove specific release dates for Zen 5 ('later this year')
- GT-QLoRA blog: remove upstream brand references, reframe as alignment research
- Launch blog: add proper Safety Research Variants section
2026-03-01 17:00:21 -08:00
zeekay c85db808cf chore(zen-docs): regenerate content collections after qwen blog deletion
Auto-generated manifests updated to reflect removal of 37 qwen blog posts.
Browser and server collection manifests now contain only Zen-branded content.
2026-03-01 16:20:36 -08:00
zeekay 881deae654 feat(zen-docs): add external app links row to hero section
Below the primary CTAs in the hero, add a row of subtle pill-style links
to Hanzo Chat, Hanzo App, API Console, and Hanzo AI. Styled as
rounded-full border pills with muted foreground color and hover state.
2026-03-01 16:19:55 -08:00
zeekay 1f9cb465b8 feat(zen-docs): floating pill nav with Try Zen CTA
Replace fumadocs HomeLayout default nav with a fixed floating pill nav:
- Frosted glass pill (rounded-full) centered at top of viewport
- Logo (ZenEnso 24px) + Zen LM wordmark on left
- Desktop: Models / API / Pricing / Training nav links
- Far right: Login (hanzo.id) + 'Try Zen' CTA (white pill → hanzo.chat)
- Mobile: hamburger → dropdown with same links + CTAs
- Expands to rounded-2xl on mobile open, rounded-full when closed
2026-03-01 16:19:19 -08:00
zeekay e97ea89910 content(blog): add Zen LM launch announcement and collaboration story
Launch post covers the full model catalog (100+ models, Apache 2.0),
Zen MoDE architecture, research lineage Zen 1→5, abliterated variants,
and links to hanzo.chat / huggingface.co/zenlm / console.hanzo.ai.

Collaboration post explains the three-org structure: Hanzo AI (infra),
Zoo Labs Foundation (research/governance), Lux Partners (compute layer).
2026-03-01 16:18:34 -08:00
zeekay 8fee3f704b fix(brand): delete 37 upstream qwen blog posts, update @zenlm/ui to 1.0.6
- Remove all qwen*.mdx, qwq*.mdx, qvq*.mdx, codeqwen*.mdx blog posts
  which contained verbatim Qwen/QwenLM content with wrong company links
- Update zen-docs to @zenlm/ui@^1.0.6 (perfect SVG circle logo)
- Remove '3x upstream' pricing language from docs index
2026-03-01 16:16:31 -08:00
zeekay cf191aedc2 content(zen-docs): brand cleanup across blog posts and remove zenlm-models/ui packages
- Update blog/[slug]/page.tsx to use getAllSlugs() instead of getSortedPosts() for static params
- Sweep all blog MDX files to remove upstream model name references (brand policy compliance)
- Add new blog posts: 7680-dim-embeddings, agent-nfts, bitdelta-behavioral-compression, case-for-decentralized-science
- Delete gspo.mdx and qwen2.5-vl-32b.mdx (consolidated/removed content)
- Remove packages/zenlm-models and packages/zenlm-ui entirely
- Update lib/blog.ts, docs/server.ts, docs/browser.ts for blog infrastructure
- Update pnpm-lock.yaml after package removal
2026-03-01 16:07:08 -08:00
zeekay f001bf8814 fix(zenlm-ui): white enso ring — remove fill, default color white
- Remove filled circle that faded in after stroke (pure stroke only)
- Remove cut notch overlay
- Change default color from #A855F7 (purple) to white
- Simplify CSS to single draw animation
- Update zen-docs hero: color="white"
- Bump @zenlm/ui to 1.0.3
2026-03-01 15:55:50 -08:00
zeekay 7a36f0b4b5 chore(zen-docs): switch to @zenlm/ui and @zenlm/models workspace packages
Replace cross-repo @hanzo/ui/models and @hanzo/zen-models references with
self-contained workspace packages @zenlm/ui and @zenlm/models. This eliminates
the CI ENOENT failure caused by the file:../../../ui/pkg/ui cross-repo path.

- components/ModelTable.tsx: @hanzo/ui/models → @zenlm/ui
- components/ZenEnso.tsx: @hanzo/ui/models → @zenlm/ui
- app/(home)/ModelLibrary.tsx: @hanzo/ui/models + @hanzo/zen-models → @zenlm/ui + @zenlm/models
- app/(home)/page.tsx: @hanzo/zen-models → @zenlm/models
- package.json: remove @hanzo/ui, @hanzo/zen-models; add @zenlm/ui, @zenlm/models workspace:*
2026-03-01 15:31:20 -08:00
zeekay 351cfbd13c chore(zen-docs): regenerate content collection manifests for all blog posts 2026-03-01 15:23:26 -08:00
zeekay e5d097b45c chore(blog): normalize date formatting in blog frontmatter 2026-03-01 15:22:57 -08:00
zeekay 511fbf923e chore(zen-docs): update blog routing, source config, and lockfile 2026-03-01 15:21:57 -08:00
zeekay 083b4db956 feat(zen-docs): add shared model components, fix /docs/models page, add blog
Model components:
- Add ModelTable, ZenEnso, ZenLoader components (thin wrappers over @hanzo/ui/models)
- Register ModelTable in client-components.tsx and page.tsx components map
- Rewrite /docs/models.mdx — replace broken DynamicModelTable (dead API)
  with ModelTable using static @hanzo/zen-models data
- Add individual model detail pages (zen3, zen4, zen5 variants)

zen-models:
- Fix zen3 family name: "Zen 3 Multimodal" → "Zen 3"
- Update zen3 description: "Previous generation API models..."

Blog:
- Add blog route (app/blog/, content/blog/)
- Add 30+ zen/hanzo-branded technical blog posts
- Brand-clean: excludes upstream-named posts

Home:
- Update ModelLibrary, layout, page, DownloadSection
- Add not-found page
2026-03-01 15:21:40 -08:00