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
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/(excludingnode_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.ts—ZOO_BRANDING,HANZO_BRANDING,SPC_BRANDING,PARS_BRANDINGconstants. These render as chain identity (which subnet this block / address belongs to) onexplore-{org}.lux.networkhosts. That's network metadata for chains running on Lux primary network, not a third-party brand on the explorer.ui/chains/ChainDetailPage.tsxSUBNET_CHAIN_IDS/SUBNET_DESCRIPTIONSmaps — 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.ts—addLiquiditymethod literal in transaction stub.lib/api/dchain/useDexData.ts—totalLiquidityfield 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 overlayspublic/.well-known/explore.jsonin 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
- Federation peers list — agree on the ConfigMap schema across Hanzo / Zoo /
Pars explorer deployments; current
peers: []placeholder is correct for build-time defaults. LUX_BRANDING_SETUP.mdstill mentions annginxreverse proxy and adocker-luxnetpath that no longer exist. Rewrite next pass — not blocking.Dockerfile.brandedis a stale env-overlay image; superseded byDockerfile.lux. Candidate for removal in a follow-up clean-up.