Skip to content

Replay 0.9.7

Choose a tag to compare

@github-actions github-actions released this 29 Jul 14:12
· 57 commits to main since this release

Download

Replay-0.9.7.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:

  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.


Added

  • Replay can be read in another language, and there is now a way to translate it.
    Settings ▸ General ▸ Language, listing only the languages this build actually carries —
    and the switch takes effect immediately rather than at the next launch.
  • A translation kit, because the two things that translate text — a person and a service —
    both want a table, and neither wants a .strings file. node tools/translate.mjs new fr
    writes translations/fr.csv, a service or a translator fills the second column, build fr
    turns it into the catalogue that ships. Re-running new keeps what is already translated
    and adds rows for anything the app has gained since. status says how far each language is.
    Instructions, including what a translator needs to know about %@, are in
    docs/TRANSLATING.md.
  • A language ships only when it is complete. build refuses below 100% unless --partial
    is passed: an .lproj tells macOS "Replay speaks this", and a Mac set to it would then show
    translated and English lines mixed with no way to tell which is which.
  • Uzbek, complete — all 423 strings, so it ships without --partial. It is machine-made
    and wants a native reader: corrections belong in translations/uz.csv, and rebuilding is one
    command. Twelve more languages are scaffolded and empty, ready for a service or a person.

Fixed

  • Swift unicode escapes were being carried into the table as text. Three of the longest
    strings in the app contain \u{2019} in the source; the extractor took them literally, so
    those keys could never have matched the string the app actually looks up. Found by
    translating them — nothing else would have.
  • The sidebar was never translatable, and no audit could have said so: its names arrive as
    Navigation.Surface.rawValue, and tools/strings-audit.mjs looks for literals. The most
    visible column in the app was English in every language while the audit read clean. It goes
    through Loc now, and the extractor knows about the helpers that take copy as an argument.