Skip to content

Fix README logo, add real wordmark, document HACS icon situation - #28

Merged
turbo5000c merged 4 commits into
mainfrom
claude/noaa-it-all-hacs-images-hugvxv
Aug 12, 2026
Merged

Fix README logo, add real wordmark, document HACS icon situation#28
turbo5000c merged 4 commits into
mainfrom
claude/noaa-it-all-hacs-images-hugvxv

Conversation

@turbo5000c

Copy link
Copy Markdown
Owner

Description

The HACS store list shows "icon not available" for this integration. That is an upstream HACS bug, not a repository problem — three prior attempts to fix it here (8ca08d9, a3679e8, ffc7a1d) were chasing something that does not live in this repo. This PR ships the branding fixes that are actually reachable and documents the rest so it does not get re-attempted.

Why the HACS list icon is blocked

HACS's frontend renders that icon via brandsUrl() from its pinned homeassistant-frontend submodule, which still resolves to the legacy brands.home-assistant.io/_/noaa_it_all/icon.png CDN. That CDN is backed by home-assistant/brands, where noaa_it_all does not exist and cannot be added — the repo runs close-new-custom-integrations.yml, which auto-closes any PR adding a new custom_integrations/ folder, and its README now calls that directory a "Legacy folder".

Our local brand/ folder is the correct HA 2026.3+ mechanism and already works everywhere inside Home Assistant. Only the HACS store list is affected. Tracking: hacs/integration#5171, hacs/integration#5223, hacs/frontend#937 (the PR that would ship the fix), hacs/integration#5388. HACS frontend's last release is 20250128065759 — January 2025.

