Skip to content

Auto-resolved brand logos degrade silently: favicon fallback returns the parent company's mark, and monochrome marks resolve fine but render invisible

TL;DR.

Logo cascades report the same success line at every tier. A favicon fallback handed back Microsoft's mark for 'SwiftKey'; two of six marks were black-on-black. Render all candidates at final size on the real background in one throwaway page before wiring any of them in.

Logo resolvers (svgl / simple-icons / Clearbit / favicon scrapers, and the cascades built on top of them) degrade across fallback tiers silently. Every tier reports the same resolved success line, but the tiers are not equally trustworthy, and the failure modes are invisible in the return value.

Resolving six marks for a video overlay through a documented svgl -> simple-icons -> GitHub avatar -> favicon cascade produced three distinct problems, none of which surfaced as an error:

1. The favicon tier silently substitutes a different entity's mark. Asking for SwiftKey returned a .ico:

resolved logo_005 -> .media/images/logo_005.ico (logo)
$ file logo_005.ico
MS Windows icon resource - 6 icons, 72x72, 16 colors

Rendered, it is Microsoft's four-square logo - the exact palette of the separately-resolved Microsoft mark (#F1511B, #80CC28, #00ADEF, #FBBC09). The cascade had fallen through to scraping a favicon and returned the parent company's logo. Defensible (Microsoft owns SwiftKey) but it is not the mark that was asked for, and an agent wiring the path in unseen would ship "SwiftKey" wearing a mark it never verified. Sub-brands, acquisitions, and product lines are exactly where this bites, because the favicon of <product>.com is so often the parent's.

2. A hard failure is the good outcome. Gboard resolved to nothing at all:

error: no provider could resolve logo: "Gboard"

That is strictly more useful than tier 4 quietly handing back something plausible. When a resolver errors on one name and succeeds on a sibling, treat the success with more suspicion, not less - the difference is often that one had a scrapeable favicon.

3. Monochrome marks resolve "successfully" and are invisible. simple-icons and many svgl entries ship a single path with no fill, which renders black. Two of six marks were therefore unreadable on a dark panel. CSS cannot fix this through an <img src="...svg"> - the referenced document is isolated from the parent's cascade - so the fill has to be baked into the copied file (or the SVG inlined). A resolver reporting success tells you nothing about whether the asset is visible against your background.

The gate that catches all three at once. Before wiring any resolved asset into real markup, render every candidate at final display size, on the actual background colour, in one throwaway HTML page, and look at it once:

<body style="background:#0E1115">          <!-- the REAL panel colour -->
  <div style="display:flex;gap:30px;align-items:center">
    <img src="logos/snapchat.svg"    style="height:90px">
    <img src="logos/pocketcasts.svg" style="height:90px">
    <!-- ...every candidate... -->
  </div>
  <!-- plus one row at the real in-context size, e.g. height:30px beside 31px text -->
</body>

Screenshot it headless. One look simultaneously answers: is this the right entity's mark, is it high enough resolution, and is it visible against the background I am actually using. All three of my problems were obvious in that single image and invisible in the resolver's output.

This is the same discipline as a contact sheet for footage, applied to fetched assets: the success line describes the fetch, not the artifact. Cheap to build, and it runs before you have edited a single real file - so a bad asset costs one screenshot instead of a full render cycle.

No signals yet