Skip to content

feat: ship a .dmg alongside the macOS zip - #63

Merged
IAmJSD merged 1 commit into
mainfrom
feat/macos-dmg
Aug 28, 2026
Merged

feat: ship a .dmg alongside the macOS zip#63
IAmJSD merged 1 commit into
mainfrom
feat/macos-dmg

Conversation

@IAmJSD

@IAmJSD IAmJSD commented Aug 28, 2026

Copy link
Copy Markdown
Member

The zip is what CI could upload safely, so it became what people downloaded -- and a zip of an .app leaves them dragging it into /Applications themselves, if they think to. Build a disk image from the finished bundle instead: the app and a symlink to /Applications, which is the install everyone already knows.

Built after stapling, from the bundle rather than a rebuild, so whatever signing happened is already inside it -- and copied with ditto, the only copy that carries a bundle's symlinks and extended attributes across without voiding the signature.

The image is signed and notarized in its own right, not just for what it carries: Gatekeeper assesses the .dmg when it is opened, before anything inside it has been looked at. Unlike the flat MCP binary a .dmg takes a stapled ticket, so stapler staple is also the check on the submission -- it fails on a rejected image rather than passing quietly, and needs no grep through the notarytool log.

The zip stays: it is still what anything that unpacks a download itself wants. The release workflow needed no change -- it uploads dist/* and its rm -rf dist/Schist.app still leaves the image alone.

Claude-Session: https://claude.ai/code/session_0197wHPNr9Kf1DwXTDkuMJaB

The zip is what CI could upload safely, so it became what people
downloaded -- and a zip of an .app leaves them dragging it into
/Applications themselves, if they think to. Build a disk image from the
finished bundle instead: the app and a symlink to /Applications, which is
the install everyone already knows.

Built after stapling, from the bundle rather than a rebuild, so whatever
signing happened is already inside it -- and copied with ditto, the only
copy that carries a bundle's symlinks and extended attributes across
without voiding the signature.

The image is signed and notarized in its own right, not just for what it
carries: Gatekeeper assesses the .dmg when it is opened, before anything
inside it has been looked at. Unlike the flat MCP binary a .dmg takes a
stapled ticket, so `stapler staple` is also the check on the submission
-- it fails on a rejected image rather than passing quietly, and needs no
grep through the notarytool log.

The zip stays: it is still what anything that unpacks a download itself
wants. The release workflow needed no change -- it uploads dist/* and its
`rm -rf dist/Schist.app` still leaves the image alone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0197wHPNr9Kf1DwXTDkuMJaB
@IAmJSD
IAmJSD merged commit 0eac9a6 into main Aug 28, 2026
0 of 3 checks passed
@IAmJSD
IAmJSD deleted the feat/macos-dmg branch August 28, 2026 19:24
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