Releases: Timtam/rabbit
Release list
v0.4.1
Added
-
Accepting a RABBIT update now opens a progress window instead of leaving
you watching a status line: it names the phase ("Downloading RABBIT…
4.1 MB of 10.2 MB"), fills a progress bar as the bytes arrive, and keeps
a running log of each step as it completes, so a screen reader can be
walked back through what happened. The bar covers the download, the
checksum verification and the install, and the window closes on its own
when RABBIT relaunches into the new version. It has no Cancel button on
purpose — once the file swap starts there is nothing to safely undo — and
it can't be dismissed by mistake with Escape. -
The "RABBIT update available" prompt now answers "what would I be
updating to?" before you decide: alongside the question it shows the
release notes for the update, in a read-only box you can read through
and scroll like the package details pane. The notes cover every release
published since the version you are running, not just the newest one, so
skipping a couple of updates still tells the whole story. Update now is
the default button, so Enter accepts from anywhere in the dialog and
Escape declines. When the notes can't be fetched — no network, GitHub
down — the prompt falls back to the short question it has always asked,
since nothing about the notes should stand between you and an update.
rabbit self-update checkprints the same notes. Release notes are also
stripped of their Markdown wherever they are shown, RABBIT's own and
ReaPack's alike — headings, bold, inline code and links now read as the
words they contain rather than as strings of asterisks, hashes and
backticks spoken out loud. Underscores are left alone, since in these
notes they are far more often part of a name you need to hear exactly
(depends_on) than emphasis, and a link's address is dropped while the
text you would have clicked is kept. -
A French REAPER language pack joins the Spanish and German ones, so
REAPER and the SWS extension speak French too. It is maintained by Lee
Julien and Pierre-Marie Curt for ReaperAccessible, the French
screen-reader community. RABBIT installs it asfr_CA.ReaperLangPack,
the name that makes OSARA load its own French translation — thefr_CA
one, which is all but complete where OSARA'sfr_FRtranslation still
leaves about a third of its messages in English. Unlike the other two
packs, this one is published with a version number, which RABBIT reads
from ReaperAccessible's ReaPack index and shows in the wizard.
Changed
-
A language pack you turn down stays turned down. RABBIT ticks the pack
matching its own language for you, which is right for most people and was
wrong for anyone who doesn't want it: unticking it lasted exactly one run,
and the pack came back ticked on the next launch. That refusal is now
remembered in the install receipt, so the pack stays listed and tickable
but is not ticked for you again — including its updates, so a pack you
installed and later stopped using stops re-offering itself every time the
translators publish a fix. A pack that is merely installed and up to date
is not a refusal: it sits unticked because there is nothing to do, and
RABBIT reads that as silence rather than a decision. Tick it yourself and
the refusal is forgotten, so a change of mind sticks too. The memory is
per REAPER install, so you can say no on one and yes on another, and
packages opt
into this through a newremember_opt_outmanifest flag — only the
language packs set it, because they are the ones RABBIT turns on by
guessing. Receipts stay readable by older RABBITs, which simply ignore the
new field. -
The wizard no longer grows a "Set REAPER's language to X" configuration
step for every language it supports. There is one Set REAPER's
language step, and which pack it activates comes from a REAPER
language after installation dropdown listing the packs you ticked — one
decision instead of a row per language, and two translated strings rather
than two per language. On the command line the step id is now
set-reaper-language(it wasset-reaper-language-<language>), and
--reaper-language <package>picks which pack to activate. An unknown
package there is now rejected with the list of language packs rather than
quietly leaving REAPER in English. -
Set REAPER's language is now tied to the language packs you tick.
With none ticked the step is greyed out rather than tickable — the
"REAPER language after installation" dropdown lists exactly the packs you
ticked, so an unticked list left the step pointing at nothing. Tick a
pack and the step ticks itself, ready to be unticked if you want the
files without the switch; untick the last pack and the step clears
itself. A pack merely sitting on disk from an earlier run doesn't arm it:
someone who keeps a German pack installed but runs REAPER in English
chose English, and a run that installs nothing language-related must not
switch the interface out from under them.rabbit setupfollows the same
rule for its defaults, while--config-step set-reaper-languagestill
activates an already-installed pack for people who want exactly that. -
RABBIT <command> --helpnow explains every flag. 47 of the 50 printed
nothing but their own name, which made RABBIT's own advice — "run
--helpfor anything not covered here" — worth very little.
--accept-reapack-donation-noticewas the sharp edge: ReaPack cannot be
installed unattended without it, and neither the help nor the README said
so, which simply reads as a broken install. The README also gains that
example, a Spanish-variant one, and a short tour of the flags most likely
to be wanted.
Fixed
-
On macOS and Linux, ticking a package on the row that already had focus
(Space, or clicking its checkbox) left every control below the package
list stale: the OSARA keymap note, the Spanish translation picker and the
new REAPER-language dropdown only refreshed when the selection changed.
Arrow onto a row and press Space and nothing below the list caught up.
Windows was unaffected — it refreshes them on every toggle route. -
On macOS and Linux, the Configuration group checkbox could be ticked
but never unticked, and always drew as unchecked, as soon as one of its
steps was already applied at the target — which is the normal case, since
an existing ReaPack remote counts as applied. It counted already-applied
steps as unticked members of the group, so "all ticked" was never true. -
Installing a language pack no longer deletes the other ones. RABBIT
treated language packs as mutually exclusive and removed the previously
installed pack, which was simply wrong: REAPER keeps every pack in its
LangPackfolder and only activates one, so a multilingual user can
install German and Spanish and switch between them in REAPER whenever
they like. Packs now sit side by side; the only file RABBIT still
replaces is the one it installed for that same pack, such as when you
switch between the two Spanish translations. -
A failed REAPER install no longer reports itself as a confusing language
error. If REAPER can't be installed, the language pack that depends on it
is correctly skipped — but the step that sets REAPER's language ran
anyway and failed the whole run with "cannot set REAPER's language: no
installed language-pack file is recorded for langpack-de", hiding the
real problem. Configuration steps now look at what actually landed on
disk rather than what was planned, so the genuine failure is what you
see; and if a language pack is missing for any other reason, setting the
language is skipped with an explanation instead of aborting the install. -
macOS: the app bundle now declares Spanish, so VoiceOver reads RABBIT's
Spanish interface with a Spanish voice instead of an English one. RABBIT
gained its Spanish translation in 0.4.0, but the bundle still advertised
only English, German, French and Italian — and macOS decides what language
an app speaks from that declaration.
v0.4.0
Added
- RABBIT can now install REAPER language packs, so REAPER itself speaks
your language rather than only RABBIT's wizard. Two are available to
start with, both of which also translate the SWS extension: Spanish,
maintained by Javier Robledo for the Spanish REAPER community, and
German, maintained by MrData in the REAPER Stash. The pack matching the
language RABBIT is running in is suggested and ticked for you (a Mexican
Spanish system gets the Spanish pack); packs for other languages are
listed but left unticked, and nothing is offered in English because
REAPER is already English. By default RABBIT also sets the pack as
REAPER's language, so you don't have to find it under Options,
Preferences, General — untick that step if you only want the file. Only
one language pack can be active, so installing one removes the previous
one RABBIT installed; a pack you put in theLangPackfolder yourself is
never touched. They appear under their own Language packs heading in
the package list. Language packs are published without version numbers,
so RABBIT identifies them by what the server reports about the file (its
ETag, or last-modified date and size, falling back to the file's
contents) and offers an update when the translator publishes a new one —
no RABBIT release needed. Spanish additionally offers a choice of OSARA
translation — REAPER Accesible español (the default) or Team PMA —
which OSARA picks up from the pack's file name. Choose it from the
Spanish OSARA translation dropdown on the packages page (or
--package-variant langpack-es=pmaon the command line); your choice is
remembered, so a later update keeps the translation you picked instead of
reverting to the default, and switching cleans up the old file. Suggested
by Carlos Esteban Martínez (#19). - RABBIT now speaks Spanish. The translation was contributed by Carlos
Esteban Martínez (#19) and is picked automatically on Spanish systems —
including regional variants, so an es-MX machine gets the Spanish UI —
or from the language picker at any time. - Windows: the wizard now adds a Microsoft Defender exclusion for RABBIT's
own download cache folder (%TEMP%\rabbit-cache) so freshly built,
low-prevalence — but code-signed — installers, chiefly OSARA's
development snapshots, aren't quarantined as false positives mid-install.
It's scoped to that one folder (never all of%TEMP%), added once under a
single administrator prompt, and skipped without prompting on later runs
once present. RABBIT never turns real-time protection off, and if the
prompt is declined or blocked by policy/Tamper Protection the install
proceeds anyway (a real block still shows the "allow it in Protection
history" guidance). The command-line tool is left untouched so it stays
non-interactive for unattended/CI use. - The packages page's details pane now answers "what's new?": REAPER and
SWS show the newest section of their official changelogs, ReaPack shows
its release notes, and OSARA shows the latest snapshots' list of changes
— the feed OSARA's own updater reads, lightly cleaned for listening
rather than reading: developer-facing "dev:" commits are skipped,
repeated chore lines are collapsed, and trailing GitHub issue/PR
references are stripped. The notes are fetched together with the online
version check under a localized heading; packages whose feeds carry no
real notes (rolling snapshot releases) don't declare a notes source, and
if notes can't be fetched the pane simply keeps its usual contents. (#4)
Changed
- The check for the latest versions now runs several packages at once
instead of one after another, so it finishes in roughly the time of the
slowest single check rather than the sum of all of them. The status line
reports "Checking versions… (3 of 11)" as they complete, so it keeps
moving even while a slow check is still running — previously a language
pack, whose check has to look at the file itself, could leave the
progress bar sitting still for several seconds. - A single package failing no longer aborts the whole install. RABBIT now
records the failure, keeps installing every other selected package, and
reports what succeeded and what failed at the end (the wizard's result
page shows "Finished with errors"; the CLI still exits non-zero). The one
exception is dependencies: packages install into REAPER, so if REAPER
itself fails, its extensions (OSARA, SWS, ReaPack, ReaKontrol, the JAWS
scripts, FFmpeg) are skipped with a "REAPER didn't install" note rather
than being installed into a broken or absent REAPER. Standalone extras
(Surge XT, app2clap) are unaffected by a REAPER failure. Dependencies are
declared per package in the manifest (depends_on), and a dependency
that isn't part of the current run (installing an extension into an
already-present REAPER) never gates anything. - macOS self-updates now replace the whole
RABBIT.appbundle with the
release's notarized bundle, instead of swapping just the executable inside
it. The app keeps its original Apple-verified (Developer ID + notarized)
signature across updates, so Gatekeeper stays satisfied without any
workarounds and macOS permission grants (such as Full Disk Access, which
are tied to the app's signature) survive updates instead of needing to be
granted again. The previous bundle is kept next to the app as
RABBIT.app.rabbit-oldfor manual rollback, and a renamed app keeps its
name. Requires an updater that already has this change, so the first
bundle-swap update is the one after this release; installs outside an
.appbundle and Windows keep the existing binary swap.
Fixed
- Windows: when antivirus software blocks a package, RABBIT now says so and
explains how to continue, instead of failing with a raw
"I/O error … (os error 225)". Microsoft Defender occasionally flags a
legitimately code-signed third-party installer it hasn't seen widely yet —
OSARA's development snapshots, rebuilt on every change, are the usual case —
and quarantines it mid-install. The new message states that this is
typically a false positive, that the installer is signed and RABBIT had
already verified the download against the publisher's checksum, and walks
through allowing the
item under Windows Security → Virus & threat protection → Protection
history (or excluding RABBIT's download folder, or installing that one
package by hand). The steps also appear in your own language on the
wizard's result page, and the README gained a matching section. RABBIT
does not, and will not, switch your virus protection off. - macOS: Cmd+Q (and the application menu's Quit item) now quits RABBIT.
The wizard installed no menu bar at all, so macOS had no functional
Quit item to offer and Cmd+Q was a dead key. RABBIT now installs a
minimal menu bar on macOS whose stock Quit item lands in the
application menu as usual; quitting this way behaves exactly like the
window's close button. - macOS: RABBIT no longer refuses to launch after a self-update. Updating
replaces the binary insideRABBIT.appand re-signs the bundle with a
local (ad-hoc) signature — but the bundle still carried the quarantine
marker from its original download, so on the next launch from Finder or
the Dock, Gatekeeper re-checked it, no longer found the notarized
signature it had originally approved, and blocked the app with "RABBIT
could not be opened" (the relaunch right after updating worked because it
bypasses that check). The self-update now clears the quarantine marker
from the whole bundle after re-signing, so subsequent launches work
normally. Anyone already affected can fix their copy by running
xattr -dr com.apple.quarantine /path/to/RABBIT.appin Terminal once (or
re-downloading the release). - Pressing Enter on the wizard's final Done page now activates Close.
Enter already triggered each step's primary button, but the Done page left
the disabled Next button as the default, so Enter did nothing there.
Close is now the default button on that page, and Enter is additionally
re-routed from the read-only summary and details text boxes — which
otherwise swallow the key — so it works from the control the screen reader
is parked on when the page opens. Enter still does nothing while an install
is running.
v0.3.2
Added
- RABBIT now writes a crash report when it crashes due to an internal error:
a small plain-text file (crash-<timestamp>.log) with the RABBIT version,
OS, the error and where it happened, saved right next to the RABBIT
executable — next to theRABBIT.appbundle on macOS — in keeping with
RABBIT being fully portable. If that location isn't writable (for example
RABBIT running from a read-only disk image), the report falls back to the
system temp folder asrabbit-crash-<timestamp>.log. When reporting a
crash, attaching that file makes diagnosing it much easier.
Fixed
- macOS: the app no longer crashes shortly after the first Next click, when
the online version check finishes and the wizard advances to the packages
page (a 0.3.1 regression: the screen-reader focus improvement selected the
package list's top row through an API that is only valid for flat lists,
not the tree the packages page uses, crashing the native macOS view; the
page now simply receives keyboard focus, which already starts reading at
the top).
v0.3.1
Added
- Two new ReaPack repository configuration steps from the REAPER
Accessible team: REAPER Accessible (EN) (reaperaccessible/rap_en,
English-language resources, recommended) and REAPER Accessible (FR)
(reaperaccessible/rap_fr, French-language resources, optional — offered
but not pre-selected, since its content is French-specific). Like the
existing REAPER Accessibility step, they're offered after install when
ReaPack is present and wire the repositories intoreapack.ini.
Changed
- Installations are faster: package downloads now run in parallel (up to
three at a time), and each package installs as soon as its own download
finishes instead of waiting for every download to complete. In a typical
setup, REAPER, OSARA, and SWS are already installed while FFmpeg's large
archive is still downloading. Installs themselves still run one at a
time and in the usual order, so nothing changes about elevation prompts
or the order packages land on disk. The progress page now tracks several
simultaneous downloads: the bar combines their progress, and the status
line summarizes them ("Downloading 3 packages…") while an install is not
running. If something fails partway through, packages that already
installed keep their receipts, so RABBIT still knows about them
afterwards.
Fixed
- After the online version check, the packages page now places screen-reader
focus on the top-most entry of the package list (the "Packages" group
header) instead of landing on an arbitrary row a few items down. Going
Back to the page still keeps your previous position. - Large downloads no longer fail on slow or briefly stalling servers.
Package downloads (and RABBIT's own self-update download) previously
inherited a 30-second network timeout, so a download whose connection
stalled for longer — routine for FFmpeg's ~390 MB archive from the busy
gyan.dev server — was aborted with a cryptic "I/O error … error decoding
response body" and took the whole installation with it. Downloads now
tolerate stalls of up to a minute, and an interrupted connection is
retried up to three times, resuming from the bytes already received when
the server supports it (verified so a resumed file can never mix two
different upstream versions) instead of starting over. If the connection
keeps dropping, the error now clearly names the download URL and suggests
checking the internet connection, rather than pointing at a temp file on
disk.
v0.3.0
Added
- app2clap (Windows only) — install and update support for jcsteh's
app2clap, a CLAP plug-in that captures audio from other applications into
REAPER (or any CLAP host). RABBIT tracks the rolling GitHubsnapshots
release, picks the highest-versioned build, and installsapp2clap.clap
into the per-user CLAP folder (%LOCALAPPDATA%\Programs\Common\CLAP), so no
administrator rights are needed. It appears under the new Additional
software group. Updates replace the existing copy (backing up the old one
first); a copy installed for a different REAPER target or by hand is detected
by file presence, with the version reported as unknown until RABBIT installs
it itself. Like Surge XT, it's disabled on portable REAPER targets — the CLAP
folder lives outside any portable REAPER folder. - French (fr-FR) UI translation. RABBIT now ships with English, German, and
French out of the box; the language picker lists Français (France) and the
OS-language auto-detection on first launch covers French locales (including
regional variants such as fr-CA, which map to fr-FR). - Italian (it-IT) UI translation. The language picker now lists Italiano
(Italia), it ships in the macOS app bundle, and OS-language auto-detection on
first launch covers Italian locales (anyit-*, which map to it-IT). - The wizard's primary action is now the window's default button, so pressing
Enter activates it from anywhere in the page (Next on the navigation steps,
Install on the review step) instead of only when a button already holds
focus. This matches the standard dialog convention on both macOS and Windows.
A disabled default button stays a no-op, so an invalid Target step or a
review step that can't install yet won't advance.
Changed
- The wizard's package list now groups packages into an Additional
software section, separate from the main Packages list, for extras
that aren't part of REAPER itself. Surge XT moves into this new group
(and future additional software like app2clap will land there too). Each
group has its own check-all header and aggregate state; the main Packages
group is unaffected. The new group is localized in all four UI languages
and only appears when at least one additional package is available for the
selected target. - REAPER updates no longer leave an unwanted desktop icon on Windows.
REAPER's silent installer always (re)creates a desktop shortcut, with no
switch to suppress it, so updating a REAPER whose icon you'd deleted put it
back. RABBIT now snapshots the desktop shortcuts before running the
installer and, once the install is confirmed, removes a REAPER shortcut the
installer freshly created — unless this is a brand-new standard install (the
one case a new icon is wanted) or an icon was already there (never touched).
Portable installs already create no shortcut, so this is a no-op for them.
Windows only; checks both the per-user and the all-users desktop, and only
removes aREAPER*.lnkthat appeared during the install. - A single unreachable upstream no longer blocks the entire update check.
Previously, when one latest-version provider failed (e.g. the SWS homepage
being down), the wizard stopped on the version-check page and the CLI's
latest/plan --onlinecommands aborted — even though every other
package could still be checked and updated. Now the check always completes
with whatever providers answered: in the wizard, each failed package's row
is disabled (unchecked, with a localized "online version check failed"
indicator) and a note with the full error appears in the review summary,
while all other packages keep their normal install/update flow. On the
CLI,latestprints resolved versions to stdout and per-package warnings
to stderr, andplan --onlinerecords each failure as a plan note. The
latest --jsonoutput shape changed accordingly: it is now an object with
packagesandfailuresarrays instead of a bare array.
Fixed
- A blocked plugin overwrite on macOS now explains how to fix it instead of
showing a bare "OS error 1". That error is EPERM ("operation not
permitted") and is not REAPER being open (that would be a different error
— RABBIT already handles it), so closing REAPER doesn't help; it's a macOS
permission/modification gate (App Management on Sonoma and later, an
immutable file flag, or ownership). When replacing an installed extension
such asreaper_kontrol.dylibfails with EPERM/EACCES, RABBIT now reports
that it's a permission block and points the user to grant RABBIT Full Disk
Access (or App Management) under System Settings → Privacy & Security, then
quit and relaunch — rather than leaving them with an opaque error.
Additionally, a new macOS preflight check catches this before downloading
and installing: it rehearses the write into theUserPluginsfolder
(creating and deleting a probe file, and renaming each already-installed
reaper_*plugin aside and back — non-destructively, the files are left
exactly as they were) and fails up front with the same guidance if the OS
denies it. macOS only; other failures and platforms are unchanged. - The "close REAPER before installing" preflight no longer fails open when
REAPER's process is running but its executable path can't be read. On
Windows that happens routinely — most often when REAPER is running elevated
while RABBIT is not (the OS denies the image-path query), or under some
antivirus — and RABBIT would detect thereaper.exeprocess by name but,
unable to match its (unknown) path to the install target, silently treat it
as a different REAPER and let the installer overwrite a running one. The
check is now fail-safe: a running REAPER whose path we can't read is treated
as the target and blocks the install (or warns, with the override on), so
the user is told to close REAPER instead of getting a corrupted update. A
REAPER with a readable, non-matching path is still correctly ignored. - Setup no longer fails with "stream did not contain valid UTF-8" when
reapack.iniisn't UTF-8-encoded. ReaPack writes its config through the
Win32 profile-string APIs, which use the active ANSI code page (or UTF-16
when the file carries a BOM), so a repository name with a single non-ASCII
character — e.g. a CP-1252 curly apostrophe — made RABBIT's strict UTF-8
read error out and abort the run's post-install configuration step, right
after all packages had installed successfully. RABBIT now decodes such
files losslessly (UTF-8, UTF-16 LE/BE with BOM, or byte-preserving ANSI),
edits them, and writes them back in their original encoding, so existing
bytes survive untouched and ReaPack still parses the file. The same
encoding-tolerant handling now coversreaper-kb.iniduring OSARA key-map
replacement, whose script names can carry ANSI bytes too. Reported in
issue #7.
v0.2.1
Added
- The wizard now auto-detects a portable REAPER sitting in RABBIT's own
folder. If you droprabbitnext to a portable REAPER (reaper.exe +
reaper.ini on Windows, aREAPER*.appbundle on macOS), that install is
discovered as a target and selected by default — so you can check for
updates straight away without going through the Browse button.
Changed
- macOS builds are now signed with an Apple Developer ID and notarized by
Apple (then stapled) when the release'sMACOS_*signing secrets are
configured. Gatekeeper trusts a notarized bundle on first launch, so the
download is just "unzip and double-clickRabbit.app" — the
Open Me First.commandquarantine helper is gone from signed builds. Forks
and credential-less builds still fall back to ad-hoc signing with the
helper. A new manualmacos-signing-smokeworkflow exercises and verifies
the full sign → notarize → staple path so it can be validated before a
release tag.
Fixed
- Elevated NSIS installers now receive their
/D=<path>install-directory
flag correctly, so packages whose vendor installer is NSIS land in the
REAPER folder RABBIT planned instead of NSIS's default
C:\Program Files\REAPER (x64)\.quote_onewas doubling every
backslash and wrapping the flag in double quotes, but NSIS reads/D=
straight fromGetCommandLine()and takes everything after it verbatim
to end-of-string — so the quoted path arrived with a trailing"baked
into the directory name (an invalid path). NSIS fell back to its default
location, and post-install verification at the planned path then
surfaced the installer's1223exit code as a hard error, leaving every
package after REAPER unprocessed./D=…arguments are now passed
unquoted and last as NSIS requires, and backslash escaping follows the
Windows command-line spec (only backslashes immediately before a"are
doubled). Windows only. Fixed in PR #6 by @trypsynth. - Self-update apply on macOS no longer leaves the swapped binary
non-executable. The staged source is the bare universal Mach-O off
the GitHub release, and HTTPS downloads strip Unix mode bits, so
fs::copypropagated a 0o644 mode ontoRabbit.app/Contents/MacOS/rabbit.
Finder then labelled the file "document" instead of "Unix executable"
and the bundle refused to launch — even thoughcodesign --force --deep
succeeded on it.swap_install_filenow re-asserts 0o755 on the
install target right after the copy, before the bundle re-sign step.
No-op on Windows. Reported in issue #5. - Self-update apply in the GUI now exits the old RABBIT process after
spawning the relaunched copy. Previously the swap completed and the
new version launched, but the pre-update window kept running next to
it because the apply callback never asked the wx event loop to shut
down. The relaunch path now mirrors the language-switch relaunch and
callsstd::process::exit(0)once the new process has been spawned;
the error path is unchanged so a failed spawn still leaves the
original window open. CLIapply --restartwas already correct.
v0.2.0
Added
-
New package: Surge XT, the free open-source hybrid synthesizer from
the Surge Synth Team. Opt-in,
Windows + macOS, standard REAPER installations only. RABBIT runs the
vendor installer (Inno Setup on Windows, productbuild-wrapped.pkg
on macOS) under elevation so the VST3, CLAP, AU (macOS) and standalone
formats land system-wide for REAPER and other DAWs to pick up. Tracks
the rolling nightly channel at
surge-synthesizer/surgereleases tagNightlyrather than the
stable 1.3.4 release (2024-08-11) — the project effectively ships
through nightlies now. Version detection layers aNIGHTLY-<date>-<sha>
token from the receipt over a Medium-confidence semver fallback read
from the vendor-installed VST3 bundle's file metadata. -
macOS elevation primitive in
rabbit-platform::elevation: wraps the
elevated command inosascript -e 'do shell script "…" with administrator privileges'so the system raises its native
AuthorizationServices dialog. First (and currently only) consumer is
the Surge XTMountDiskImageAndRunPkgInstallerrunner. -
New
PlannedExecutionKind::MountDiskImageAndRunPkgInstallerrunner:
mounts a.dmg, locates the inner.pkgvia a filename-suffix glob
matched against the mounted volume root, invokes/usr/sbin/installer -pkg <path> -target /under admin authorization, and detaches the
image whether the install succeeded or failed. -
Automatic ReaPack script-action preservation across OSARA key-map
replacement. Replacingreaper-kb.iniwithOSARA.ReaperKeyMap—
the default OSARA-recommended flow — drops everySCRline ReaPack
had registered through REAPER'sAddRemoveReaScriptAPI, so installed
ReaScripts disappear from REAPER's actions list until the user runs
"ReaPack: Synchronize packages" inside REAPER (or re-installs every
package). The unattended replacement path now reads the existing
reaper-kb.inifirst, captures all of itsSCRrecords, lets the
OSARA key map overwrite the file as before, then re-appends the
preserved lines using the written file's newline convention. Any
userKEYbinding that targeted one of those scripts keeps working —
REAPER derives the_RS<hex>action command ID deterministically
from the script path, so the re-appended SCR lines bind to the same
IDs the user already has in their key map. No opt-out: the
preservation always runs when the OSARA key map is replaced. -
Live per-package progress reporting on the wizard's Installation
progress page. The previous progress page set the gauge to 10 % when
install kicked off, then jumped straight to 100 % at the end —
everything in between was a black box even though packages like
REAPER's macOS dmg take ~30 MB of network transfer per install.
The setup pipeline now emits structuredProgressEvents
(DownloadStarted/DownloadProgress/DownloadCompleted/
InstallStarted/InstallCompleted/ConfigurationStarted/
ConfigurationCompleted) through an optionalProgressReporter
threaded down fromexecute_setup_operation_with_progressinto
download_artifacts_with_progressand
install_cached_artifacts_with_progress. The artifact downloader
swappedstd::io::copyfor a chunked read/write loop that emits a
byte-progress event every ~256 KiB or ~200 ms (whichever is rarer),
so the gauge moves smoothly during the REAPER dmg pull instead of
stalling. The wxdragon wizard forwards each event to the UI thread
viawxdragon::call_after: the gauge advances by a per-phase
fraction (weighted by completed downloads/installs plus the
in-flight byte fraction), the status label updates to "Downloading
REAPER… 12.4 MB / 30.0 MB", and a running log of completed
transitions appends to the progress details TextCtrl (screen
readers announce each new line as it lands). The no-progress
entry points (execute_setup_operation,
execute_resolved_setup_operation,download_artifacts,
install_cached_artifacts,execute_wizard_install) stay on
their existing signatures and delegate viaProgressReporter::noop,
so the CLI and existing tests are unaffected.
Fixed
-
Wizard startup detection no longer SHA-256-hashes every receipted
install file.verify_package_receiptused to verify each entry in
a package's receipt by hashing the on-disk file, which on Windows
meant 14 seconds of stalled UI just for FFmpeg (~200 MB of DLLs)
and ~1 second for REAPER on every wizard launch — plus another
round of the same after every install via the post-install rescan
hook. The receipt verifier now checks file existence and size only;
size mismatch alone catches every realistic regression the detection
layer cares about (partial overwrites, truncated files), and the
receipt's own stamped version is what gets shown either way.
Recording hashes during install is unchanged. -
FFmpeg version detection no longer freezes the wizard for tens of
seconds on Windows when an FFmpeg install is present. Probe 2
previously calledffmpeg.exe -versionviastd::process::Command
on the UI thread, which on Windows blocks for the entire AV scan of
FFmpeg's dozens of DLL dependencies — easily 20-30 s per launch on
a default-configured machine, and the same stall ran on the
post-install rescan after installing FFmpeg too. Probe 2 now scans
theffmpeg.exebinary for the contiguousshow_bannerformat
string anchored on the uniquethe FFmpeg developersliteral, and
pulls<VERSION>out between the trailingversiontoken and the
nextCopyrightmarker. That matches both the upstream FFmpeg
banner (%s version <VERSION>, Copyright (c) …) and the Gyan.dev
full-builds variant that drops the comma and pads with spaces
(%s version 8.1.1-full_build-www.gyan.dev Copyright (c) …),
so externally-installed Gyan FFmpegs now report8.1.1instead of
the libavformat-major fallback's8.0.0. SameHighconfidence as
before; the matching detector id changed fromffmpeg-cli-version
toffmpeg-binary-version-string.
v0.1.2
Changed
- Self-update is now a modal Yes/No prompt at startup instead of a
button on the wizard's Done page. The previous design was effectively
unreachable: users had to finish an install before they ever saw the
"Apply RABBIT update" button, and the always-visible status bar line
pointed at a button most users couldn't find. The startup self-update
check now raises a Yes/No dialog as soon as it completes; "Yes" runs
the apply inline (with progress in the status bar) and relaunches
RABBIT, "No" dismisses the prompt for the rest of the session. Users
who change their mind can relaunch RABBIT to be re-prompted; the
status-bar line spells that out.
Fixed
-
Per-arch artifact dispatch on a fresh first-time install. On macOS
with no existing/Applications/REAPER.app, the binary-header probe
instandard_macos_installationcouldn't read a file that wasn't
there yet and returnedArchitecture::Unknown. The SWS and ReaPack
resolvers then fell through to theirUnknown → X64fallback arms
and downloadedsws-…-Darwin-x86_64.dmgand
reaper_reapack-x86_64.dylib, even on Apple Silicon hosts running
natively where the freshly-installed REAPER would launch asarm64
and refuse to load the mismatched extension binaries. The dispatch-
time canonicalizer (renamed fromcanonicalize_macos_universal_arch
tocanonicalize_dispatch_arch) now collapsesUnknownto the host
slice the same way it collapsesUniversal—Architecture::current()
with Rosetta correction — so the upcoming install lands arch-correct
plug-ins regardless of whether REAPER was already on disk when the
wizard launched. The fix also closes the equivalent x64-fallback bug
on Windows-on-ARM, where an unprobed target would have produced
Windows-x64.exeSWS andreaper_reapack-x64.dllinstead of the
arm64ec variants. -
macOS Rosetta detection. v0.1.1 shelled out to
/usr/sbin/sysctl -n sysctl.proc_translatedto determine whether RABBIT was running
under Rosetta, butsysctl.proc_translatedreports the querying
process's translation state — and the shelled-outsysctlbinary
always runs as the host's native arch (the kernel picks its native
slice at exec time, ignoring the parent's translation state). The
probe therefore always reportedfalse, including when RABBIT
itself was the translatedx86_64slice on Apple Silicon. The
artifact dispatcher then canonicalized REAPER-Universal to
Architecture::current()(i.e.,X64) and installedx86_64
plug-ins against anarm64-native REAPER process. The probe now
callssysctlbynamedirectly via FFI from RABBIT's own process, so
the kernel resolves the key against RABBIT's translation state. -
macOS self-update used to leave
Rabbit.appstructurally invalid
after the binary swap. The release pipeline now ad-hoc signs the
barerabbit-<version>-macos-universalartifact itself (so the
staged-in binary has a valid embedded signature even though
lipo -createstrips its inputs' sigs), andapply_self_update
re-seals the enclosing.appbundle withcodesign --force --deep --sign -after the swap. Both pieces are needed: the bare-binary
signing keeps Apple Silicon's exec checks happy and the bundle
re-seal restores the_CodeSignature/CodeResourcesconsistency that
Gatekeeper checks on Finder launch. Without these, post-update
Finder launches on macOS 15 (Sequoia) and 26 (Tahoe) would refuse
the bundle as corrupt rather than just untrusted.
v0.1.1
Added
- Stable always-latest download URLs for every platform, e.g.
https://github.com/Timtam/rabbit/releases/latest/download/rabbit-windows-x86_64.exe
and…/rabbit-macos-universal.app.zip. The release pipeline now
publishes version-less aliases of each artifact alongside the
versioned originals, so the URLs above resolve to whatever release is
current at the time of the click. The README's Download section has
been switched to direct links; the GitHub Releases page is still
there for users who want to pin a version or verify SHA-256 sums.
Changed
- macOS: ship a single universal Mach-O instead of separate Apple Silicon
and Intel builds. The release pipeline now builds both arches and
lipo -creates them into one binary, published as
rabbit-<version>-macos-universal(and…-universal.app.zip). The
self-update manifest'splatformsmap keeps itsmacos-aarch64and
macos-x86_64keys for backward compatibility with already-released
RABBIT 0.1.0 clients, both pointing at the universal artifact, so
existing installs migrate to the fat binary on their next self-update
check without a manual download.
Fixed
-
macOS:
Cmd+C(andCmd+Sin the German build) no longer closes the
wizard. Wizard buttons used&Close/&Schließen-style mnemonics
for Alt-key access on Windows and Linux, but wxWidgets' OSX backend
binds those&mnemonics asCmd+letteraccelerators — colliding
with macOS system shortcuts (Cmd+C copy, Cmd+S save, …). Mnemonics
on buttons aren't HIG-conformant on macOS anyway, so they're now
stripped from the label entirely on that platform; underlined
Alt-key access continues to work on Windows and Linux. -
macOS first-launch helper:
Open Me First.commandno longer falsely
reports success on macOS 15 (Sequoia) and 26 (Tahoe). Removing the
com.apple.quarantinexattr is no longer enough on those versions —
Gatekeeper blocks unsigned bundles on first launch regardless of
quarantine state. The helper now (a) verifies the xattr was actually
cleared recursively across the bundle (the previous version checked
only the bundle root, missing inner-file failures), (b) detects the
macOS version, and (c) on macOS 15+ triggers a launch attempt to
register Rabbit.app with Gatekeeper, then deep-links System Settings
→ Privacy & Security so the user's "Open Anyway" approval is one
click away. macOS 14 and earlier keep the original quiet behavior. -
macOS: install no longer aborts with
no artifact found for sws on MacOs/Universal(and the analogous
silent ReaPack-arm64 mis-install on Intel hosts) when REAPER is a
universal Mach-O. The artifact dispatcher now canonicalizes
Architecture::Universalto the host slice on macOS before
per-package resolvers run, so SWS picks the matchingDarwin-x86_64
/Darwin-arm64.dmgand ReaPack picks the matching
reaper_reapack-x86_64.dylib/reaper_reapack-arm64.dylib. On
Apple Silicon Macs running RABBIT under Rosetta, the dispatcher
consultssysctl.proc_translatedand forces thearm64slice so
plug-ins match thearm64-native REAPER process rather than the
x86_64translator's view. -
macOS: VoiceOver now reads the German UI with a German voice. The
bundle previously declared only English (CFBundleDevelopmentRegion
with noCFBundleLocalizationsand no.lprojdirectories), so
Cocoa picked the English voice for every accessibility string
regardless of the in-app language. The bundle now ships
CFBundleLocalizationsforenandde, matching empty
en.lproj/de.lprojstubs, and seatsAppleLanguagesfrom the
resolved runtime locale before wxDragon brings up Cocoa so the
override also takes effect for users on an English-language macOS
who switch RABBIT to German.
v0.1.0
Initial public release. RABBIT is a REAPER accessibility bootstrap and
bundle installer with a screen-reader-friendly GUI wizard and a matching
CLI, packaged as a single self-contained executable per platform.
Added
- Accessibility-first wizard built on wxDragon: keyboard-first
navigation, native controls, tested with NVDA, JAWS, Narrator, and
VoiceOver. Wizard runs when launched without arguments; arguments hand
off to the CLI. - Cross-platform builds: Windows x86_64, Windows aarch64, macOS
aarch64, and macOS x86_64. macOS ships as an ad-hoc-signed.app.zip
with anOpen Me First.commandhelper that clears Gatekeeper
quarantine on first launch. - Localization: English (en-US) and German (de-DE) bundled, with
Fluent-based runtime locale selection. Auto-picks the OS language when
a translation is available. - REAPER discovery: detects standard installations on Windows and
macOS, plus user-supplied portable folders. Reports app path, resource
path, version, architecture, writability, and confidence. - Package install / update for REAPER, OSARA, SWS, ReaPack,
ReaKontrol, JAWS-for-REAPER scripts (Windows + JAWS only), and FFmpeg
shared runtime (Windows, opt-in; pulled from gyan.dev on x64 and
tordona/ffmpeg-win-arm64 on ARM64, pinned to FFmpeg 8.x). - Architecture-aware artifact resolution: selects x86_64 / aarch64 /
arm64ec / universal builds appropriate to the detected REAPER, with
per-arch self-update assets in the release manifest. - Configuration steps: post-install tweaks managed alongside package
installs. Ships withreapack-add-reaper-accessibility-remote, which
adds the REAPER Accessibility ReaPack repository
(Timtam/reapack) and is idempotent on re-runs. - Preflight checks that run before any apply: REAPER process state,
resource path writability, donation acknowledgement for ReaPack, etc.
CLI returns a non-zero exit when checks fail. - Dry-run by default in the CLI: every install / update / restore
command requires--applyto make changes. JSON output available on
every command via--json. - Backups and rollback: each install writes a backup set under
<resource>/RABBIT/backups/<timestamp>/;rabbit backupslists them
andrabbit restore-backuprolls one back. - JSON + text reports under
<resource>/RABBIT/logs/for every
install, update, restore, and setup operation. - Self-update: signed update manifest published alongside each
GitHub release with per-arch URLs and SHA-256 sums;rabbit self-update check / stage / apply [--restart](CLI) and an automatic
on-startup check (GUI). Handles bare-binary replacement on Windows and
macOS without the user re-clearing Gatekeeper. - Portable runtime: the binary carries embedded resources (locales,
package manifest). Cache and lock files live under the OS cache directory by
default; nothing is left behind in the resource path beyond explicit
reports and backups.