Fix README logo, add real wordmark, document HACS icon situation - #28
Merged
Conversation
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
marked this pull request as ready for review
August 12, 2026 07:10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 pinnedhomeassistant-frontendsubmodule, which still resolves to the legacybrands.home-assistant.io/_/noaa_it_all/icon.pngCDN. That CDN is backed byhome-assistant/brands, wherenoaa_it_alldoes not exist and cannot be added — the repo runsclose-new-custom-integrations.yml, which auto-closes any PR adding a newcustom_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 is20250128065759— January 2025.Changes
github.com/.../blob/...URL, which serves an HTML page rather than an image, so it rendered broken everywhere. Switched toraw.githubusercontent.com. This is user-visible inside HACS too, sincehacs.jsonsetsrender_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@2xfiles 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:#0d2e70body,#c0e4f5ring.brand/dark_icon.pngdeleted — byte-identical toicon.png, and HA's fallback chain already resolvesdark_icon.pngtoicon.png.TestReadmeImagesto catch the/blob/URL bug class that started this. Corrected the false docstring ontest_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 thebrand/mechanism works, the fallback chain, why the HACS list icon is blocked, upstream tracking links, and an explicit DO NOT TRY list. Linked fromcopilot-instructions.md, which also had its stale "manual trigger only" claim abouthacs-validate.ymlcorrected in 3 places.No change to
hacs-validate.yml: the HACSbrandscheck accepts local brand assets atcustom_components/<domain>/brand/icon.pngand only falls back to the CDN domain list when those are absent, so it passes as-is. Noignoreneeded.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
Checklist
Verification performed
pytest tests/— 521 passedflake8 custom_components/noaa_it_all/ tests/ --max-line-length=120— clean/blob/URL failsTestReadmeImages, restoring it passeshttps://raw.githubusercontent.com/dawg-io/noaa_it_all/main/icon.pngreturns200 image/pngGenerated by Claude Code