Release prep for 0.31.0, cut from main at 790db5ed (PR #318). 90 commits since v0.30.0, 65 non-merge.
Commits on the branch:
style: cargo fmt drift — whitespace-only. crates/pf-console-ui/src/screens/controllers.rs and crates/punktfunk-host/src/audio/linux/pad_card_volume.rs landed on main formatted differently from rustfmt 1.96.0, so ci.yml's Format step is red on the tip this is cut from.
release: 0.31.0 — Cargo.toml 0.30.0 → 0.31.0, Cargo.lock (versions-only, 36 lines), docs/releases/v0.31.0.md, docs/releases/whatsnew/v0.31.0.txt (498/500), and the ## v0.31.0 section of CHANGELOG.md.
merge of origin/main (#318 landed after the first cut) + release: 0.31.0 — re-cut updating the count and the Nix cache paragraph (signing key installed, DNS via unom/infra OpenTofu).
Why a minor and not 0.30.1: nothing versioned moved (wire 2, ABI 24 with the header byte-identical to the tag, driver 6/3, gamepad 3, index 1, gamescope +pfhdr8, openapi still 0.29.0). It is a minor because the cycle is feature-shaped and one commit is !: the Android Compose console is deleted and pf-console-ui is the console on all three ABIs; ASurfaceControl is the default Android present path; the Linux desktop-audio capture flips to a host-owned null sink by default; topology: exclusive on Hyprland/sway goes from silently-extend to actually disabling outputs; the Nix binary cache ships; and the Linux host package grows three system files the DualSense audio path needs. Canaries already sit at 0.31.x. If you'd rather call it 0.30.1, the notes and CHANGELOG only need the number changed.
Gates run locally (MacBook, 1.96.0): fmt clean, cargo metadata --offline ok, cargo test -p punktfunk-core unit suite 272 passed, Play notes gate 498/500 + unique, notes voice scan clean, both openapi copies identical, header regenerated with no diff. Not run: the C ABI harness — no libopus on this machine (ld: library 'opus' not found); header unchanged since v0.30.0 where it passed. Detailed in the CHANGELOG's Verification status.
Owed but not in this PR (called out in the CHANGELOG version table): sdk-v0.1.5 (the mgmt-endpoint follow in sdk/src/config.ts is unpublished) and plugin-kit-v0.4.3 (SyncSettings.minInterval is unpublished). Also pre-existing: packaging/gamescope/PKGBUILD still says pfhdr7.
After merge, per docs/releases/README.md: git tag -a v0.31.0 … && git push origin v0.31.0, wait for green, dispatch announce.
Release prep for **0.31.0**, cut from `main` at 790db5ed (PR #318). 90 commits since v0.30.0, 65 non-merge.
Commits on the branch:
1. `style: cargo fmt drift` — whitespace-only. `crates/pf-console-ui/src/screens/controllers.rs` and `crates/punktfunk-host/src/audio/linux/pad_card_volume.rs` landed on main formatted differently from rustfmt 1.96.0, so `ci.yml`'s Format step is red on the tip this is cut from.
2. `release: 0.31.0` — `Cargo.toml` 0.30.0 → 0.31.0, `Cargo.lock` (versions-only, 36 lines), `docs/releases/v0.31.0.md`, `docs/releases/whatsnew/v0.31.0.txt` (498/500), and the `## v0.31.0` section of `CHANGELOG.md`.
3. merge of `origin/main` (#318 landed after the first cut) + `release: 0.31.0 — re-cut` updating the count and the Nix cache paragraph (signing key installed, DNS via unom/infra OpenTofu).
**Why a minor and not 0.30.1:** nothing versioned moved (wire 2, ABI 24 with the header byte-identical to the tag, driver 6/3, gamepad 3, index 1, gamescope +pfhdr8, openapi still 0.29.0). It is a minor because the cycle is feature-shaped and one commit is `!`: the Android Compose console is deleted and `pf-console-ui` is the console on all three ABIs; ASurfaceControl is the default Android present path; the Linux desktop-audio capture flips to a host-owned null sink by default; `topology: exclusive` on Hyprland/sway goes from silently-extend to actually disabling outputs; the Nix binary cache ships; and the Linux host package grows three system files the DualSense audio path needs. Canaries already sit at 0.31.x. If you'd rather call it 0.30.1, the notes and CHANGELOG only need the number changed.
**Gates run locally** (MacBook, 1.96.0): fmt clean, `cargo metadata --offline` ok, `cargo test -p punktfunk-core` unit suite 272 passed, Play notes gate 498/500 + unique, notes voice scan clean, both openapi copies identical, header regenerated with no diff. **Not run:** the C ABI harness — no libopus on this machine (`ld: library 'opus' not found`); header unchanged since v0.30.0 where it passed. Detailed in the CHANGELOG's *Verification status*.
**Owed but not in this PR** (called out in the CHANGELOG version table): `sdk-v0.1.5` (the `mgmt-endpoint` follow in `sdk/src/config.ts` is unpublished) and `plugin-kit-v0.4.3` (`SyncSettings.minInterval` is unpublished). Also pre-existing: `packaging/gamescope/PKGBUILD` still says `pfhdr7`.
After merge, per `docs/releases/README.md`: `git tag -a v0.31.0 … && git push origin v0.31.0`, wait for green, dispatch `announce`.
Two files landed on main formatted differently from rustfmt 1.96.0's
output, so ci.yml's Format step fails on the tip the release is cut
from. Whitespace only; no behaviour change.
88 commits since v0.30.0 (64 non-merge). Cut from origin/main 8a4eac4c
(PR #317 merged; PR #318, the Nix cache signing-key follow-up, is open
and NOT in this cut).
THE NUMBER: 0.31.0 is a judgement call, not forced. Nothing versioned
moved — WIRE_VERSION 2, C ABI 24 with include/punktfunk_core.h byte-
identical to the v0.30.0 tag, driver protocol 6 / min 3 (pf-driver-proto
has no diff against the tag), gamepad channel 3, plugin index schema 1,
host event schema 1, gamescope +pfhdr8 with no new patch files,
api/openapi.json still stamped 0.29.0 and unchanged, SDK 0.1.4,
plugin-kit 0.4.2. On that table alone this could be 0.30.1. It is a
minor because the cycle is feature-shaped and one commit carries a `!`:
the Android Compose console is deleted outright and pf-console-ui over
Skia/GL becomes the console on all three ABIs (#301, #317); the Android
present path moves to ASurfaceControl by default (#290); the Linux
desktop-audio capture flips to a host-owned null-audio-sink by default
with PUNKTFUNK_STREAM_SINK=stream as a one-release escape (#305);
`topology: exclusive` on Hyprland/sway goes from silently-extend to
genuinely disabling the operator's outputs, which is the default policy
on every auto-detected box (#304, closes#284); a Nix binary cache
ships (#313); and the Linux host package grows three new system files
(udev rule, WirePlumber policy, ALSA UCM drop-in) that the DualSense
audio path depends on (#291, #302, #315). scripts/ci/pf-version.sh
already derives the canary base as latest stable + one minor, so
canaries have sat at 0.31.x since the v0.30.0 tag and move to 0.32.x
after this one.
Version table re-measured on 8a4eac4c, not carried forward. Two rows
carry a warning rather than a change: sdk/ and plugin-kit/ both have
real code changes (the mgmt-endpoint follow in config.ts/runner-cli.ts;
SyncSettings.minInterval in sync-engine.ts) with package.json unbumped.
They version off their own sdk-v*/plugin-kit-v* tags and this commit
does not touch them; the CHANGELOG names sdk-v0.1.5 and
plugin-kit-v0.4.3 as owed so they are cut deliberately.
The release branch also carries one preceding whitespace-only commit:
crates/pf-console-ui/src/screens/controllers.rs and
crates/punktfunk-host/src/audio/linux/pad_card_volume.rs had landed on
main formatted differently from rustfmt 1.96.0 (the pinned toolchain),
so ci.yml's Format step was red on the tip this is cut from. `cargo fmt
--all` and nothing else.
Gates run on this tree (this MacBook, rustc/rustfmt 1.96.0): cargo fmt
--all --check clean; cargo metadata --offline ok; Cargo.lock diff
versions-only (36/36 lines); cargo test -p punktfunk-core unit suite
272 passed; the android.yml Play notes gate run verbatim — 498/500
characters and not byte-identical to any prior release's; notes voice
scan finds no internal names outside the For developers section (the
two hits, `nixpkgs` and Flatpak, are things those users configure by
name); both openapi copies cmp identical and unchanged since the tag;
include/punktfunk_core.h regenerated by the build and git-diff clean.
⚠ NOT run here: the C ABI harness (tests/c_abi.rs) — it links -lopus
and this machine has no libopus (`ld: library 'opus' not found`; the
Mac Studio has it). The header is byte-identical to v0.30.0's, where the
harness passed, and nothing in punktfunk-core's C surface changed; the
CI runner is its first execution for this tag. Named in the CHANGELOG's
Verification status rather than left to be discovered.
No outside contributor is credited by name: every attribution in the
64 bodies is a dated field report or "a reporter", and issue #284 was
filed by the maintainer. The Thanks section thanks the field reports
without naming anyone.
90 commits since v0.30.0 (65 non-merge), was 88/64. #318 installed the
Nix cache signing key (public half now pinned in the docs and served by
the cache) and moved its DNS provisioning into unom/infra's OpenTofu; the
CHANGELOG's Nix paragraph says so instead of listing the PR as absent.
The notes needed no change: their NixOS line already pointed at the
install guide and the cache-served key. Version table unaffected — #318
touches docs and the setup wizard only.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Release prep for 0.31.0, cut from
mainat790db5ed(PR #318). 90 commits since v0.30.0, 65 non-merge.Commits on the branch:
style: cargo fmt drift— whitespace-only.crates/pf-console-ui/src/screens/controllers.rsandcrates/punktfunk-host/src/audio/linux/pad_card_volume.rslanded on main formatted differently from rustfmt 1.96.0, soci.yml's Format step is red on the tip this is cut from.release: 0.31.0—Cargo.toml0.30.0 → 0.31.0,Cargo.lock(versions-only, 36 lines),docs/releases/v0.31.0.md,docs/releases/whatsnew/v0.31.0.txt(498/500), and the## v0.31.0section ofCHANGELOG.md.origin/main(#318 landed after the first cut) +release: 0.31.0 — re-cutupdating the count and the Nix cache paragraph (signing key installed, DNS via unom/infra OpenTofu).Why a minor and not 0.30.1: nothing versioned moved (wire 2, ABI 24 with the header byte-identical to the tag, driver 6/3, gamepad 3, index 1, gamescope +pfhdr8, openapi still 0.29.0). It is a minor because the cycle is feature-shaped and one commit is
!: the Android Compose console is deleted andpf-console-uiis the console on all three ABIs; ASurfaceControl is the default Android present path; the Linux desktop-audio capture flips to a host-owned null sink by default;topology: exclusiveon Hyprland/sway goes from silently-extend to actually disabling outputs; the Nix binary cache ships; and the Linux host package grows three system files the DualSense audio path needs. Canaries already sit at 0.31.x. If you'd rather call it 0.30.1, the notes and CHANGELOG only need the number changed.Gates run locally (MacBook, 1.96.0): fmt clean,
cargo metadata --offlineok,cargo test -p punktfunk-coreunit suite 272 passed, Play notes gate 498/500 + unique, notes voice scan clean, both openapi copies identical, header regenerated with no diff. Not run: the C ABI harness — no libopus on this machine (ld: library 'opus' not found); header unchanged since v0.30.0 where it passed. Detailed in the CHANGELOG's Verification status.Owed but not in this PR (called out in the CHANGELOG version table):
sdk-v0.1.5(themgmt-endpointfollow insdk/src/config.tsis unpublished) andplugin-kit-v0.4.3(SyncSettings.minIntervalis unpublished). Also pre-existing:packaging/gamescope/PKGBUILDstill sayspfhdr7.After merge, per
docs/releases/README.md:git tag -a v0.31.0 … && git push origin v0.31.0, wait for green, dispatchannounce.790db5ed(#318 merged after the first cut)enricobuehler referenced this pull request2026-08-19 23:24:48 +00:00