Skip to content

Belay 1.2.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 08:35
· 290 commits to main since this release

Everything the direct build gained since 1.1.0.

Added

A "What's New" screen. Shown once, on the first launch after an update, in
the same window as the welcome screen: same width, same margins, same lit panel,
same single button. Three to five things get an icon and a sentence; everything
else real gets one line under "Also", which is what keeps a release with ten
changes in it from becoming a wall of icons.

Items are channel-aware. Update Now and Homebrew are direct-build facts, and
the App Store build is shown neither, for the same reason Precise Detection came
out of the store listing: a screen must not promise what its build cannot do.

The rule that decides who sees it is WhatsNewDecision, which is pure and has a
test per branch. The case that needed the most care is the quiet one: everybody
already running Belay has no record of a last-seen version, and reading that as
"new install" would announce this release to people who have been running it for
months. They are recorded silently instead and told nothing.

The window has no scroll view. A ScrollView has no height of its own to
report, so a window sized from its content clips the last item mid-sentence,
which is what the first two attempts did. The window grows with the list, and
the number of items that can reach it is capped at six, which bounds the height
where it can be reasoned about rather than hoped about.

Belay installs its own updates. The update row is one button: Check Now
when there is nothing to install, and a green Update Now when there is.
Pressing it downloads the new version, checks it against the signing key
compiled into the running app, replaces the app and offers to relaunch. Sparkle
does that part; nothing here reimplements it.

The right-click menu carries the same job: Check for Updates until there is
one, then Update Now (v1.3.0) naming the version, so the row says what
pressing it will get you.

Updating in place begins with this version and cannot reach back. Sparkle
refuses an update whose app carries no signing key when the running one does,
correctly, and 1.0.0 and 1.1.0 shipped before the key existed. Anyone on those
updates by hand or through Homebrew once, and never again after that.

Folders are remembered. A folder picked for a generic target is kept as a
security-scoped bookmark, one per folder, so the sandboxed build can read it at
all and can still read it after a relaunch.

Homebrew. brew install --cask belay.

Changed

The paused mark is part of the icon rather than a badge on it. Two bars are
cut out of the big star, with no circle and no border. It was a badge in the
corner before, and a strike through the mark before that: the strike said
forbidden, which is wrong, and at 17 points a bordered circle reads as a
notification dot.

"Skip for now" is drawn, not borrowed. A bordered system button looked like
a different app's control on macOS 15, beside a button that is drawn. It now
shares the primary button's measurements exactly.

The licence. MIT until 1.1.0, and the Belay Source-Available Licence from
here: forking and using are free, selling is not, and attribution is required.

Fixed

Quitting did not release the hold. shutdown release timed out appeared in
the log on every quit: a @MainActor type blocked the main thread on a
semaphore while waiting for work that needed the main actor to finish. The hold
outlived the app until its own two-minute timeout reaped it. Found on macOS 15
and fixed there.

The welcome window opened off-centre on macOS 15. Its size was read before
AppKit had laid it out, so the centring arithmetic ran against a size of zero
and put the window's corner in the middle of the screen. It is sized from the
hosting controller's fitting size now, which does not depend on when a layout
pass happens.

The disk image showed its own hidden files when Finder was set to show them.

Verifying this download

shasum -a 256 Belay-1.2.0.dmg
bbfd7380755c9eaf850aa6aa8b3100816995fee8634edde85ec5c0cdf5eb3429  Belay-1.2.0.dmg

The DMG is signed with Developer ID and carries a stapled notarization ticket.
spctl -a -t open --context context:primary-signature Belay-1.2.0.dmg should accept it offline.