Files
zeekayandHanzo Dev 9b17185436 brand: one binary, five brands, and no brand wearing another's mark
Hanzo and Lux status pages run the same image digest. Three of the tab-icon
links were brand-templated, but the paths a browser reaches for on its own
were not: /favicon.ico, /apple-touch-icon.png, /logo-192x192.png and
/logo-512x512.png were real files at the web root, and git records this
commit moving them into brands/hanzo/ because that is what they always were.
Every brand got Hanzo's bytes. Saving status.lux.network to an iOS home
screen saved the Hanzo mark, md5-identical.

Artwork now has one home, /brands/<brand>/, and one name to reach it by:
ui.brand. Tab icon, home screen icon, PWA icons and the header logo all
derive from that name, so a deployment cannot title itself one company and
hand out another's mark. The bare root paths are served from the same place
rather than being a second copy that drifts, and a brand missing an asset is
a boot failure instead of a page quietly wearing nobody.

manifest.json was a checked-in static file: it called itself "Status" on a
page titled "Hanzo Status", described itself in upstream Gatus's words, and
splashed #f7f9fb light grey in front of a UI that paints #020817. It is now
rendered from the same config that renders the page, and the theme-color meta
reads the colour the app actually paints instead of a rounder-looking #000000.

The 180/192/512 sizes were rasterised from each brand's own canonical SVG with
rsvg-convert, the same pipeline that produced the existing 16/32 — it
reproduces every shipped icon byte for byte, and Hanzo's icons are unchanged
from what production serves today.

Config drops `logo` and the three-field `favicon` block for the single
`brand` key. TestNoBrandWearsAnothersMark asserts the property that was
silently false: distinct bytes per brand at every size.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-05 16:07:37 -07:00
..