Project favicons were hotlinked from about seven hosts on every visit. The build now fetches each named project's icon into icons/projects/<content hash>.<ext> and site.json maps full_name to that path. Only PNG, ICO, GIF, JPEG and WebP are kept; an SVG is drawn to a 64 px PNG, so nothing fetched runs on the site's origin. A failed fetch leaves the project on its monogram, as a broken image did before.
Verified against a copy of the index: 21 projects, 9 icon files, 0 broken images; third-party image hosts on the page went from 7 to 0. cargo test (prerender headline test already fails on main), clippy --features aws, node --check.
Before / after:
🤖 Generated with Claude Code