Skip to content

feat(site): WP-19 catalog site — read-only product page over the indexer API - #27

Merged
cursor[bot] merged 9 commits into
masterfrom
cursor/wp-19-catalog-site-0b31
Sep 14, 2026
Merged

cursor[bot] merged 9 commits into
masterfrom
cursor/wp-19-catalog-site-0b31

Conversation

@jefflau

@jefflau jefflau commented Sep 14, 2026

Copy link
Copy Markdown
Owner

What

Adds apps/site (@enspack/site): a static Vite + React catalog site that renders the indexer JSON API (MVP.md §4.3) so a visitor can see what an enspack name is, what it points at, and that it verifies — without installing the CLI. This is MVP criterion 7 / WP-19 (already added to MVP.md on master in 36c1a90). Decision record and build spec live in the Project store (docs/catalog-site-decision.md, docs/catalog-site-spec.md). SPEC.md and schema/* untouched.

Pages:

  • / — hero with copyable enspack get …, live stats, how-it-works (Name → Manifest → Bytes → Verify), searchable model list with publisher filter and cursor pagination. Hero and stats stay on the unfiltered catalog.
  • /name/:name — the selling page: trust chain (ENS name → contenthash CID → manifest → infohash/magnet/webseeds → per-file SHA-256), sortable files table with full hashes + copy (stacks under 720px), versions, and a "Get it" panel with the enspack.lock entry per SPEC §9 (collapsed by default).
  • /publisher/:label — HF proof + registrar attestation (GET /v1/publishers/:label) as key/value with explorer links; explicit "no attestation" state for mirrors.enspack.eth / self-owned names.
  • /violations — SPEC §6.2 audit surface with an informative empty state.
  • /get-started — quickstart, publish flow, registrar CTA.

Data layer: HttpIndexClient / FixtureIndexClient; config from VITE_INDEX_URL, VITE_REGISTRAR_URL, VITE_CHAIN, VITE_DATA_SOURCE=http|demo. No wallet, no writes, no RPC URL or keys in the bundle; @enspack/core is type-only.

Indexer: hono/cors on GET /v1/* so the browser can call index.enspack.dev from enspack.dev.

Verification

  • Root pnpm check green across all 12 workspace projects; CI green on 4e95f9c.
  • Site: 31 vitest tests against recorded fixtures (no network) covering every page, empty/error states, the data clients, sorting, the collapsed lock entry, document titles and the clipboard fallback.
  • Indexer: CORS header test.
  • Visual QA pass (desktop 1280 + mobile 360/420) and a responsive polish round; demo video recorded in VITE_DATA_SOURCE=demo mode.

enspack_catalog_site_demo_home_model_trust_chain_publisher_violations.mp4

Not in this PR

  • Cloudflare Pages project and enspack.dev DNS (manual; see apps/site/README.md).
  • Live run against the Sepolia indexer — pending the indexer deployment from WP-21 infra. Acceptance item "home page lists the bootstrapped mirrors" is verified only against fixtures for now.

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

@cursor
cursor Bot force-pushed the cursor/wp-19-catalog-site-0b31 branch from 305feb4 to 32cb6ce Compare September 14, 2026 15:46
@jefflau
jefflau marked this pull request as ready for review September 14, 2026 16:44
jefflau and others added 9 commits September 14, 2026 16:47
Vite + React + TS static app under apps/site reading the indexer JSON API
(MVP.md §4.3). Adds the typed data layer (HttpIndexClient / FixtureIndexClient),
config from VITE_* env only, shared primitives (Hash, CopyButton, Badge, states,
Layout), design tokens, recorded fixtures and route stubs for the pages.

Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Model page renders the trust chain (ENS name -> CID -> manifest -> bytes ->
per-file SHA-256), a sortable files table, versions and a get-it panel with
the lockfile entry. Home has live stats, how-it-works and a searchable list.

Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Files table stacks under 720px, trust chain and attestation values wrap,
lockfile entry collapses by default, hero and stats stay on the unfiltered
catalog, shared code-block chrome, primary CTA, per-route document titles.

Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
Co-authored-by: Jeff Lau <jefflau@users.noreply.github.com>
@cursor
cursor Bot force-pushed the cursor/wp-19-catalog-site-0b31 branch from 4e95f9c to 51c3184 Compare September 14, 2026 16:48
@cursor
cursor Bot merged commit 51c3184 into master Sep 14, 2026
1 check 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