Clients want to show which OS/distro a host runs. The host now detects it once per process (new osinfo module: compile-time on Windows/macOS, os-release on Linux) and advertises an icon-friendly specificity chain, generic → specific — `windows`, `macos`, `linux[/<family>][/<id>]`, e.g. `linux/fedora/bazzite`, `linux/arch/steamos`. A client walks the chain most-specific-first and shows the first token it has art for, so an unknown distro degrades to its family's mark and finally to plain Tux — the host emits the full chain precisely so clients need zero distro→parent knowledge. The middle token is the first recognized ID_LIKE ancestor (the spec orders them most-similar-first); the leaf is ID verbatim, sanitized to TXT-safe `[a-z0-9._-]` because it feeds a DNS record. Two carriers, both additive: a new advisory mDNS `os=` TXT key (same trust posture as `mac` — unauthenticated, a wrong value only draws a wrong icon), and `HostInfo.os` + `HostInfo.os_name` on the mgmt API (`os_name` is the os-release PRETTY_NAME, REST-only so the TXT stays small). GameStream serverinfo and the QUIC Welcome are untouched. api/openapi.json regenerated (drift test green on Linux) and the TS SDK gen refreshed from it — which also catches the committed gen up with earlier spec changes it had missed (monitors, native_paired_clients, encoder_backend). assets/os-icons/ gains the ten master SVG marks every client derives its per-platform art from (Font Awesome Free brands CC BY 4.0 + Simple Icons CC0 — provenance in its README), with attribution folded into THIRD-PARTY-NOTICES.txt via the generator (regenerating also catches the stale crate manifest up with the current lockfile). Co-Authored-By: Claude Fable 5 <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 | Font Awesome Free brands (CC BY 4.0) |
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) |
Distros with no file here (Bazzite, CachyOS, Nobara, Pop!_OS, Mint, …) are intentional:
the host advertises the full chain (linux/fedora/bazzite), and clients walk it
most-specific-first, so they degrade to the family mark and finally to Tux.
All files are monochrome (fill="currentColor"), original per-icon viewBoxes preserved.
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.