Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Releases

Tagged releases publish portable servers, a source tarball, desktop installers, signed update bundles, and container images. The nightly workflow rebuilds the rolling nightly release at 03:07 UTC when main has changed.

Changesets

Every user-visible change adds a file to .changeset/:

cargo xtask changeset patch "RTL-SDR: keep gain after reconnect"

To release, on a clean main:

cargo xtask release --dry-run
cargo xtask release
git push origin v1.2.3

release picks the next version from the largest bump among changesets added since the last tag and tags HEAD. It never commits. The release workflow turns those changesets into the GitHub release notes (cargo xtask release-notes 1.2.3) and fails on a tag without any. sdrmm.com reads its changelog from the GitHub releases. Released changesets can be deleted any time.

Versioning

The root workspace version is the source of truth. Set it with:

cargo xtask set-version 1.2.3

Stable tags use v<major>.<minor>.<patch>. Nightlies use the UTC date as YY.M.D. Windows MSI requires major and minor to fit in eight bits and patch in sixteen bits; prerelease suffixes are unsupported. The task validates these limits.

Portable archives

cargo xtask-release dist
cargo xtask-release dist --target aarch64-unknown-linux-gnu

The task installs a missing Rust target, builds the frontend and release binary, verifies embedded assets, and writes a .tar.gz or .zip under dist/ with the binary, the FFmpeg libraries, README.md, LICENSE, and THIRD_PARTY_NOTICES.md. cargo xtask-release source-dist writes the source tarball with the built frontend. cargo xtask-release link-check <dir> checks that macOS and Windows binaries link only bundled and system libraries.

Archives load SoapySDR at runtime without linking or bundling it. Verify startup on a clean machine both with and without a system SoapySDR installation.

Desktop bundles

Run the compile gate:

cargo xtask desktop

To create installers, install cargo-packager:

cargo install --locked cargo-packager
cargo xtask desktop --bundles app,dmg

Use deb,rpm,appimage on Linux and wix,nsis on Windows. rpm is repackaged from the deb and needs dpkg-deb and rpmbuild. Installers use system SoapySDR at runtime. Linux and Windows bundles are built on x86-64 and ARM64, each on a native machine. Windows ARM64 builds nsis alone, because WiX 3 emits no arm64 package.

The build fetches Chromium (CEF) into .cef and needs CMake and Ninja. cargo xtask desktop --run builds the app and starts it.

Desktop updates

Release builds check downloads.sdrmm.com for the latest stable release at startup, then GitHub. Local builds never check. On Linux only the AppImage updates itself. On Windows, MSI and NSIS installs each update through their own installer kind. Update archives carry a minisign signature separate from platform code signing. Preserve the private updater key; installed clients trust its compiled public key. The manifest keeps the keys older Tauri builds read.

Without CARGO_PACKAGER_SIGN_PRIVATE_KEY, packages carry no updater signature and cannot serve as application updates. Release CI requires signatures and builds the update manifest:

cargo xtask updater-manifest \
  --version 1.2.3 \
  --dir dist/release \
  --base-url https://github.com/Newspicel/sdrmm/releases/download/v1.2.3

Containers

Releases publish Linux amd64 and arm64 images, also mirrored as ghcr.io/newspicel/sdrminusminus:

ghcr.io/newspicel/sdrmm:<version>
ghcr.io/newspicel/sdrmm:<major>.<minor>
ghcr.io/newspicel/sdrmm:latest

Nightlies update :nightly and add a sha-<commit> tag. The nightly workflow builds both architectures and checks the binary, SoapySDR modules, server startup, and embedded frontend.

Homebrew

The sdrmm formula lives in homebrew-core and the sdrmm-app cask in homebrew-cask. Homebrew bumps both after a release.

AUR and WinGet

The release workflow pushes sdrmm-bin and sdrmm-app-bin to the AUR, written by cargo xtask aur --version 1.2.3 --sums SHA256SUMS --out <dir>. It submits Newspicel.SDRmm to WinGet once the package is listed in winget-pkgs.

downloads.sdrmm.com

The R2 bucket sdrmm serves downloads.sdrmm.com, the primary download location. A stable release uploads to releases/<tag>/ first, then to GitHub Releases as the fallback. Once both hold it, releases/latest, releases/latest.json (updater manifest) and releases/release.json (download page) move to the new tag. AUR packages and the WinGet manifest point at the mirror; the Homebrew cask stays on GitHub. Nightlies stay on GitHub only.

After a release, the linux-repo workflow publishes the signed APT and RPM repository under packages/. Dispatch it by hand to rebuild the repository from a tag.

scripts/r2-upload.sh <prefix> <file>... uploads through wrangler. Denoise models live under denoise/v1/. cargo xtask denoise-model builds them into target/denoise-model/ and fails until the catalog in crates/wire/src/audio.rs matches. Then upload:

scripts/r2-upload.sh denoise/v1 target/denoise-model/*.sdrmmnn

Uploads are cached as immutable. Never replace a file; publish a new prefix instead.

Secrets

SecretNeeded forWithout it
CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_IDR2 uploadsA tagged release fails
TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORDUpdater signatures, passed to cargo-packagerThe release fails
APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_SIGNING_IDENTITY, APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_IDmacOS signing and notarizationThe release fails
APP_STORE_CONNECT_KEY_ID, APP_STORE_CONNECT_ISSUER_ID, APP_STORE_CONNECT_PRIVATE_KEYiPhone uploadsThe iPhone job fails
AUR_SSH_KEYPushing to the AURThe AUR job is skipped
WINGET_TOKENWinGet submissionThe WinGet job is skipped
PACKAGES_GPG_KEYSigning the APT and RPM repositoryThe repository job is skipped
DISCORD_WEBHOOKPosting release notes to DiscordThe Discord job is skipped

A tag release warns for every skipped job. Other release jobs continue.

Release checklist

  1. Run cargo xtask check, test, smoke, and audit.
  2. Run cargo xtask desktop and build the container.
  3. Check generated API, license, icon, and band-plan outputs.
  4. Validate hardware with the candidate package, including reconnect and recording.
  5. Confirm updater and platform signing credentials.
  6. Run cargo xtask release, push the tag and check every artifact job.
  7. Install a published artifact and run sdrmm --version and sdrmm --doctor.

Manual workflow dispatch rehearses the artifact matrix without publishing a GitHub release.