From 3f396ee722e45593f10fa8114b5a4776a1716a02 Mon Sep 17 00:00:00 2001 From: lozenge0 <7510861+lozenge0@users.noreply.github.com> Date: Sun, 13 Sep 2026 09:53:53 +0100 Subject: [PATCH] Use PNG artwork for Unraid Docker icon compatibility --- CHANGELOG.md | 2 ++ assets/README.md | 16 ++++++++++++++-- assets/icon.png | Bin 0 -> 9826 bytes ca_profile.xml | 2 +- docs/RELEASE-REVIEW.md | 1 + templates/audio-cpp.xml | 2 +- tests/test_publication.py | 5 +++-- tests/test_template.py | 28 +++++++++++++++++++++++++++- 8 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 assets/icon.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a6d28d..fb2857b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased — targeting v0.1.0 +- Added a PNG export of the existing community artwork and switched template/profile + icon URLs to PNG for Docker Manager compatibility. Original SVG preserved. - Changed the default host WebUI/API port to `6969` for CPU, CUDA 12 and CUDA 13 installations. Internal port `8080` and WebUI port resolution remain unchanged; existing installations retain their configured host port. diff --git a/assets/README.md b/assets/README.md index b6a296f..22a9a1e 100644 --- a/assets/README.md +++ b/assets/README.md @@ -4,6 +4,18 @@ the white waveform on a blue/violet tile. Only a final newline was added; artwork and original SVG metadata are preserved. It requires no external font. +`icon.png` is a 256 × 256 raster export of that same artwork for the Community +Apps profile and Docker template. Docker Manager uses PNG-oriented icon caching +and rendering; the SVG remains the unchanged source asset. From the repository +root, export with: + +```sh +rsvg-convert --width 256 --height 256 --output assets/icon.png assets/icon.svg +``` + +The raster export does not carry the SVG's embedded provenance metadata; that +metadata remains in the original SVG. No artwork was regenerated or redesigned. + On 2026-09-06, the project owner (`lozenge0`) confirmed that the artwork was generated from scratch using their own prompts with Claude/AI, without supplied third-party images or assets. This records the owner's provenance statement; @@ -13,7 +25,7 @@ it is not an independent originality, copyright or trademark clearance. On 2026-09-12, the project owner (`lozenge0`) approved applying [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/) to -`icon.svg`, to the extent they hold copyright and related rights in it. +`icon.svg` and its `icon.png` export, to the extent they hold copyright and related rights in them. The [CC0 legal code](https://creativecommons.org/publicdomain/zero/1.0/legalcode.en) governs this dedication, including its waiver, fallback licence and disclaimers. SPDX identifier: `CC0-1.0`. @@ -21,7 +33,7 @@ SPDX identifier: `CC0-1.0`. This does not assert that AI-generated artwork necessarily has copyright protection, clear third-party rights, or grant trademark rights. This is community integration artwork, not official audio.cpp branding or endorsement. The root MIT -licence covers integration code/docs; `icon.svg` is separately covered by CC0. +licence covers integration code/docs; both icon formats are separately covered by CC0. ## Maintainer presentation checks diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..33d35c7e3f9e399bdefd92c1de268d204b10b94f GIT binary patch literal 9826 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 n<@>pmG audio.cpp for Unraid: community-maintained templates using unmodified upstream Docker images. This project maintains the Unraid integration, not audio.cpp itself, and is not an official upstream endorsement. Installation support belongs in this repository's issues. Beta integration: see the README for tested hardware and remaining deployment checks. - https://raw.githubusercontent.com/lozenge0/audio-cpp-unraid/main/assets/icon.svg + https://raw.githubusercontent.com/lozenge0/audio-cpp-unraid/main/assets/icon.png https://github.com/lozenge0/audio-cpp-unraid diff --git a/docs/RELEASE-REVIEW.md b/docs/RELEASE-REVIEW.md index cd5f7d1..bbf40fe 100644 --- a/docs/RELEASE-REVIEW.md +++ b/docs/RELEASE-REVIEW.md @@ -104,6 +104,7 @@ LICENSE README.md SECURITY.md assets/README.md +assets/icon.png assets/icon.svg ca_profile.xml docs/CONFIGURATION.md diff --git a/templates/audio-cpp.xml b/templates/audio-cpp.xml index da44279..5bfcbbe 100644 --- a/templates/audio-cpp.xml +++ b/templates/audio-cpp.xml @@ -9,7 +9,7 @@ true AI Tools: http://[IP]:[PORT:8080]/ - https://raw.githubusercontent.com/lozenge0/audio-cpp-unraid/main/assets/icon.svg + https://raw.githubusercontent.com/lozenge0/audio-cpp-unraid/main/assets/icon.png https://github.com/0xShug0/audio.cpp https://github.com/lozenge0/audio-cpp-unraid/issues https://raw.githubusercontent.com/lozenge0/audio-cpp-unraid/main/templates/audio-cpp.xml diff --git a/tests/test_publication.py b/tests/test_publication.py index b7a514a..3a9812b 100644 --- a/tests/test_publication.py +++ b/tests/test_publication.py @@ -8,7 +8,7 @@ '.github/dependabot.yml', '.github/workflows/validate.yml', '.gitignore', 'CHANGELOG.md', 'LICENSE', 'README.md', 'CONTRIBUTING.md', 'SECURITY.md', - 'assets/README.md', 'assets/icon.svg', 'ca_profile.xml', + 'assets/README.md', 'assets/icon.svg', 'assets/icon.png', 'ca_profile.xml', 'docs/CONFIGURATION.md', 'docs/MAINTAINER.md', 'docs/CPU-RETEST-20260912.md', 'docs/FIRST-RUN-FINDINGS.md', 'docs/PLAN.md', 'docs/PUBLISHING.md', 'docs/RECREATION-TEST.md', 'docs/RELEASE-REVIEW.md', @@ -98,7 +98,8 @@ def test_no_selected_private_data_patterns_in_public_content(self): r'\bgithub_pat_[A-Za-z0-9_]{30,}\b', ) for name in sorted(EXPECTED): - if name.startswith('tests/'): + if name.startswith('tests/') or name == 'assets/icon.png': + # PNG structure/chunk allowlist is checked by test_template. continue text = (ROOT / name).read_text() for pattern in patterns: diff --git a/tests/test_template.py b/tests/test_template.py index f5d981a..3e069c4 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -129,6 +129,32 @@ def test_profile(self): self.assertTrue(profile.findtext("Profile")) self.assertEqual(profile.findtext("Icon"), self.root.findtext("Icon")) + def test_deployment_icon_is_256_pixel_png(self): + import struct + import zlib + data = (ROOT / "assets/icon.png").read_bytes() + self.assertEqual(data[:8], b"\x89PNG\r\n\x1a\n") + offset = 8 + chunks = [] + while offset < len(data): + size = struct.unpack(">I", data[offset:offset + 4])[0] + kind = data[offset + 4:offset + 8] + payload = data[offset + 8:offset + 8 + size] + crc = struct.unpack(">I", data[offset + 8 + size:offset + 12 + size])[0] + self.assertEqual(crc, zlib.crc32(kind + payload)) + self.assertIn(kind, (b"IHDR", b"bKGD", b"IDAT", b"IEND")) + chunks.append(kind) + if kind == b"IHDR": + self.assertEqual(struct.unpack(">II", payload[:8]), (256, 256)) + offset += 12 + size + self.assertEqual(offset, len(data)) + self.assertEqual(chunks[0], b"IHDR") + self.assertIn(b"IDAT", chunks) + self.assertEqual(chunks[-1], b"IEND") + for tag, root in variants(self.root): + with self.subTest(variant=tag): + self.assertTrue(root.findtext("Icon").endswith("/assets/icon.png")) + def test_icon_is_self_contained_svg(self): icon = ET.parse(ROOT / "assets/icon.svg").getroot() self.assertEqual(icon.tag, "{http://www.w3.org/2000/svg}svg") @@ -171,7 +197,7 @@ def test_selected_publication_destinations(self): self.assertEqual(self.root.findtext("Support"), base + "/issues") self.assertEqual(self.root.findtext("TemplateURL"), raw + "templates/audio-cpp.xml") self.assertEqual(self.root.findtext("ReadMe"), raw + "README.md") - self.assertEqual(self.root.findtext("Icon"), raw + "assets/icon.svg") + self.assertEqual(self.root.findtext("Icon"), raw + "assets/icon.png") profile = ET.parse(ROOT / "ca_profile.xml").getroot() self.assertEqual(profile.findtext("WebPage"), base) for path in (ROOT / "templates/audio-cpp.xml", ROOT / "ca_profile.xml"):