RABBIT sets up a fully accessible REAPER on Windows and macOS in a few clicks. Instead of hunting through download pages, copying files into the right folders, and fighting installers that fight your screen reader, you launch one small program and it does the work.
RABBIT installs and keeps up to date:
- REAPER — the DAW itself
- OSARA — the screen-reader extension that makes REAPER usable with NVDA, JAWS, Narrator, and VoiceOver
- SWS — the popular SWS Extension
- ReaPack — REAPER's package manager
- ReaKontrol — Native Instruments Komplete Kontrol support
- JAWS-for-REAPER scripts (Windows only, when JAWS is detected)
- FFmpeg (Windows only, opt-in) — the shared FFmpeg runtime
(
avformat,avcodec, …) that REAPER's video decoder loads fromUserPlugins. Pulled from Gyan.dev on x64 and tordona/ffmpeg-win-arm64 on ARM64. Pinned to the latest stable FFmpeg major REAPER's video decoder is known to support (currently 8.x). Unticked by default so it doesn't surprise users who don't need video. - Surge XT (opt-in, standard REAPER installations only) — the
free open-source hybrid synthesizer from the
Surge Synth Team. RABBIT
runs the vendor installer (Inno Setup on Windows,
productbuild-wrapped
.pkgon macOS) under elevation so the VST3, CLAP, AU (macOS only) and standalone formats land system-wide for REAPER and other DAWs to pick up. Tracks the rolling nightly channel rather than the official 1.3.4 release (which is from August 2024 and the project effectively ships through nightlies). Hidden on portable REAPER targets because Surge XT's factory data lives at fixed system paths outside any portable REAPER folder. - app2clap (Windows only, opt-in, standard REAPER installations only) —
app2clap, a CLAP plugin by Jamie Teh
(jcsteh, of OSARA/NVDA fame) that captures audio from other applications
and brings it into REAPER — or any CLAP host — as a plug-in you insert on
a track. RABBIT tracks the
rolling
snapshotsrelease, installsapp2clap.clapinto the per-user CLAP folder (%LOCALAPPDATA%\Programs\Common\CLAP) with no elevation required, and keeps it up to date. Disabled on portable REAPER targets because the CLAP folder lives outside any portable REAPER folder.
Surge XT and app2clap are grouped under Additional software in the wizard — extras that aren't tied to REAPER itself. Both are disabled on portable REAPER targets, since they install to fixed per-user/system locations rather than into the portable REAPER folder.
RABBIT can also translate REAPER itself (not just its own wizard), by
installing a community language pack into <resource>/LangPack/. Three are
available today, and all of them translate the SWS extension as well:
- Spanish — maintained by Javier Robledo for the Spanish REAPER
community and published on
reaperespa.com. REAPER and SWS are the
same translation either way, but OSARA has two Spanish translations,
chosen by the pack's file name: installed as
es_ES.ReaperLangPackyou get REAPER Accesible español, and ases_MX.ReaperLangPackyou get Team PMA's. Pick one from the Spanish OSARA translation dropdown on the packages page (enabled once the Spanish pack is selected), or pass--package-variant langpack-es=pmaon the command line. Switching reinstalls under the new name and removes the old file. - German — maintained by MrData and published in the
REAPER Stash, installed as
de_DE.ReaperLangPack. - French — maintained by Lee Julien and Pierre-Marie Curt for
ReaperAccessible, the French
screen-reader community, and published in their
ReaPack repository.
Installed as
fr_CA.ReaperLangPack, which is what makes OSARA load itsfr_CAtranslation: that one is all but complete, while OSARA'sfr_FRtranslation still leaves about a third of its messages in English. The pack itself is the same standard French under either name — only OSARA's own strings differ, and a few of them are Canadian (muté, soloté).
The pack matching the language RABBIT is running in is suggested and ticked for you; packs for other languages are listed but unticked. Nothing is offered in English, since REAPER is already English.
If you don't want it, untick it and RABBIT remembers: the pack stays listed
and tickable, but it won't be ticked for you again on this REAPER install.
That covers updates too — if you installed a pack, later stopped using it,
and turn down its next update, RABBIT takes that as a no and stops offering
it. Tick it again at any point and RABBIT forgets the refusal. What is not
a refusal is a pack that is simply installed and up to date: it sits
unticked because there is nothing to do, and RABBIT reads that as silence
rather than a decision. The choice is stored per install (in
RABBIT/install-state.json), so you can say no on one REAPER and yes on
another.
You can install as many language packs as you like — REAPER keeps them all
in LangPack/ — and switch between them later from REAPER's own
preferences. Only one is active at a time, so if you install several,
pick which one REAPER starts in from the REAPER language after
installation dropdown on the packages page (or --reaper-language <package> on the command line). Installing a pack never removes another
one; the only file RABBIT replaces is the one it installed for that same
pack, e.g. when you switch Spanish translations.
The Spanish and German 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): it
notices when a translator publishes a new file and offers it as an update,
without RABBIT needing a new release. The French pack does carry a version
(7.75.1 at the time of writing), read from its ReaPack index. Your choice
of Spanish translation is remembered, so an update keeps the variant you
picked instead of reverting to the default.
Beyond installing packages, RABBIT can also apply small post-install configuration tweaks:
- Add the REAPER Accessibility ReaPack repository to ReaPack
(
https://github.com/Timtam/reapack/raw/master/index.xml). When ReaPack is part of your install plan or already on disk, this step is ticked by default; if the repository is already configured in yourreapack.ini, the step shows as already applied and is skipped. Idempotent and safe to re-run. - Set REAPER's language to one of the language packs you're
installing, by writing it into
reaper.ini. A single step covers every language — which one it activates comes from the dropdown above. The step is tied to the packs you tick: with none ticked it is greyed out, because the dropdown it reads from is empty and there would be nothing to activate. Tick a language pack and the step ticks itself, ready to be unticked if you want the files installed without changing the language REAPER is in; untick the last pack and the step clears itself again. A pack merely sitting on disk from an earlier run doesn't count — a run that installs nothing language-related leaves your current language alone. (On the command line the step is still reachable directly with--config-step set-reaper-language, which activates an already-installed pack.) Only the one setting is touched; the rest ofreaper.iniis preserved byte for byte, including its original text encoding.
Built with screen reader users in mind: keyboard-first wizard, native controls, NVDA/JAWS/Narrator/VoiceOver tested, English, German, Spanish, French
- Italian UI out of the box. No console window, no installer, no settings file — one executable you can run from any folder and delete when you're done.
Pick the file that matches your machine. These links always point at the latest release — bookmark or share them freely:
- Windows (Intel/AMD 64-bit): rabbit-windows-x86_64.exe
- Windows (ARM 64-bit): rabbit-windows-aarch64.exe
- macOS (universal — Apple Silicon + Intel) — recommended: rabbit-macos-universal.app.zip
- macOS bare binary (CLI use): rabbit-macos-universal
To pin a specific version (or download SHA-256 sums for verification),
browse the GitHub Releases
page — every release also
publishes versioned filenames (rabbit-<version>-windows-x86_64.exe,
etc.) alongside per-asset .sha256 files.
On Windows, place the downloaded executable wherever you like (Desktop,
Downloads, a USB stick) and double-click it. You can rename it to RABBIT.exe
if you prefer — RABBIT still updates itself in place under whatever filename you
chose.
RABBIT for macOS is signed with an Apple Developer ID and notarized by Apple.
Unzip rabbit-<version>-macos-universal.app.zip and double-click Rabbit.app
— it launches normally on first run, with no quarantine workaround needed.
Self-updates keep working under the same bundle identity.
The bare rabbit-<version>-macos-universal download is a plain Mach-O CLI
executable (no .app wrapper). After downloading, run chmod +x and invoke
it from Terminal.
Launch the downloaded executable. The wizard walks you through:
- Pick a REAPER target — RABBIT detects existing standard installs automatically; pick "portable" if you want a self-contained REAPER folder.
- RABBIT checks for the latest versions of REAPER and the accessibility packages.
- Pick the packages you want installed or updated, plus any configuration steps (e.g. adding the REAPER Accessibility ReaPack repository). Sensible defaults are already checked. The page has two tabs, Install or update and Uninstall, and opens with focus on the tabs: press Tab to reach the list.
- Review and install. RABBIT downloads, verifies, and installs everything without further prompts.
When it finishes, you can launch REAPER straight from the wizard or open the saved report.
To remove packages instead, switch to the Uninstall tab on the package page, tick what should go, and press Next. Nothing is ticked to begin with.
- Switching tabs: on Windows, Ctrl+Tab or Ctrl+Page Down from the tabs or anything on them, and Ctrl+Shift+Tab or Ctrl+Page Up to go back; the arrow keys work while the tabs have focus. On macOS, Ctrl+Tab and Ctrl+Shift+Tab anywhere on the page, or VoiceOver's own navigation of the tab group.
- What RABBIT can remove: SWS, ReaPack, ReaKontrol, FFmpeg and app2clap (both Windows only) and the language packs. Every other installed package is listed too, with the reason it can't be ticked.
- What is kept: your settings, such as SWS's grooves, ReaPack's
repositories and ReaKontrol's FX maps, unless you tick Also remove
settings below the list.
reaper.ini,reaper-kb.ini, your key maps and everything ReaPack installed always stay. Everything that goes, settings removed with that option included, moves into a backup set underRABBIT\backupsrather than being deleted. - Starting it: the review page says what each package loses and keeps. Enter doesn't start an uninstall there; press Uninstall. REAPER must be closed, and for app2clap every REAPER on the computer.
- Getting a package back: start RABBIT again and tick it on the Install
or update tab, which no longer ticks a package you removed by itself. To
put back the very files that went instead, Show details on the last
page lists a
rabbit restore-backupcommand for each package (see Uninstall under command-line usage).
Use the language picker at the bottom of the window. Currently bundled languages: English (United States), Deutsch (Deutschland), español (España), Français (France) and Italiano (Italia). RABBIT auto-picks your OS language on first launch when a translation is available — regional variants fall back to the bundled one, so a Mexican Spanish (es-MX) system gets the Spanish UI.
The wizard has a hidden expert mode for people who test pre-release software. It installs builds that are unsupported and can break REAPER or its accessibility at any time. Keep it away from a setup you depend on.
To turn it on, press Ctrl+Shift+E (Cmd+Shift+E on macOS) on the first
page and confirm. To have it on from the start, launch RABBIT with the
environment variable RABBIT_EXPERT=1:
$env:RABBIT_EXPERT=1; .\RABBIT.exe # Windows, PowerShell
RABBIT_EXPERT=1 /Applications/Rabbit.app/Contents/MacOS/rabbit # macOS
The window title then ends in "Expert mode", and two choices appear on the first page below the REAPER installation:
- REAPER builds: regular releases, or the development builds from landoleet.org. RABBIT installs whatever landoleet currently offers, whether that is a development build, a release candidate or a release.
- OSARA builds: regular snapshots, or the test build of an open OSARA pull request. RABBIT fetches the list from GitHub when expert mode comes on, with the newest pull request (the highest number) first. These builds are unreviewed, unsigned code. GitHub deletes them after 90 days, and Windows security software is more likely to flag them (see below).
On the Packages page, a package coming from a pre-release build says so in its row, for example "(development build)".
Expert mode is never saved. It lasts until RABBIT closes, and pressing the same keys again on the first page turns it off. Leaving it has a consequence. The next install without expert mode takes every package that came from a pre-release build back to its regular release, and the row says "back to the regular release". The same thing happens to an OSARA test build once its pull request is merged or closed, or GitHub has deleted the build. The mode can only be changed on the first page, never while an install is running.
The same RABBIT.exe / RABBIT executable also exposes a CLI when invoked with
arguments. Run RABBIT --help for the full list. The most useful commands grouped
by what they do:
RABBIT detect # list detected REAPER installs
RABBIT detect --portable C:\REAPER # also probe a portable folder
RABBIT components --resource-path "%APPDATA%\REAPER"
RABBIT latest # show latest upstream versions
RABBIT plan --resource-path "%APPDATA%\REAPER"
RABBIT plan --resource-path "%APPDATA%\REAPER" --online
RABBIT preflight --resource-path "%APPDATA%\REAPER"
plan prints what RABBIT would do for the given REAPER target. Add
--online to compare detected versions against the live upstream feeds.
# One-shot setup of a portable REAPER + accessibility packages:
RABBIT setup --resource-path C:\REAPER --portable --apply
# Update or install one specific package:
RABBIT install-extension --package osara --resource-path "%APPDATA%\REAPER" --apply
# Install/update everything that needs it for an existing REAPER:
RABBIT apply-packages --resource-path "%APPDATA%\REAPER" --apply
# ReaPack shows a donation notice on first run, so installing it
# unattended means acknowledging that notice up front:
RABBIT setup --resource-path "%APPDATA%\REAPER" --package reapack \
--accept-reapack-donation-notice --apply
The CLI is dry-run by default; pass --apply to actually make changes.
--save-report writes a JSON report next to the resource path so you have a
record of what was installed, and --json prints the result as JSON for
scripting. A few other flags are worth knowing: --allow-reaper-running
proceeds even though REAPER is open (files it holds open may fail to be
replaced), --preserve-osara-keymap and --replace-osara-keymap decide
what happens to your key map when OSARA is installed (without either,
RABBIT replaces it only when OSARA is new or the key map is still OSARA's
own, as the wizard does), and --stage-unsupported
downloads the packages RABBIT can't install automatically and leaves them
in the cache for you to run yourself instead of skipping them. Every flag
is documented in RABBIT <command> --help.
setup also accepts --config-step <id> (repeatable) and
--skip-config-step <id> for the post-install configuration tweaks.
With no flags, the recommended steps whose dependencies are satisfied
(and that aren't already applied) run automatically; pass an explicit
list to opt in to a specific subset, or --skip-config-step to opt
out of one. Set REAPER's language is the exception: it only runs by
default when the run actually asks for a language pack, so a machine that
merely has one on disk does not get its interface language changed. Ask
for it with --config-step set-reaper-language to switch to a pack you
installed earlier. Step ids today are
reapack-add-reaper-accessibility-remote,
reapack-add-reaper-accessible-fr-remote,
reapack-add-reaper-accessible-en-remote, and
set-reaper-language (one step for every language; it depends on at
least one language pack being installed or in the plan).
Language packs install like any other package, e.g.:
RABBIT install-extension --package langpack-de --resource-path "%APPDATA%\REAPER" --apply
RABBIT setup --resource-path "%APPDATA%\REAPER" --package langpack-es \
--package langpack-de --reaper-language langpack-de --apply
# Pick Team PMA's Spanish translation (es_MX) over the default es_ES:
RABBIT setup --resource-path "%APPDATA%\REAPER" --package langpack-es \
--package-variant langpack-es=pma --reaper-language langpack-es --apply
--reaper-language only accepts a language pack, and lists the ones it
knows if you mistype it. Unlike the wizard, the CLI never records a package
you left out as "don't offer this again". It works the other way round,
though: a package you uninstalled, or turned down in the wizard, is skipped
by apply-packages and setup with a note, and naming it with --package
in a run that installs takes it off that list, so later runs offer it again.
The CLI needs no expert mode to install pre-release builds. Ask for a channel
per package with --package-channel. It works with latest, artifacts,
download, plan, install-extension, apply-packages and setup.
# REAPER's development build from landoleet.org:
RABBIT install-extension --package reaper --resource-path C:\REAPER \
--package-channel reaper=dev --apply
# The test build of OSARA pull request 1454:
RABBIT install-extension --package osara --resource-path "%APPDATA%\REAPER" \
--package-channel osara=pr:1454 --apply
# Back to the regular release:
RABBIT apply-packages --resource-path C:\REAPER --package-channel reaper=stable --apply
# See what's out on a channel without installing anything:
RABBIT latest --package-channel reaper=dev
RABBIT packages lists each package's channels. Unlike the wizard outside
expert mode, the CLI keeps a package on the channel it was last installed
from until you pass <package>=stable, so a later apply-packages keeps a
development REAPER on development builds. OSARA pull request builds come
through nightly.link, because GitHub hands workflow
builds only to signed-in users. When a pull request is merged or closed, or
has no build left, RABBIT installs the regular snapshot and prints a warning
saying so. It never counts a network failure as a missing build, so an outage
can't quietly downgrade anything.
RABBIT asks GitHub's API about several packages, and without signing in
GitHub allows 60 such requests an hour for each internet connection.
Following OSARA pull request builds takes several more on every run, so
testers can run into that limit. Version checks then fail with GitHub's "rate
limit exceeded" error, and the wizard can't list OSARA's pull request builds.
To lift the limit to 5,000 an hour, set the environment variable
GITHUB_TOKEN to a GitHub personal access token before starting RABBIT. The
wizard and the CLI both use it. RABBIT only reads public data, so a token
without any extra permissions is enough. RABBIT only sends it to
api.github.com, and never hands it to OSARA's test builds or to REAPER:
$env:GITHUB_TOKEN = "<your token>"; .\RABBIT.exe # Windows, PowerShell
GITHUB_TOKEN="<your token>" /Applications/Rabbit.app/Contents/MacOS/rabbit # macOS
uninstall removes packages RABBIT knows how to take off again: today SWS,
ReaPack, ReaKontrol, FFmpeg and app2clap (both Windows only) and the language
packs. RABBIT components says for each package whether RABBIT can uninstall
it, and if not, why. Name every package with --package; there is no "remove
everything". Like the other commands, it only shows what it would do until you
add --apply:
# See what would go, what stays, and anything that would stop it:
RABBIT uninstall --resource-path "%APPDATA%\REAPER" --package sws
# Uninstall SWS and the German language pack:
RABBIT uninstall --resource-path "%APPDATA%\REAPER" --package sws \
--package langpack-de --apply
- What goes: the files RABBIT installed and the files the package is known to install. A file RABBIT installed that changed since stays, and the report says so.
- What stays: your settings, such as SWS's grooves and
S&M.ini, ReaPack's repositories and its list of what it installed, and ReaKontrol's FX maps. Add--remove-settingsto remove those too.reaper.ini,reaper-kb.ini, your key maps and everything ReaPack installed always stay, even files ReaPack installed among a package's settings. - Nothing is deleted for good. Removed files move into a backup set under
RABBIT\backups, and so do settings removed with--remove-settings. The run saves a report underRABBIT\logs. If REAPER used the language pack you removed, RABBIT sets REAPER back to English. - REAPER must be closed. For REAPER on Windows, Surge XT, app2clap and the
JAWS scripts, every REAPER on the computer must be closed, portable ones
included. Unlike the commands that install,
uninstallhas no--allow-reaper-running: a running REAPER holds its extensions' files open, so they can't be moved, and it writesreaper.iniagain when it closes, which would undo the language reset. The dry run checks this too. - All or nothing up front. If any package you named can't be uninstalled,
or one of its files can't be read,
--applychanges nothing at all and says why. For the JAWS scripts (whichever REAPER you name) and a portable REAPER, which RABBIT can't remove, it prints how to remove them by hand. - Ctrl+C stops between packages. The package being removed finishes, and
the rest stay installed. Press Ctrl+C again to stop at once; the files
already moved stay in the backup set, where
restore-backupfinds them. - Removed packages stay removed. The wizard no longer ticks them, and
apply-packagesandsetupskip them with a note. Name one with--packageto install it again.
--json prints the plan in a dry run and the report with --apply, both with
message codes instead of sentences. The exit code follows one table for the
dry run and --apply:
| Exit code | Meaning |
|---|---|
| 0 | Every package was removed (or, in a dry run, can be), or isn't installed, so a script can run twice. Anything of a package RABBIT still finds afterwards is listed, never deleted. |
| 1 | A removal failed or was stopped. Its files went back where they were; packages removed before it stay removed. Also when an error stopped RABBIT before anything changed, such as another RABBIT working on the same REAPER; the message says which. |
| 2 | A package you named can't be uninstalled. Nothing changed. |
To bring a package back, find the uninstall's backup set and restore just that package from it:
RABBIT backups --resource-path "%APPDATA%\REAPER"
RABBIT restore-backup --resource-path "%APPDATA%\REAPER" \
--backup-id uninstall-unix-1234567890 --package sws --apply
Its files come back, its settings too if --remove-settings removed them. It
goes back into RABBIT's receipt and is no longer skipped, and REAPER's language
goes back to it if the uninstall changed that and you haven't picked another
language since. Without --package, every package in the set comes back. An
uninstall that stopped partway through a package restores the same way. Two
limits: a package you installed again after uninstalling it can't be restored
from the old set, because the newer copy is in the way (uninstall it first);
and a removal that a backup can't hold, such as one by a vendor's own
uninstaller or with administrator rights, can't be restored. RABBIT doesn't
make such removals yet.
RABBIT backups --resource-path "%APPDATA%\REAPER" # list rollback sets
RABBIT restore-backup --resource-path "%APPDATA%\REAPER" \
--backup-id unix-1234567890 --apply # roll back one set
RABBIT self-update check # see if a new RABBIT is out
RABBIT self-update apply --restart # update + relaunch
The GUI does this automatically on startup; the CLI commands are there for unattended environments and CI.
An install can fail with "Windows security software blocked …". Microsoft Defender sometimes 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. This is a false positive: the installer is signed by its publisher, and RABBIT downloads every package over HTTPS from the publisher's own release page and verifies it against the publisher's checksum before touching it.
To finish the installation, do one of the following:
- Open Windows Security → Virus & threat protection → Protection history, find the blocked item, choose Allow, then run RABBIT again.
- Add RABBIT's download folder to Virus & threat protection → Manage settings → Exclusions.
- Install that one package by hand from the publisher's own page, then re-run RABBIT for the rest.
RABBIT will never turn your virus protection off, and you should not need to: disabling real-time protection exposes the whole machine, and any installer that switches it off is indistinguishable from malware. If a RABBIT release itself is flagged, please report it — and consider submitting the file to Microsoft as a false positive at https://www.microsoft.com/en-us/wdsi/filesubmission.
Every installation produces a JSON report under <resource>/RABBIT/logs/.
Backups go to <resource>/RABBIT/backups/<timestamp>/. The download cache is a
rabbit-cache folder in your temporary folder, usually %TEMP%\rabbit-cache on
Windows and $TMPDIR/rabbit-cache on macOS. It can be deleted safely at any time, and
the CLI's --cache-dir points a single run somewhere else.
RABBIT was built with the help of AI coding assistants. Much of the code, tests, and documentation in this repository was written collaboratively with large language models, then reviewed and maintained by its human author. We mention this openly so users and contributors know what went into the project.
See DESIGN.md for the full architecture and design rules. To
build from source you need Rust 1.99 or newer. The wxDragon GUI
feature on Windows additionally needs the Visual Studio C++ build tools, an
LLVM libclang.dll discoverable through LIBCLANG_PATH, and Ninja on
PATH.
cargo fmt
cargo test --workspace
.\scripts\build-wxdragon-test.ps1 # Windows GUI smoke build
CI lives under .github/workflows/:
ci.yml— formatting, tests, and release-mode artifacts on every push.macos-smoke.yml— daily live-upstream smoke against real REAPER + OSARA- SWS + ReaKontrol downloads.
release.yml— builds taggedv*releases (Windows.exe, macOS bare binary, macOS.app.zip), publishes the GitHub Release with checksums and the self-update manifest. macOS bundles are Developer ID signed and notarized when theMACOS_*signing secrets are configured, falling back to ad-hoc signing + theOpen Me First.commandhelper otherwise.macos-signing-smoke.yml— manual (workflow_dispatch) smoke test of the macOS signing + notarization + stapling path. Builds the universal bundle, signs/notarizes/staples it, verifies the result on the runner, and uploads the signed bundle without publishing. Run it to validate signing before tagging a release.
Issues, pull requests, and translation contributions welcome — RABBIT is for the REAPER accessibility community first.