Plate only the logos that need one, instead of all of them (0.53.0)
CI / check (push) Successful in 12m3s
CI / build-and-push (push) Successful in 1m56s

0.52.0 put every app logo on a white tile. The reason was real — a good number
of logos are solid black line art and vanish into a dark surface — but the cure
was applied to all of them, and in dark mode that makes each row look like it
has a sticker pasted on it.

So the tile goes back to the same neutral surface everything else uses, and the
decision is made per image. The browser already holds the bytes, so it draws
each one into a 24px canvas once and measures it: no new dependency, no second
request, and it covers uploads as well as catalog logos.

Measuring luminance alone was the first attempt and it is wrong. It plates Home
Assistant, whose logo is a mid-blue house that reads on anything, and it plates
Plex, which is dark *orange* — mean luminance cannot see that hue is doing the
work. So chroma is measured too, and a plate requires low contrast **and** art
with essentially no colour of its own. The threshold sits between the logos that
only look monochrome (Sonarr 0.115, Uptime Kuma 0.129) and the ones that are
(MinIO 0.065, Memos 0.037).

Checked against 66 real logos rather than guessed: six get a plate in dark mode
(Vaultwarden, Tailscale, Frigate, Heimdall, Miniflux, MinIO, all solid black),
two in light mode (Ollama, Open-WebUI, solid white). The other ~90% sit bare.
Mid-grey art like Bazarr is deliberately left alone — it already has contrast
against both grounds, and a plate would be noise.

Every failure path returns "no plate": jsdom with no canvas, a blocked canvas, an
image that will not decode. Being wrong in that direction costs contrast on a
handful of icons; being wrong the other way is the sticker problem again. The
unit test is built from the measured luminance/chroma pairs, so it tests the
rule against the art it actually has to handle.

0.53.0 because 0.52.0's images are already in the registry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
menzelj
2026-09-17 11:08:08 +02:00
co-authored by Claude Opus 5
parent b629d1b2c2
commit 76a228314a
7 changed files with 290 additions and 9 deletions
+23
View File
@@ -13,6 +13,25 @@ as intuitive as Dockge, as capable as Portainer for Compose workflows.
> (Auto-update) + Phase 23 (Secrets & configs) + Phase 24 (Design System v2)
> complete.
## Upgrading to 0.53.0 — nothing to do
A dark-mode fix. 0.52.0 put every app logo on a white tile so that black line
art would not disappear; in dark mode that made each icon look like a sticker
pasted onto the row.
The tile is now the same neutral surface the rest of the UI uses, and only art
that genuinely vanishes into it gets a backing plate. The browser measures each
image once — how light it is *and* how colourful — because luminance alone gets
it wrong: Plex is dark orange and Home Assistant a mid blue, and both read
perfectly well on either ground. A plate needs low contrast **and** art with
essentially no colour of its own.
Across 66 common logos that means six get a plate in dark mode (Vaultwarden,
Tailscale, Frigate, Heimdall, Miniflux, MinIO — all solid black) and two in
light mode (Ollama, Open-WebUI — solid white). The other ~90% sit bare on the
tile, which is what they were always meant to do. Measuring falls back to "no
plate" wherever it cannot run.
## Upgrading to 0.52.0 — nothing to do
The icons 0.51.0 introduced are the **real app logos** now. A stack called
@@ -411,6 +430,10 @@ it is what your saved destination credentials are encrypted with.
512 KiB. Uploads live in `${DATA_DIR}/stack-icons/` and are
classified by their actual bytes, not by the filename or Content-Type the
browser claims. Cloning a stack copies its icon; deleting one removes it.
- **Legible in both themes.** A logo sits directly on the tile; only art that
would disappear into it — solid black in dark mode, solid white in light mode
— gets a backing plate. The browser measures each image's luminance and chroma
once to decide, so a dark *colourful* mark like Plex is left alone.
- **The status moved onto the icon.** In the stacks list and on the detail page
the status dot is gone: the icon carries a soft glow in the status colour
(green running, amber partial, red error, pulsing blue while an operation