Skip to content

Hex explorer - #38

Merged
tylermalin merged 14 commits into
mainfrom
hex-explorer
May 24, 2026
Merged

Hex explorer#38
tylermalin merged 14 commits into
mainfrom
hex-explorer

Conversation

@tylermalin

Copy link
Copy Markdown
Owner

Description

Checklist

Please verify the following before submitting your PR:

  • Tests Passing: All unit and integration tests are passing successfully.
  • Invariants Updated: Any changes to state logic or contract invariants have been fully documented in docs/audit/invariants.md.
  • Audit Impact Assessed: Considered security implications and audit checks for multi-chain functions, layer interfaces, and signed-data integrity.
  • Docs Updated: The README.md and relevant documentation inside docs/ have been updated to reflect these changes.

Additional Context

tylermalin and others added 14 commits May 23, 2026 11:43
…iage

Resolution:
  Res 6 → Res 3 (~12,392 km²/cell, metro-region scale)
  Regenerated 200 Genesis hexes: 5 regions × 40 cells, 0 duplicates
  Idaho corridor: added Sun Valley + Boise as explicit anchors (cells
  832886fffffffff and 832884fffffffff both confirmed in mountain region)
  Background LOD simplified: Res 1 overview (zoom 0-3) + Res 3 license
  grid (zoom 3+) — rendering now matches the actual purchased resolution
  Region jump zoom: 9.5 → 4.5 (appropriate for Res-3 cell visibility)

HexPanel bullet icons:
  Replaced <ul>/<li> (stripped by Tailwind reset) with flex rows using
  explicit '•' bullets in #c4f061 accent colour. Both 'What's included'
  and 'Terms of sale' sections updated.

Explorer list view (restored):
  Added HexListView component with status/region/score/price columns
  Map ↔ List toggle in top toolbar
  Selecting a row opens HexPanel inline on the right

Typography:
  html font-size: 17px (was browser default 16px)
  body line-height: 1.6
  Heading scale via clamp() per brand guidelines

Build warnings:
  FIXED: vercel ^51.2.1 moved from dependencies → devDependencies
  FIXED: @upstash/redis URL sanitizer strips stray quote chars that
         caused 'must start with https' UrlError in production
  TRACKED: docs/build-warning-rationale.md — rationale for 9 remaining
           transitive-dep warnings (MetaMask, WalletConnect, glob chain)
           and 2 open bugs (checkout reservation, list view restored)

Updated files:
  scripts/seed-genesis-res3.mjs         RES=3, Idaho corridor anchors
  apps/web/src/data/regions.json        200 Res-3 cells
  apps/web/src/lib/genesis-hexes.ts     Res-3 lab IDs + h3Resolution:3
  apps/web/src/explorer/components/     LOD, zoom levels, constants
  apps/web/src/app/explorer/page.tsx    list view, Res-3 labels, banner
  apps/web/src/explorer/components/HexPanel.tsx  bullet icons
  apps/web/src/app/globals.css          font-size, line-height, h1-h3
  apps/web/src/lib/kv.ts               sanitizeEnvString()
  package.json                          vercel → devDependencies
  docs/build-warning-rationale.md       NEW — warning triage log

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resolution: Res 3 → Res 4 (~1,770 km²/cell, ~60 km edge)
  seed-genesis-res3.mjs RES=4, 200 unique cells, 0 duplicates
  Lab IDs: 8429a1dffffffff/845d145ffffffff/8428847ffffffff/8427407ffffffff/8426cb9ffffffff
  Background LOD: Res 1 overview + Res 4 license grid (rendering = license res)
  Region jump zoom: 4.5 → 6.0

Hex auto-calculation (lib/hex-geo.ts, NEW):
  detectRegion(lat,lng) — bounding-box US region detection, 5 regions
  classifyZone(lat,lng) — urban-core/urban/suburban/rural/remote from
    haversine distance to 35 major US metros with population weighting
    Thresholds calibrated for Res-4 cell scale (~60 km edge)
  estimateWaterCoverage(lat,lng,res) — samples centroid + 6 hex vertices
    against simplified ocean/lake bounding boxes; returns 0-100%
  buildManifestFromApi now calls all three — no more null zoneClassification

Phase1Hex schema:
  Added waterCoveragePercent: number | null to hex-map.types.ts

Admin partners page (apps/web/src/app/admin/partners/page.tsx, NEW):
  Full CRUD partner management UI
  View all KOL partners with clicks/conversions/earned stats
  Approve pending applications in one click
  Invite new partners — email or shareable link
  4 approved outreach copy templates (general intro, follow-up, social,
    newsletter) with [NAME]/[REFERRAL_URL]/[COMMISSION] auto-fill
  Side drawer with personalised message composer per partner

