1778 Commits
Author SHA1 Message Date
zeekay 83da5f5221 feat(lux-kms-go): deploy Lux KMS Go server alongside Infisical-fork
* Source: ~/work/lux/kms cmd/kms/main.go — Go-native, MPC-backed, ZapDB.
* Image: ghcr.io/luxfi/kms:server (built native amd64 in lux-k8s build pod;
  CI was unblocked by switching from cross-org reusable workflow to a
  self-contained build job and using hanzo-dev creds for GHCR write).
* Routes: /healthz + /v1/kms/* (auth/login, orgs/{org}/secrets, keys/*).
* Currently secrets-only (MPC_VAULT_ID empty). Threshold signing pending
  mpcd ZAP-server registration on a dedicated port (P2P :9651 doesn't
  accept ZAP client requests, only MPC-MPC handshakes).
* Coexists with the legacy ghcr.io/hanzoai/kms in `lux-kms` ns. Once
  kms-operator is refactored to use luxfi/kms/pkg/client (PR pending),
  KMSSecret CRDs migrate hostAPI → kms.lux-kms-go.svc.cluster.local
  and the Infisical-fork is decommissioned.
2026-04-25 20:52:18 -07:00
Hanzo AI ca6b8ccb54 feat(lux-kms-go): deploy Lux KMS Go server alongside Infisical-fork
* Source: ~/work/lux/kms cmd/kms/main.go — Go-native, MPC-backed, ZapDB.
* Image: ghcr.io/luxfi/kms:server (built native amd64 in lux-k8s build pod;
  CI was unblocked by switching from cross-org reusable workflow to a
  self-contained build job and using hanzo-dev creds for GHCR write).
* Routes: /healthz + /v1/kms/* (auth/login, orgs/{org}/secrets, keys/*).
* Currently secrets-only (MPC_VAULT_ID empty). Threshold signing pending
  mpcd ZAP-server registration on a dedicated port (P2P :9651 doesn't
  accept ZAP client requests, only MPC-MPC handshakes).
* Coexists with the legacy ghcr.io/hanzoai/kms in `lux-kms` ns. Once
  kms-operator is refactored to use luxfi/kms/pkg/client (PR pending),
  KMSSecret CRDs migrate hostAPI → kms.lux-kms-go.svc.cluster.local
  and the Infisical-fork is decommissioned.
2026-04-25 20:52:18 -07:00
zeekay d0b30fd9a7 fix(zoo-exchange): point KMSSecret at Lux KMS, not legacy Hanzo KMS
* apiVersion was wrong: kms.hanzo.ai/v1alpha1 doesn't exist in cluster.
  Real CRD is secrets.lux.network/v1alpha1, owned by ghcr.io/luxfi/kms-operator.
* hostAPI added (required field) → kms.lux-kms.svc.cluster.local
  (~/work/lux/kms Go-native server, MPC-backed via ~/work/lux/mpc).
* Project slug zoo-exchange (own project), env prod, path /.
  No more shared hanzo-exchange/zoo subpath.
* Resource named zoo-exchange-kms-sync to match the *-kms-sync naming
  convention used by analytics/billing/cloud/etc. across hanzo namespace.
2026-04-25 20:52:18 -07:00
Hanzo AI 29ba696da7 fix(zoo-exchange): point KMSSecret at Lux KMS, not legacy Hanzo KMS
* apiVersion was wrong: kms.hanzo.ai/v1alpha1 doesn't exist in cluster.
  Real CRD is secrets.lux.network/v1alpha1, owned by ghcr.io/luxfi/kms-operator.
* hostAPI added (required field) → kms.lux-kms.svc.cluster.local
  (~/work/lux/kms Go-native server, MPC-backed via ~/work/lux/mpc).
* Project slug zoo-exchange (own project), env prod, path /.
  No more shared hanzo-exchange/zoo subpath.
* Resource named zoo-exchange-kms-sync to match the *-kms-sync naming
  convention used by analytics/billing/cloud/etc. across hanzo namespace.
2026-04-25 20:52:18 -07:00
zeekay 7417fbf070 feat(zoo-exchange): KMS-backed secrets, drop init-container patch script
* Replaced init-container ConfigMap (sed URL rewrites + fetch interceptor +
  CSP injection) with clean SPA wiring — secrets come from KMSSecret CRD
  syncing /zoo path from hanzo-exchange KMS project to zoo-exchange-secrets
  in the cluster.
* Image moves from ghcr.io/luxfi/exchange@sha256:9b97... (digest pin +
  nodeAffinity hack) to ghcr.io/zooai/exchange:latest with normal pull.
* SPA_INSIGHTS_API_KEY arrives via envFrom: secretRef. SPA runtime
  templates /config.json from SPA_* env at pod start; brand singleton
  reads insightsApiKey at boot.
* Removed wildcard *.api.zoo.exchange Ingress + cert (no more fake
  cloudflare-prefix subdomains — events go to insights.hanzo.ai directly).
2026-04-25 20:52:18 -07:00
Hanzo AI 22ea49b661 feat(zoo-exchange): KMS-backed secrets, drop init-container patch script
* Replaced init-container ConfigMap (sed URL rewrites + fetch interceptor +
  CSP injection) with clean SPA wiring — secrets come from KMSSecret CRD
  syncing /zoo path from hanzo-exchange KMS project to zoo-exchange-secrets
  in the cluster.
* Image moves from ghcr.io/luxfi/exchange@sha256:9b97... (digest pin +
  nodeAffinity hack) to ghcr.io/zooai/exchange:latest with normal pull.
* SPA_INSIGHTS_API_KEY arrives via envFrom: secretRef. SPA runtime
  templates /config.json from SPA_* env at pod start; brand singleton
  reads insightsApiKey at boot.
* Removed wildcard *.api.zoo.exchange Ingress + cert (no more fake
  cloudflare-prefix subdomains — events go to insights.hanzo.ai directly).
2026-04-25 20:52:18 -07:00
zeekay d30ea0b979 docs(stack): full ecosystem architecture — multi-tenant gateway + WL exchange forking
Comprehensive standup guide covering:
- Repo map (lux/{exchange,bridge,explorer,graph,universe,standard,genesis,cli},
  zoo/{exchange,contracts,brand,logo}, hanzo/, pars/, liquidity/swap)
- Network topology diagram (browser → CF → hanzoai/ingress LB → KrakenD
  gateway → luxd validators / unified explorer / MPC bridge)
- Per-chain backend table (gateway + indexer + graph + explorer per chain)
- Unified luxfi/explorer image (indexer + graph + explore frontend in one)
- White-label DEX standup pattern (50-line main.tsx shim, 5 steps to fork)
- Onboarding new WL apps (hanzo/exchange, pars/exchange, etc.) from canonical
  zoo/exchange template
- Bridge integration (multi-tenant by Host header)
- Local dev full-stack standup (lux + standard + explorer + bridge + zoo)
- Production cluster deploy (kubectl apply per directory)
- DNS table for all 5 brand frontends + their api.*

Cross-references white-label api gateway recipe at
k8s/lux-mainnet/WHITE-LABEL-API.md.
2026-04-25 20:52:18 -07:00
Hanzo AI e1e339dbfc docs(stack): full ecosystem architecture — multi-tenant gateway + WL exchange forking
Comprehensive standup guide covering:
- Repo map (lux/{exchange,bridge,explorer,graph,universe,standard,genesis,cli},
  zoo/{exchange,contracts,brand,logo}, hanzo/, pars/, liquidity/swap)
- Network topology diagram (browser → CF → hanzoai/ingress LB → KrakenD
  gateway → luxd validators / unified explorer / MPC bridge)
- Per-chain backend table (gateway + indexer + graph + explorer per chain)
- Unified luxfi/explorer image (indexer + graph + explore frontend in one)
- White-label DEX standup pattern (50-line main.tsx shim, 5 steps to fork)
- Onboarding new WL apps (hanzo/exchange, pars/exchange, etc.) from canonical
  zoo/exchange template
- Bridge integration (multi-tenant by Host header)
- Local dev full-stack standup (lux + standard + explorer + bridge + zoo)
- Production cluster deploy (kubectl apply per directory)
- DNS table for all 5 brand frontends + their api.*

Cross-references white-label api gateway recipe at
k8s/lux-mainnet/WHITE-LABEL-API.md.
2026-04-25 20:52:18 -07:00
zeekay 49676fc05f k8s(api): white-label api gateway pattern + api.zoo.exchange ingress
Lux-ecosystem KrakenD gateway (lux-mainnet/api-gateway-gateway) is now
documented as a shared multi-tenant backend. Any white-label app —
Zoo, Hanzo, Pars, <tenant>, third-party — points api.<their-domain>
at the same service via a 5-line Ingress + DNS A record. CORS is
wide-open (allow_origins=*) so browser SPAs from any origin work.

This commit:
- k8s/lux-mainnet/api-zoo-exchange-ingress.yaml — first WL ingress
  (api.zoo.exchange → api-gateway-gateway:80, TLS via cert-manager)
- k8s/lux-mainnet/WHITE-LABEL-API.md — onboarding recipe + endpoint
  list + backend topology diagram

zoo.exchange's SPA env (SPA_RPC_HOST, SPA_API_HOST, SPA_GATEWAY_HOST)
all now point at api.zoo.exchange. JS bundle was rewritten by the init
container to swap api.lux.network/* and gateway.{lux,uniswap}.org
references for api.zoo.exchange — zero third-party domains visible
in browser network tab.

Out-of-band: removed api.zoo.exchange from the conflicting
lux-ns/exchange-api Traefik IngressRoute so the standard Ingress
takes the route.
2026-04-25 20:52:18 -07:00
Hanzo AI 19aba237f0 k8s(api): white-label api gateway pattern + api.zoo.exchange ingress
Lux-ecosystem KrakenD gateway (lux-mainnet/api-gateway-gateway) is now
documented as a shared multi-tenant backend. Any white-label app —
Zoo, Hanzo, Pars, <tenant>, third-party — points api.<their-domain>
at the same service via a 5-line Ingress + DNS A record. CORS is
wide-open (allow_origins=*) so browser SPAs from any origin work.

This commit:
- k8s/lux-mainnet/api-zoo-exchange-ingress.yaml — first WL ingress
  (api.zoo.exchange → api-gateway-gateway:80, TLS via cert-manager)
- k8s/lux-mainnet/WHITE-LABEL-API.md — onboarding recipe + endpoint
  list + backend topology diagram

zoo.exchange's SPA env (SPA_RPC_HOST, SPA_API_HOST, SPA_GATEWAY_HOST)
all now point at api.zoo.exchange. JS bundle was rewritten by the init
container to swap api.lux.network/* and gateway.{lux,uniswap}.org
references for api.zoo.exchange — zero third-party domains visible
in browser network tab.

Out-of-band: removed api.zoo.exchange from the conflicting
lux-ns/exchange-api Traefik IngressRoute so the standard Ingress
takes the route.
2026-04-25 20:52:18 -07:00
zeekay 162bbcade3 k8s(zoo-exchange): land hanzoai/spa deployment manifest
Zoo exchange moved out of lux-explorer namespace (reserved for unified
luxfi/explorer indexer+graph+explore) into its own 'zoo' namespace,
runtime switched from nginx → ghcr.io/hanzoai/spa:1.2.0.

- Init container pulls SPA bundle from pinned digest of cached
  luxfi/exchange@sha256:9b9765e0…, patches index.html (Zoo title +
  gateway.uniswap.org CSP), and rewrites 'gateway.lux.org' →
  'gateway.uniswap.org' in all built JS/CSS/HTML (Statsig gating URL
  fix — the .lux.org fork placeholder has no backing deployment).
- Main container runs hanzoai/spa with SPA_* env-var templating into
  /config.json (brand, chain id, RPC/IAM/KMS/ID hosts).
- NodeAffinity to lux-nodes-vvfa0/kzit5/kzitk (cached image) pending
  PAT refresh for ghcr-luxfi.
- Standard K8s Ingress + TLS via cert-manager letsencrypt.
- Old IngressRoute (lux-explorer/exchange-zoo) deleted out-of-band.

Dropping node affinity is safe once either (a) a fresh ghcr-luxfi PAT
lands in the lux-explorer ns secret, or (b) zooai/exchange:latest
finally builds successfully and we switch the init-container image.
2026-04-25 20:52:18 -07:00
Hanzo AI 6065a70d56 k8s(zoo-exchange): land hanzoai/spa deployment manifest
Zoo exchange moved out of lux-explorer namespace (reserved for unified
luxfi/explorer indexer+graph+explore) into its own 'zoo' namespace,
runtime switched from nginx → ghcr.io/hanzoai/spa:1.2.0.

- Init container pulls SPA bundle from pinned digest of cached
  luxfi/exchange@sha256:9b9765e0…, patches index.html (Zoo title +
  gateway.uniswap.org CSP), and rewrites 'gateway.lux.org' →
  'gateway.uniswap.org' in all built JS/CSS/HTML (Statsig gating URL
  fix — the .lux.org fork placeholder has no backing deployment).
- Main container runs hanzoai/spa with SPA_* env-var templating into
  /config.json (brand, chain id, RPC/IAM/KMS/ID hosts).
- NodeAffinity to lux-nodes-vvfa0/kzit5/kzitk (cached image) pending
  PAT refresh for ghcr-luxfi.
- Standard K8s Ingress + TLS via cert-manager letsencrypt.
- Old IngressRoute (lux-explorer/exchange-zoo) deleted out-of-band.

Dropping node affinity is safe once either (a) a fresh ghcr-luxfi PAT
lands in the lux-explorer ns secret, or (b) zooai/exchange:latest
finally builds successfully and we switch the init-container image.
2026-04-25 20:52:18 -07:00
5a870ea82f chore(arc): decommission lux-build/deploy scale sets — all callers on hanzo ARC (#2)
lux-build-linux-amd64 and lux-deploy-linux-amd64 were scaled to 0 in 6f76ace.
All caller workflows migrated to hanzo-build-linux-amd64 / hanzo-build-linux-arm64.
No remaining references in .github/workflows. Zero live consumers.

ArgoCD will reconcile and tear down the corresponding AutoscalingRunnerSet
resources after merge. lux-build-linux-arm64 remains active.

Co-authored-by: Hanzo Dev <[email protected]>
2026-04-23 20:22:28 -07:00
Hanzo DevandGitHub 2e4a091df7 chore(arc): decommission lux-build/deploy scale sets — all callers on hanzo ARC (#2)
lux-build-linux-amd64 and lux-deploy-linux-amd64 were scaled to 0 in 6f76ace.
All caller workflows migrated to hanzo-build-linux-amd64 / hanzo-build-linux-arm64.
No remaining references in .github/workflows. Zero live consumers.

ArgoCD will reconcile and tear down the corresponding AutoscalingRunnerSet
resources after merge. lux-build-linux-arm64 remains active.

Co-authored-by: Hanzo AI <[email protected]>
2026-04-23 20:22:28 -07:00
7c400e9258 infra(arc): spin down lux-build/lux-deploy scale sets to 0 (ARC consolidation) (#1)
All workflow callers across hanzo/lux/zoo/liquidity have been migrated
to the canonical hanzo ARC fleet:
- hanzo-build-linux-amd64 (DO ARC, max 30)
- hanzo-build-linux-arm64 (GKE T2A Ampere ARC, max 30)
- hanzo-deploy-linux-amd64 (DO ARC, max 20)

This scales the duplicate lux-build-linux-amd64 and lux-deploy-linux-amd64
scale sets to 0 (minRunners=0, maxRunners=0). Files kept in place so ops
can verify zero-pod state before a follow-up PR deletes them entirely.

One and only one ARC fleet. No duplicate scale sets.

Co-authored-by: Hanzo Dev <[email protected]>
2026-04-23 18:04:18 -07:00
Hanzo DevandGitHub 6f76ace433 infra(arc): spin down lux-build/lux-deploy scale sets to 0 (ARC consolidation) (#1)
All workflow callers across hanzo/lux/zoo/liquidity have been migrated
to the canonical hanzo ARC fleet:
- hanzo-build-linux-amd64 (DO ARC, max 30)
- hanzo-build-linux-arm64 (GKE T2A Ampere ARC, max 30)
- hanzo-deploy-linux-amd64 (DO ARC, max 20)

This scales the duplicate lux-build-linux-amd64 and lux-deploy-linux-amd64
scale sets to 0 (minRunners=0, maxRunners=0). Files kept in place so ops
can verify zero-pod state before a follow-up PR deletes them entirely.

One and only one ARC fleet. No duplicate scale sets.

Co-authored-by: Hanzo AI <[email protected]>
2026-04-23 18:04:18 -07:00
zeekay effc8d0db6 fix(ingress): use real lux.network subdomains, drop fake .bitcoin/.coin/.invest TLDs
.bitcoin, .coin, .invest are not real TLDs — those ingress rules were
unreachable. Replace with bitcoin.lux.network / invest.lux.network /
coin.lux.network subdomains and add safe.lux.network.

DNS A records needed at lux.network zone (proxied or direct to
lux-k8s LB 134.199.138.27):
  safe.lux.network      A 134.199.138.27   (already exists, now live)
  bitcoin.lux.network   A 134.199.138.27   (pending)
  invest.lux.network    A 134.199.138.27   (pending)
  coin.lux.network      A 134.199.138.27   (pending)
2026-04-21 09:09:53 -07:00
Hanzo AI 240a03d50a fix(ingress): use real lux.network subdomains, drop fake .bitcoin/.coin/.invest TLDs
.bitcoin, .coin, .invest are not real TLDs — those ingress rules were
unreachable. Replace with bitcoin.lux.network / invest.lux.network /
coin.lux.network subdomains and add safe.lux.network.

DNS A records needed at lux.network zone (proxied or direct to
lux-k8s LB 134.199.138.27):
  safe.lux.network      A 134.199.138.27   (already exists, now live)
  bitcoin.lux.network   A 134.199.138.27   (pending)
  invest.lux.network    A 134.199.138.27   (pending)
  coin.lux.network      A 134.199.138.27   (pending)
2026-04-21 09:09:53 -07:00
zeekay 679052fcc7 fix(security): CiliumNetworkPolicy allowing cluster/host/remote-node ingress
Fixes pod-network drops when hostNetwork ingress DaemonSet (hanzo-ingress
in lux-system) sends cross-node traffic to pod-CIDR backends in hanzo ns.

Cilium resolves source identity as remote-node for hostNetwork traffic,
which doesn't match pod-label selectors in standard NetworkPolicies.
fromEntities: [cluster, host, remote-node] covers all in-cluster sources.

Unblocks: lux.finance, lux.industries, blog.lux.network, blog.lux.network/api/search,
vote.lux.network (all were 504-ing at CF edge due to policy drops).
2026-04-21 09:07:02 -07:00
Hanzo AI 72cafe6363 fix(security): CiliumNetworkPolicy allowing cluster/host/remote-node ingress
Fixes pod-network drops when hostNetwork ingress DaemonSet (hanzo-ingress
in lux-system) sends cross-node traffic to pod-CIDR backends in hanzo ns.

Cilium resolves source identity as remote-node for hostNetwork traffic,
which doesn't match pod-label selectors in standard NetworkPolicies.
fromEntities: [cluster, host, remote-node] covers all in-cluster sources.

Unblocks: lux.finance, lux.industries, blog.lux.network, blog.lux.network/api/search,
vote.lux.network (all were 504-ing at CF edge due to policy drops).
2026-04-21 09:07:02 -07:00
zeekay b5b86737ba feat: lux-blog on k8s, bank-docs manifest; DNS moved blog.lux.network to lux-k8s
- lux-blog: ghcr.io/luxfi/lux-blog:v1.0.0 via hanzoai/spa (Fumadocs static export)
- bank-docs ingress updated for docs.lux.financial search
- DNS: blog.lux.network CNAME lux-blog.pages.dev → A 134.199.138.27 proxied
2026-04-21 05:54:34 -07:00
Hanzo AI b24402cde7 feat: lux-blog on k8s, bank-docs manifest; DNS moved blog.lux.network to lux-k8s
- lux-blog: ghcr.io/luxfi/lux-blog:v1.0.0 via hanzoai/spa (Fumadocs static export)
- bank-docs ingress updated for docs.lux.financial search
- DNS: blog.lux.network CNAME lux-blog.pages.dev → A 134.199.138.27 proxied
2026-04-21 05:54:34 -07:00
zeekay 758f667ef7 chore(financial): bump lux-financial to v1.4.0 2026-04-21 04:18:36 -07:00
Hanzo AI 7ad9f2e294 chore(financial): bump lux-financial to v1.4.0 2026-04-21 04:18:36 -07:00
zeekay 025f190c93 chore(financial): bump lux-financial to v1.3.0
Adds /research and /open-source pages cross-linking all OSS repos
and research papers.
2026-04-20 22:46:13 -07:00
Hanzo AI 1772027e40 chore(financial): bump lux-financial to v1.3.0
Adds /research and /open-source pages cross-linking all OSS repos
and research papers.
2026-04-20 22:46:13 -07:00
zeekay 121a85162f k8s(financial): bump lux-financial to v1.2.0
Expanded solutions (10 new industries) and products (Compliance & Data
section) to cover full docs.lux.financial capability surface.
2026-04-20 22:33:19 -07:00
Hanzo Dev 548440d94f k8s(financial): bump lux-financial to v1.2.0
Expanded solutions (10 new industries) and products (Compliance & Data
section) to cover full docs.lux.financial capability surface.
2026-04-20 22:33:19 -07:00