- Add apiUrl/wsUrl to brand config for runtime resolution
- Auth and OAuth callback now use brand's apiUrl instead of baked env var
- Pin node:22-alpine to specific digest for supply chain security
Updated all container image references across compose, K8s manifests,
cloud deploy scripts, and tests to use the ghcr.io/hanzoai/bootnode
registry format.
The layout.tsx was missing bootnode case in brand switch,
causing it to fall through to Hanzo. Added bootnode and
changed default from Hanzo to Bootnode.
Build distinct images with NEXT_PUBLIC_BRAND baked in at build time:
- web-latest (bootnode brand for bootno.de)
- web-hanzo-latest (hanzo brand for web3.hanzo.ai)
Next.js NEXT_PUBLIC_* vars are embedded at build, not runtime.
- Split web deployment into hanzo-web3 and bootnode-web
- hanzo-web3: web3.hanzo.ai, auth via hanzo.id
- bootnode-web: bootno.de, auth via iam.bootno.de
- Updated CI to deploy both frontends
- Changed image registry to ghcr.io/bootnode/bootnode
- Updated ingress for both domains with separate TLS certs
CI pushes to ghcr.io/hanzoai/bootnode, but manifests were
referencing hanzoai/bootnode which defaults to docker.io.
This caused deployments to use stale images from docker.io.
- Add CDN-Cache-Control header (60s) for HTML pages
- Keep long cache (1 year) for immutable static assets
- Prevents Cloudflare from serving stale branded content
The hanzo-kms and hanzo-iam packages are not published to PyPI,
causing uv lock to fail. In production K8s, secrets are injected
as env vars directly by the KMS operator.
- Link Hanzo IAM users to Commerce customers via hanzo_id
- Auto-create Commerce customer on first billing access
- New unified billing endpoints:
- GET /billing/account - unified user with IAM + Commerce data
- GET /billing/account/subscriptions - all subscriptions
- GET /billing/account/invoices - all invoices
- GET /billing/account/payment-methods - payment methods
- POST /billing/account/sync - sync IAM to Commerce
- POST /billing/account/subscribe - create subscription
- Support for hanzo.id, zoo.id, lux.id, pars.id orgs
- Update layout.tsx with brand-aware metadata (title, OG, icons)
- Change default brand from bootnode to hanzo in brand.ts
- Update homepage, product pages with brand-aware text
- Replace api.bootnode.dev URLs with api.hanzo.ai
- Update llms.txt route to use brand system
- Update security, privacy pages with Hanzo branding
- Update code-demo, unified-navigation with brand logos
- Update footer status link to status.hanzo.ai
- Add k8s configs for production deployment
- Use shared postgres/datastore in hanzo namespace
- Fix image registry to ghcr.io/hanzoai/bootnode
- Add deploy script with shared infra support
- Simplify compose.yml for local development
Added the following Hanzo services to compose.yml:
- IAM: Multi-tenant identity (hanzo.id, lux.id, zoo.id, pars.id)
- KMS: Secrets management and encryption
- Platform: Service orchestration and deployment
- Console: Admin dashboard with AI backend
- Console Worker: Background job processor
- Commerce: Multi-tenant e-commerce platform
- Analytics: Multi-tenant analytics platform
All services share the existing infrastructure:
- PostgreSQL for operational data
- Redis for caching and queues
- ClickHouse (datastore) for analytics
To start Hanzo services:
docker compose --profile hanzo up -d
Added IAM service to the compose stack:
- Uses ghcr.io/hanzoai/iam:latest image
- Shares PostgreSQL and Redis with other services
- Available on port 8001
- Multi-tenant support for hanzo.id, lux.id, zoo.id, pars.id
- Use profile 'hanzo' to enable: docker compose --profile hanzo up