Version bump, release notes, CHANGELOG technical half, and Play "What's new" for v0.28.1.
50 commits since v0.28.0 (32 non-merge). Cut from f8361f3e.
Nothing breaks — measured, not assumed
include/ is byte-identical to the v0.28.0 tag, so the C ABI stays 19. crates/pf-driver-proto, plugin-kit/package.json and sdk/ show no diff against the tag at all. Verified twice: before and after the four late PRs (#215–#218) landed.
The one Rust-visible change is an addition: punktfunk_core::client::FLUSH_COOLDOWN went pub(crate) → pub, so the host compares against the constant instead of a copy of the number.
v0.28.0
v0.28.1
Wire protocol
2
2
C ABI
19
19
Driver protocol
6
6 (min 3)
Plugin index schema
1
1
gamescope patch level
+pfhdr6
+pfhdr7
api/openapi.json
0.27.0
0.28.0 (two collection deletes)
The number
0.28.1 is defensible but not free. Three feat(...) commits landed since the tag — the "unpair all" endpoints, the Apple gamepad-UI host menu, and the tvOS present-floor levers. All additive, no contract moves. If the feature half is judged too visible for a patch, the only edit required is the number itself: scripts/ci/pf-version.sh derives the canary base as latest-stable + one minor, so 0.28.1 and 0.29.0 both leave canary on 0.29.x and neither collides.
One defect found and fixed while preparing
docs-site/public/openapi.json had drifted for the third time in two release cycles — still stamped 0.27.0 and missing both new collection deletes. Re-synced; byte-identical again, and re-checked after the rebase. The copy is a documented manual step (CONTRIBUTING.md) that nothing in CI enforces.
Contents
CHANGELOG: the in-development section carried four topics and #215–#218 brought four of their own; the remaining twenty-one commits had none. Added the version table (every row measured), an explicit empty breaking-changes verdict, and sections for the unpair-all endpoints, Hyprland/Sway cursor-mode negotiation, the gamescope WSI layer, the 203-nit SDR anchor, the Apple stats/colour faults, the Skia loader regression, the AV1 level sentinel, the stats stage-line partition, the two mis-attributed host warnings, and the openapi drift.
Notes (docs/releases/v0.28.1.md): user-facing only, TL;DR first, CHANGELOG link points at the v0.28.1 tag. The two Windows headliners lead — the Steam add-on publishing nothing (a 0.28.0 regression that emptied the grid) and an idle host wrecking a locally played game. Before you update carries the two Sound-settings changes an operator could misread as defects.
luxus is credited three times — in the lead-in the Discord embed shows, inline on the fix itself, and in a new ## Thanks section. The linger crash was his find, his patch and his on-glass proof, and it ships as he wrote it.
Play notes: 436 characters against the 500 cap, Android-app content only.
Gates (all green, post-rebase)
cargo fmt --all --check clean
cargo metadata --locked consistent
Cargo.lock diff versions-only, 36/36 lines, zero non-version lines
cargo test -p punktfunk-core210 passed
C ABI harness passes printing abi_version=19
repo pre-push hook exits 0
⚠ Tagging note
Do not push the tag within minutes of merging this. On the v0.28.0 cut the merge's main push and the tag push landed on the same sha and cancelled each other's runs, silently costing the Android AAB (and its Play upload), the arm64 client .deb and the Fedora 44 rpm. Let the main-push runs settle first, then tag the merge commit.
Version bump, release notes, CHANGELOG technical half, and Play "What's new" for **v0.28.1**.
50 commits since v0.28.0 (32 non-merge). Cut from `f8361f3e`.
## Nothing breaks — measured, not assumed
`include/` is **byte-identical** to the v0.28.0 tag, so the C ABI stays **19**. `crates/pf-driver-proto`, `plugin-kit/package.json` and `sdk/` show **no diff against the tag at all**. Verified twice: before and after the four late PRs (#215–#218) landed.
The one Rust-visible change is an addition: `punktfunk_core::client::FLUSH_COOLDOWN` went `pub(crate)` → `pub`, so the host compares against the constant instead of a copy of the number.
| | v0.28.0 | v0.28.1 |
|---|---|---|
| Wire protocol | 2 | **2** |
| C ABI | 19 | **19** |
| Driver protocol | 6 | **6** (min 3) |
| Plugin index schema | 1 | **1** |
| gamescope patch level | +pfhdr6 | **+pfhdr7** |
| `api/openapi.json` | 0.27.0 | **0.28.0** (two collection deletes) |
## The number
**0.28.1 is defensible but not free.** Three `feat(...)` commits landed since the tag — the "unpair all" endpoints, the Apple gamepad-UI host menu, and the tvOS present-floor levers. All additive, no contract moves. If the feature half is judged too visible for a patch, **the only edit required is the number itself**: `scripts/ci/pf-version.sh` derives the canary base as latest-stable + one minor, so 0.28.1 and 0.29.0 both leave canary on 0.29.x and neither collides.
## One defect found and fixed while preparing
`docs-site/public/openapi.json` had drifted for the **third time in two release cycles** — still stamped `0.27.0` and missing both new collection deletes. Re-synced; byte-identical again, and re-checked after the rebase. The copy is a documented manual step (CONTRIBUTING.md) that **nothing in CI enforces**.
## Contents
- **CHANGELOG**: the in-development section carried four topics and #215–#218 brought four of their own; the remaining twenty-one commits had none. Added the version table (every row measured), an explicit empty breaking-changes verdict, and sections for the unpair-all endpoints, Hyprland/Sway cursor-mode negotiation, the gamescope WSI layer, the 203-nit SDR anchor, the Apple stats/colour faults, the Skia loader regression, the AV1 level sentinel, the stats stage-line partition, the two mis-attributed host warnings, and the openapi drift.
- **Notes** (`docs/releases/v0.28.1.md`): user-facing only, TL;DR first, CHANGELOG link points at the **v0.28.1 tag**. The two Windows headliners lead — the Steam add-on publishing nothing (a 0.28.0 regression that emptied the grid) and an idle host wrecking a locally played game. `Before you update` carries the two Sound-settings changes an operator could misread as defects.
- **luxus is credited three times** — in the lead-in the Discord embed shows, inline on the fix itself, and in a new `## Thanks` section. The linger crash was his find, his patch and his on-glass proof, and it ships as he wrote it.
- **Play notes**: 436 characters against the 500 cap, Android-app content only.
## Gates (all green, post-rebase)
- `cargo fmt --all --check` clean
- `cargo metadata --locked` consistent
- `Cargo.lock` diff **versions-only, 36/36 lines**, zero non-version lines
- `cargo test -p punktfunk-core` **210 passed**
- C ABI harness passes printing `abi_version=19`
- repo pre-push hook exits 0
## ⚠ Tagging note
Do **not** push the tag within minutes of merging this. On the v0.28.0 cut the merge's `main` push and the tag push landed on the same sha and cancelled each other's runs, silently costing the Android AAB (and its Play upload), the arm64 client `.deb` and the Fedora 44 rpm. Let the main-push runs settle first, then tag the merge commit.
50 commits since v0.28.0 (32 non-merge). Cut from origin/main f8361f3e.
THE NUMBER: 0.28.1 is defensible but not free. Three `feat(...)` commits landed
since the tag — the "unpair all" button and its two endpoints, the Apple
gamepad-UI host menu, and the tvOS present-floor levers. That is not the shape
of v0.28.0's cut (17 feats, a packager-visible default flip, an MSRV rise and a
deletion that empties the library grid), and none of the three changes a
contract: every one is additive, and the version table is unchanged on every row
an embedder, packager or driver author reads. `scripts/ci/pf-version.sh` derives
the canary base as latest-stable + one minor, so 0.28.1 and 0.29.0 both leave
canary on 0.29.x and neither collides.
NOTHING BREAKS, and this was measured rather than assumed, twice — before and
after the four late PRs. `include/` is byte-identical to the v0.28.0 tag, so the
C ABI stays 19; `crates/pf-driver-proto`, `plugin-kit/package.json` and `sdk/`
show no diff against the tag at all. The one Rust-visible change is an addition:
`punktfunk_core::client::FLUSH_COOLDOWN` went `pub(crate)` -> `pub`, so the host
can compare against the constant instead of a copy of the number.
ONE DEFECT FOUND AND FIXED WHILE PREPARING:
`docs-site/public/openapi.json` had drifted for the THIRD time in two release
cycles. It was still stamped 0.27.0 and missing both new collection deletes,
while `api/openapi.json` sits at 0.28.0. v0.28.0 fixed this once (it was five
releases stale at 0.21.0) and it drifted again inside that same cycle. Re-synced;
the two files are byte-identical again, and re-checked after the rebase. The copy
is a documented manual step (CONTRIBUTING.md) that nothing in CI enforces — three
drifts is the argument for gating it, and that gate is not in this commit.
CHANGELOG: the in-development section carried four topics and the late PRs
brought four more of their own; the remaining twenty-one commits had none. Added
the version table (every row measured, not copied forward), an explicit empty
breaking-changes verdict, and sections for the management API's two collection
deletes, the Hyprland/Sway cursor-mode negotiation, the gamescope WSI layer we
now ship ourselves, the 203-nit SDR anchor, the Apple stats/colour faults, the
Skia loader-version regression, the AV1 level sentinel, the stats stage-line
partition, the two host warnings that named the wrong subsystem, and the
docs-site openapi drift.
NOTES: `docs/releases/v0.28.1.md` follows the post-v0.25.0 split — user-facing
only, TL;DR first, internals left to the CHANGELOG link, which points at the
v0.28.1 TAG rather than main. The two Windows headliners lead it: the Steam
add-on publishing nothing (a 0.28.0 regression that emptied the grid) and an idle
host wrecking a locally played game. `Before you update` carries the two
Sound-settings changes an operator will see and could read as defects, plus the
0.27-and-older pointer at v0.28.0's action items.
luxus is credited three times: in the lead-in the Discord embed shows, inline on
the fix itself, and in a new `## Thanks` section — the linger crash was his find,
his patch and his on-glass proof, and it ships as he wrote it. The CHANGELOG
keeps its own credit with the overlay#9 link.
Play notes are 436 characters against the 500 cap and cover only what changed in
the Android app, which this release is still one commit of.
GATES, all green on this tree after the rebase: `cargo fmt --all --check` clean;
`cargo metadata --locked` consistent; Cargo.lock diff is versions-only, 36/36
lines, zero non-version lines against the new base; `cargo test -p punktfunk-core`
210 passed; the C ABI harness passes printing abi_version=19 (needs
`LIBRARY_PATH=/opt/homebrew/opt/opus/lib` on macOS — a link path, not a defect);
the repo pre-push hook exits 0.
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.
Version bump, release notes, CHANGELOG technical half, and Play "What's new" for v0.28.1.
50 commits since v0.28.0 (32 non-merge). Cut from
f8361f3e.Nothing breaks — measured, not assumed
include/is byte-identical to the v0.28.0 tag, so the C ABI stays 19.crates/pf-driver-proto,plugin-kit/package.jsonandsdk/show no diff against the tag at all. Verified twice: before and after the four late PRs (#215–#218) landed.The one Rust-visible change is an addition:
punktfunk_core::client::FLUSH_COOLDOWNwentpub(crate)→pub, so the host compares against the constant instead of a copy of the number.api/openapi.jsonThe number
0.28.1 is defensible but not free. Three
feat(...)commits landed since the tag — the "unpair all" endpoints, the Apple gamepad-UI host menu, and the tvOS present-floor levers. All additive, no contract moves. If the feature half is judged too visible for a patch, the only edit required is the number itself:scripts/ci/pf-version.shderives the canary base as latest-stable + one minor, so 0.28.1 and 0.29.0 both leave canary on 0.29.x and neither collides.One defect found and fixed while preparing
docs-site/public/openapi.jsonhad drifted for the third time in two release cycles — still stamped0.27.0and missing both new collection deletes. Re-synced; byte-identical again, and re-checked after the rebase. The copy is a documented manual step (CONTRIBUTING.md) that nothing in CI enforces.Contents
docs/releases/v0.28.1.md): user-facing only, TL;DR first, CHANGELOG link points at the v0.28.1 tag. The two Windows headliners lead — the Steam add-on publishing nothing (a 0.28.0 regression that emptied the grid) and an idle host wrecking a locally played game.Before you updatecarries the two Sound-settings changes an operator could misread as defects.## Thankssection. The linger crash was his find, his patch and his on-glass proof, and it ships as he wrote it.Gates (all green, post-rebase)
cargo fmt --all --checkcleancargo metadata --lockedconsistentCargo.lockdiff versions-only, 36/36 lines, zero non-version linescargo test -p punktfunk-core210 passedabi_version=19⚠ Tagging note
Do not push the tag within minutes of merging this. On the v0.28.0 cut the merge's
mainpush and the tag push landed on the same sha and cancelled each other's runs, silently costing the Android AAB (and its Play upload), the arm64 client.deband the Fedora 44 rpm. Let the main-push runs settle first, then tag the merge commit.