feat(cli): keep every icon a site declares and headline the bare mark (#3727)
A brand band shows logo artwork on a transparency checker, where a badge (a mark knocked out of a full-bleed disc or square) reads as a solid blob. The capture kept only the first icon that downloaded, so which of a site's icons survived was decided by ranking alone, and nothing recorded what the survivor actually looked like. Keep them all. Each declared icon is written as assets/icon-<rel>-<sizes>.<ext> and classified as bare-mark, badge, or unknown, then the best one is copied onto the historical assets/favicon.<ext> stem so a stem match still finds it. Classification is deterministic and cheap. SVG is read from markup, not rendered: these files routinely fill via CSS custom properties behind a prefers-color-scheme query, and librsvg resolves neither, rasterising one real favicon to a fully transparent image while Chrome draws it correctly. Raster icons are sampled at the midpoint of each edge rather than the corners, because a full-bleed disc has four transparent corners and would otherwise read as a bare mark. The headline prefers a bare mark, then falls back to the existing ranking. Preference is binary on purpose: an "unknown" is not promoted above a badge, or an undecodable .ico would outrank a good SVG purely for being unexaminable. extracted/icons-manifest.json records every icon, its shape and the evidence for that shape, plus which file became the headline, its rank, and why. A choice whose losers are invisible is indistinguishable from having had no choice, which is how a substituted icon went unnoticed in the first place. Worth noting for consumers: sites often declare no bare mark at all. An apple-touch-icon is composited onto an opaque tile per Apple's spec, so it is a badge, not a mark. The manifest says so rather than implying the preference was satisfied.
M
Miguel Ángel committed
1fa31d5dfb9c2e2e27fd9f745e5bd52f3dff0663
Parent: 97fde27
Committed by GitHub <noreply@github.com>
on 9/6/2026, 2:35:45 AM