Server-side admin proxy (api/admin/partners-proxy/route.ts, NEW):
  Keeps ADMIN_SECRET server-side; validates caller via Auth0/email session
  Checks ADMIN_EMAILS env var (default: tyler@malamaproject.org)
  GET: list, get, templates  POST: invite (pre-approved), approve

User referral link (dashboard/page.tsx):
  ReferralLinkSection component shown for all authenticated users
  Referral ID = SHA-256(email)[0:12] — non-reversible, URL-safe
  Link: /presale?ref={refId} — earns points (not % commission)
  'Apply to Partner Programme' link for users who want commission

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Columns (left → right):
  ID          node number (zero-padded 001-200)
  H3 Cell     full H3 index, monospace
  Region      Genesis region label
  Zone        colour-coded badge — urban-core/urban/suburban/rural/remote
  ×Multi      geographic multiplier (0.90×–1.60×), zone colour tinted
  Score       data demand score /100 in accent green
  Water %     estimated water coverage; >30% shows 'coastal' tag in blue

Left border of each row = status colour (blue=available, red=reserved,
green=selected) so status is always visible without a column.

Filter bar: Status group (All / Available / Reserved) + Zone group
(Urban Core / Urban / Suburban / Rural / Remote) with zone-matched
background colours on active filter chips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… unconfigured

- auth0.ts: stripped the dummy.auth0.com / dummy_client_id fallback that was
  silently redirecting users to a non-existent tenant on signup. SDK now reads
  from env vars natively (AUTH0_DOMAIN, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET,
  AUTH0_SECRET, APP_BASE_URL).
