Thirty-one cards, one per route, generated 26 Jul 2026. Today the whole
site shares a single /assets/og.png, so every link anyone pastes looks
identical whether it points at the leaderboard or at Qatar.
build/lib/html.js still points every
route at the one generic image. Wiring these up changes what a shared link looks like,
which is a visual change, and the ship policy stages those for review. The change is two
lines: the og:image and twitter:image tags.
node build/make-og.js [outDir] in the wifiodds repo. Opt-in, like
build/make-brand.py. It must never join prerender.js: it
shells out to headless Chrome 31 times.pyexpat built against a libexpat it does not have,
so pip cannot run at all. Chrome turned out to be the better tool: the
cards are laid out with the site's own tokens in the site's own self-hosted Source
Serif, so a card cannot drift from the page it advertises.assets/airlines.js. Every other card's headline is that page's own
<title>, read off the built HTML.band() and
BAND_WORD from build/lib/pages.js, so a card says what its
page says. The first draft used scoreAirline().cls, which returns the
extension's class names (usl-pct-mid). Every colour lookup missed
and all 31 scores rendered in the default brown. It only showed up by opening one.