The header carried a letter (v) in an accent chip and the favicon was a separate
v glyph, so the forge had two marks that could drift apart. Both are now the
supplied rat emblem, from one file.
What changed
server/web/static/logo.svgis the artwork, served from the binary like every other static asset. It is both the<link rel="icon">target and the header mark.server/web/static/favicon.svgis deleted; nothing referenced it..brand .markno longer paints a background, a radius or a font. It sizes the image (22px) and nothing else, since the emblem carries its own shape.- A test asserts the served file contains the emblem and that the shell names it as both icon and mark, so a rename cannot leave every page pointing at a missing icon.
The theme adaptation, and why
The artwork is a badge with the rat silhouette knocked out — that is what makes it read as one object rather than a rat sitting on a disc. The consequence is that the rat takes the colour of whatever is behind it, so the badge has to be the thing that adapts:
circle#badge { fill: #171717; }
@media (prefers-color-scheme: dark) { circle#badge { fill: #e7e8ea; } }
Light mode is the artwork as authored: a near-black coin with a light rat. Dark mode is its negative: a near-white coin with a dark rat. The mask’s black and white are luminance and stay literal — theming them would break the cut-out.
The embedded query is safe as a fallback: a browser that ignores
prefers-color-scheme inside an SVG image is a browser that also shows the light
theme for the page, which is the state the base rule is for. Nothing else in the
stylesheet is used, so there is no second place to keep in step.
Rendered and checked at 200px and at the header’s 20–22px in both themes: the silhouette — head, ear, whiskers, eye, tail — survives the small size.
If you would rather keep the coin black in both themes, delete the media query
from logo.svg; in dark mode it becomes a very dark disc on a very dark header,
which is why it is not the default.