Skip to content

feat(landing): live project-directory grid with descriptions, PR telemetry, and payouts - #1363

Merged
e35ventura merged 4 commits into
testfrom
feat/landing-instant-previews
Jul 18, 2026
Merged

feat(landing): live project-directory grid with descriptions, PR telemetry, and payouts#1363
e35ventura merged 4 commits into
testfrom
feat/landing-instant-previews

Conversation

@e35ventura

@e35ventura e35ventura commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

What this does

Turns the landing grid into a live project directory: each card is a compact dossier (name, one-sentence description, preview, PR telemetry, payouts) rendered in the site's mono/terminal voice, with a composed loading sequence instead of content trickling in. Everything data-driven stays dynamic: nothing on the page needs a redeploy to stay current.

The cards

Each card, top to bottom:

  • Identity header above the framed preview: repo name, then the project's one-sentence description. The description block is a fixed two lines (clamped or padded) so every frame in a row sits on a common baseline.
  • Descriptions come from each repo's GitHub About text. The prebuild script snapshots them alongside homepages for an instant first paint, and the client re-fetches each repo's current About text once per session a few seconds after load, so an owner editing their description propagates per page view, not per deploy. Five repos with no About text get hand-written fallbacks that yield automatically the moment a real description appears.
  • Framed preview: website screenshot immediately, verified live embed fading in over it (loads hidden, reveals after its own load event plus a grace period, so slow hosts never show a blank window booting up). Grayscale at rest, color on hover; host pill on hover only.
  • Telemetry strip: 28 days of merges-per-day as 1px monochrome hairline ticks over a faint baseline (square-root scaled so quiet days stay visible next to spike days).
  • Stat line: N PRS MERGED THIS WEEK · N ACTIVE MINERS · ~$N/DAY. Active miners = distinct PR authors in the last 30 days; payout = the repo's emission share of the network's total miner USD/day. All folded from the two network-wide datasets the dashboard already loads — zero per-repo API calls. The payout figure is grayscale at rest and turns accent green on hover, keeping the resting grid fully monochrome.

Loading sequence

  • Once-per-session branded curtain (black, Gittensor, three pulsing dots) covers first paint and lifts once the repo list is in AND the first screen of preview images has loaded (preloaded via the same URLs the cards render, so they paint instantly from cache). Minimum 0.7s beat, hard-capped at 4s. Entrance animations hold at frame zero until it lifts.
  • Name-plate base layer behind every preview surface as the terminal fallback, so a card never renders as an empty void.
  • Preview images fade in on load; the mshots placeholder-refresh stops once a real screenshot has loaded; the screenshot stays mounted under the live embed so the cross-fade never shows a gap.
  • Guarded sessionStorage access: browsers with all site data blocked skip the curtain instead of crashing the page.

Layout

  • Grid container widened 1180 → 1320; three columns kept (breadth over panel size).
  • repoWebsites.json refreshed: JSONbored/loopover, the gittensor-agent-forge/gt-imagent rename, and sparkinfer's move to sparkinfer.com.

Screens

The grid:

grid

Curtain beat (≤4s, once per session):

curtain

Validation

  • npm run lint, tsc -b, and vite build pass
  • lint-staged ran on every commit
  • Verified in-browser with timed headless captures: curtain lifts into a fully formed grid, no mid-load dropouts, hover restores color per card

…branded curtain

- snapshot the registry at build time (fetch-repo-registry.mjs) so the
  landing grid renders real cards on first paint instead of skeletons
- download every repo's preview at build time (fetch-repo-previews.mjs)
  into public/previews/ - first-party assets ready in milliseconds instead
  of view-time mshots/GitHub OG fetches (slow, rate-limited, blank while
  pending); live embeds still verify and swap in as an upgrade
- add a once-per-session black curtain (Gittensor + three dots) that lifts
  when the first screen of previews has decoded, min 0.7s / capped at 2.5s,
  then plays the entrance sweep for the viewer
