Files
punktfunk/data/platforms.json
enricobuehlerandClaude Fable 5 cd6ce34892
ci / bun-nix (pull_request) Successful in 35s
ci / docs-drift (pull_request) Successful in 20s
ci / docs-site (pull_request) Successful in 1m21s
installer-smoke / smoke (arch, archlinux:base, pacman -Sy --noconfirm --needed curl git nodejs && (pacman-key --init >/dev/null 2>&1 || true)) (pull_request) Failing after 23s
installer-smoke / smoke (fedora-44, fedora:44, dnf install -y -q curl git nodejs) (pull_request) Failing after 0s
ci / web (pull_request) Successful in 1m27s
ci / rust-arm64 (pull_request) Successful in 1m31s
installer-smoke / smoke (debian-13, debian:trixie, apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl git nodejs) (pull_request) Failing after 21s
apple / swift (pull_request) Successful in 2m19s
apple / distribute (pull_request) Skipped
apple / screenshots (pull_request) Skipped
android / android (pull_request) Canceled after 2m37s
ci / rust (pull_request) Canceled after 2m38s
install.sh: a guided Linux installer (preview) that runs exactly the commands platforms.json states, with a CI smoke test per package family
WP4 of the docs-and-onboarding overhaul (punktfunk-planning design/docs-and-onboarding-overhaul.md).

