Skip to content

Home: put a refresh date on every front-page figure - #13

Merged
aurph merged 4 commits into
mainfrom
splash
Aug 6, 2026
Merged

Home: put a refresh date on every front-page figure#13
aurph merged 4 commits into
mainfrom
splash

Conversation

@aurph

@aurph aurph commented Aug 4, 2026

Copy link
Copy Markdown
Owner

What

Every figure on the front door now prints the date its own dataset was last refreshed, read from the same endpoint that serves the figure. Nothing is hardcoded, and a stat whose API returns no date renders no date rather than borrowing today's.

The landing itself is unchanged: the typed wordmark leads at full size and the tagline stays "Energy infrastructure, in plain sight."

The dates this puts on screen

They are the point, and they are not flattering:

stat as of age
Operational power for compute 26 Jun 2026 40 days
Contracted power deals 20 May 2026 77 days
Cost of compute 5 Aug 2026 live sweep, current
Tracked clusters 26 Jun 2026 40 days

Two of the four datasets are weeks stale and the front page now says so out loud. That is the argument for mounting the daily cluster-refresh pipeline, not an argument against shipping this.

Also in this branch

  • The Power Map card claimed 33 facilities while the map beneath it plotted 58. The caption now reads from /api/datacenters, sharing the query key with RealUSMap so the sentence cannot disagree with the dots. The neighbouring "One hundred public companies" was checked rather than assumed and is correct.
  • The landing shipped two footers. App.tsx renders SiteFooter for every route including /, and Home.tsx rendered HomeFooter on top of it. HomeFooter goes; its two unique links move into SiteFooter so every page gains them.
  • The header and footer disagreed on the company's own name ("GridTilt" vs "Gridtilt"). Wordmark now exports the split as constants and a guard test fails on any surface that renders the accent half lowercase.

Reverted from the earlier version of this branch

Three changes here collided with settled brand decisions and were backed out:

  • The headline read "The AI power buildout, tracked with sourced numbers." Marquee surfaces stay power and grid first; AI belongs on data labels deep in the product.
  • "sourced numbers" rendered in Source Serif 4 italic via .gt-tagline-emphasis, which was dead CSS on main. Serif is not part of this brand.
  • The typed wordmark dropped to 28-40px masthead size. It leads at full size instead.
  • The hero map backdrop went from 0.085 to 0.5 opacity. Background layers stay low opacity and a map behind the wordmark was already rejected once, so hero-map.tsx is removed and anchor.css returns to main.

Verification

tsc clean, 289 tests pass, build passes, homepage rendered and checked in Chrome. Merged together with #12 and #14 on top of current main: 305 tests pass, tsc clean, build passes. Only conflict across the three is a blank line in .gitignore.

Not tested: real touch interaction and hover states on the stat cards.

The hero spent its largest type on a logo the nav already carries, said
"Energy infrastructure, in plain sight." (which does not say what GridTilt
is, or that anything is sourced), and showed four numbers with no date and
no provenance. For a product whose whole differentiator is sourced numbers,
the front door argued the opposite.

- The sentence leads: "The AI power buildout, tracked with sourced numbers."
  with "sourced numbers" set in the marketing serif italic, which
  anchor.css already reserves for exactly this emphasis. The scope line
  underneath names what is covered. The wordmark drops to masthead size.
- Every figure in the ledger now prints the date its own dataset was last
  refreshed, read from the same endpoint that serves the figure. Nothing is
  hardcoded, and a stat whose API returns no date renders "no date" rather
  than borrowing today's. This surfaces real staleness immediately: the
  deals figure reads "as of 20 May 2026", because it is.
- Each ledger cell links to the module that shows its working.
- Adds the live cluster map behind the hero, using the same projection and
  the same dot semantics as the social card, so the landing page and the
  images that go out on X read as one system. It uses geoAlbers rather than
  geoAlbersUsa, whose composite clip draws stray Alaska and Hawaii inset
  frames over a lower-48 feature set.
- Cuts the reveal delay from 1.5s to 0.12s. The old hero showed a visitor a
  bare wordmark for a second and a half before saying anything.
- Uses .gt-tagline-primary / .gt-tagline-emphasis, which were designed in
  anchor.css for the landing and then never wired to anything.

Also carries the Virginia winding fix from the daily-card branch, because
this hero's map reads the same geojson: the ring shipped backwards, d3 read
it as the whole sphere minus Virginia, and every geoAlbersUsa fitSize on the
site has been fitting to a global extent.

tsc clean, 300 tests pass, client build passes, verified in headless Chrome
at 1440px and 430px.
The card claimed "Thirty-three tracked facilities" while the map rendered
directly beneath it plotted 58. /api/datacenters returns 58 today.

The count was never going to hold. The datacenter ingester appends newly
discovered facilities every six hours, so any number written into the copy
starts drifting the moment it ships. This is the same class of problem as a
stat with no as-of date: a claim the page cannot back up.

