Establish stable self-signed macOS releases - #4
Open
amrshawqy wants to merge 1 commit into
Open
Conversation
This was referenced Jul 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR gives Speaky a stable, reproducible macOS release identity without requiring a paid Apple Developer membership.
Today, ad-hoc or differently signed builds can appear to macOS as different applications even when they share Speaky's name and bundle identifier. In practice, that can leave duplicate Speaky entries in Privacy & Security and force users to grant Accessibility or Microphone access again after an update. The release process is also difficult to reproduce safely across architectures.
The new release path uses one long-lived, self-signed certificate for every public build. Keeping that certificate and application identity stable gives macOS a consistent designated requirement across releases, which makes permission continuity possible for users who replace an existing Speaky installation with a later build from the same release lineage.
No paid Apple account, Developer ID certificate, notarization service, or hosted signing service is required.
What changed
Stable application and signing identity
build.shfail closed when the stable release identity is unavailable; an ad-hoc build now requires the explicitSPEAKY_ALLOW_ADHOC=1development override.Reproducible Apple Silicon and Intel releases
FluidAudioto the last verified Intel-compatible version and commitsPackage.resolved.Guarded GitHub Actions release workflow
main.release-signingGitHub Environment approval boundary.Development and test isolation
This prevents local development and test builds from contaminating the release app's permissions or mutable state.
Smaller, honest release surface
These removals are intentional: they eliminate non-functional update metadata and a packaging dependency rather than presenting an updater that cannot securely deliver releases.
Security model and tradeoffs
This is deliberately a self-signed release model:
The PR documents these boundaries directly so neither maintainers nor users are given a false sense of Apple-backed trust.
Documentation
The workflow is split by audience:
docs/maintainer-setup.md— one-time certificate, backup, repository secret, and protected-environment setup.docs/build-signing.md— repeatable local and CI steps for each release.docs/end-user-installation.md— first installation, Open Anyway, permissions, upgrades, verification, and troubleshooting.The README links to all three guides.
Validation performed
arm64andx86_64.hdiutil verify.Package.resolvedremained unchanged through locked builds.The release validation used disposable local certificates and keychains; no test private key or generated release artifact is committed.
Maintainer workflow after merge
release-signingenvironment with required reviewers, amain-only deployment rule, and the encrypted certificate secrets.main.main, review the test phase, then approve access to the signing environment.Scope
This PR is intentionally limited to build identity, release safety, and the runtime/test isolation necessary to support them. The separate Show in Dock feature is not included here, which keeps each contribution independently reviewable.
The result is a free release process that is stricter, repeatable, auditable, and substantially less likely to create duplicate permission identities for users.