feat(landing): live project-directory grid with descriptions, PR telemetry, and payouts - #1363
Merged
Merged
Conversation
…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.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
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
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.Layout
repoWebsites.jsonrefreshed:JSONbored/loopover, thegittensor-agent-forge/gt-imagentrename, and sparkinfer's move to sparkinfer.com.Screens
The grid:
Curtain beat (≤4s, once per session):
Validation
npm run lint,tsc -b, andvite buildpass