Ship punktfunk-gamescope on apt, support Debian 13, and state the real host floor #190

Merged
enricobuehler merged 5 commits from worktree-debian-ubuntu-support into main 2026-08-13 10:21:55 +00:00
Owner

The bug this started from

punktfunk-gamescope had never been published to apt — not in any release. It was built inside the host job's Ubuntu 24.04 image, where it cannot build:

wlroots| Dependency wayland-server found: NO found 1.22.0 but need: '>=1.23.1'

Our pin vendors wlroots 0.19.3 (floor 1.23.1); noble ships 1.22.0, has no libxcb-errors-dev, and only libdisplay-info 0.1.1. Every rung of that path was a ::warning:: returning 0 and the one hard gate ran last by design, so v0.26.0 and v0.27.0 both released with the package missing while the release notes and docs-site told apt users to install it. The same tags shipped it fine for Arch, Fedora 44 and Bazzite — apt was the only platform affected.

What changed

gamescope builds on Debian 13 now (ci/gamescope-trixie.Dockerfile), in its own job, the oldest apt base the tree configures on. One package serves Debian 13 and Ubuntu 26.04 — verified by installing and running it on both — because the build also vendors libdisplay-info via a new opt-in --extra-fallback: linked against the distro copy it demands libdisplay-info2 on trixie, which Ubuntu 26.04 does not have (it carries libdisplay-info3). Opt-in, so the Arch/Fedora/nix outputs are byte-for-byte unchanged.

Debian 13 is a supported host target. This needed no packaging change: the host .deb's glibc-2.39 floor and bundled FFmpeg already made it installable, and it had been working for a long time while docs-site said Debian was unsupported and unverified.

smoke-install job installs every published package from the registry in pristine ubuntu:24.04, ubuntu:26.04 and debian:trixie, asserts every binary resolves its sonames and runs, and insists the version served is the one that run built. Nothing in deb.yml had ever installed a package it produced — which is how both facts above survived.

Cinnamon (Mint, LMDE) now gets an answer instead of a dead end. Muffin forked from Mutter 3.36: org.cinnamon.Muffin.ScreenCast has only RecordMonitor/RecordWindow, never RecordVirtual, and xdg-desktop-portal-xapp implements no ScreenCast — so no value of PUNKTFUNK_COMPOSITOR can make a Cinnamon desktop host a virtual display. Both the detection error and an explicit =cinnamon pin now name headless gamescope, which needs no desktop compositor.

The real host floor is documented: Ubuntu 26.04+ / Debian 13+. The floor is about the desktop, not the package — 24.04 installs punktfunk-host and then has KWin 5.27 (floor 6.5.6), GNOME Shell 46 (floor 48) and no gamescope, which reads as a bug rather than an unsupported base. Measured on a real linuxmintd/mint22-amd64 image: this is why Linux Mint 22.x cannot host while LMDE 7 can.

Verification

All measured in containers, not inferred:

Debian 13 Ubuntu 26.04 Ubuntu 24.04
punktfunk-gamescope builds/installs/runs (5 libs short)
punktfunk-host installs + runs (but nothing to drive)
  • gamescope binary: glibc floor GLIBC_2.38, no dynamic libstdc++, --version runs.
  • 210 pf-vdisplay tests pass; clippy --all-targets -- -D warnings clean; cargo fmt --all --check clean.
  • docs-site builds and typechecks.
  • The smoke script was confirmed non-vacuous — against today's registry it fails exactly as intended on Unable to locate package punktfunk-gamescope.

⚠ Bootstrap

punktfunk-gamescope-trixie:latest must exist in the LAN registry before build-publish-gamescope can start. docker.yml builds it on any push to main, but it runs concurrently with deb.yml, so the first run after merge may miss the image and go red; it self-heals on the next push, or seed it once by hand.

Not included

A Debian-13-built client package is proven feasible — it builds (7m07s), packages, installs and resolves on both Debian 13 and Ubuntu 26.04, with much looser floors (libc6 >= 2.39, libgtk-4-1 >= 4.12.0) than the current 26.04 build's libc6 >= 2.43. Left out deliberately: it moves the client off the 26.04 image, changing what existing Ubuntu users receive, and the GTK GUI itself was never launched (only ldd and the CLI binary).

