9da398459e9e43abdb2bee2b7214854a2f6d8b40
The previous commit dropped console's explicit `storage: sessionStorage` so the session would be shared across tabs, and the build died on the next push: Error occurred prerendering page "/auth/callback" ReferenceError: sessionStorage is not defined `^0.21.2` resolved to a build whose default was the bare global `config.storage ?? sessionStorage`, evaluated in the IAM constructor. In a browser that is merely the wrong lifetime; under Next's static export it runs in Node, where the identifier does not exist at all, so the constructor threw and the export exited. Passing `sessionStorage` explicitly had been masking it — the callback page constructs the SDK at module scope, and the value it passed was the client-side one Next never evaluates on the server. 0.21.6 resolves storage through a guarded probe (`typeof localStorage`, then an actual write, since privacy modes expose the object and throw on setItem) and falls back to an in-memory Storage. So prerender gets a real object, the browser gets localStorage, and neither needs a caller to know which one it is. The caret already permitted 0.21.6; the lockfile is what pinned 0.21.2, which is why CI installed the broken one while a local `pnpm install` would not have. Verified by running the export that failed: 13/13 static pages, /auth/callback among them. Co-authored-by: Hanzo Dev <dev@hanzo.ai>
Hanzo Cloud Console
Unified admin console for Hanzo Cloud and all Hanzo cloud products. Built on
@hanzo/gui (cross-platform UI) over the unified /v1
backend (hanzoai/cloud). Dark theme, OIDC sign-in via Hanzo IAM.
Manages: Providers · Models · Applications · Stores · Chat — with an extensible product-module registry so every cloud product can be added as a module.
Quick start
npm install
cp .env.example .env.local
# set NEXT_PUBLIC_IAM_CLIENT_ID for live sign-in; defaults point at production.
npm run dev # http://localhost:4000
Scripts
| Script | What |
|---|---|
npm run dev |
Dev server on :4000 |
npm run build |
Production build (type-checks; Gui CSS injected at runtime) |
npm run start |
Serve the production build |
npm run typecheck |
tsc --noEmit (strict) |
Configuration
All config is NEXT_PUBLIC_* (browser app, cookie auth). See .env.example.
| Var | Default | Meaning |
|---|---|---|
NEXT_PUBLIC_CLOUD_URL |
same origin, else https://api.hanzo.ai |
The ONE Hanzo API endpoint (unified /v1 backend). Never a per-service API host. |
NEXT_PUBLIC_IAM_URL |
https://iam.hanzo.ai |
Hanzo IAM OIDC authority |
NEXT_PUBLIC_IAM_APP_NAME |
hanzo-console |
IAM application (<org>-<app>) |
NEXT_PUBLIC_IAM_ORG_NAME |
hanzo |
IAM organization |
NEXT_PUBLIC_IAM_CLIENT_ID |
— | OAuth client id |
Architecture
See LLM.md for the full design (base choice, /v1 client, auth flow, the product-module registry, and the Providers surface). Endpoint reference in docs/endpoints.md.
License
BSD-3-Clause. Copyright (c) 2026-present, Hanzo AI, Inc.
Languages
TypeScript
99.1%
JavaScript
0.5%
CSS
0.4%