Commit Graph
282 Commits
Author SHA1 Message Date
zeekay 4b23b671a6 feat(api): expose mpc/keys/launch + add contracts & subgraphs
- register previously-dark routers: mpc (threshold ECDSA), keys, launch
  (explorer/indexer/gateway/exchange/faucet ecosystem deploy)
- new /v1/contracts: deploy via signed tx, receipt, code, eth_call
- new /v1/subgraphs: The Graph admin (create/deploy/remove/status)
- align launch CRD luxd ports to canonical 9630/9631
2026-06-19 00:32:57 +00:00
zeekay 9090b70ea2 fix(nodes): correct luxd deploy to canonical Lux
- image luxfi/luxd:latest -> ghcr.io/luxfi/node:latest (the pullable one)
- numeric network-id (localnet=1337/devnet=3/testnet=2/mainnet=1), drop
  Avalanche 'fuji' and 'subnet'/--track-subnets language
- HTTP 9630 / staking 9631 (not 9650); --data-dir=/data
- stage bundled VM plugins into --plugin-dir so C-Chain EVM + zk/quantum/
  threshold/bridge/dex VMs load (mirrors luxd-boot.sh)
- fix port allocator feedback loop that overflowed host ports past 65535
2026-06-19 00:32:57 +00:00
zeekay d6203fd19b feat(api): pin to v1.0.0, sourced DRY from __version__
Never launched, so start at 1.0.0. All app/ZAP-server/OTEL version strings
now read bootnode.__version__ (ZAP protocol version stays its own axis).
2026-06-19 00:32:57 +00:00
zeekayandHanzo Dev ef604e6941 fix(web): unblock build — relax frozen-lockfile + approve sharp native build
pnpm install --frozen-lockfile failed on a stale lockfile; pnpm 10 also refused
to run sharp's build script (ERR_PNPM_IGNORED_BUILDS). Use --no-frozen-lockfile
and add pnpm.onlyBuiltDependencies (sharp, esbuild, @tailwindcss/oxide).

Co-authored-by: Hanzo Dev <[email protected]>
2026-06-18 23:08:42 +00:00
zeekayandHanzo Dev 4f0c68df12 fix: get the API booting (stale refactor imports + qdrant healthcheck)
The api crashed on import after a half-finished model refactor, and the qdrant
healthcheck used a binary not in the image.

- compose.yml: qdrant ships no wget/curl, so its healthcheck always failed and
  blocked the api (depends_on service_healthy). Dropped the broken healthcheck and
  gate the api on qdrant service_started (qdrant itself serves fine on :6333).
- db/__init__.py: reconcile to the real models — drop removed Node + Cluster
  (now CRDs) and MPCWalletModel; export the actual set (User, OrgCluster,
  SmartWallet, Subscription, TeamMember, etc.).
- api/mpc + api/keys: MPCWalletModel -> SmartWallet (the renamed model).

API now boots healthy: GET /health 200 {"status":"healthy","version":"2.0.0"},
/docs serving, 42 node/chain/fleet endpoints live (fleets deploy/scale, presets,
pod health/logs). Full local stack up: postgres, redis, clickhouse, qdrant,
meilisearch, api.

Note (follow-up, not blocking boot): api/nodes/db_nodes.py + db/seed_nodes.py
still import removed Node/Cluster models — dead code to remove or port to the
fleet/CRD path; the web frontend build fails on a stale pnpm lockfile.

