forked from unom/punktfunk
WP0 + S2 run against a real Omarchy 4.0.1 box (Hyprland 0.56.2, Quickshell 0.3.1, RTX 5070 Ti). Everything below is a measurement, not a re-reading of the docs. Fixed, each one a first-run defect ---------------------------------- 1. **The install line could not work.** Omarchy ships a libalpm PreTransaction hook (00-omarchy-update-guard) that aborts any transaction whose pacman invocation carries BOTH -S and -u, to funnel upgrades through `omarchy update`. So the Arch line this branch shipped for Omarchy — `pacman -Syu <pkgs>` — dies with "Woah partner..." and installs NOTHING. Seen in /var/log/pacman.log, then confirmed the other way: `pacman -Sy` + `pacman -S <pkgs>` installs all three cleanly. platforms.json, the docs page and install.sh now split the two, and plain Arch keeps its full -Syu (a partial upgrade against a ROLLING repo is what breaks those boxes; Omarchy's frozen snapshot mirror is exactly why it does not break here). 2. **The idle guard never restored anything.** `omarchy-toggle-idle status` prints JSON, not a keyword — and the payload is a trap: its tooltip names the action the button WOULD take, so the string "Stay Awake" appears precisely when stay-awake is OFF. The old case-glob matched neither that nor the words it was looking for, so every arm fell through to "do nothing" and the box stayed awake after every session. Now reads `"enabled":true`. Verified both ways on the real tool: a user's own stay-awake survives a stream, one we set is undone. 3. **`status` lied twice.** It reported "no punktfunk rules" seconds after adding six of them (a failed `sudo -n` read was being treated as proof of absence), and reported xdph missing on a box that was capturing through it — `pgrep -x` can never match `xdg-desktop-portal-hyprland` because Linux truncates comm to 15 characters, and pgrep says so on a stderr the check threw away. Now: never claim absence from a failed read, and ask systemd about the portal. 4. **D3's premise is only half true.** Omarchy ships TWO session entries. On `hyprland-uwsm` graphical-session.target starts; on plain `hyprland` it never does — measured, and Omarchy's OWN units that want it (omarchy-crash-watch, omarchy-sleep-lock) sit enabled-and-dead there too. The drop-in is additive so autostart still works either way, but "restarts with your session" was a promise we could not keep. setup and status now detect and say which it is, and the docs explain when switching sessions is worth it (rarely: the host re-derives the live compositor per connect). 5. **`ctl watch` leaked a stream per dead consumer.** A watcher only ever READS, so when the widget died its end of our stdout pipe closed unnoticed: six orphans accumulated across three shell restarts on a host with no events at all. The SSE keep-alive now surfaces as a `ctl.heartbeat` line, which gives us a write to fail on, and a failed write ends the process. Verified with its control: dies ~13s after its reader goes, survives 50s while the reader lives. Confirmed as designed --------------------- * **D6 end to end.** The box's xdph.conf is exactly the shape the fix targets. A real capture (xdph → PipeWire 1920x1080 → cuda-import → nvenc) installed the shim, the shim picked up `hyprland-preview-share-picker` as its fallback automatically, the restore fired on teardown, and the file came back byte-identical with no marker left. The landmine is defused. * **The pin correction.** The mgmt port serves 306d95… = native-cert.pem; cert.pem is 34a4cb…, a different certificate entirely. Pinning cert.pem as the plan said would have exited 4 on every healthy host. All four exit codes exercised on glass — 4 by pointing ctl at the host's own legacy cert, which is a valid certificate that simply is not the one mgmt serves. * **R1 and R3 closed.** Our soname depends (libavcodec.so=63-64 …) match the frozen snapshot mirror's ffmpeg 9.0.1 exactly, and /etc/pacman.conf is owned by pacman, not omarchy-settings, so our repo stanza is not clobbered. R4 closed by (1); R7 closed — enforce_permissions is off as shipped. * The tree builds on Omarchy in 8m16s against the snapshot's toolchain (rustc 1.98). Gates: fmt, clippy -D warnings, 13 ctl tests, docs-drift, shellcheck, 8 shell self-checks.
238 lines
9.9 KiB
JSON
238 lines
9.9 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 punktfunk-web punktfunk-scripting"
|
|
]
|
|
},
|
|
{
|
|
"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 punktfunk-web punktfunk-scripting"
|
|
]
|
|
},
|
|
{
|
|
"$comment": "Omarchy IS Arch for delivery — same signed repo, same packages — but NOT the same install command. Omarchy ships a libalpm PreTransaction hook (00-omarchy-update-guard) that ABORTS any transaction whose pacman invocation carries both -S and -u, so Arch's `pacman -Syu <pkgs>` dies with 'Woah partner...' and installs nothing (measured on 4.0.1, 2026-08-28). `-Sy` refreshes without a sysupgrade and is not blocked, and `-S` then installs. Everything Omarchy-specific is the setup line after them.",
|
|
"id": "omarchy",
|
|
"name": "Omarchy",
|
|
"installs": "host",
|
|
"packageManager": "pacman",
|
|
"docs": "/docs/omarchy",
|
|
"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 -Sy",
|
|
"sudo pacman -S punktfunk-host punktfunk-web punktfunk-scripting",
|
|
"punktfunk-omarchy setup"
|
|
]
|
|
},
|
|
{
|
|
"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 punktfunk-web punktfunk-scripting"
|
|
]
|
|
},
|
|
{
|
|
"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": "installer",
|
|
"docs": "/docs/install-client#windows",
|
|
"install": [
|
|
"curl.exe -LO https://git.unom.io/api/packages/unom/generic/punktfunk-client-windows/latest/punktfunk-client-setup_x64.exe",
|
|
".\\punktfunk-client-setup_x64.exe"
|
|
]
|
|
},
|
|
{
|
|
"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"
|
|
}
|
|
]
|
|
}
|