Files
explore/BRAND-AUDIT.md
Hanzo AI c74fd8a620 brand: audit, rip non-lux references, add .well-known/explore.json
Per the no-crossover rule, explorer source contains only Lux brand data.
Per-chain identity (subnet logo, chain name) preserved as network metadata.

Removed:
- .env.example.{hanzo,zoo,pars} — non-Lux brand build recipes
- Dockerfile.liquidity — regulated US securities brand, must not appear in OSS
- Third-party-domain hostnames from chainRegistry.ts (explore.zoo.ngo etc.)
- Non-Lux hostname suffixes from lib/white-label.ts (.hanzo.ai, .zoo.network, etc.)
- "" mention from lib/requestHost.ts comment

Kept (chain identity on Lux primary network):
- ZOO/HANZO/SPC/PARS_BRANDING constants in chainRegistry.ts
- explore-{org}.lux.network hostnames (Lux-served subnet explorers)
- DeFi terms ( Provider, add) — generic finance vocab

Added:
- public/.well-known/explore.json — federation manifest
- scripts/generate-well-known.js — regenerates manifest from chain registry
- Wired into npm build / build:next scripts
- BRAND-AUDIT.md — survey + decisions
2026-05-29 14:30:23 -07:00

4.8 KiB

Brand Audit — luxfi/explore

Rule: luxfi/explore committed source contains only Lux brand. Per-chain identity for subnets on Lux primary network (Zoo, Hanzo, SPC, Pars) is permitted as network metadata. No external-org explorer recipes, no Liquidity references.

Scope surveyed

  • All committed source under ~/work/lux/explore/ (excluding node_modules/, .next/, test-results/, qa-screenshots/).
  • Source globs: *.{json,ts,tsx,js,jsx,md,yaml,yml,html,Dockerfile,env*}.

Findings

Cross-brand recipes (REMOVED)

Path Why removed
.env.example.hanzo Configured the image to be built and served as Hanzo Explorer under Hanzo's domain. That makes luxfi/explore a Hanzo brand surface — not allowed.
.env.example.zoo Same as above for Zoo.
.env.example.pars Same as above for Pars.
Dockerfile.liquidity Liquidity is regulated US securities — must NEVER appear in OSS Lux.

Third-party-domain hostnames in configs/app/chainRegistry.ts (REMOVED)

Removed hostnames from the chain registry that asserted "this image, served at the third-party org's canonical domain, IS that org's branded explorer":

  • explore.zoo.network, explore.zoo.ngo (Zoo entry)
  • explore.hanzo.network, explore.hanzo.ai (Hanzo entry)
  • explore.pars.network (Pars entry)

Kept: explore-{zoo,hanzo,spc,pars}.lux.network — these are Lux-served subnet explorer hosts where the chain identity (logo + name) is rendered as network metadata for a chain running on the Lux primary network. That is the per-chain branding the audit rules explicitly allow.

Multi-brand selector (REWRITTEN)

lib/white-label.ts previously contained a hostname-suffix table mapping *.hanzo.ai, *.hanzo.network, *.zoo.ngo, *.zoo.network, *.pars.network to brand identifiers hanzo/zoo/pars. The intent was a single image that becomes a different org's explorer based on serving host.

Replaced with: only Lux suffixes (.lux.network, .lux.build, .lux-test.network, .lux-dev.network). External operators continue to be supported via NEXT_PUBLIC_BRAND=other + NEXT_PUBLIC_NETWORK_* env vars (see .env.example.external) — they supply their own brand strings at deploy time; none are hardcoded here.

Comment edits

  • lib/requestHost.ts: dropped "Liquidity" from the multi-host narrative.

Per-chain identity (KEPT — allowed)

  • configs/app/chainRegistry.tsZOO_BRANDING, HANZO_BRANDING, SPC_BRANDING, PARS_BRANDING constants. These render as chain identity (which subnet this block / address belongs to) on explore-{org}.lux.network hosts. That's network metadata for chains running on Lux primary network, not a third-party brand on the explorer.
  • ui/chains/ChainDetailPage.tsx SUBNET_CHAIN_IDS / SUBNET_DESCRIPTIONS maps — chain identity for subnets, kept.

Generic finance terms (KEPT — not brand)

DeFi vocabulary that incidentally contains the substring "Liquidity":

  • ui/pool/PoolInfo.tsx, ui/pools/PoolsTable.tsx, ui/pools/PoolsListItem.tsx, ui/pages/Pool.tsx — "Liquidity Provider", "Liquidity" column header.
  • stubs/token.tsaddLiquidity method literal in transaction stub.
  • lib/api/dchain/useDexData.tstotalLiquidity field name.
  • ui/showcases/Tabs.tsx — generic "Liquidity staking" tab demo.

None of these reference the regulated Liquidity brand or its parent entity.

Federation manifest

Added public/.well-known/explore.json plus a generator at scripts/generate-well-known.js. The generator parses configs/app/chainRegistry.ts so the published federation manifest stays in sync with the chain registry.

  • Wired into npm scripts: build, build:next, wellknown:generate, wellknown:check.
  • Mainnet chains emitted: C-Chain (Lux Mainnet) + Lux Testnet + Lux Devnet + Zoo/Hanzo/SPC/Pars subnets (chain identity, not org brand).
  • peers: [] is populated at runtime by a ConfigMap mount that overlays public/.well-known/explore.json in production; each deploy environment knows which other federation peers (Hanzo Explorer, Zoo Explorer, etc.) are reachable.

Files touched

D  .env.example.hanzo
D  .env.example.pars
D  .env.example.zoo
D  Dockerfile.liquidity
M  configs/app/chainRegistry.ts
M  lib/requestHost.ts
M  lib/white-label.ts
M  package.json
A  public/.well-known/explore.json
A  scripts/generate-well-known.js
A  BRAND-AUDIT.md

Follow-ups

  1. Federation peers list — agree on the ConfigMap schema across Hanzo / Zoo / Pars explorer deployments; current peers: [] placeholder is correct for build-time defaults.
  2. LUX_BRANDING_SETUP.md still mentions an nginx reverse proxy and a docker-luxnet path that no longer exist. Rewrite next pass — not blocking.
  3. Dockerfile.branded is a stale env-overlay image; superseded by Dockerfile.lux. Candidate for removal in a follow-up clean-up.