The caption now reads from /api/datacenters, sharing the query key with
RealUSMap so react-query serves both from one fetch and the sentence cannot
disagree with the dots. While the request is in flight it drops the number
rather than guessing one.

Checked the neighbouring claim rather than assuming: "One hundred public
companies" is correct, /api/stack carries exactly 100 unique tickers across
17 sectors, so it stays as written.
@aurph

aurph commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

Added in 9d7b368: the Power Map card claimed "Thirty-three tracked facilities" while the map directly beneath it plotted 58. The count was never going to hold, since the datacenter ingester appends new facilities every 6 hours, so any hardcoded number starts drifting the moment it ships. The caption now reads from /api/datacenters, sharing the query key with RealUSMap so one fetch serves both and the sentence cannot disagree with the dots.

Checked the neighbouring claim rather than assuming it was wrong too: "One hundred public companies" is correct (/api/stack carries exactly 100 unique tickers across 17 sectors), so it stays as written.

Two defects found by actually scrolling the rendered page rather than
reading the source.

The landing shipped two footers. App.tsx renders SiteFooter inside <main>
for every route, including "/", and Home.tsx rendered HomeFooter on top of
it. The front door therefore ended with two brand lockups, two copyright
lines and two source lists stacked on each other.

SiteFooter is the more complete of the two, so HomeFooter goes. The two
links only HomeFooter carried, the GitHub repo and the contact address,
move into SiteFooter's Data column, so nothing is lost and every page gains
them rather than just "/".

Separately, the header and the footer disagreed on the company's own name.
The animated Wordmark splits the constant "GridTilt" into "Grid" + "Tilt",
while HomeFooter hardcoded its own lockup and rendered the accent half
lowercase, as "Grid" + "tilt". Wordmark now exports BRAND_TEXT, BRAND_HEAD
and BRAND_TAIL, and the surfaces share one split.

The guard test pins the constant and fails on any surface that renders the
brand with a lowercase second half, because this is a one-character drift
that reads as correct until you put the header and the footer side by side.

Also checked and deliberately left alone: the em dash rule. Seven hits in
client/src are all JSX comments, null placeholders, or the DemandChart line
that strips em dashes out of annotation labels. No product copy violates it.

tsc clean, 289 tests pass, client build passes, verified in Chrome.
@aurph

aurph commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

Two more found by scrolling the rendered page rather than reading source (65bfa4c):

The landing shipped two footers. App.tsx renders SiteFooter inside <main> for every route including /, and Home.tsx rendered HomeFooter on top of it. The front door ended with two brand lockups, two copyright lines and two source lists stacked. SiteFooter is the more complete one, so HomeFooter is removed; the two links only it carried (GitHub repo, contact address) moved into SiteFooter's Data column, so every page gains them instead of just /.

The header and footer disagreed on the company's own name. Wordmark splits the constant "GridTilt" into Grid + Tilt; HomeFooter hardcoded its own lockup and rendered the accent half lowercase as Grid + tilt. Wordmark now exports BRAND_TEXT/BRAND_HEAD/BRAND_TAIL and the surfaces share one split. A guard test fails on any surface rendering a lowercase second half, since it's a one-character drift that reads as correct until you put header and footer side by side.

Checked and deliberately left alone: the no-em-dash house rule. All 7 hits in client/src are JSX comments, null placeholders, or the DemandChart line that strips em dashes from annotation labels. No product copy violates it.

The hero rewrite in this branch changed three things that are settled brand
decisions, so they are reverted here and the part worth keeping stays.

Reverted:
- The headline read "The AI power buildout, tracked with sourced numbers."
  Marquee surfaces stay power and grid first; AI belongs on data labels deep
  in the product, not on the front door.
- "sourced numbers" rendered in Source Serif 4 italic via .gt-tagline-emphasis,
  which was dead CSS on main. Serif is not part of this brand.
- The typed wordmark dropped to 28-40px masthead size so the sentence could
  lead. It leads instead, at full size, as shipped.
- The hero map backdrop went from 0.085 to 0.5 opacity. Background layers stay
  low opacity, and a map behind the wordmark was already rejected once. The
  GridPulse backdrop stands on its own, so hero-map.tsx is removed and
  anchor.css returns to main.

Kept, and the reason this branch exists:
- Every hero stat prints the date its own dataset was last refreshed, read
  from the same endpoint that serves the figure. Nothing is hardcoded, and a
  stat whose API returns no date renders "no date" instead of borrowing today.
- Each stat links to the module that shows its working.

The dates this puts on screen are the point and they are not flattering:
clusters 26 Jun, deals 20 May, GPU 5 Aug from the live sweep. Two of the four
datasets are weeks stale and the front page now says so.

tsc clean, 289 tests pass, build passes, homepage verified in Chrome.
@aurph aurph changed the title Home: lead the hero with the sourced-numbers claim and prove it inline Home: put a refresh date on every front-page figure Aug 5, 2026
@aurph
aurph merged commit 60b2768 into main Aug 6, 2026
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