Three things were wrong with the host-card OS icons. The Windows mark was Font Awesome 5's, which is still the Windows 8/10 flag with the perspective skew — dated next to the flat four-pane mark Microsoft has shipped since Windows 11. No icon set has the current one (Simple Icons carries no windows/microsoft slug at all), so it is drawn here: four equal squares at the authentic 11.377 + 1.246 proportion. The Decky plugin was pulling FaWindows straight from react-icons, so it now inlines the masters like the web console does, or it would have kept the old flag regardless. Bazzite, CachyOS and Nobara collapsed onto their family's mark. The host already advertises the full chain, so this is purely missing art: all three now ship a leaf mark, because "a Bazzite box" and "a Fedora box" are different machines to the person reading the card. CachyOS and Nobara come from Simple Icons; Bazzite has no icon anywhere, so its "b" is lifted out of the project's own badge (Apache-2.0, attributed). On Android every non-square mark was stretched. A VectorPainter maps the viewport onto the ImageVector's default size with independent x and y scales, so declaring a 448x512 Tux as 24x24 dp squashed it — silently, no crash, no warning. The longest viewport edge now sets the 24 dp box and the other follows the ratio, which is what Icon()'s ContentScale.Fit expects. A unit test pins the invariant; every other client was already correct. Also: scripts/gen-os-icons.sh replaces the undocumented hand-run pipeline that turns a master into the GTK symbolic SVG, the Windows PNG and the Apple template PDF. It reproduces the committed artifacts byte-identically. Verified: web and Decky typecheck, Decky bundles, Android compiles and its tests pass, PunktfunkKit builds, osinfo's tests pass. Not verified on glass, and the GTK/Windows client crates do not build on macOS. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
OS icon masters
The canonical OS/distro brand marks every client derives its host-card OS icon from
(web console inline SVGs, GTK symbolic icons, Windows PNGs, Apple template imagesets,
Android ImageVectors). One file per icon token of the host's OS-identity chain
(see crates/punktfunk-host/src/osinfo.rs and crates/pf-client-core/src/os.rs):
| token | mark | source |
|---|---|---|
windows |
Windows (the current four-pane mark, no perspective skew) | own geometry |
apple |
Apple (also macos via alias) |
Font Awesome Free brands (CC BY 4.0) |
linux |
Tux | Font Awesome Free brands (CC BY 4.0) |
steam |
Steam (also steamos via alias) |
Font Awesome Free brands (CC BY 4.0) |
ubuntu |
Ubuntu | Font Awesome Free brands (CC BY 4.0) |
fedora |
Fedora | Font Awesome Free brands (CC BY 4.0) |
opensuse |
SUSE | Font Awesome Free brands (CC BY 4.0) |
arch |
Arch Linux | Simple Icons (CC0 1.0) |
nixos |
NixOS | Simple Icons (CC0 1.0) |
debian |
Debian | Simple Icons (CC0 1.0) |
bazzite |
Bazzite | ublue-os/bazzite (Apache-2.0) |
cachyos |
CachyOS | Simple Icons (CC0 1.0) |
nobara |
Nobara | Simple Icons (CC0 1.0, slug nobaralinux) |
The last three are distro leaves, not families: a chain walks most-specific-first, so
linux/fedora/bazzite would otherwise draw the Fedora mark. They earn their own art because
"a Bazzite box" and "a Fedora box" are different machines to the person reading the card, and
they are what this project's hosts actually run. Every other distro with no file here (Pop!_OS,
Mint, …) still degrades to its family's mark and finally to Tux — that fallback is the design,
not a gap.
Windows is the one mark drawn here rather than sourced: every icon set that ships a "Windows" brand glyph still carries the Windows 8/10 flag with the perspective skew, which reads as dated next to the flat four-pane mark Microsoft has used since Windows 11. Four equal squares (11.377 + 1.246 gap) is the current proportion.
All files are monochrome (fill="currentColor"), original per-icon viewBoxes preserved. Because
those viewBoxes are not all square, a client must letterbox rather than stretch — see the aspect
note in clients/android/.../components/OsIcons.kt.
Regenerating the per-client derivatives
bash scripts/gen-os-icons.sh [token ...] turns a master into the three baked forms (GTK
symbolic SVG, Windows PNG, Apple template PDF) and prints the path data for the three clients
that inline it (web console, Decky plugin, Android). Adding a new token also means adding it
to each client's shipped-token list — the script prints that checklist too.
Licensing
Attribution notices live in LICENSES/ and are folded into THIRD-PARTY-NOTICES.txt by
scripts/gen-third-party-notices.py. The marks are trademarks of their respective owners; they
are used here nominatively — to identify the operating system a host runs, the standard
practice in this ecosystem — and imply no affiliation or endorsement.