Skip to content

CI: sign and notarize the macOS desktop app when secrets are set - #195

Open
kevinelliott wants to merge 1 commit into
masterfrom
claude/project-thread-ohxc8q
Open

kevinelliott wants to merge 1 commit into
masterfrom
claude/project-thread-ohxc8q

Conversation

@kevinelliott

@kevinelliott kevinelliott commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Kevin · project thread

Wires Developer ID signing and notarization into the Desktop workflow. Nothing changes until the secrets are added: without them the app keeps its ad-hoc signature, exactly as today.

How it works

A new "Set up macOS signing" step passes the secrets to Tauri only when they exist, and only on master pushes, releases and manual runs. Pull requests never see them.

Secret What
APPLE_CERTIFICATE base64 of the Developer ID Application .p12
APPLE_CERTIFICATE_PASSWORD its export password (leave unset if it has none)
APPLE_SIGNING_IDENTITY Developer ID Application: Name (TEAMID)
APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_ID notarization, with an app-specific password
  • Certificate and identity present: the app and .dmg are signed.
  • Notarization secrets present too: they are notarized and stapled.
  • Neither: ad-hoc signature, and the log says so.

Also in this PR:

  • workflow_dispatch on the Desktop workflow, so a signed build can be run by hand to check the setup.
  • release.yml passes secrets through to the Desktop workflow (secrets: inherit).
  • entitlements.plist with disable-library-validation. Signing turns on the hardened runtime, which would otherwise refuse to load Homebrew's SoapySDR, its driver modules and the Airspy libraries, and no radio would be found.
  • A "Show macOS signature" step prints codesign and spctl results for the built app.

Testing

  • This PR's own run exercises the unsigned path (pull requests skip the signing step) and the entitlements with the ad-hoc signature.
  • The signed and notarized paths cannot run until the secrets exist. After they are added, run the Desktop workflow manually on master and read the "Show macOS signature" step: it should show the Developer ID authority and accepted, source=Notarized Developer ID.
  • A certificate of the wrong type ("Apple Development") will sign but spctl will reject it, which that step makes visible.

Generated by Claude Code


Note

Medium Risk
Touches release packaging and adds a security-sensitive entitlement (disable-library-validation); behavior is gated on secrets and PRs stay unsigned, but misconfigured signing or overly broad entitlements could affect macOS trust and SDR loading.

Overview
Adds optional Developer ID signing and notarization for macOS desktop builds in CI when APPLE_* repository secrets are present.

The Desktop workflow gains a Set up macOS signing step (skipped on pull requests) that exports certificate, identity, and optional notarization credentials into GITHUB_ENV for Tauri only when secrets exist; otherwise builds stay ad-hoc. Manual runs are enabled via workflow_dispatch, and a post-build Show macOS signature step logs codesign / spctl output. Release now calls the Desktop workflow with secrets: inherit so tagged releases can sign the same way.

Supporting app packaging changes: new entitlements.plist with com.apple.security.cs.disable-library-validation (wired in tauri.conf.json) so hardened-runtime signed builds can load Homebrew SoapySDR/Airspy libraries. README and release notes text are updated to describe signed vs unsigned behavior; Windows remains unsigned.

Reviewed by Cursor Bugbot for commit ad17252. Bugbot is set up for automated code reviews on this repo. Configure here.

With the APPLE_* repository secrets present, master pushes, releases and
manual runs sign XNG with the Developer ID certificate and notarize it.
Pull requests, and repositories without the secrets, keep the ad-hoc
signature, so nothing changes until the secrets are added.

The app now carries a disable-library-validation entitlement: under the
hardened runtime that signing turns on, it could otherwise not load
Homebrew's SoapySDR and Airspy libraries.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PS44Q9VjeCGLV3nuhpoua1
@kevinelliott kevinelliott self-assigned this Nov 14, 2026
@coderabbitai

coderabbitai Bot commented Nov 14, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 13 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ce0aff4e-3ec4-42ec-8e3c-486f45671a09
Commits

Reviewing files that changed from the base of the PR and between 3db1e12 and ad17252.

Files selected for processing: 5

  • .github/workflows/desktop.yml
  • .github/workflows/release.yml
  • desktop/README.md
  • desktop/src-tauri/entitlements.plist
  • desktop/src-tauri/tauri.conf.json
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Cursor Bugbot completed successfully with no findings that need human review, and no approval policy required extra review. No reviewers were assigned.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants