fix(favicon): make the per-install tint actually cover the fingerprint URLs

The install-time tint only recolored favicon.svg, but the page also shipped a
fixed raster favicon.ico + .png — and favicon-hash scanners hash /favicon.ico,
which was identical across every install. So the "car-paint" tint didn't change
what those tools cluster on.

- index.html links only the SVG now (drop the raster <link>s).
- Remove the unused favicon-16x16/32x32.png.
- install.sh: after tinting favicon.svg, copy it over favicon.ico too, so a
  blind /favicon.ico fetch also returns the per-install color instead of a fixed
  icon. (SVG bytes under an .ico name — browsers use the linked SVG; this only
  affects what a scanner hashes at that URL.)

Still obscurity/defense-in-depth, not a real gate — but now it does what it says.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Juan DenisandClaude Opus 4.8 committed 2026-07-15 14:04:00 -04:00
1 parent 3954680c87
commit 8ee33ef2c6
4 files changed
+7 -3

No files matched your search

+2 -3
View File
@@ -3,10 +3,9 @@
<head>
<meta charset="UTF-8" />
<!-- Single SVG favicon so the per-install tint (install.sh randomize_favicon)
is the only mark served; no fixed raster icon to fingerprint-cluster on. -->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="description" content="Control Panel" />
<title>Control Panel</title>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

+5
View File
@@ -1129,6 +1129,11 @@ randomize_favicon() {
if sed -i -E "s|(<rect width=\"32\" height=\"32\" rx=\"7\" fill=\")[^\"]+(\")|\1hsl(${h}, ${s}%, ${l}%)\2|" "$fav" 2>/dev/null; then
good "Favicon tint set to hsl(${h}, ${s}%, ${l}%)"
fi
# Also serve the tinted mark at /favicon.ico so a blind favicon-hash fetch
# there varies per install too, instead of a fixed cross-install icon. It's
# SVG bytes under an .ico name — browsers use the linked SVG anyway; this is
# only about what a scanner hashes at that URL.
cp "$fav" "$INSTALL_DIR/frontend/dist/favicon.ico" 2>/dev/null || true
}
build_frontend() {