Skip to content

feat: ship unsigned macOS app bundles via the curl installer#78

Merged
ElbertePlinio merged 2 commits into
mainfrom
feat/macos-packaging
Jul 24, 2026
Merged

feat: ship unsigned macOS app bundles via the curl installer#78
ElbertePlinio merged 2 commits into
mainfrom
feat/macos-packaging

Conversation

@ElbertePlinio

Copy link
Copy Markdown
Member

Closes the final PR 6 slice of #66 (re-scoped: no Apple Developer ID — unsigned distribution). Fixes #57.

What

  • install.sh: Darwin support — installs PickScribe.app into ~/Applications and an argument-forwarding pickscribe-app wrapper into ~/.local/bin (no sudo, curl downloads carry no Gatekeeper quarantine; defensive xattr -dr for manually-downloaded archives). Bash-3.2/POSIX portable (fixes install.sh: bash 3.2 syntax error at line 154 (';;') #57). Hardened per review: destination identity check before replacement, transactional backup/restore with signal-safe cleanup, GitHub-host allowlist + HTTPS-only transports, pre-extraction archive member validation.
  • release.yml: split into build-linux + build-macos (macos-15, --bundles app, Tauri updater minisign artifacts PickScribe_<ver>_aarch64.app.tar.gz + .sig) + a release job generating a combined latest.json (linux-x86_64 + darwin-aarch64). Least-privilege permissions (contents: write only on the release job), aligned artifact actions, stale post-fix-appimage tarballs dropped.
  • platform.rs: macOS → ShipsNow, no blockers; summary documents the unsigned posture.
  • Docs: README status/table/install sections, UNRELEASED entry.
  • Tests: installer smoke now covers macOS install, wrapper arg-forwarding, idempotent update with real replacement assertion, hermetic Intel rejection + Rosetta-positive (fake sysctl), and quoted-HOME wrappers.

Review

Serious-backend panel (3 reviewers, distinct profiles) + targeted fix-verification: clean at HEAD. Deferred hardening filed as #76 (installer minisign verification) and #77 (SHA-pinned actions).

Validation

sh -n clean under /bin/sh (bash 3.2), bun run test 42/42 (8 installer smoke scenarios), cargo test 140 pass, cargo check clean, shellcheck + actionlint pass. Local tauri build --bundles app produces an ad-hoc-signed PickScribe.app; synthetic release set verified a combined two-platform latest.json. Full updater E2E lands with the next tag.

🤖 Generated with Claude Code

Apply review findings from the #66 PR 6 panel: verify the destination is a
real PickScribe bundle before replacement; stage, back up, and restore the
previous app on failure; restrict release-asset downloads to GitHub hosts
over HTTPS-only transports; validate archive members before extraction;
scope workflow permissions to the release job; align artifact action
versions; stop shipping stale post-fix-appimage tarballs; make installer
smokes hermetic (fake sysctl) and cover Rosetta, binary replacement, and
quoted home paths.
@ElbertePlinio
ElbertePlinio merged commit 09a8c25 into main Jul 24, 2026
4 checks passed
@ElbertePlinio
ElbertePlinio deleted the feat/macos-packaging branch July 24, 2026 14:55
@ElbertePlinio ElbertePlinio mentioned this pull request Jul 24, 2026
11 tasks
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.

install.sh: bash 3.2 syntax error at line 154 (';;')

1 participant