From f5ece6284432ebb0adf316ea3fda5863e71a4e7e Mon Sep 17 00:00:00 2001 From: SandObserver <260779319+SandObserver@users.noreply.github.com> Date: Fri, 16 Oct 2026 21:47:56 -0400 Subject: [PATCH] Fix blank Unraid icon on the Docker tab and Dashboard Point the template icon at templates/icon.png, a copy of the 512 px favicon. Unraid saves the template icon as -icon.png, and an SVG under that name does not draw. --- templates/icon.png | Bin 0 -> 15106 bytes templates/stackyard.xml | 2 +- test/repo/ca-template.test.js | 14 +++++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 templates/icon.png diff --git a/templates/icon.png b/templates/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..047b6e5f634285426e4195fbc790d106015994b6 GIT binary patch literal 15106 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 K@w0+?@c#m2fi-vl literal 0 HcmV?d00001 diff --git a/templates/stackyard.xml b/templates/stackyard.xml index 5f4b65f6..891f1e35 100644 --- a/templates/stackyard.xml +++ b/templates/stackyard.xml @@ -14,7 +14,7 @@ Tools:Utilities http://[IP]:[PORT:80] https://raw.githubusercontent.com/SandObserver/Stackyard/main/templates/stackyard.xml - https://raw.githubusercontent.com/SandObserver/Stackyard/main/templates/icon.svg + https://raw.githubusercontent.com/SandObserver/Stackyard/main/templates/icon.png https://raw.githubusercontent.com/SandObserver/Stackyard/main/docs/screenshot.png https://raw.githubusercontent.com/SandObserver/Stackyard/main/docs/screenshot-general.png https://raw.githubusercontent.com/SandObserver/Stackyard/main/docs/screenshot-appearance.png diff --git a/test/repo/ca-template.test.js b/test/repo/ca-template.test.js index a27a13f8..26a637ba 100644 --- a/test/repo/ca-template.test.js +++ b/test/repo/ca-template.test.js @@ -57,7 +57,7 @@ test('config and icon storage are both mapped, or an update wipes them', () => { test('every referenced asset exists in the repo', () => { const assets = { - [tag(template, 'Icon')]: 'templates/icon.svg', + [tag(template, 'Icon')]: 'templates/icon.png', [tag(template, 'Screenshot')]: 'docs/screenshot.png', }; for (const [url, file] of Object.entries(assets)) { @@ -66,6 +66,18 @@ test('every referenced asset exists in the repo', () => { } }); +/* Unraid saves the template icon as -icon.png whatever its format. An SVG + saved under that name draws blank on the Docker tab and the Dashboard. */ +test('the template icon is a PNG and matches the 512 px favicon', () => { + const icon = fs.readFileSync(path.join(ROOT, 'templates', 'icon.png')); + const signature = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); + assert.deepEqual(icon.subarray(0, 8), signature, 'templates/icon.png is not a PNG'); + assert.ok( + icon.equals(fs.readFileSync(path.join(ROOT, 'ui', 'icons', 'favicon-512.png'))), + 'templates/icon.png differs from ui/icons/favicon-512.png', + ); +}); + test('the legacy light and dark icons ship alongside the tile icon', () => { for (const f of ['templates/icon.svg', 'templates/icon-light.svg', 'templates/icon-dark.svg']) { assert.ok(fs.existsSync(path.join(ROOT, f)), `${f} is missing`);