Per the logo + brand: the name is upbeatBytes (camelCase). Swept all user-facing
strings — titles/og:site_name/og:title, logo alt text, share pages (share.py),
emails (email_send), classifier prompt (llm), digest/unsubscribe (api), PWA
manifest, game share text, sign-in, the SPA shell + patch-static-heads (play
title) — plus README/publish.sh and the email test fixture. (SMTP From env was
already upbeatBytes.) Domains (upbeatbytes.com) unchanged. 425 BE + 36 FE green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- home3 dropped source_read_minutes when mapping the brief item, so the badge
only ever showed "1 min brief" — include it so "· ~N min full story" appears.
- /art is public but shipped the homepage title/canonical/OG (SSR-off shell, so
svelte:head can't fix scrapers) — add /art to patch-static-heads.mjs.
- Bloom: center the circular motif in the tile's visual field (~43%) instead of
the top illustration zone, so it reads as a medallion (per Jay + Codex).
- Polish: prefers-reduced-motion disables the tile hover-lift; fix stale
patch-play-head.mjs comment reference.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- News card "3 min read" → computed from our own gist (~200 wpm, floor 1). We
summarize, so it's honestly ~"1 min read" — the good news in about a minute.
- Generalized the build-time head patch (patch-play-head → patch-static-heads):
now also rewrites build/word.html, quote.html, onthisday.html so each ships
its own <title>/description/canonical/OG/Twitter tags instead of the homepage
head + canonical="/". Non-JS scrapers and canonical dedup are correct before
these pages are ever un-noindexed. Same fail-loud guard as before.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>