## The bug this started from `punktfunk-gamescope` had **never been published to apt** — not in any release. It was built inside the host job's Ubuntu 24.04 image, where it cannot build: ``` wlroots| Dependency wayland-server found: NO found 1.22.0 but need: '>=1.23.1' ``` Our pin vendors wlroots 0.19.3 (floor 1.23.1); noble ships 1.22.0, has no `libxcb-errors-dev`, and only libdisplay-info 0.1.1. Every rung of that path was a `::warning::` returning 0 and the one hard gate ran last by design, so **v0.26.0 and v0.27.0 both released with the package missing** while the release notes and docs-site told apt users to install it. The same tags shipped it fine for Arch, Fedora 44 and Bazzite — apt was the only platform affected. ## What changed **gamescope builds on Debian 13 now** (`ci/gamescope-trixie.Dockerfile`), in its own job, the oldest apt base the tree configures on. One package serves Debian 13 **and** Ubuntu 26.04 — verified by installing and running it on both — because the build also vendors libdisplay-info via a new opt-in `--extra-fallback`: linked against the distro copy it demands `libdisplay-info2` on trixie, which Ubuntu 26.04 does not have (it carries `libdisplay-info3`). Opt-in, so the Arch/Fedora/nix outputs are byte-for-byte unchanged. **Debian 13 is a supported host target.** This needed no packaging change: the host `.deb`'s glibc-2.39 floor and bundled FFmpeg already made it installable, and it had been working for a long time while docs-site said Debian was unsupported and unverified. **`smoke-install` job** installs every published package from the registry in pristine `ubuntu:24.04`, `ubuntu:26.04` and `debian:trixie`, asserts every binary resolves its sonames and runs, and insists the version served is the one that run built. Nothing in `deb.yml` had ever installed a package it produced — which is how both facts above survived. **Cinnamon (Mint, LMDE)** now gets an answer instead of a dead end. Muffin forked from Mutter 3.36: `org.cinnamon.Muffin.ScreenCast` has only `RecordMonitor`/`RecordWindow`, never `RecordVirtual`, and `xdg-desktop-portal-xapp` implements no ScreenCast — so no value of `PUNKTFUNK_COMPOSITOR` can make a Cinnamon desktop host a virtual display. Both the detection error and an explicit `=cinnamon` pin now name headless gamescope, which needs no desktop compositor. **The real host floor is documented: Ubuntu 26.04+ / Debian 13+.** The floor is about the *desktop*, not the package — 24.04 installs `punktfunk-host` and then has KWin 5.27 (floor 6.5.6), GNOME Shell 46 (floor 48) and no gamescope, which reads as a bug rather than an unsupported base. Measured on a real `linuxmintd/mint22-amd64` image: this is why **Linux Mint 22.x cannot host** while LMDE 7 can. ## Verification All measured in containers, not inferred: | | Debian 13 | Ubuntu 26.04 | Ubuntu 24.04 | |---|---|---|---| | `punktfunk-gamescope` builds/installs/runs | ✅ | ✅ | ❌ (5 libs short) | | `punktfunk-host` installs + runs | ✅ | ✅ | ✅ (but nothing to drive) | - gamescope binary: glibc floor `GLIBC_2.38`, no dynamic `libstdc++`, `--version` runs. - 210 `pf-vdisplay` tests pass; `clippy --all-targets -- -D warnings` clean; `cargo fmt --all --check` clean. - docs-site builds and typechecks. - The smoke script was confirmed **non-vacuous** — against today's registry it fails exactly as intended on `Unable to locate package punktfunk-gamescope`. ## ⚠ Bootstrap `punktfunk-gamescope-trixie:latest` must exist in the LAN registry before `build-publish-gamescope` can start. `docker.yml` builds it on any push to main, but it runs concurrently with `deb.yml`, so the **first** run after merge may miss the image and go red; it self-heals on the next push, or seed it once by hand. ## Not included A Debian-13-built **client** package is proven feasible — it builds (7m07s), packages, installs and resolves on both Debian 13 and Ubuntu 26.04, with much looser floors (`libc6 >= 2.39`, `libgtk-4-1 >= 4.12.0`) than the current 26.04 build's `libc6 >= 2.43`. Left out deliberately: it moves the client off the 26.04 image, changing what existing Ubuntu users receive, and the GTK GUI itself was never launched (only `ldd` and the CLI binary).
enricobuehler added 5 commits 2026-08-13 10:21:12 +00:00
`punktfunk-gamescope` had never been published to the apt registry — not in any
release. It was built inside the host job's Ubuntu 24.04 image, where it cannot
build: our pin vendors wlroots 0.19.3, which floors `wayland-server` at 1.23.1,
and noble ships 1.22.0 (it also lacks libxcb-errors-dev and has only
libdisplay-info 0.1.1). Every rung of that path was a `::warning::` returning 0
and the one hard gate ran last by design, so v0.26.0 and v0.27.0 both released
with the package missing while docs-site told apt users to install it. The same
tags shipped it fine for Arch, Fedora 44 and Bazzite.

It now builds in its own job on Debian 13 (ci/gamescope-trixie.Dockerfile), the
oldest apt base the tree configures on. One package serves Debian 13 AND Ubuntu
26.04 — measured by installing and running it on both — because the build also
vendors libdisplay-info via the new `--extra-fallback` option: linked against
the distro copy it demands `libdisplay-info2` on trixie, which Ubuntu 26.04 does
not have (it carries libdisplay-info3). The option is opt-in, so the
Arch/Fedora/nix outputs are byte-for-byte unchanged. Ubuntu 24.04 gets no
gamescope package and cannot — its wayland is too old to run one however built.