- live embeds now load hidden and fade in after their own load event plus a
  grace period, so slow hosts (kata via ngrok) never show a blank window
  booting up; hover can no longer reveal a half-loaded embed
- quieter card footer: single caption line (small avatar, dimmed org /
  name) so the preview reads as the card's subject
- preview surfaces render at full opacity with a contrast lift inside the
  grayscale so dark sites stay legible on the dark page
- host URL pill shows on hover only (always visible on touch)
- name-plate base layer + load fades for any card still fetching remotely
- refresh repoWebsites.json (picks up JSONbored/loopover, imagent rename)
…veal

The registry slice and preview screenshots were fetched at build time and
committed, so the landing page could only ever be as fresh as the last
deploy. This site is not rebuilt often: registered projects change their
websites and the registry gains repos between deploys, so the committed
snapshots (and 1.5MB of binary churn per refresh) would rot in place.

Previews go back to view-time fetching (mshots screenshot, GitHub OG card,
live embed), exactly as before. What stays is the presentation layer:

- once-per-session branded curtain, now lifting when the live repo query
  settles (min 0.7s beat, hard-capped at 2.5s), with entrance animations
  held at frame zero until it lifts
- name-plate base layer so a card never renders as an empty void
- preview images fade in on load instead of popping in raw
- live embeds load hidden and reveal after load + grace period
- contrast lift, hover-only host pill, quieter card caption
- sessionStorage access is now guarded so blocked site data cannot crash
  the page

prebuild is back to fetch-repo-websites.mjs only.
@e35ventura e35ventura changed the title feat(landing): instant first-paint grid with build-time previews and branded curtain feat(landing): branded curtain and composed card loading (fully dynamic previews) Jul 18, 2026
The curtain was lifting as soon as the repo list arrived, revealing a wall
of name plates with previews trickling in behind it. Three fixes, verified
with timed headless-browser captures:

- website cards show their mshots screenshot immediately as the backdrop,
  including while a live embed is still verifying, instead of sitting as a
  bare name plate until the embed reveals
- the curtain preloads the first screen of preview images (same URLs the
  cards render, so the cache makes them paint instantly) and holds until
  they settle, min beat unchanged, hard cap raised to 4s
- the mshots placeholder refresh stops once a real 1280px screenshot has
  loaded (remounting it blanked the card back to its name plate), and the
  screenshot stays mounted under the live embed so the cross-fade never
  lets the name plate peek through
Each card is now a compact project dossier in the site's mono voice:

- identity header above the framed preview: repo name left, then the
  project's one-sentence description (a fixed two-line block so every
  frame in a row starts at the same height)
- descriptions come from each repo's GitHub About text: the prebuild
  script now snapshots them alongside homepages (same fail-safe
  contract), and the client re-fetches each repo's current description
  once per session a few seconds after load, so an owner editing their
  About box propagates per page view without a redeploy; five repos with
  no About text get hand-written fallbacks that yield automatically the
  moment a real description appears
- below the preview, a merges-per-day telemetry strip: 28 days of 1px
  monochrome hairline ticks over a faint baseline, square-root scaled so
  quiet days stay visible next to spike days, with the headline numbers
  as text underneath: PRs merged this week, active miners (distinct PR
  authors in 30 days), and the repo's estimated payout (emission share
  x the network's total miner USD/day) - all folded from the two
  network-wide datasets the dashboard already loads, no per-repo calls
- the payout figure is grayscale at rest and turns accent green only on
  hover, keeping the resting grid fully monochrome
- grid container widened 1180 -> 1320 (three columns kept)

repoWebsites.json refresh picked up sparkinfer's move to sparkinfer.com.
@e35ventura e35ventura changed the title feat(landing): branded curtain and composed card loading (fully dynamic previews) feat(landing): live project-directory grid with descriptions, PR telemetry, and payouts Jul 18, 2026
@e35ventura
e35ventura merged commit b025290 into test Jul 18, 2026
2 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