scripts/install.sh — plain POSIX sh (dash-clean), ~380 lines, `curl -fsSL https://punktfunk.unom.io/install.sh | sh`:
detect the distro from os-release (apt / dnf / pacman / rpm-ostree→sysext; NixOS, SteamOS, Windows
and unknown distros get a one-line pointer and stop; Debian 12 / Ubuntu 24.04 / Mint 22 / Fedora
45 hit the documented floors with the right docs link) → install with the platforms.json lines
VERBATIM (channel and the Fedora group are edited into the string at run time; `--yes` rewrites
them non-interactive, a tty hands the package manager its own prompt; stdin is never read, because
under `curl | sh` stdin is the script) → `punktfunk-host detect-conflicts` (exit 1 = active
Sunshine-family host) → offer to keep both by moving the management API port (PUNKTFUNK_MGMT_BIND,
default 47991, the firewall step opens it) → input group (ujust on Bazzite; no-op if already in) →
optional punktfunk group, GameStream compat, shared clipboard (all default no) → firewalld/ufw
profiles → enable host + console (+ the plugin runner where it isn't) → optional linger → verify
(unit active, UDP 9777 bound) and print the console URL, the password command and the pairing
steps. `--dry-run` prints every command and changes nothing; every prompt has a PUNKTFUNK_INSTALL_*
environment twin; re-running is safe (install skipped when the binary exists). Running under sudo
is refused (host.env and the units belong to the user); root without sudo gets a shim so the
verbatim lines still work.

Decisions: the canonical URL is punktfunk.unom.io/install.sh, a 302 on the website to the script at
raw/branch/main (versioned with the code it installs; precedent: the Bazzite sysext bootstrap) —
the website half is punktfunk-website PR #4. GPU drivers stay the docs pages' job; the one silent
failure (Fedora + NVIDIA without RPM Fusion's ffmpeg-libs → no NVENC) is called out at the end.

Gates: check-docs-drift.sh gate 6 — every apt/pacman/dnf/sysext install line in data/platforms.json
must appear verbatim in the script, and the script must parse (shown to fail on a planted drift).
New path-filtered workflow installer-smoke.yml runs the script unattended in debian:trixie,
fedora:44 and archlinux:base against the real registry, then `punktfunk-host --version`,
`detect-conflicts`, and a re-run that must say "already installed".

Docs: install hub gains "Guided install (preview)" rendered from platforms.json's new `installer`
block via an <Installer/> component (one-liner + inspect-first form + flags); CONTRIBUTING names
the new gate. Verified locally: sh/dash -n, both docs gates, docs-site build + lint, and a
--dry-run matrix over 16 faked os-release files (all four families, every floor, canary, every
option, piped stdin). The container run itself is the CI job's to report — Docker on this machine
was wedged under another session's emulated build.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 20:54:13 +02:00

221 lines
8.5 KiB
JSON

{
"$comment": "Single source for the install/port facts that used to drift across four surfaces (docs-and-onboarding-overhaul WP1). Consumers: docs-site install pages (<Install platform=…/> and <Ports/> in docs-site/src/components/platforms.tsx, reading the byte-identical snapshot docs-site/src/data/platforms.json that check-docs-drift.sh gates), the website download page (WP3), the guided install script (WP4). A port number, repo URL or install command lives HERE and nowhere else — pages quote it, they don't restate it. `install` is the shell snippet that puts the package on the box (lines, in order); `url` is a download/store link where there is no command. Validated by scripts/ci/check-docs-drift.sh (parse + snapshot sync; ponytail: cross-check against code literals when a consumer exists).",
"ports": {
"mgmt": {
"port": 47990,
"proto": "tcp",
"what": "management REST API (HTTPS + token; read-only status/library off loopback)",
"env": "PUNKTFUNK_MGMT_BIND",
"conflict": "Sunshine / Apollo / Vibeshine serve their web UI on 47990 too — the one port still shared with them once GameStream compat is off. Move it via PUNKTFUNK_MGMT_BIND; clients relearn it from discovery."
},
"web": {
"port": 47992,
"proto": "tcp",
"what": "web console (HTTPS, login-gated); plugin interfaces on 47993",
"also": [47993]
},
"native": {
"port": 9777,
"proto": "udp",
"what": "punktfunk/1 QUIC control port",
"env": "PUNKTFUNK_NATIVE_PORT"
},
"data": {
"port": null,
"proto": "udp",
"what": "per-session video data plane — ephemeral port the client hole-punches; nothing fixed to open",
"env": "PUNKTFUNK_DATA_PORT"
},
"mdns": {
"port": 5353,
"proto": "udp",
"what": "mDNS discovery"
},
"gamestream": {
"tcp": [47984, 47989, 48010],
"udp": [47998, 47999, 48000],
"what": "GameStream/Moonlight-compat planes (opt-in, PUNKTFUNK_GAMESTREAM=1)",
"conflict": "Sunshine / Apollo / Vibeshine bind these same fixed ports and advertise the same mDNS name — run only one GameStream host at a time, or keep punktfunk native-only."
}
},
"firewall": {
"$comment": "Service/profile names the Linux packages install for firewalld and ufw — the packages never open a port themselves.",
"native": "punktfunk-native",
"gamestream": "punktfunk-gamestream",
"web": "punktfunk-web"
},
"installer": {
"$comment": "The guided Linux installer (WP4, preview). Canonical URL is the website's /install.sh, a redirect to the raw script on main so it's versioned with the code it installs; the docs hub and the download page quote these lines.",
"status": "preview",
"url": "https://punktfunk.unom.io/install.sh",
"source": "https://git.unom.io/unom/punktfunk/raw/branch/main/scripts/install.sh",
"oneLiner": "curl -fsSL https://punktfunk.unom.io/install.sh | sh",
"inspectFirst": [
"curl -fsSLO https://punktfunk.unom.io/install.sh",
"less install.sh",
"sh install.sh"
],
"docs": "/docs/install#guided-install-preview"
},
"conflicts": {
"hosts": ["Sunshine", "Apollo", "Vibeshine"],
"detect": "punktfunk-host detect-conflicts",
"detectExit": "1 only when a conflicting host runs or will start on its own; dormant leftovers print but exit 0",
"docs": "/docs/switching-from-sunshine"
},
"platforms": [
{
"id": "debian",
"name": "Debian 13+ / Ubuntu 26.04+",
"installs": "host",
"packageManager": "apt",
"docs": "/docs/debian",
"repo": "https://git.unom.io/api/packages/unom/debian",
"install": [
"sudo install -d -m 0755 /etc/apt/keyrings",
"curl -fsSL https://git.unom.io/api/packages/unom/debian/repository.key | sudo tee /etc/apt/keyrings/punktfunk.asc >/dev/null",
"echo \"deb [signed-by=/etc/apt/keyrings/punktfunk.asc] https://git.unom.io/api/packages/unom/debian stable main\" | sudo tee /etc/apt/sources.list.d/punktfunk.list",
"sudo apt update",
"sudo apt install punktfunk-host"
]
},
{
"id": "arch",
"name": "Arch Linux / CachyOS",
"installs": "host",
"packageManager": "pacman",
"docs": "/docs/arch",
"repo": "https://git.unom.io/api/packages/unom/arch",
"install": [
"curl -fsS https://git.unom.io/api/packages/unom/arch/repository.key | sudo pacman-key --add -",
"sudo pacman-key --lsign-key E0CA04465C99C936E0B0C6510A317015A34DDD69",
"grep -q '^\\[punktfunk\\]' /etc/pacman.conf || printf '\\n[punktfunk]\\nServer = https://git.unom.io/api/packages/unom/arch/$repo/$arch\\n' | sudo tee -a /etc/pacman.conf >/dev/null",
"sudo pacman -Syu punktfunk-host"
]
},
{
"id": "fedora",
"name": "Fedora 43+",
"installs": "host",
"packageManager": "dnf",
"docs": "/docs/fedora",
"repo": "https://git.unom.io/api/packages/unom/rpm/fedora-44",
"install": [
"sudo tee /etc/yum.repos.d/punktfunk.repo >/dev/null <<'REPO'",
"[punktfunk]",
"name=punktfunk",
"# fedora-44 on Fedora 44; bazzite on Fedora 43 (a plain Fedora 43 build of the same package)",
"baseurl=https://git.unom.io/api/packages/unom/rpm/fedora-44",
"enabled=1",
"gpgcheck=1",
"repo_gpgcheck=1",
"gpgkey=https://git.unom.io/api/packages/unom/rpm/repository.key",
" https://git.unom.io/api/packages/unom/generic/punktfunk-keys/1/RPM-GPG-KEY-punktfunk",
"REPO",
"sudo dnf install punktfunk"
]
},
{
"id": "bazzite",
"name": "Bazzite / Fedora Atomic",
"installs": "host",
"packageManager": "sysext",
"docs": "/docs/bazzite",
"install": [
"curl -fsSLO https://git.unom.io/unom/punktfunk/raw/branch/main/packaging/bazzite/punktfunk-sysext.sh",
"sudo bash punktfunk-sysext.sh install"
]
},
{
"id": "nixos",
"name": "NixOS",
"installs": "host",
"packageManager": "nix",
"docs": "/docs/nixos",
"install": [
"# flake input: inputs.punktfunk.url = \"git+https://git.unom.io/unom/punktfunk\";",
"# then: imports = [ punktfunk.nixosModules.default ]; services.punktfunk.host.enable = true;"
]
},
{
"id": "steamos",
"name": "SteamOS (Steam Deck as host)",
"installs": "host",
"packageManager": "script",
"docs": "/docs/steamos-host",
"install": [
"git clone https://git.unom.io/unom/punktfunk ~/punktfunk",
"bash ~/punktfunk/scripts/steamdeck/install.sh"
]
},
{
"id": "windows",
"name": "Windows 11 (22H2+)",
"installs": "host",
"packageManager": "winget",
"docs": "/docs/windows-host",
"install": [
"winget source add -n punktfunk https://winget.punktfunk.unom.io -t Microsoft.Rest",
"winget install unom.PunktfunkHost"
]
},
{
"id": "linux-client",
"name": "Linux client (any distro)",
"installs": "client",
"packageManager": "flatpak",
"docs": "/docs/install-client#linux-desktop-flatpak",
"install": [
"flatpak install --user https://flatpak.unom.io/io.unom.Punktfunk.flatpakref"
]
},
{
"id": "steam-deck-client",
"name": "Steam Deck (Gaming Mode)",
"installs": "client",
"packageManager": "decky",
"docs": "/docs/steam-deck"
},
{
"id": "windows-client",
"name": "Windows client",
"installs": "client",
"packageManager": "msix",
"docs": "/docs/install-client#windows",
"install": [
"curl.exe -LO https://git.unom.io/api/packages/unom/generic/punktfunk-client-windows/latest/punktfunk-client-windows_x64.msix",
"Add-AppxPackage .\\punktfunk-client-windows_x64.msix"
]
},
{
"id": "macos-client",
"name": "macOS",
"installs": "client",
"packageManager": "dmg",
"docs": "/docs/install-client#macos",
"url": "https://git.unom.io/unom/punktfunk/releases"
},
{
"id": "apple-client",
"name": "iPhone, iPad, Apple TV",
"installs": "client",
"packageManager": "testflight",
"docs": "/docs/install-client#ios-ipados-apple-tv",
"url": "https://testflight.apple.com/join/Qr7uSemk"
},
{
"id": "android-client",
"name": "Android / Android TV",
"installs": "client",
"packageManager": "play",
"docs": "/docs/install-client#android",
"url": "https://play.google.com/store/apps/details?id=io.unom.punktfunk"
}
]
}