Release v0.3.1 #13

Merged
psk merged 7 commits from release/v0.3.1 into master 2026-06-28 18:34:39 +00:00
Owner

Cuts v0.3.1 = the complete diff from v0.3.0: post-process/background fix, libopus vendored (pure Rust), gui/live_audio headless feature gate, deploy/desktop docs + headless CI gate, and the release-pipeline token fixes. Local gate: clippy clean, 95 tests pass.

Cuts v0.3.1 = the complete diff from v0.3.0: post-process/background fix, libopus vendored (pure Rust), gui/live_audio headless feature gate, deploy/desktop docs + headless CI gate, and the release-pipeline token fixes. Local gate: clippy clean, 95 tests pass.
feat(headless): vendor libopus as pure Rust (drop the system libopus dep)
All checks were successful
ci / build-and-test (pull_request) Successful in 8m29s
8c4556d473
Replace audiopus (-> audiopus_sys -> system libopus; needed libopus-dev to
build and libopus.so at runtime) with the opus-rs fork's unsafe-libopus
backend — libopus transpiled to Rust by c2rust. The Opus encoder now
compiles into the binary: no libopus-dev, no system libopus, no
autotools/cmake.

- Cargo.toml: audiopus "0.2" -> opus (DCNick3/opus-rs, unsafe-libopus-backend).
- opus.rs: audiopus API -> opus crate (u32 sample rate, mut encoder).
- audiopus/audiopus_sys gone from the lockfile; the binary no longer
  directly links libopus (only transitively via libpulse for loopback).
- Docs: CLAUDE.md/README flip "needs libopus-dev" -> vendored; TODO.md drops
  the now-shipped "Headless in releases" packaging plan.

Verified: clippy clean, 95 tests pass, ldd/readelf show no direct libopus,
and a render smoke test yields a valid MP4 (ffprobe: codec=opus, 2ch).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add `gui` (egui/winit/UI) and `live_audio` (cpal/pulse/rodio-playback)
features, both in `default`. A headless build
(`--no-default-features --features diagnostics`) now drops every
system-lib-pulling crate — cpal/ALSA, bevy_egui, winit, libpulse, rfd,
wayland, x11 — compiling only the offline render + encode path. The
normal windowed app is unchanged.

- Cargo.toml: gui/live_audio features; bevy_egui/cpal/libpulse/rfd
  optional; bevy_winit/bevy_text/bevy_input_focus moved to gui; rodio
  decode-only by default (live_audio adds playback/recording).
- main.rs: windowed app extracted to run_windowed_app() behind gui;
  render dispatch always available; headless-only fallback message.
- New audio_data.rs + audio_decode.rs (analyzer->AudioData glue +
  offline decode) so headless doesn't drag the live plugins.
- Gate GUI plugins, AudioPlugin, loopback/mic, RodioAudioHandler,
  AudioSource/MusicStateResource, FileDialogResource, post-process egui.

Verified: default + headless both compile clean; headless renders a valid
h264+opus MP4 with none of the system deps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cb3a0f1's egui-ordering restructure changed the final
`.add_systems(Core2d, post_process_passes)` from `render_app` to `app`.
`Core2d` only exists in the render world, so the Tilemap/CombinedEffects/
Vector shader chain never ran — every post-process effect
(blur/glow/chromatic/tilemap/vector) silently disappeared. Add them to
`render_app`, like the RenderStartup pipeline-init systems right above.

Verified: rendering the same frame before/after the fix differs (effects
re-apply; 90 KB -> 133 KB PNG).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- README: Arch + Debian desktop libs; a headless server/container deploy
  section (Debian/Alpine/aarch + a Dockerfile); the headless render stack
  in acknowledgements (openh264/muxide/unsafe-libopus/nvenc); the -nvenc
  artifact row + a headless-render note in the download section.
- ci.yml: a `cargo clippy --no-default-features --features diagnostics`
  gate so the headless feature gate can't silently rot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
release-plz.yml authenticated its tag re-push (and the Release PR) with
FORGEJO_TOKEN — Forgejo's auto-injected token. Auto-token-authored pushes
never trigger downstream workflows (loop-prevention), so the re-push would
NOT fire release.yml: a release would land tagged-but-not-built. (The
sibling bossman repo hit and solved the same thing with a dedicated PAT.)

Use a dedicated RELEASE_TOKEN PAT for the triggering operations:
- GIT_TOKEN + checkout token -> RELEASE_TOKEN, so the Release PR is
  PAT-authored and fires ci.yml.
- the re-push -> explicit `git push https://oauth2:${RELEASE_TOKEN}@...`
  (not persisted auto-token creds), guarded by `:?` so a missing secret
  fails the run loudly.

Requires a RELEASE_TOKEN repo secret (a PAT: repo + PR write); CLAUDE.md
documents it. release.yml is unchanged (its FORGEJO_TOKEN only does
non-triggering API calls).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chore: release v0.3.1
All checks were successful
ci / build-and-test (pull_request) Successful in 9m41s
51f226ae73
The complete diff from v0.3.0: libopus vendored as pure Rust, the
gui/live_audio headless feature gate, the post-process/background-effects
fix, deploy/desktop docs + headless CI gate, and the release-pipeline
token fixes (tag re-push + RELEASE_TOKEN PAT).
psk merged commit 5424d626bd into master 2026-06-28 18:34:39 +00:00
psk deleted branch release/v0.3.1 2026-06-28 18:34:39 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
public/soundy-bits!13
No description provided.