Describe the bug
just desktop-release-build is documented as building the full desktop Tauri app locally, but the recipe never builds or copies real sidecar binaries. It touches empty placeholders under desktop/src-tauri/binaries/ and then runs pnpm tauri build. Tauri's externalBin list copies those files into the .app / installer, so a source-built “release” app can ship 0-byte buzz-acp, buzz-agent, buzz-dev-mcp, git-credential-nostr, buzz, and (non-Windows) buzz-backend-kubernetes.
This is separate from the dev stub-shadowing bugs (#4747, #3664, #3927). Those are about just dev / _ensure-sidecar-stubs hiding a real binary on PATH. This one is the local release recipe packaging the stubs themselves.
GitHub Actions release.yml already does the right thing (cargo build --release -p … then ./scripts/bundle-sidecars.sh). Official GitHub-published Desktop builds are not the subject of this report. The gap is the in-tree Just recipe that contributors and self-hosters use to make a local app.
Steps to reproduce
- Check out
origin/main (reproduced against c3132c3ee982d194cd0198ad07b57ec8bd726e4e).
- Read
Justfile desktop-release-build (Justfile:263-277). It only:
touch desktop/src-tauri/binaries/buzz-acp-$TARGET (and the other sidecar names)
pnpm install
pnpm tauri build --features mesh-llm --target …
- Confirm
desktop/src-tauri/tauri.conf.json bundle.externalBin lists those same names (binaries/buzz-acp, binaries/buzz-agent, …).
- Run
just desktop-release-build (macOS example: default aarch64-apple-darwin).
- Inspect the bundled sidecars next to the app executable, e.g.
Buzz.app/Contents/MacOS/buzz-acp (and the other externalBin names).
Expected behavior
A local release build should fail closed unless each sidecar is a real, nonempty, executable binary for the target — the same contract scripts/bundle-sidecars.sh already enforces for CI/canary/release workflows.
Suggested shape (no new packaging invention):
cargo build --release --target "$TARGET" for the sidecar crates.
./scripts/bundle-sidecars.sh "$TARGET" instead of touch.
- After
tauri build, reject 0-byte / non-executable sidecars in the output bundle.
Version and platform
- Buzz version:
0.5.20 (desktop/package.json on origin/main c3132c3ee)
- OS: macOS (arm64). Recipe is target-parameterized; Windows would
touch .exe stubs the same way via _ensure-sidecar-stubs, but this report is about desktop-release-build.
Logs / additional context
Current recipe on origin/main:
desktop-release-build target="aarch64-apple-darwin":
TARGET={{target}}
mkdir -p desktop/src-tauri/binaries
touch "desktop/src-tauri/binaries/buzz-acp-$TARGET"
touch "desktop/src-tauri/binaries/buzz-agent-$TARGET"
# …
touch "desktop/src-tauri/binaries/buzz-$TARGET"
pnpm install
cd {{desktop_dir}} && pnpm tauri build --features mesh-llm --target {{target}}
Contrast with .github/workflows/release.yml (“Build sidecars”):
cargo build --release -p buzz-acp -p buzz-agent -p buzz-backend-kubernetes -p buzz-dev-mcp -p git-credential-nostr -p buzz-cli
./scripts/bundle-sidecars.sh
scripts/bundle-sidecars.sh already errors if a release binary is missing from target/…/release. The Just recipe never calls it.
Related, not duplicates:
Happy to follow with a small PR that wires desktop-release-build to the existing bundle script and adds a fail-closed check.
Important
Do not include security vulnerabilities in a public issue. Report them
privately through a GitHub security advisory.
Describe the bug
just desktop-release-buildis documented as building the full desktop Tauri app locally, but the recipe never builds or copies real sidecar binaries. Ittouches empty placeholders underdesktop/src-tauri/binaries/and then runspnpm tauri build. Tauri'sexternalBinlist copies those files into the.app/ installer, so a source-built “release” app can ship 0-bytebuzz-acp,buzz-agent,buzz-dev-mcp,git-credential-nostr,buzz, and (non-Windows)buzz-backend-kubernetes.This is separate from the dev stub-shadowing bugs (#4747, #3664, #3927). Those are about
just dev/_ensure-sidecar-stubshiding a real binary onPATH. This one is the local release recipe packaging the stubs themselves.GitHub Actions
release.ymlalready does the right thing (cargo build --release -p …then./scripts/bundle-sidecars.sh). Official GitHub-published Desktop builds are not the subject of this report. The gap is the in-tree Just recipe that contributors and self-hosters use to make a local app.Steps to reproduce
origin/main(reproduced againstc3132c3ee982d194cd0198ad07b57ec8bd726e4e).Justfiledesktop-release-build(Justfile:263-277). It only:touch desktop/src-tauri/binaries/buzz-acp-$TARGET(and the other sidecar names)pnpm installpnpm tauri build --features mesh-llm --target …desktop/src-tauri/tauri.conf.jsonbundle.externalBinlists those same names (binaries/buzz-acp,binaries/buzz-agent, …).just desktop-release-build(macOS example: defaultaarch64-apple-darwin).Buzz.app/Contents/MacOS/buzz-acp(and the otherexternalBinnames).Expected behavior
A local release build should fail closed unless each sidecar is a real, nonempty, executable binary for the target — the same contract
scripts/bundle-sidecars.shalready enforces for CI/canary/release workflows.Suggested shape (no new packaging invention):
cargo build --release --target "$TARGET"for the sidecar crates../scripts/bundle-sidecars.sh "$TARGET"instead oftouch.tauri build, reject 0-byte / non-executable sidecars in the output bundle.Version and platform
0.5.20(desktop/package.jsononorigin/mainc3132c3ee)touch.exestubs the same way via_ensure-sidecar-stubs, but this report is aboutdesktop-release-build.Logs / additional context
Current recipe on
origin/main:Contrast with
.github/workflows/release.yml(“Build sidecars”):scripts/bundle-sidecars.shalready errors if a release binary is missing fromtarget/…/release. The Just recipe never calls it.Related, not duplicates:
buzzsidecar —just devnever replaces the Tauri stubs beside the app executable #3664 / bug(dev):just devleaves non-executable sidecar stubs, breaking ACP authentication #3927 same stub-shadowing class forjust devHappy to follow with a small PR that wires
desktop-release-buildto the existing bundle script and adds a fail-closed check.