diff --git a/docs/design-guide.md b/docs/design-guide.md index b8abb7f..59b37cf 100644 --- a/docs/design-guide.md +++ b/docs/design-guide.md @@ -43,6 +43,12 @@ Read this **before** touching theme, layout, typography, color, or SEO markup. P | Real photos (author, hardware) | **WebP q82** + JPEG fallback | Continuous-tone images are the opposite case from the flat art above. | Regenerate all derivatives after adding a post: `uv run --with pillow python scripts/optimize-images.py`. + +- **Every published post must point at its own art.** `scripts/check-assets.mjs` runs as the first + step of `npm run build` (so CI fails, not just warns) and rejects a post whose `ogImage` or + `banner` is missing or misnamed, or whose banner `.webp` / `-400` / `-800` thumbs are absent. + The renderers only *read* frontmatter — nothing writes these two fields for a new post, which is + how two 2026-10-20 posts shipped on `/og-default.jpg` with no hero banner. - **Declare `og:image:width/height` explicitly** — mis-declared dimensions get preview cards rejected by WhatsApp/Telegram/LinkedIn. - **Favicon**: reference all sizes (`.ico` + 32×32 + 192×192 PNG + apple-touch 180×180). "Favicon not showing" is usually browser cache, not a missing asset — `curl` the live files before "fixing". diff --git a/docs/project-state.md b/docs/project-state.md index 59d649b..7ea70f5 100644 --- a/docs/project-state.md +++ b/docs/project-state.md @@ -258,8 +258,15 @@ No topics were killed by the user in this sweep. - Verified with headless Chrome by injecting the built `