Co-authored-by: Hanzo Dev <[email protected]>
2026-06-18 22:33:54 +00:00
zeekay a6c2aee6cf chore(repo): merge bootnode-org/main back into the Hanzo-side work
These two repos share root commit 8999f3c3 ("Initial commit") but
diverged long ago — hanzoai/bootnode evolved the recent stack
(api-go, brand package, etc.) while bootnode-org/main retained the
mainline 2026 history (175 commits we don't have).

Brand-leak fix: this work belongs in github.com/bootnode/bootnode,
not github.com/hanzoai/bootnode. Per the no-cross-brand-leak policy,
merge both histories together and push the result back to
bootnode/bootnode as the canonical home.

After this lands:
- bootnode/bootnode is the canonical repo
- hanzoai/bootnode gets archived with a redirect notice
- @bootnode-io/brand npm package's `repository.url` already points at
  bootnode/bootnode (set in the earlier package.json scaffold)

# Conflicts:
#	.github/workflows/ci.yml
#	api/bootnode/api/__init__.py
#	api/bootnode/api/billing/__init__.py
#	api/bootnode/config.py
#	api/bootnode/core/billing/__init__.py
#	api/bootnode/db/models.py
#	api/bootnode/main.py
#	api/tests/test_billing.py
#	web/app/dashboard/infrastructure/page.tsx
#	web/app/dashboard/organization/billing/page.tsx
#	web/app/dashboard/organization/page.tsx
#	web/app/dashboard/page.tsx
#	web/app/layout.tsx
#	web/components/navbar.tsx
#	web/components/unified-navigation.tsx
#	web/lib/brand.ts
#	web/public/logo/zoo-icon.svg
#	web/public/logo/zoo-logo-white.svg
#	web/public/logo/zoo-logo.svg
#	web/tsconfig.tsbuildinfo
2026-05-19 10:23:43 -07:00
zeekay df0c5161a6 feat(brand): scaffold @bootnode-io/brand npm package
Matches the canonical brand-package shape (parallel to @hanzo/brand,
@luxfi/brand, @zooai/brand, @osage/brand, etc.):

- package.json — name @bootnode-io/brand, version 0.1.0, public,
  exports ./, ./brand.json, ./loader, ./assets/*
- brand.json — canonical schema (brand, chains, iam, rpc,
  walletConnect, api blocks)
- src/index.ts + src/loader.ts — TS source compiled to dist/ via tsup
  (cjs+esm+dts)
- tsconfig.json — ES2020 + bundler resolution
- .npmignore — ship dist/, assets/, brand.json only

Existing config.ts + components.tsx + DESIGN.md preserved.

Publish (when npm @bootnode-io scope is reserved + creds available):
  cd brand && npm publish --access public
2026-05-19 08:56:13 -07:00
zeekayandGitHub 97321f67b0 feat: Go rewrite scaffold — ZAP-first, Mount() per HIP-0106 (#1)
Adds a Go subsystem alongside the existing Python FastAPI service so
bootnode can fold into `superbase` per HIP-0106. The Python service in
`api/bootnode/` stays untouched.

What landed:

- `schema/bootnode.zap` — public typed surface (chains, RPC, tokens,
  NFTs, transfers, smart wallets, ERC-4337, gas, webhooks, fleets,
  nodes, usage). No `.capnp` anywhere — ZAP only, per brand policy.
- `zap/gen/` — hand-rolled Go bindings that match what `zapc generate`
  emits, so `go build` works without zapc installed locally.
- `api/mount.go` — the HIP-0106 contract:
    func Mount(r chi.Router, deps Deps) error
  mounts every FastAPI-parity route group through `api/handlers/`.
- `api/deps.go` — cross-subsystem ZAP client interfaces (IAM, KMS,
  Base, O11y, Commerce). No business logic, no hard imports — keeps
  the Bootnode module independent of sibling subsystems until they
  ship their typed clients.
- `api/handlers/` — 149 chi routes mounted (Python has 150). Each
  handler body is a 501 stub with a `TODO(bootnode-port)` pointing at
  the Python file + symbol to port.
- `api/middleware/` — IAM-backed auth, OTEL-friendly telemetry,
  per-org rate limit (stub).
- `api/store/` — per-tenant SQLite access via `deps.Base.Open(orgID,
  "bootnode")` per HIP-0302.
- `api/web3/` — chain registry + RPC pool surface (production version
  prefers luxfi/* over upstream go-ethereum).
- `cmd/bootnode/main.go` — standalone shim; same `api.Mount` superbase
  calls in production.
- `docs/PYTHON_TO_GO_PORT.md` — endpoint-by-endpoint port map.

Build: `go build ./...` and `go vet ./...` clean. Standalone shim
smokes 200 on /health, /ready, /v1/chains; 401 on auth-required
endpoints with no JWT; 501 on every TODO route.

Out of scope (not in this commit):
- Handler bodies (Phase 2 — porting in RPC → tokens → NFTs → ...
  priority order).
- superbase wiring (lands when the superbase repo opens its main).
- Python service removal (stays until handlers reach prod parity).
2026-05-18 23:36:46 -07:00
zeekay 7745e3a39b api-go/client: declare canonical Bootnode interface 2026-05-13 02:08:16 -07:00
zeekay a9497e711c api-go: Go port scaffold (foundation + auth + chains + projects + wallets)
Lays down the Go skeleton parallel to api/ (FastAPI). Foundation:
  - config: env-driven Settings
  - db: pgx pool + idempotent schema migrations + typed row structs
  - iam: HS256 JWT Verifier + bearer-auth middleware
  - api: chi router with /healthz + /readyz + versioned /v1 mount

Routes ported:
  - /auth: login + signup + refresh (bcrypt + JWT)
  - /chains: registry + status
  - /projects: full CRUD scoped by org
  - /wallets: list + create scoped by project+org

Stubs (route wired, handler returns 501):
  - /api-keys, /webhooks, /rpc, /tokens, /nfts

cmd/bootnode/main.go is the production entrypoint with graceful
shutdown (SIGINT/SIGTERM) and slog JSON logging. Dockerfile builds a
distroless image with CGO disabled.

Remaining surface to port (in order of priority): rpc upstream
dispatcher, api-keys CRUD + auth, tokens + nfts read-only, webhooks
delivery worker, fleet + node + cluster routes, bundler + gas, billing.
The Python service in api/ keeps running until parity ships.
2026-05-13 02:00:07 -07:00
zeekay 834171d7dd ci: add id-token: write to caller permissions
Required for hanzoai/.github/.github/workflows/docker-build.yml@main —
without it the workflow_call dies as startup_failure with no jobs
dispatched. Caller permissions are a CEILING.
2026-05-07 09:09:27 -07:00
zeekay 6c1878d606 deploy: pin :latest → semver across image refs
Replaces all ghcr.io/hanzoai/<svc>:latest pins with the latest published
semver tag for each service. Per CLAUDE.md auto-bump policy: mutable
branch tags (:latest, :main, :dev) are deprecated for cluster pins —
only immutable semver permitted.

Bulk update across services with published v* tags. Services without a
published semver remain on :latest until their release pipeline cuts a
v* tag.
2026-05-07 08:34:59 -07:00
zeekay 8d5fe3bfe7 fix(brand): RootLayout brand also detected from Host header
generateMetadata() already used the host header, but RootLayout itself
read only process.env.BRAND with a hard-coded "bootnode" fallback. That
made the body theme/SSR brand drift from the metadata brand on per-host
deploys. Make RootLayout async and reuse the host detection so both
paths agree.
2026-05-01 20:29:24 -07:00
zeekay 912d4a6475 ci: push web image under bootnode package with -web tag suffix
GHCR 403s on first-push package creation for ghcr.io/hanzoai/bootnode-web.
Push web build to the existing bootnode package with tag-suffix=-web,
api with tag-suffix=-api, so they coexist without colliding tags.

Deployment image becomes:
  ghcr.io/hanzoai/bootnode:vX.Y.Z-web
  ghcr.io/hanzoai/bootnode:sha-XXXXXXX-web

Update K8s deployments via kubectl set image after CI succeeds.
2026-05-01 20:14:48 -07:00
zeekay db3390e0a5 fix(brand): add missing zoo logo SVGs to public/logo
The zoo brand config in web/lib/brand.ts references /logo/zoo-icon.svg,
/logo/zoo-logo.svg, /logo/zoo-logo-white.svg but only the references
existed — the files were missing, producing 404s on web3.zoo.ngo and
zoo.cloud. Added the canonical Zoo CMYK Venn mark from
zoo.industries/public/zoo-logo.svg.
2026-05-01 20:14:38 -07:00
zeekay 022a134eee fix(brand): remove hardcoded Bootnode leaks (terms, navbar, ai-chat, region-data, wallets sdk sample) + zoo IAM → zoolabs.id
- web/lib/brand.ts: zoo iam.url + iam.domain → zoolabs.id (zoo.id is NXDOMAIN)
- web/components/navbar.tsx: brand-aware `npm i {sdk}` snippet
- web/components/ai-chat.tsx: brand-namespaced localStorage keys
- web/components/lux/region-data.ts: brand-namespaced localStorage keys
- web/app/products/wallets/page.tsx: brand-aware SDK class + package in sample
- web/app/terms/page.tsx: BOOTNODE → {brand.name.toUpperCase()} in legal text
- web/lib/sdk-package.ts: shared brand→pkg/client map (single source of truth)
2026-04-30 00:24:49 -07:00
zeekay 286a92b575 ci: retrigger docker-release after bootstrapping bootnode-web GHCR package 2026-04-29 15:57:46 -07:00
zeekay c1c6168603 feat(brand): SSR also detects zoo.cloud as zoo brand 2026-04-29 15:39:30 -07:00
zeekay a15dc95b71 feat(brand): route zoo.cloud through bootnode-web-zoo
- web/lib/brand.ts: detect zoo.cloud as zoo brand (alongside zoo.ngo, zoo.network)
- infra/k8s/ingress.yaml: add zoo.cloud + www.zoo.cloud as additional hosts on
  bootnode-zoo-ingress (TLS SAN via cert-manager, rules → bootnode-web-zoo:3001)

Makes zoo.cloud serve the same Bootnode platform as web3.zoo.ngo with Zoo brand.
2026-04-29 15:37:15 -07:00
zeekay 0418ffb9fc chore: symlink AGENTS.md and CLAUDE.md to LLM.md
Canonical project context lives in LLM.md. Symlinks ensure
agentic coding tools (agent, Cursor, etc.) find context
automatically regardless of which filename they look for.
2026-04-01 14:10:56 -07:00
zeekay d508ffb9eb fix: ingressClassName is 'ingress' not 'hanzo' 2026-03-26 22:57:39 -07:00
zeekay 5ee151b452 infra: replace all nginx references with hanzo ingress
Migrate every ingress resource from nginx annotations to
traefik.ingress.kubernetes.io for hanzoai/ingress controller.
Update network policies to match hanzo-ingress pod selector.
Update operator config to use className: hanzo.
2026-03-25 12:11:56 -07:00
zeekay e67a22a0b8 fix: SSR title uses Host header for brand detection
NEXT_PUBLIC_BRAND gets baked at build time by Next.js, always resolving
to the Dockerfile default ("bootnode"). Use headers() + Host-based
detection in generateMetadata() so cloud.lux.network shows "Lux Cloud"
at request time, not "Bootnode".
2026-03-24 23:10:48 -07:00
zeekay 55b5180465 ci: remove direct deployment — managed by universe E2E-gated pipeline
- Remove deploy job (kubectl to bootnode-k8s + lux-k8s)
- Remove KMS credential fetching, doctl, manifest apply steps
- Images still build and push to GHCR via reusable workflow
2026-03-16 18:22:01 -07:00
zeekay b56ff80d88 rebrand: purge PostHog references 2026-03-13 17:46:50 -07:00
zeekay 7ab70ed08e ci: revert to ubuntu-latest runners (hanzo-build offline) 2026-03-12 18:33:31 -07:00
zeekay 79b50baf29 fix: refresh ghcr-secret on every deploy, cleanup stale pods
Root cause: ghcr-secret was expired/missing, causing ImagePullBackOff
on all web portal pods. Now auto-refreshes using GITHUB_TOKEN on each
deploy. Also cleans up stale pending pods from previous failed rollouts.
2026-03-12 18:22:03 -07:00
zeekay 06a8abf759 ci: add pod failure diagnostics to deploy workflow 2026-03-12 17:45:22 -07:00
zeekay 17aed627f2 ci: install kubectl on hanzo-k8s runner before deploy 2026-03-12 17:06:12 -07:00
zeekay f234c74eb3 fix: add /api/health endpoint, fix web pod probes and resources
- Add lightweight /api/health Next.js route for K8s probes
- Increase readiness probe: initialDelaySeconds 5→15, timeout 5s, failureThreshold 5
- Increase liveness probe: initialDelaySeconds 10→30, periodSeconds 15
- Bump memory limit 512Mi→1Gi for Next.js SSR cold start
- Bump CPU request 100m→200m, limit 500m→1000m
2026-03-12 17:02:54 -07:00
zeekay 607a5e8619 ci: switch all jobs to Hanzo self-hosted runners
- CI: test-api, test-web, e2e-test → hanzo-build
- Docker Release: gate → hanzo-build, deploy → hanzo-k8s
- Builds already use hanzo-build/hanzo-build-arm64 via reusable workflow defaults
2026-03-12 16:59:38 -07:00
zeekay 5969d372cf ci: fetch deploy credentials from Hanzo KMS via Universal Auth
Instead of storing DIGITALOCEAN_ACCESS_TOKEN and cluster names as
GitHub Secrets, authenticate to KMS at deploy time and fetch them
from /deploy path. Falls back to GitHub Secrets if KMS is unavailable.

Matches the pattern used by hanzo/app and other Hanzo services:
only KMS_CLIENT_ID + KMS_CLIENT_SECRET stored in GitHub.
2026-03-12 16:27:07 -07:00
zeekay e0b7f66b87 ci: skip lux-k8s deploy when LUX_K8S_CLUSTER_NAME secret is missing 2026-03-12 16:12:23 -07:00
zeekay 62c0be939a feat: hanzo.ai-style mega-menu navbar with Products/Solutions dropdowns
Replace NavigationMenu with custom NavMenu hover dropdowns:
- Products: 3 featured hero cards (Node/Explorer/MPC) + 5-column category grid + SDK footer
- Solutions: Enterprise/Startup panels + Use Cases/By Role/By Chain columns
- Hover-to-open on desktop (150ms close delay), click on mobile
- Full-viewport-width backdrop-blur dropdowns matching hanzo.ai pattern

Also fix API deployment: increase probe timeouts, add ENVIRONMENT=staging
2026-03-12 16:11:50 -07:00
zeekay ad4a2085d0 ci: make API rollout non-blocking so web portals still deploy
API pods timing out on rollout shouldn't prevent web portal deployment.
Use continue-on-error for API, tolerant errors for web brands.
2026-03-12 15:16:24 -07:00
zeekay 94edb721bc ci: make external-secrets apply non-fatal in deploy
ClusterSecretStore CRDs may not be installed yet on the cluster.
Allow deploy to continue and warn instead of failing.
2026-03-12 14:58:49 -07:00
zeekay 3aefe63798 ci: remove legacy build/deploy from CI, use docker-release.yml
The build-and-push and deploy jobs were duplicated in ci.yml with missing
REGISTRY env vars, causing Docker login failures. docker-release.yml is
the canonical deploy pipeline (triggers on CI workflow_run completion).
2026-03-12 14:52:40 -07:00
zeekay 0aa9c4e346 feat: add Explorer + MPC product pages, fleet management, operator, Helm charts, and CI/CD
- Add Explorer product page with branded block explorer deployment, contract
  verification, Etherscan-compatible API, and multi-chain support
- Add MPC product page with deep Lux MPC integration: CGGMP21 (ECDSA),
  FROST (EdDSA), LSS resharing, 15+ chain support, threshold signing API
- Update landing page with 6-product grid (Node, Data, Wallets, Explorer,
  MPC, Rollups) and 8 API cards including Explorer API and MPC Signing
- Update navbar and command menu with Explorer and MPC products
- Add Lux fleet management dashboard, observability, and services pages
- Add AI chat component and unified navigation with org switcher
- Add Kubernetes operator (Rust) for multi-chain node lifecycle management
- Add Lux Helm charts with genesis configs for devnet/testnet/mainnet
- Add docker-release.yml CI/CD pipeline for automated DOKS deployment
- Add monitoring, network policies, web deployments, and ingress updates
- Refactor API: fleet management, billing tracker, observability endpoints
- Update brand config, API client, and infrastructure manifests
2026-03-12 14:48:40 -07:00
zeekay 167f08bca7 fix(ci): use v3 KMS API with workspaceId and Universal Auth
- environment=production → environment=prod (matches KMS config)
- v1/secrets/raw → v3/secrets/raw with workspaceId
- Added KMS_CLIENT_ID/SECRET Universal Auth with HANZO_API_KEY fallback
2026-03-11 16:00:38 -07:00
zeekay b06e1e962c ci: migrate deploy to HANZO_API_KEY + KMS
Replace direct DIGITALOCEAN_ACCESS_TOKEN with KMS credential fetch
using HANZO_API_KEY for multi-cluster bootnode deployment.
2026-03-11 14:35:49 -07:00
zeekay 72cf6e4c3b fix: update IAM auth integration for bootnode 2026-03-09 23:27:10 -07:00
zeekay 97c8a5842d feat: add Graph Node + IPFS + subgraph infrastructure
- Add graph-node, graph-ipfs, graph-postgres to compose.yml (subgraph profile)
- Add k8s manifests for Graph Node stack (lux/graph-node.yaml)
- Add deploy-subgraph.sh for AMM V3/V2 subgraph deployment
- Update deploy.sh with 'graph' target for Graph Node infrastructure
- Matches existing lux-k8s lux-explorer namespace setup
2026-03-07 00:03:44 -08:00
zeekay 1ce1924c41 fix: convert DATABASE_URL to asyncpg scheme for async SQLAlchemy engine
The K8s DATABASE_URL env var uses postgresql:// which makes
create_async_engine try to load psycopg2 (sync driver). Add
_ensure_async_dsn() to convert postgresql:// and postgres:// to
postgresql+asyncpg:// at engine creation time. asyncpg is already
in dependencies.
2026-03-03 08:13:33 -08:00
zeekay 05dfdb3b8e ci: push canonical image to ghcr.io/bootnode/bootnode
Add BOOTNODE_GHCR_PAT secret-based login to push API and web images
to the canonical ghcr.io/bootnode/bootnode registry in addition to
ghcr.io/hanzoai/bootnode. Also add provenance=false/sbom=false to web
build to avoid attestation timeouts on linux/amd64.
2026-03-01 14:06:16 -08:00
zeekay 1000925467 ci: disable stale operator build job (operator is in bootnode/universe) 2026-03-01 14:02:19 -08:00
zeekay d8ac2d165b ci: remove cross-org ghcr.io/bootnode push (needs PAT, not GITHUB_TOKEN) 2026-03-01 13:57:06 -08:00
zeekay efc23bc347 ci: also push to ghcr.io/bootnode/bootnode canonical image name 2026-03-01 13:53:52 -08:00
zeekay db21b65cb7 fix: run ZAP Cap'n Proto server inside capnp.kj_loop() background task
capnp.AsyncIoStream.create_server() must be called from within an active
KJ event loop context. Wrap the entire serve lifecycle in a background
asyncio Task that runs under `async with capnp.kj_loop()`, fixing the
startup error: "The KJ event-loop is not running on this thread".

The server now signals readiness via `_running=True` after bind and
the caller polls for up to 1 s before raising if startup fails.
2026-03-01 13:50:47 -08:00
zeekay 996cfce549 security: disable X-Powered-By header in Next.js config
Prevents leaking framework information in HTTP responses.
2026-02-26 15:32:38 -08:00
zeekay 636e4279bb chore: update domain references from bootnode.dev to bootno.de
Update ZAP endpoints, CORS origins, K8s annotations, and documentation
to use the new bootno.de primary domain.
2026-02-26 15:25:27 -08:00