- proxy.ts: added AUTH0_CONFIGURED guard so the app continues to load (email
  session + Magic Link still work) when Auth0 env vars are absent. /auth/* paths
  redirect to /dashboard instead of crashing the middleware.

Required env vars to enable Auth0 auth:
  AUTH0_DOMAIN, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET, AUTH0_SECRET, APP_BASE_URL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Hex clustering:
- seed-genesis-res3.mjs: rewrite to gridDisk(metro, 1) only — all 200 cells
  stay within ~120 km of a major city. No remote/rural fallback expansion.
  Anchors: LA, SF, Seattle, PHX, Portland, LV, Reno, ABQ, Tacoma, Boise
  (west); Honolulu, Hilo, Maui, Kauai, Anchorage, Palmer, Homer, Fairbanks,
  Juneau, Kodiak, Cordova, Ketchikan (pacific); Denver, SLC, Provo, Boise,
  Missoula, Billings, Fargo, Sioux Falls, COS, Helena, Rapid City, Riverton
  (mountain); Chicago, Minneapolis, Detroit, Milwaukee, Cleveland, Columbus,
  Indianapolis, St Louis, KC, Madison, Omaha, Des Moines (midwest); Dallas,
  Houston, Atlanta, Miami, DC, NYC, Austin, Nashville, Charlotte, Philly,
  Boston, Virginia Beach (south). 200 unique / 0 duplicates.
- Inline isOverOcean / isOverLake water detection to skip 100%-water cells.
- New lab cell IDs: Pacific→84464b9ffffffff (Honolulu),
  Mountain→84268cdffffffff (Denver), Midwest→842664dffffffff (Chicago).

Explorer:
- buildManifestFromApi: skip hexes with waterCoveragePercent >= 100.
- MALAMA_RESERVED_HEX_LABELS updated for new lab cell IDs.
- HexListView: add onDeselect prop; panel close button now actually clears
  selection. Remove nested double-padding wrapper in side panel — clean flex
  column with single overflowY: auto prevents the 'bounding scroll box' UX.

Dashboard:
- Remove broken Auth0 'Log in' / 'Sign up' buttons (were routing to
  dummy.auth0.com → 400). Email session form is now the primary auth.
- sessionAuth type narrowed to 'email' | null; all auth0 branches removed.
- Simplified session pill: one button (Sign out) for email sessions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tall failure

npm ci was failing silently when build cache was unavailable. Switched to
npm install --no-audit --no-fund --prefer-offline which is more resilient
across npm versions and lockfile formats.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Next.js route files only permit HTTP-verb exports (GET, POST, etc.).
APPROVED_COPY_TEMPLATES is consumed internally and served via the
?action=templates endpoint — no named export needed.
Also reverts vercel.json to npm ci (cache is warm).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…corridor

- seed-genesis-res3.mjs: per-anchor diskR support ([lat,lng,diskR?] format)
  so Hawaiian anchors use disk=0 (island fits 1 Res-4 cell, ring-1 = ocean)
- Cook Inlet bbox tightened to lng < -150.5 so Anchorage (-149.9) and
  Palmer (-149.4) are correctly classified as land (not ocean)
- hex-geo.ts: same Cook Inlet fix; per-island Hawaii bboxes replace old
  broad bbox that incorrectly flagged inter-island ocean as land
- Pacific anchors: + Tok, McGrath, Healy (interior AK) to reach 40 cells
- Mountain anchors: Montana removed → Idaho corridor
  (Coeur d'Alene, Moscow, Sun Valley, Twin Falls, Pocatello, Idaho Falls)
- South anchors: Virginia Beach removed → Richmond VA (VA Beach over Atlantic)
- regions.json: regenerated — 200 cells, 200 unique, 0 duplicates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…serve 5 labs

- public/whitepaper.pdf: canonical Mālama Labs Whitepaper v1.0 (33p, institutional)
- app/whitepaper/page.tsx: dedicated /whitepaper page with PDF embed + download btn
- SiteFooter: Whitepaper link → /whitepaper (was /docs/tokenomics)
- DocsLayout: add Whitepaper v1.0 entry to sidebar nav (ScrollText icon)
- WhitepaperProse — Token Identity: replace bullet list with designed card table
  showing Name, Ticker, Decimals, Standard, Primary/Liquidity chain,
  Cross-chain bridge, Hard cap — dark card with header logo + per-row layout
- WhitepaperProse — QuickNav sticky: remove xl:items-start from grid so
  aside stretches to article height; TocNav now uses IntersectionObserver
  with -10%/-70% rootMargin to highlight active section while scrolling
- WhitepaperProse section 3.3: correct reserved node list from 'Dallas only'
  to all 5 cities (LA, Honolulu, Denver, Chicago, Dallas)
- explorer/page.tsx: update stale Res-6 comment → Res-4 lab cell IDs
- .gitignore: add exception for apps/web/public/whitepaper.pdf

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Navbar:
- 'Become A Launch Partner' → 'Partners' (shorter)
- Add malamalabs.com ↗ external link (hidden on sm, visible lg+)
- Docs active state includes /whitepaper

Footer:
- Remove duplicate 'Documentation' from Product column
- Product: Reserve | Explorer | Timeline | Partners
- Documentation: Whitepaper v1.0 | Docs hub | MLMA Tokenomics | Pricing & ROI | Operator Guide
- Community: Discord | Schedule a call (remove redundant Operator FAQ)
- Legal: Legal center | Token & Rewards Risk Disclosure (moved from Docs column)
- Add ← malamalabs.com link in branding column

Docs hub (/docs):
- Crumb '← Mālama Labs' → '← malamalabs.com' (external, opens corporate site)
- Whitepaper v1.0 added to switcher tabs
- Whitepaper featured card (full-width span, accent border, accent 'Read + Download →')
  as first item in doc-grid — before DOCS·01 through DOCS·07
- Pages count updated 8 → 9
- Meta-card pages 8 → 9

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove @auth0/nextjs-auth0 from apps/web/package.json (was causing
  npm deprecation warnings on every Vercel install)
- Delete apps/web/src/lib/auth0.ts
- proxy.ts: remove auth0 import + AUTH0_CONFIGURED guard;
  /auth/* routes now redirect to /dashboard directly
- api/auth/session/route.ts: remove auth0 branch entirely;
  returns email session only (or null)
- api/admin/partners-proxy/route.ts: remove dynamic import('@/lib/auth0')
  try-catch; admin auth is email session only
- api/wallet/magic-express/route.ts: stub returns 501 — this endpoint
  requires an OIDC provider; disabled until re-configured
- Navbar.tsx: type SessionData auth: 'auth0' | 'email' | null
  → 'email' | null
- package-lock.json regenerated — 0 auth0 entries remaining

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rride

packages/sdk is an uninitialized git submodule (tylermalin/malamasensorlab).
Vercel does not initialize submodules, so the packages/sdk directory is empty
on every build — npm ci sees malama-sdk@0.1.0 as missing and fails.

Nothing in apps/web imports malama-sdk, so removing it from workspaces is safe.
Lockfile regenerated; npm ci --dry-run passes cleanly.

Also adds the @harmoniclabs/cbor ^1.6.0 override (was applied but not committed).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This mac-only ARM binary was declared as a direct root dependency.
Vercel runs Linux x64 and rejects it with EBADPLATFORM.

Next.js selects its own platform-specific SWC binary as an optional
peer dep — no need to pin it in the monorepo root.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented May 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
malamalaunch Ready Ready Preview, Comment May 24, 2026 12:49am

@tylermalin
tylermalin merged commit 52c3745 into main May 24, 2026
2 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant