Skip to content

feat(macos): wire Developer-ID signing + notarization; fix "app is damaged" docs (#134, #72) - #143

Merged
debpalash merged 1 commit into
mainfrom
feat/macos-notarization
May 29, 2026
Merged

feat(macos): wire Developer-ID signing + notarization; fix "app is damaged" docs (#134, #72)#143
debpalash merged 1 commit into
mainfrom
feat/macos-notarization

Conversation

@debpalash

@debpalash debpalash commented May 29, 2026

Copy link
Copy Markdown
Owner

Addresses the macOS "OmniVoice Studio.app is damaged and can't be opened" reports (#134, #72) — which is Gatekeeper blocking an unsigned/un-notarised app, not actual corruption.

Two parts

  1. release.yml — pass APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_SIGNING_IDENTITY, APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_ID to tauri-action. It code-signs + notarizes the macOS bundle only when these repo secrets are set, and is a no-op (today's unsigned build) when they're absent. → safe to merge now; it activates the moment you add an Apple Developer ID cert.
  2. docs/install/macos.md — clarify the "damaged" message is Gatekeeper (not corruption), give the immediate xattr -cr + right-click→Open workarounds, and add a "For maintainers" table of the exact secrets to configure. Removed a stale "tracked for v0.4" line (versioning rule — everything's on v0.3.0). The in-app error→docs deeplink (GATEKEEPER_QUARANTINE) already points at the #gatekeeper-quarantine anchor.

What you need to do to get signed builds

Add the 6 repo secrets listed in docs/install/macos.md → For maintainers (needs a paid Apple Developer account, $99/yr). Until then, users on the unsigned build clear quarantine with xattr -cr.

Verification note

The signing path can't be exercised in CI without a real Apple cert; this PR wires it + degrades gracefully. The next tagged release with the secrets present is the real test. release.yml YAML validated.

Refs #134, #72.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Enabled macOS application signing and notarization for improved security, resolving Gatekeeper compatibility issues that display "damaged" application warnings.
  • Documentation

    • Enhanced macOS installation guide with improved guidance for Gatekeeper security warnings, providing clear explanations of quarantine behavior and two practical workarounds: using the xattr command or the right-click open method.

Review Change Stack

…maged" docs (#134, #72)

The unsigned DMG triggers macOS Gatekeeper's misleading "app is damaged" block
(#134, #72). Two parts:

- release.yml: pass APPLE_CERTIFICATE / _PASSWORD / APPLE_SIGNING_IDENTITY /
  APPLE_ID / APPLE_PASSWORD / APPLE_TEAM_ID to tauri-action. It signs +
  notarizes the macOS bundle when these repo secrets are set, and is a no-op
  (today's unsigned build) when they're absent — so this is safe to merge now
  and "activates" the moment the maintainer adds an Apple Developer cert.
- docs/install/macos.md: explain the "damaged" message is Gatekeeper (not
  corruption), give the `xattr -cr` + right-click→Open workarounds, and add a
  "For maintainers" table of the required secrets. Removed the stale "tracked
  for v0.4" line (versioning rule: everything's on v0.3.0).

The in-app error→docs deeplink (GATEKEEPER_QUARANTINE) already targets the
#gatekeeper-quarantine anchor.

Refs #134, #72.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This PR enables macOS Developer-ID signing and notarization for the Tauri release pipeline by wiring six Apple-related secrets into the build step, and updates installation documentation to clarify Gatekeeper quarantine behavior for end users and document the maintainer setup requirements.

Changes

macOS Notarization Support

Layer / File(s) Summary
Release workflow macOS signing inputs
.github/workflows/release.yml
Tauri release step environment extended with APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_SIGNING_IDENTITY, APPLE_ID, APPLE_PASSWORD, and APPLE_TEAM_ID sourced from repository secrets, enabling macOS app signing and notarization when those credentials are configured.
Gatekeeper and notarization documentation
docs/install/macos.md
Gatekeeper quarantine section rewritten to explain the "damaged and can't be opened" message, document the xattr -cr remediation and right-click open workaround, and replace version-specific notes with a detailed maintainer subsection covering release workflow wiring and all required GitHub secrets for enabling signed builds.

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is comprehensive with clear summary, detailed explanation of both changes, activation instructions, and verification notes; however it lacks the required template sections (Changes list, Type checkbox, Testing, and Checklist). Add the missing template sections: a bulleted Changes list, check the applicable Type (appears to be 'CI / Build' + 'Documentation'), describe testing approach, and complete the checklist items.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main changes: wiring macOS Developer-ID signing/notarization and documenting the Gatekeeper 'damaged app' issue fix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/macos-notarization

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

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps

greptile-apps Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR wires Apple Developer ID signing and notarization into the existing tauri-action step of the release workflow, and rewrites the macOS install docs to explain the Gatekeeper "damaged" error and how to clear it. The signing path is fully conditional — when the 6 Apple secrets are absent the workflow continues to produce the same unsigned build it does today.

  • release.yml: six APPLE_* env vars added to the tauri-action step; they resolve to empty strings when the secrets aren't configured in the repo, which tauri-action interprets as "skip signing" — no regression to current unsigned builds.
  • docs/install/macos.md: clarifies the Gatekeeper "damaged" error (not corruption), documents xattr -cr and right-click→Open workarounds, and adds a "For maintainers" table of the exact secrets needed to enable notarized releases; removes the stale "tracked for v0.4" deferral per project conventions.

Confidence Score: 4/5

Safe to merge — the workflow change is additive and degrades gracefully to the existing unsigned build when Apple secrets are absent. The only concrete defect is in the docs.

The release workflow change is correct and conservative: empty secret values skip signing entirely, so there is no regression to current builds. The documentation rewrite is clear and well-structured, but it tells users to look for a *.dmg.sha256 checksum file that doesn't exist — the release workflow uploads SHA256SUMS-macOS Apple Silicon.txt. A user trying to verify their DMG before clearing quarantine (a security-conscious step the docs actively encourages) will come up empty and may either skip verification or get confused.

docs/install/macos.md — the checksum filename in the verification instruction doesn't match the actual release artifact name.

Important Files Changed

Filename Overview
.github/workflows/release.yml Adds 6 Apple signing/notarization env vars to the tauri-action step; correctly degrades to unsigned builds when secrets are absent (empty-string semantics in GH Actions), and is no-op on Windows/Linux matrix legs.
docs/install/macos.md Rewrites the Gatekeeper section to clarify the "damaged" message, adds xattr + right-click workarounds, and documents the 6 required repo secrets for maintainers; carries forward an inaccurate checksum filename (*.dmg.sha256) that doesn't match what the release workflow actually uploads (SHA256SUMS-.txt).

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Tag push / workflow_dispatch] --> B[tauri-action runs on macos-14]
    B --> C{APPLE_CERTIFICATE\nnon-empty?}
    C -- Yes\n6 secrets configured --> D[Import .p12 to keychain\nSign .app + .dmg\nNotarize via notarytool]
    C -- No\nsecrets absent / empty --> E[Build unsigned .app + .dmg\ntoday's behavior]
    D --> F[Signed + notarized DMG\nOpens without quarantine warning]
    E --> G[Unsigned DMG\nGatekeeper blocks launch]
    G --> H[User workaround:\nxattr -cr or right-click Open]
    F --> I[macOS installer smoke test\nRuns backend --health-check\nvia hdiutil attach]
    E --> I
Loading

Fix All in Claude Code

Reviews (1): Last reviewed commit: "feat(macos): wire Developer-ID signing +..." | Re-trigger Greptile

Comment thread docs/install/macos.md
Comment on lines +59 to +62
That clears the quarantine xattr so Gatekeeper stops blocking the launch — a
one-time fix per install. Alternatively, right-click the app → **Open** →
**Open** in the dialog. The app is open source; verify the SHA-256 against the
`*.dmg.sha256` checksum on the release page first if you want belt-and-braces.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Checksum filename doesn't match what the release workflow produces

The release workflow uploads checksum files named SHA256SUMS-macOS Apple Silicon.txt, not *.dmg.sha256. A user following this instruction to verify their download before clearing quarantine won't find any file matching *.dmg.sha256 in the release assets.

Suggested change
That clears the quarantine xattr so Gatekeeper stops blocking the launch — a
one-time fix per install. Alternatively, right-click the app → **Open**
**Open** in the dialog. The app is open source; verify the SHA-256 against the
`*.dmg.sha256` checksum on the release page first if you want belt-and-braces.
That clears the quarantine xattr so Gatekeeper stops blocking the launch — a
one-time fix per install. Alternatively, right-click the app → **Open**
**Open** in the dialog. The app is open source; verify the SHA-256 against the
`SHA256SUMS-macOS Apple Silicon.txt` file on the release page first if you want belt-and-braces.

Fix in Claude Code

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 363-368: The Apple signing secrets (APPLE_CERTIFICATE,
APPLE_CERTIFICATE_PASSWORD, APPLE_SIGNING_IDENTITY, APPLE_ID, APPLE_PASSWORD,
APPLE_TEAM_ID) are currently set globally for every matrix run; move these env
entries out of the shared/global env block and scope them only to the macOS
runner by adding them to the macOS job or the matrix entry that runs on macOS
(e.g., the job with runs-on: macos-latest or the matrix item for macOS), or
conditionally attach them with a matrix/os == 'macos' conditional so only the
macOS leg receives the APPLE_* secrets.

In `@docs/install/macos.md`:
- Around line 61-62: Update the sentence that currently references the
nonexistent `*.dmg.sha256` checksum artifact to point to the actual release
asset `SHA256SUMS-*.txt` (or the exact per-platform filename), e.g. replace the
`*.dmg.sha256` token in the line containing "Open in the dialog. The app is open
source; verify the SHA-256 against the `*.dmg.sha256` checksum on the release
page first..." with `SHA256SUMS-*.txt` (or add guidance to check the
`SHA256SUMS` attachment) so readers are directed to the correct checksum file.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: bd8d2407-083b-4dcb-b879-4e1b33eb9eac

📥 Commits

Reviewing files that changed from the base of the PR and between c37a932 and 992b2b8.

📒 Files selected for processing (2)
  • .github/workflows/release.yml
  • docs/install/macos.md

Comment on lines +363 to +368
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Scope the Apple signing secrets to the macOS leg only.

Lines 363-368 inject the Developer ID / notarization credentials into every matrix run, even though only the macOS build can use them. That unnecessarily widens secret exposure to the Windows/Linux runners and all tooling invoked on those legs.

Suggested shape
-      - name: Build + release (Tauri)
+      - name: Build + release (Tauri, macOS)
+        if: runner.os == 'macOS'
         uses: tauri-apps/tauri-action@v0
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
           TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
           TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
           APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
           APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
           APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
           APPLE_ID: ${{ secrets.APPLE_ID }}
           APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
           APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
           APPIMAGE_EXTRACT_AND_RUN: 1
         with:
           projectPath: frontend
           args: --target ${{ matrix.rust_target }} --bundles ${{ matrix.bundles }}
           ...

+      - name: Build + release (Tauri, non-macOS)
+        if: runner.os != 'macOS'
+        uses: tauri-apps/tauri-action@v0
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
+          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
+          APPIMAGE_EXTRACT_AND_RUN: 1
+        with:
+          projectPath: frontend
+          args: --target ${{ matrix.rust_target }} --bundles ${{ matrix.bundles }}
+          ...
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 363 - 368, The Apple signing
secrets (APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_SIGNING_IDENTITY,
APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_ID) are currently set globally for every
matrix run; move these env entries out of the shared/global env block and scope
them only to the macOS runner by adding them to the macOS job or the matrix
entry that runs on macOS (e.g., the job with runs-on: macos-latest or the matrix
item for macOS), or conditionally attach them with a matrix/os == 'macos'
conditional so only the macOS leg receives the APPLE_* secrets.

Comment thread docs/install/macos.md
Comment on lines +61 to +62
**Open** in the dialog. The app is open source; verify the SHA-256 against the
`*.dmg.sha256` checksum on the release page first if you want belt-and-braces.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Reference the actual checksum artifact name.

The release workflow uploads SHA256SUMS-*.txt, not *.dmg.sha256, so users following this text will look for an asset that doesn't exist. Please point them to the SHA256SUMS attachment (or the exact per-platform filename) instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/install/macos.md` around lines 61 - 62, Update the sentence that
currently references the nonexistent `*.dmg.sha256` checksum artifact to point
to the actual release asset `SHA256SUMS-*.txt` (or the exact per-platform
filename), e.g. replace the `*.dmg.sha256` token in the line containing "Open in
the dialog. The app is open source; verify the SHA-256 against the
`*.dmg.sha256` checksum on the release page first..." with `SHA256SUMS-*.txt`
(or add guidance to check the `SHA256SUMS` attachment) so readers are directed
to the correct checksum file.

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.

1 participant