Debian 13 is now a documented host target. That needed no packaging change at
all: the host .deb's glibc-2.39 floor and bundled FFmpeg already made it
installable, and it had been working for a long time while docs-site said Debian
was unsupported and unverified. Verified by installing: host, web console and
plugin runner install, resolve every soname and run. The desktop client stays
Ubuntu-26.04-only (built there, floors at `libc6 >= 2.43`; Debian 13 has 2.41).

Compositor detection now answers Cinnamon (Mint, LMDE) with the route that works
instead of advice that cannot help. Muffin forked from Mutter 3.36:
`org.cinnamon.Muffin.ScreenCast` has only RecordMonitor/RecordWindow, never
RecordVirtual, and xdg-desktop-portal-xapp implements no ScreenCast — so no
value of PUNKTFUNK_COMPOSITOR makes a Cinnamon desktop host a virtual display.
The error names headless gamescope, which needs no desktop compositor. The XDG
sniff moved into a pure function so those branches are testable; Cinnamon is
matched before GNOME, since it is a GNOME derivative and the generic arm would
otherwise hand it the Mutter backend (caught by the new test).

New `smoke-install` job installs every published package from the registry in
pristine ubuntu:24.04, ubuntu:26.04 and debian:trixie images, asserts each
binary resolves its libraries and runs, and insists the version served is the
one this run built. Nothing in deb.yml had ever installed a package it produced,
which is how both of the above survived unnoticed.

⚠ Bootstrap: seed `punktfunk-gamescope-trixie:latest` into the LAN registry once
(docker.yml builds it thereafter) or the new job cannot start.
software-properties-common is not available in Debian 13, so the
apt-add-repository line could not have worked. Debian 13 keeps its
sources in deb822 format; edit Components there instead (verified in a
trixie container — the NVIDIA driver it then offers is 550, above our
535 floor).
PUNKTFUNK_COMPOSITOR=cinnamon is the first thing a Mint or LMDE user
reaches for, and the bare list of accepted values invites the
next-closest guess — 'mutter', since Muffin is a Mutter fork — which
starts a session that fails deep inside an org.gnome.Mutter.ScreenCast
call Muffin does not serve. No value of the variable can work, so say
that and name headless gamescope, which needs no desktop compositor.
Measured on a real linuxmintd/mint22-amd64 image and on Ubuntu 24.04. The
package installs on both, which is exactly what makes this easy to miss —
nothing on the box can then produce a stream:

  * Cinnamon cannot host a virtual display (Muffin has no RecordVirtual).
  * gamescope is absent from 24.04 and cannot be built for it: the tree needs
    wayland >= 1.23.1 (has 1.22.0), libinput >= 1.26 (1.25), libavif >= 1.2.1
    (1.0.4), pixman >= 0.44 (0.42), plus libdisplay-info2 and libxcb-errors0,
    neither of which 24.04 packages at all.
  * Switching desktop does not rescue it — 24.04 has KWin 5.27 (floor 6.5.6)
    and GNOME Shell 46 (floor 48). Only sway 1.9 is even a candidate.

So the gamescope route documented for Cinnamon holds for LMDE 7 (Debian 13,
verified end to end) but NOT for Linux Mint 22.x — which is every mainstream
Mint until Mint 23 lands on a 26.04 base in December 2026. Both the Debian and
Ubuntu pages now say so, and the Debian page carries a per-edition table.

Also states what Debian 13 itself can drive: GNOME 48.7 and sway 1.10 are above
the floors; its KWin 6.3.6 is below.
docs: state the real host floor — Ubuntu 26.04+ / Debian 13+ — and name Debian everywhere
ci / docs-site (pull_request) Successful in 1m17s
ci / rust-arm64 (pull_request) Successful in 1m29s
ci / bun-nix (pull_request) Successful in 1m33s
apple / swift (pull_request) Successful in 1m44s
apple / screenshots (pull_request) Skipped
ci / web (pull_request) Successful in 3m56s
android / android (pull_request) Successful in 9m55s
ci / rust (pull_request) Successful in 15m59s
85980b425e
The floor that matters is the DESKTOP, not the package: 24.04 installs
punktfunk-host and then has no compositor over the version floors and no
gamescope, which reads as a bug rather than an unsupported base. The
requirements page now leads with a per-release table separating 'package
installs' from 'can actually host', and install.md carries the same
caveat next to the apt row.

Debian was already a supported target after the previous commits but was
still invisible at the entry points — README's install table, the docs
index cards, and the 'what you need' list all said Ubuntu only. All three
now name Debian and carry the version floor.
enricobuehler scheduled this pull request to auto merge when all checks succeed 2026-08-13 10:21:50 +00:00
enricobuehler merged commit 5fbf04f56d into main 2026-08-13 10:21:55 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unom/punktfunk#190