Skip to content

Publish the app as a release zip for a Homebrew cask - #2

Merged
Criseda merged 1 commit into
mainfrom
worktree-homebrew-release
Oct 15, 2026
Merged

Criseda merged 1 commit into
mainfrom
worktree-homebrew-release

Conversation

@Criseda

@Criseda Criseda commented Oct 15, 2026

Copy link
Copy Markdown
Owner

Without a paid Apple developer account the app can't be notarized, so the official homebrew/cask tap won't take it. This adds the release side of a personal tap, Criseda/homebrew-tap, which serves the netscanner formula (the ns CLI) and the netscanner-app cask.

Changes

  • Scripts/package-release.sh: builds the Release app (ad-hoc signed, as before), checks the signatures of the app and the embedded ns, and zips the app with ditto into build/release/NetScanner-<version>.zip. It prints the zip's SHA-256 for the cask.
  • .github/workflows/release.yml: runs when a v* tag is pushed. It fails if the tag doesn't match MARKETING_VERSION or if CHANGELOG.md has no ## <version> section. Otherwise it runs the package tests, builds the zip and publishes a GitHub release. The notes are that CHANGELOG section plus the zip's SHA-256.
  • README gets an Install section. AGENTS.md's Distribution section now describes this flow and the later Developer ID path. CHANGELOG has a new entry.

Testing

  • Scripts/package-release.sh built a universal app (x86_64 + arm64). The app and Contents/Helpers/ns are ad-hoc signed with the hardened runtime and pass codesign --verify --strict. ns keeps the identifier io.github.criseda.netscanner.
  • Installed that zip through the tap's cask, with its URL temporarily pointed at the local file. It installs to /Applications. The app has the quarantine attribute and Gatekeeper rejects it, as expected, so the cask's caveat explains Open Anyway and xattr -dr com.apple.quarantine. With the attribute cleared, the bundled ns runs.
  • actionlint is clean, and the CHANGELOG section extraction was checked against a ## 0.1.0 heading.
  • The workflow itself has not run yet. It runs on the first tag.

To release v0.1.0 after merging

  1. Rename ## Unreleased to ## 0.1.0 in CHANGELOG.md.
  2. Push the tag v0.1.0.
  3. Copy the SHA-256 from the release notes into the tap's cask.

Without a paid developer account the app cannot be notarized, so the
official homebrew/cask tap is out; Criseda/homebrew-tap serves it
instead. A v<version> tag now builds the ad-hoc signed Release app,
zips it with ditto and publishes it with that version's CHANGELOG
section and the zip's SHA-256 for the cask.
@Criseda
Criseda merged commit 4a10b88 into main Oct 15, 2026
1 check passed
@Criseda
Criseda deleted the worktree-homebrew-release branch October 15, 2026 12:55
@Criseda Criseda mentioned this pull request Oct 15, 2026
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