Skip to content

Replay 0.9.2

Choose a tag to compare

@github-actions github-actions released this 28 Jul 19:03
· 76 commits to main since this release

Download

Replay-0.9.2.zip — unzip it and drag Replay.app to Applications.

macOS will refuse to open it the first time. Here is why, and what to do.

Replay has no Apple Developer ID yet, so macOS marks it as unverified and shows
"Apple could not verify Replay is free of malware" — offering only Move to
Trash
or Cancel. That message is about a missing certificate, not about
anything found in the app
. Every unsigned app gets it.

To open it:

  1. Try to open Replay once and dismiss the warning.
  2. Go to System Settings ▸ Privacy & Security, scroll down, click Open Anyway.
  3. Confirm. It opens normally from then on.

Or one line in a terminal, which does the same thing:

xattr -dr com.apple.quarantine /Applications/Replay.app

Right-click ▸ Open does not work. That bypass existed for years and Apple
removed it in macOS 15. It is still the advice in most projects' READMEs.

Or skip all of that

Homebrew compiles it on your machine, so it is never downloaded, never quarantined,
and opens with no warning at all:

brew tap nurkamol/tap
brew install nurkamol/tap/replay-app    # the application
brew install nurkamol/tap/replay        # the command-line reader

A signed, notarised disk image — no warnings, nothing to click through — appears
here the day there is a certificate. The workflow that builds it is already written.


0.9.1 shipped an app that would not open. This is that fixed, and the check that should
have caught it.

Fixed

  • The app died on launch if it could not find its strings catalogue. Bundle.module calls
    fatalError when the bundle is missing, and Loc reached for it on a path that runs during
    startup. Every other path in Loc degrades to English by design — a missing .lproj, an
    unreadable table, a key nobody has translated — and missing the whole catalogue should
    degrade the same way rather than take the app down. It resolves the bundle by hand now and
    gives up quietly.
  • How it got through, because that is the useful part. The resource bundle has two shapes:
    SwiftPM's native build produces a flat one with Info.plist at the root, Xcode's produces
    a deep one with Contents/Resources/. Every local build was deep and worked; the release
    was built flat and did not. No test sees either — they run where the bundle is always found.
    951 contract checks, 115 behaviour cases and four audits all passed on a build nobody could
    open.
  • The release workflow now runs the app it is about to publish and fails if it exits on
    its own. The only way to catch this class of failure is to launch the artefact.