Changes

  • README — the header image used a github.com/.../blob/... URL, which serves an HTML page rather than an image, so it rendered broken everywhere. Switched to raw.githubusercontent.com. This is user-visible inside HACS too, since hacs.json sets render_readme.
  • brand/ wordmark — replaced the logo (previously the icon padded into a 768x256 canvas with wide empty margins, against HA's "minimum empty space on the edges" guideline) with a real lockup: icon on the left, "NOAA It All" in Liberation Sans Bold to the right, trimmed to content. The @2x files are rendered at 512px tall and halved for the 1x, so the 2x relationship is exact. Added genuine dark variants — the icon is theme-agnostic, but the navy wordmark text disappears on a dark card. Colors sampled from the icon: #0d2e70 body, #c0e4f5 ring.
  • brand/dark_icon.png deleted — byte-identical to icon.png, and HA's fallback chain already resolves dark_icon.png to icon.png.
  • Tests — pinned the new dimensions, added a guard that dark variants are not byte-copies of their light counterpart, and added TestReadmeImages to catch the /blob/ URL bug class that started this. Corrected the false docstring on test_root_icon_exists, which claimed the root icon was "required for HACS store display" — that claim is part of what produced the failed attempts.
  • docs/BRANDING.md (new) — how the brand/ mechanism works, the fallback chain, why the HACS list icon is blocked, upstream tracking links, and an explicit DO NOT TRY list. Linked from copilot-instructions.md, which also had its stale "manual trigger only" claim about hacs-validate.yml corrected in 3 places.

No change to hacs-validate.yml: the HACS brands check accepts local brand assets at custom_components/<domain>/brand/icon.png and only falls back to the CDN domain list when those are absent, so it passes as-is. No ignore needed.

Expected non-result

The HACS store list row will still show "icon not available" after this merges. That is the upstream bug, not a regression.

Type

  • Bugfix
  • Feature
  • Documentation
  • Other

Checklist

  • Follows Home Assistant custom integration structure
  • Passes flake8 checks (max-line-length=120)
  • Manifest is valid and complete
  • README updated if required

Verification performed

  • pytest tests/ — 521 passed
  • flake8 custom_components/noaa_it_all/ tests/ --max-line-length=120 — clean
  • Confirmed the new README guard actually bites: reintroducing the old /blob/ URL fails TestReadmeImages, restoring it passes
  • Verified all brand PNGs are 8-bit RGBA, non-interlaced, with fully transparent corners, and that the four logo files are genuinely distinct
  • Confirmed https://raw.githubusercontent.com/dawg-io/noaa_it_all/main/icon.png returns 200 image/png

Generated by Claude Code

claude added 4 commits August 12, 2026 06:24
The HACS store list shows "icon not available" for this integration. That is an
upstream HACS bug, not a repository problem, and three prior attempts to fix it
here (8ca08d9, a3679e8, ffc7a1d) were chasing something that does not live in
this repo. This change ships the branding fixes that are actually reachable and
documents the rest so it does not get re-attempted.

Why the HACS list icon is blocked: HACS's frontend renders it via brandsUrl()
from its pinned homeassistant-frontend submodule, which still resolves to the
legacy brands.home-assistant.io CDN. That CDN is backed by home-assistant/brands,
where noaa_it_all does not exist and cannot be added -- the repo auto-closes any
PR adding a new custom_integrations folder. Our local brand/ folder is the
correct HA 2026.3+ mechanism and already works everywhere inside Home Assistant.

Changes:

- README: the header image used a github.com/.../blob/... URL, which serves an
  HTML page rather than an image, so it rendered broken everywhere. Switched to
  raw.githubusercontent.com. This is user-visible inside HACS too, since
  hacs.json sets render_readme.

- brand/: replaced the logo (previously the icon padded into a 768x256 canvas
  with wide empty margins) with a real wordmark lockup -- icon on the left,
  "NOAA It All" in Liberation Sans Bold to the right, trimmed to content. The
  @2x files are rendered at 512px tall and halved for the 1x, so the 2x
  relationship is exact. Added genuine dark variants, since the navy wordmark
  text disappears on a dark card (the icon itself is theme-agnostic and needs
  none). Colors sampled from the icon: #0d2e70 body, #c0e4f5 ring.

- brand/dark_icon.png: deleted. It was byte-identical to icon.png, and HA's
  fallback chain already resolves dark_icon.png to icon.png.

- tests: pinned the new dimensions, added a guard that dark variants are not
  byte-copies of their light counterpart, and added TestReadmeImages to catch
  the /blob/ URL bug class that started this. Corrected the false docstring on
  test_root_icon_exists which claimed the root icon was "required for HACS
  store display" -- that claim is part of what produced the failed attempts.

- docs/BRANDING.md: new. How the brand/ mechanism works, the fallback chain, why
  the HACS list icon is blocked, upstream tracking links, and an explicit
  DO NOT TRY list. Linked from copilot-instructions.md, which also had its
  stale "manual trigger only" claim about hacs-validate.yml fixed in 3 places.

No change to hacs-validate.yml: the HACS brands check accepts local brand assets
at custom_components/<domain>/brand/icon.png and only falls back to the CDN
domain list when those are absent, so it passes as-is. No ignore needed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TA3si1SuRW4W8MD7N9x7a
Restores custom_components/noaa_it_all/brand/ byte-for-byte to its previous
state. The wordmark logos and the dark_icon.png deletion are reverted, and
tests/test_manifest.py goes back to the original pinned dimensions.

Also corrects docs/BRANDING.md, which overstated the problem. The earlier
claim that "no change to this repository can fix it" was wrong, and the
observation that disproves it is simple: other custom integrations do show
icons in the HACS store list. Verified:

  home-assistant/brands/custom_integrations/alarmo      -> exists, icon shows
  home-assistant/brands/custom_integrations/frigate     -> exists, icon shows
  home-assistant/brands/custom_integrations/noaa_it_all -> 404, placeholder

So the store-list icon depends on exactly one thing: whether the domain is in
the home-assistant/brands repo. Ours is not. Being in the HACS default store
is separate and does not grant a CDN icon -- dawg-io/noaa_it_all is already
listed in hacs/default and still shows the placeholder.

That makes submitting custom_integrations/noaa_it_all/ to home-assistant/brands
the actual fix, and worth one attempt. The repo has a workflow that auto-closes
PRs adding new custom-integration folders, but its history shows new entries
still landing through spring 2026, so the outcome is not certain until tried.
Waiting on hacs/frontend#937 is the fallback, not the only option.

The README /blob/ URL fix, its regression test, and the hacs.json tidy are
unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TA3si1SuRW4W8MD7N9x7a
Removes docs/BRANDING.md and reverts .github/copilot-instructions.md, per the
decision to keep only the README fix. The copilot-instructions changes included
three accurate corrections to a stale "manual trigger only" claim about
hacs-validate.yml, but those are out of scope here and are reverted rather than
carried along; they remain worth a separate change.

test_root_icon_exists lost its pointer to the deleted doc and now states the
reason inline: the root icon.png is the README header source and is not read by
HACS or Home Assistant for store or UI display.

What remains in this branch:

- README.md: the header image used a github.com/.../blob/... URL, which serves
  an HTML page rather than an image, so it rendered broken on GitHub and on the
  HACS repository page (hacs.json sets render_readme). Now points at
  raw.githubusercontent.com.
- tests/test_manifest.py: TestReadmeImages strips fenced code blocks, then fails
  on any github.com /blob/ image URL. Verified by reintroducing the old URL --
  the test fails, and passes again once restored.
- hacs.json: stray tab replaced with spaces.

custom_components/noaa_it_all/brand/ is byte-for-byte identical to main.

For the record, on the HACS store-list icon this branch does not address: it is
served from brands.home-assistant.io, backed by home-assistant/brands, where
noaa_it_all is absent and can no longer be added -- close-new-custom-integrations.yml
(merged 2026-03-03) auto-closes any PR adding a new custom_integrations folder,
confirmed on brands PRs #10952 and #10930 from this month. Integrations that do
show icons were added before that cutoff; open_pico, for instance, landed
2025-10-18. It resolves only when HACS ships hacs/frontend#937.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TA3si1SuRW4W8MD7N9x7a
The file referenced custom_components/noaa_integration/ throughout, which is
not this integration's domain and does not exist. The domain is noaa_it_all,
per manifest.json. Every command in the file that named a path was therefore
broken -- py_compile, flake8, and the manifest JSON validation snippet all
pointed at a directory that isn't there.

Fixed in all 7 places. Verified afterwards that every path the doc names now
resolves, and that the three commands it tells you to run actually execute and
pass against the real tree.

Also corrected the "Key Files and Locations" tree in the same block. Beyond the
wrong path it listed 4 files; the component has 10 modules plus strings.json and
three subdirectories (sensors/, translations/, brand/). A tree that omits the
coordinator, config flow, parsers and the entire sensors/ package is not much
use to anyone reading this file to find their way around.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TA3si1SuRW4W8MD7N9x7a
@turbo5000c
turbo5000c marked this pull request as ready for review August 12, 2026 07:10
@turbo5000c
turbo5000c merged commit ecc5f2b into main Aug 12, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants