• v0.3.2 0fb64149d0

    v0.3.2 — new drop 🔥
    Some checks failed
    release-pr / release-pr (push) Failing after 2s
    release / build-and-test (push) Successful in 7m43s
    release / release (push) Failing after 18m8s
    release / mirror-gitlab (push) Has been skipped
    Stable

    psk released this 2026-06-29 22:25:22 +00:00 | 7 commits to master since this release

    Fixed

    • (ci) Push the release tag once so release.yml runs once
    • Vsync frame cap follows the active monitor's refresh rate
    • (ci) Forgejo-first release + headless render builds (gitlab can't block it)
    • (ci) Drive the Release PR with git-cliff (release-plz never opened one)

    🌐 Live WASM demo (latest build): https://public.pages.ssy.dk/soundy-bits/
    This release's exact browser build is the soundy-bits-0.3.2-wasm.zip asset.

    Downloads
  • v0.3.1 5424d626bd

    v0.3.1 — new drop 🔥
    Some checks failed
    release-plz / release-plz (push) Successful in 41s
    release / release (push) Has been cancelled
    release / build-and-test (push) Has been cancelled
    Stable

    psk released this 2026-06-28 18:35:21 +00:00 | 18 commits to master since this release

    Fixed

    • Post-processing / background effects restored. The Tilemap → Combined Effects
      (blur/glow/streak/chromatic) → Vector shader chain was registered on the main app instead of the
      render sub-app, so it silently never ran ("no post processing at all"). Moved to the render app;
      every GPU post-process effect works again.
    • Release pipeline actually fires now. release-plz creates the tag via the Forgejo API, which
      does not trigger release.yml, so the tag is re-pushed as a real git push — and that push plus the
      Release PR now use a dedicated RELEASE_TOKEN PAT, because Forgejo's auto FORGEJO_TOKEN never
      triggers downstream workflows.

    Changed

    • Opus encoder vendored as pure Rust (unsafe-libopus via the opus-rs fork). The headless
      renderer's MP4 audio track no longer needs libopus-dev / system libopus or autotools/cmake.
    • Headless cargo feature gate (gui + live_audio, both default-on). A render-only build
      (--no-default-features --features diagnostics) drops the GUI (egui/winit) and live-audio
      (cpal/pulse) system dependencies, so the render subcommand runs on a bare server or container.

    Added

    • Headless deploy docs — Arch + Debian desktop library lists and a server/container section
      (Debian/Ubuntu, Alpine + a Dockerfile, NVIDIA) covering the renderer's runtime Vulkan deps.
    • Prebuilt-binaries table lists the -nvenc artifact and notes every binary doubles as a headless
      video renderer; acknowledgements credit the headless render stack (openh264 / muxide /
      unsafe-libopus). A CI gate now compiles the headless feature build so it can't silently rot.

    🌐 Live WASM demo (latest build): https://public.pages.ssy.dk/soundy-bits/
    This release's exact browser build is the soundy-bits-0.3.1-wasm.zip asset.

    Downloads
  • v0.3.0 49cb75356f

    v0.3.0 — new drop 🔥
    All checks were successful
    release-plz / release-plz (push) Successful in 3m36s
    release / build-and-test (push) Successful in 8m23s
    release / release (push) Successful in 14m58s
    Stable

    psk released this 2026-06-27 22:27:22 +00:00 | 27 commits to master since this release

    Added

    • Headless render-to-video (soundy-bits render …, native-only). The same binary renders a
      clip to an MP4 (H.264 video + Opus audio, in sync) or a PNG frame sequence with no window or
      display — deterministic and reproducible, runnable on a headless server. Reuses the real
      visualization/post-process plugins via an offscreen RenderTarget::Image + gpu_readback, a
      fixed-step clock, and a frame-indexed offline audio pump. Encoding is a pluggable
      VideoSink/VideoEncoder seam (src/headless/) so AV1 can drop in. Requires libopus-dev at
      build time and libopus.so at runtime.
      • Hardware H.264 via NVENC (--features nvenc, NVIDIA) — auto-selected by default with the
        software encoder as fallback; capped-VBR with a configurable --bitrate. The crate vendors its
        headers and dlopens the driver at runtime, so it builds with no CUDA toolkit (but hard-links the
        NVIDIA encode lib, so the nvenc binary only runs on NVIDIA hosts — hence an opt-in feature, not
        default). Reuses a pooled, pipelined set of NVENC buffers, so a full song renders at ~7× real
        time at 1080p60
        (≈420 fps on a 4090) and exits cleanly.
      • Software encoder (fallback) is multi-threaded: encode/mux on a worker thread overlapping GPU
        rendering, constant-QP + multi-slice so it parallelizes across cores, parallel RGBA→I420.
      • Flags: --encoder auto|hw|sw, --bitrate <Mbps> (NVENC), --quality <QP> (software CQP,
        default 22), --speed (faster software), --software (render on Mesa lavapipe for GPU-less hosts).

    Changed

    • Upgraded to Bevy 0.19. The custom 3-pass post-process chain (Tilemap → Combined effects →
      Vector SDF/filters) and the ColoredMesh2d pipeline were ported from the removed render-graph
      node API to the new schedule-based renderer (passes are render-world systems on the Core2d
      schedule, ordered after tonemapping in Core2dSystems::PostProcess). UI scaling moved from
      EguiContextSettings::scale_factor to the EguiZoomFactor component, and egui/Bevy deprecations
      were cleared.
    • Refreshed all dependencies to their latest compatible versions. cpal is intentionally held at
      0.17 to stay aligned with rodio 0.22 (which pins cpal 0.17), avoiding a duplicate native audio
      backend in the tree; it will follow once rodio bumps.
    • Releases are now automated via release-plz: a "Release PR" carries the
      version bump + changelog, and merging it tags + publishes. CI runs on pull requests only.

    Fixed

    • Release archives now extract into a single top-level soundy-bits-<ver>-<target>/ folder instead of
      scattering the binary + assets into the current directory (no more "tarbombs").

    🌐 Live WASM demo (latest build): https://public.pages.ssy.dk/soundy-bits/
    This release's exact browser build is the soundy-bits-0.3.0-wasm.zip asset.

    Downloads
  • v0.2.0 0c6f7b8c76

    v0.2.0 — new drop 🔥
    All checks were successful
    ci / build-and-test (push) Successful in 6m18s
    release / build-and-test (push) Successful in 6m13s
    release / release (push) Successful in 8m31s
    Stable

    psk released this 2026-06-25 23:32:59 +00:00 | 30 commits to master since this release

    Added

    • Vector SDF background layer — a resolution-independent, per-pixel procedural pattern
      (rings, sunburst, hex grid, nested polygons, moiré, kaleidoscope) rendered as a final
      post-process pass, with a the29nov-style filter stack: threshold/duotone, posterize, halftone,
      beat-gated invert, in-shader bloom, chromatic, scanlines, grain, vignette, flicker. Audio-reactive
      and layerable over any mode (like the tilemap effect). Selectable color mode: Duotone (the29nov
      mono, default) or Gradient — an animated, bass-pulsing rainbow with adjustable hue speed, like Orbit.
    • Theme / Curator-Seed system — portable themes that set partial default settings and constrain
      the randomizer (lock / range / force / one-of) into a stylistic envelope. Importable as a
      human-editable TOML file or a compact paste-able seed code (postcard + CRC32 + base64,
      versioned). Built-in starter themes (Mono/the29nov, Neon, VHS, Cosmic), an in-app Theme Editor
      (all options per mode, default value + randomize range each, plus a random-theme generator), and
      a control-panel manager. The active theme persists across sessions and keeps Randomize within its
      envelope.

    Fixed

    • Floating Windows layout now scrolls tall control panels instead of running off-screen, so the
      bottom controls in the Mode/Background/Stereo windows stay reachable.
    • Vector layer "Opacity" now works as a true layer crossfade (was swallowed by the duotone remap).
    • Reduced SDF pattern density (esp. hex) so patterns read as clean shapes, not fine texture.
    • Audited/tightened Randomize ranges + added an anti-stacking guard so a single Randomize stays
      watchable instead of producing muddy/over-stacked frames.
    • try_despawn on managed background meshes silences a benign double-despawn warning during rapid
      randomize/mode churn; guarded an empty file-dialog selection against a panic.

    🌐 Live WASM demo (latest build): https://public.pages.ssy.dk/soundy-bits/
    This release's exact browser build is the soundy-bits-0.2.0-wasm.zip asset.

    Downloads
  • v0.1.0 97afe1c064

    v0.1.0 Stable

    psk released this 2025-10-09 21:23:52 +00:00 | 180 commits to master since this release

    Downloads