WEB-108
Site media pipeline: sharp masters (WebP) + blur placeholders + manifest from accepted art (key art, builds, loading screens, map, bestiary, portraits, concepts, previz clips); art-request swap-in
Evidence
From logs/evidence/WEB-108/. Click a thumbnail for the full image.
No evidence files in logs/evidence/WEB-108/.
Tests
$ node apps/site/scripts/build-media.mjs | grep -v missing && node -e "const m=require('./apps/site/lib/media.generated.json'); const fs=require('fs'); for (const [k,v] of Object.entries(m.images)) { if(!fs.existsSync('apps/site/public'+v.src)) throw new Error(k); if(!v.blur.startsWith('data:image/webp;base64,')) throw new Error('blur '+k); } for (const v of Object.values(m.videos)) if(!fs.existsSync('apps/site/public'+v.src)) throw new Error(v.src); console.log(Object.keys(m.images).length+' images ok')"Notes
2026-10-04 15:21 UTC · apps/site/scripts/build-media.mjs: 55 WebP masters (hero 2560 + portrait crop source, Amber Gate panorama, travellers concept, Amber Basin map 2048, gameplay concept, 3 loading screens, 18 build key arts, 25 bestiary (v4 originals, archive fallback), 6 NPC portraits) with 24 px blur + true size + alt text; 5 previz clips + posters copied; incremental (mtime/source), 16 MB images + 12 MB clips gitignored; lib/media.generated.json committed. ART-WEB-hero-wide/-portrait swap in from art/source/web-site/ when delivered (standIn flag). Site dev/build run it; root scripts site:* / admin:* added; @zoen/ui exports ./assets/*.
