gamescale
Run a game at 1× so XWayland hands it the panel’s real mode, then put the desktop back when it exits.
Under GNOME fractional scaling, XWayland is handed an integer multiple of your logical resolution, never the panel’s real mode. At 133% on a 2560×1600 display no factor lands on the hardware, and a borderless-fullscreen game takes whatever the desktop reports.
| What the game is handed | Resolution | Cost |
|---|---|---|
| The panel itself | 2560×1600 | what the hardware has |
| XWayland, scale factor 1 | 1920×1200 | upscaled to fit; soft |
| XWayland, scale factor 2 | 3840×2400 | 2.25× the pixels, same image |
| With gamescale | 2560×1600 | the panel’s real mode |
gamescale %command%Scale goes to 1.0 for the lifetime of that one process, font and cursor sizes are compensated so the desktop stays usable, and everything goes back when the game exits.
Including when it doesn’t exit cleanly: a watchdog, a state file on disk, and a login reconcile unit mean a crash or a SIGKILL still gives you your desktop back.
The script, its top-bar indicator, and the reconcile unit ship in the image at a pinned tag. Flatpak launchers need one grant from gamescale’s installer: Flatpak reserves /usr, so no image can hand them a host binary.
What's inside
Gamescope, gamemode, and MangoHud are in the image; split-lock mitigation is off and the map count is raised because games want both. ntsync is loaded and handed to the seat user, so Proton can use it where the build supports it. Flathub comes unfiltered.
Every boot is checked. If the desktop does not come up three times running, the machine rolls itself back to the previous deployment without being asked.
For work: distrobox for any userland, libvirt/KVM for real machines. Apps are Flatpaks; the image is the OS.
The NVIDIA open module is compiled against the image's exact kernel and signed, so Secure Boot stays on.
image pulsar-nvidia (nvidia-open)
version 44.20260824.0
base fedora-silverblue:44
built 2026-08-24T02:10:06Z
kernel 7.1.9-200.fc44.x86_64
scheduler scx_bpfland
scheduler_btf malformed
gamescope 3.16.25-1.fc44
gamemode 1.8.2-4.fc44
mangohud 0.8.3~rc1-2.fc44
mesa 26.1.7-1.fc44
gamescale v2.0.0the image’s own manifest — rendered, not written
Every image has a paper trail
- commitpush to main
- buildboth images, nightly
- signkmod keyed to the shipped MOK cert
- attestSLSA provenance on ghcr
- bootbootc switches to the attested image
gh attestation verify \
oci://ghcr.io/arclight-digital/pulsar-nvidia:latest \
--owner arclight-digital
Loaded digest sha256:… for oci://…/pulsar-nvidia:latest
✓ Verification succeeded!One person's laptop OS, over-engineered on purpose, MIT-licensed. Running someone else's signed images is a trust decision — fork it and use your own key if that's not a relationship you want.
Starting from bare metal
A weekly installer ISO for each variant, built from the published image itself — the same Anaconda installer stock Silverblue uses, landing directly in Pulsar. Checksummed, and signed with Pulsar's release key.
Write it to a USB stick with GNOME Disks or dd, boot, install. The .json sidecar records exactly which image digest the installer carries. Verify the manifest's signature, then the ISO against the manifest:
cosign verify-blob pulsar-latest-x86_64.iso.sha256 \
--key https://lighthouse.arclight.digital/pulsar/iso/cosign.pub \
--signature pulsar-latest-x86_64.iso.sha256.sig \
--insecure-ignore-tlog=true
Verified OK
sha256sum -c pulsar-latest-x86_64.iso.sha256
pulsar-latest-x86_64.iso: OKWhat changed last night
Every build is diffed against the one before it, package by package, from the SBOMs attached to the images themselves. Nothing here is written by hand.
kernelkernel, 7.1.8-200.fc44 to 7.1.9-200.fc44
35 packages moved, in 11 distinct transitions — 30 to a new upstream version, 5 rebuilt at the same one.
b191e6fd77ca5ce306c5ff31
New upstream versions
- qt-settingsqt-settings, 43.101-3.fc44 to 44.0-1.fc44
cpp+5 packagescpp, 16.1.1-2.fc44 to 16.2.1-2.fc44, with 5 other packages
- gcc
- libatomic
- libgcc
- libgomp
- libstdc++
- rsyncrsync, 3.4.4-1.fc44 to 3.5.0-1.fc44
libdnf5+7 packageslibdnf5, 5.4.2.1-1.fc44 to 5.4.3.0-2.fc44, with 7 other packages
- dnf5
- dnf5-plugins
- dnf5daemon-server
- dnf5daemon-server-polkit
- libdnf5-cli
- libdnf5-plugin-appstream
- libdnf5-plugin-expired-pgp-keys
libcap-ng+1 packagelibcap-ng, 0.9.3-1.fc44 to 0.9.5-1.fc44, with 1 other package
- libcap-ng-python3
python3-boto3+1 packagepython3-boto3, 1.43.72-1.fc44 to 1.43.77-1.fc44, with 1 other package
- python3-botocore
- bootcbootc, 1.16.7-1.fc44 to 1.16.9-1.fc44
- misemise, 2026.8.10-1 to 2026.8.11-1
5 packagesrebuilt at the same upstream version
bluez+3 packagesbluez, 5.87-3.fc44 to 5.87-4.fc44, with 3 other packages
- bluez-cups
- bluez-libs
- bluez-obexd
- thermaldthermald, 2.5.12-2.fc44 to 2.5.12-3.fc44
The full diff is changelog.json — one row per package, the way the build wrote it. The SBOM ships attached to the image: oras discover ghcr.io/