Replay 0.9.6
Download
Replay-0.9.6.zip — unzip it and drag Replay.app to Applications.
Running 0.9.3 or newer already? Settings ▸ About ▸ Check for updates will offer this one and
install it for you, checking it against the SHA-256 published beside the zip. A Homebrew copy
is left to brew upgrade, as it should be.
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:
- Try to open Replay once and dismiss the warning.
- Go to System Settings ▸ Privacy & Security, scroll down, click Open Anyway.
- 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.appRight-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 readerA 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.
Added
-
A travelling border while an update installs. The one moving border in the app, on the
one stretch where Replay is working on something you should not interrupt and cannot be told
how long it will take. Built here rather than taken from a package — CLAUDE.md forbids
dependencies, and the effect is thirty lines. Off entirely under Reduce Motion. -
Pausing can end by itself. "Pause for…" in the menu bar offers 15 minutes, an hour, or
until tomorrow, and recording comes back on its own — including after a quit or a night
asleep, because a timed pause is a promise about a span of time rather than about this
process. The menu bar and Settings ▸ Privacy both say when it ends. Pausing with no end is
still there and still indefinite; the problem this fixes is not pausing, it is forgetting. -
After an update, Replay says what you got. The updater replaces the bundle and restarts,
so "after the update" is really the next launch — and until now that launch said nothing at
all. It now compares the version it is running against the one that ran last time and, if it
is newer, answers in one of two ways.- You pressed Update: the What's New window opens by itself. You asked a question thirty
seconds ago, the app disappeared and came back, and this is the answer. - It arrived some other way —
brew upgrade, a bundle dragged into place — a banner in
the same slot the update offer uses: "Updated to Replay 0.9.6", a What's New button and
a dismiss ✕. Nobody is waiting on an answer, so nothing takes the screen. SPEC §8's "never
interrupt" is exactly this distinction. - A downgrade says nothing: putting an older copy back is deliberate, and announcing the
release somebody just escaped would be the app arguing with them. - The note is true for one launch and remembers nothing. Read or dismissed, it is gone.
- You pressed Update: the What's New window opens by itself. You asked a question thirty
Fixed
- Replay Story moved in lurches. Each stop ran three movements where it should run one: a
flight that started at full speed, a lean toward the next stop, and another flight that
started at full speed. It arrived, stopped, crept, stopped and jerked away — two stops and a
lurch per hop. The lean was this port's own idea and has gone; the dwell is still, and a
hop now eases at both ends, because it begins from a camera at rest and nobody asked for it
in the instant it happens. The reference's timings are untouched and still contract-checked. - Compacting no longer freezes the window.
VACUUMran on the app's own connection, on
the main actor, wrapped indefer { busy = false }— so "Compacting…" could never draw a
frame and the window simply stopped answering for the length of a whole-file rewrite. It runs
on its own connection now, off the main actor, with recording paused around it so no tracker
write meets an exclusive lock. Importing a backup is still synchronous; it is seconds rather
than tens of seconds, and it is on the backlog. - A pinned ambient screen switched auto-start off. The idle watch refused to raise anything
while any display was open, so ambient mode left running on a second monitor stopped the
screensaver ever arriving on the screen you work on. The guard is about the screen now: two
displays on one screen is what it was for, and two displays on two screens is the setup. - The timeline beside the Canvas now travels with the story. It stayed on whatever was
selected when the story began, so a story was a camera moving through one memory beside a
list describing another — the Glaze version keeps the two in step, and now so does this.