From 682ba68cde0ef3f41a73e7bdfc82f8a4f4cbfed8 Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:07:02 -0500 Subject: [PATCH] Add REAPER as a macOS FMA (#46847) Introduce REAPER to maintained apps: add homebrew input (com.cockos.reaper, token `reaper`, dmg installer, Productivity category) and register it in apps.json. Add darwin output metadata (versions/7.73) including installer URL, sha256, install/uninstall script refs and embedded scripts for installation/uninstall behavior. Add frontend icon component and image asset, and wire the Reaper icon into the SOFTWARE_NAME_TO_ICON_MAP. --- .../inputs/homebrew/reaper.json | 8 +++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ ee/maintained-apps/outputs/reaper/darwin.json | 22 ++++++++++++++++++ .../SoftwarePage/components/icons/Reaper.tsx | 14 +++++++++++ .../SoftwarePage/components/icons/index.ts | 2 ++ .../images/app-icon-reaper-60x60@2x.png | Bin 0 -> 11375 bytes 6 files changed, 53 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/reaper.json create mode 100644 ee/maintained-apps/outputs/reaper/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/Reaper.tsx create mode 100644 website/assets/images/app-icon-reaper-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/reaper.json b/ee/maintained-apps/inputs/homebrew/reaper.json new file mode 100644 index 0000000000..c26e8ef1b2 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/reaper.json @@ -0,0 +1,8 @@ +{ + "name": "REAPER", + "unique_identifier": "com.cockos.reaper", + "token": "reaper", + "installer_format": "dmg", + "slug": "reaper/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 1531ca946a..766db338c4 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -2073,6 +2073,13 @@ "unique_identifier": "com.raycast.macos", "description": "Raycast is an app that allows you to control your tools with a few keystrokes." }, + { + "name": "REAPER", + "slug": "reaper/darwin", + "platform": "darwin", + "unique_identifier": "com.cockos.reaper", + "description": "REAPER is a digital audio production application." + }, { "name": "Rectangle", "slug": "rectangle/darwin", diff --git a/ee/maintained-apps/outputs/reaper/darwin.json b/ee/maintained-apps/outputs/reaper/darwin.json new file mode 100644 index 0000000000..7346db8e2b --- /dev/null +++ b/ee/maintained-apps/outputs/reaper/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "7.73", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.cockos.reaper';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.cockos.reaper' AND version_compare(bundle_short_version, '7.73') < 0);" + }, + "installer_url": "https://dlcf.reaper.fm/7.x/reaper773_universal.dmg", + "install_script_ref": "812a1a26", + "uninstall_script_ref": "544a54e5", + "sha256": "884b259b98269240b009fc229605e046bc298fa0fa94dca90d99cd22fd593cac", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "544a54e5": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/REAPER.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/REAPER'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.cockos.reaper.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.cockos.ReaMote.savedState'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.cockos.reaper.savedState'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.cockos.reaperhosti386.savedState'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.cockos.reaperhostx8664.savedState'\n", + "812a1a26": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.cockos.reaper'\nif [ -d \"$APPDIR/REAPER.app\" ]; then\n\tsudo mv \"$APPDIR/REAPER.app\" \"$TMPDIR/REAPER.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/REAPER.app\" \"$APPDIR\"\nrelaunch_application 'com.cockos.reaper'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Reaper.tsx b/frontend/pages/SoftwarePage/components/icons/Reaper.tsx new file mode 100644 index 0000000000..38a84a1f08 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Reaper.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Reaper = (props: SVGProps) => ( + + + +); +export default Reaper; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index e8dcb2f368..a3d6f6be1f 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -55,6 +55,7 @@ import Proxifier from "./Proxifier"; import Proxyman from "./Proxyman"; import Putty from "./Putty"; import RealVncServer from "./RealVncServer"; +import Reaper from "./Reaper"; import Rstudio from "./Rstudio"; import RustDesk from "./RustDesk"; import Secretive from "./Secretive"; @@ -517,6 +518,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { rapidapi: RapidApi, raycast: Raycast, "realvnc server": RealVncServer, + reaper: Reaper, rectangle: Rectangle, rider: Rider, "royal tsx": RoyalTsx, diff --git a/website/assets/images/app-icon-reaper-60x60@2x.png b/website/assets/images/app-icon-reaper-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..43c898fde2be4bfdc44bca1dc8cb0806693e3276 GIT binary patch literal 11375 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 literal 0 HcmV?d00001