chore(web): store each competitor screenshot once in the blog library

Merged
CO
6d ago
+230-64

Summary

Intent: The same competitor screenshots were uploaded again for every article that used them: MeetGeek 6 times; Granola and Otter 5; Tactiq 4; Fireflies, Jamie, Sonnet, Notta and Sembly 3 each. Many copies were PNG re-encodes about 10× heavier than the webp. Each screenshot now lives once in the shared blog/library/products/<product>/<feature>/ folder, and every article points there.

  • 21 new library objects, each a byte-for-byte copy of the lightest full-size existing version. Two groups reuse objects already in the library (Fathom recap, Fireflies recap audience).
  • 64 article references repointed. Distinct blog images referenced dropped from 283 to 240.
  • The static.anarlog.so Worker returns a 301 from each old article path to its library path. Search engines and external links keep working once the old objects are deleted. The old objects are still in R2 and are listed for deletion separately; deleting them is your call, after this Worker is deployed.

The duplicates were found by perceptual image hash and checked against each image's alt text and dimensions.

Demo

N/A: same images, new URLs. media:figures:check HEADs every referenced URL.

Verification

  • pnpm -F @anlg/web typecheck, pnpm -F @anlg/web test (378 pass, including a new Worker redirect test)
  • pnpm -F @anlg/web media:figures:check: all 240 referenced blog assets resolve
  • wrangler deploy --dry-run --config wrangler.static-assets.jsonc
  • dprint check on changed files

Summary by cubic

Deduplicates competitor product screenshots across blog articles so each screenshot is stored once in blog/library/products/ instead of re-uploaded per article, and keeps old URLs working through Worker redirects.

  • Creates 21 canonical library objects as byte-for-byte copies of the lightest existing versions and repoints 64 article references to them, dropping distinct blog image references from 283 to 240.
  • Adds a 301 redirect in the static.anarlog.so Worker from each old article path to its library path so search engines and external links keep working.
  • Leaves the old objects in R2 for separate deletion; delete them only after this Worker is deployed.