Skip to content

Add REAPER as a macOS FMA - #46847

Merged
allenhouchins merged 1 commit into
mainfrom
allenhouchins-reaper-fma
Jun 4, 2026
Merged

Add REAPER as a macOS FMA#46847
allenhouchins merged 1 commit into
mainfrom
allenhouchins-reaper-fma

Conversation

@allenhouchins

@allenhouchins allenhouchins commented Jun 4, 2026

Copy link
Copy Markdown
Member

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.

Summary by CodeRabbit

Release Notes

  • New Features
    • REAPER is now available as a manageable application on macOS, with automatic update detection and installation support.
    • Added REAPER icon for enhanced visual identification in the application interface.

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.
@codecov

codecov Bot commented Jun 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 66.96%. Comparing base (cd88fc9) to head (dfe181f).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
...end/pages/SoftwarePage/components/icons/Reaper.tsx 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #46847      +/-   ##
==========================================
- Coverage   66.96%   66.96%   -0.01%     
==========================================
  Files        2852     2853       +1     
  Lines      225486   225488       +2     
  Branches    11555    11555              
==========================================
+ Hits       150998   150999       +1     
- Misses      60791    60792       +1     
  Partials    13697    13697              
Flag Coverage Δ
frontend 56.97% <50.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@allenhouchins
allenhouchins marked this pull request as ready for review June 4, 2026 19:06
@allenhouchins
allenhouchins requested a review from a team as a code owner June 4, 2026 19:06
Copilot AI review requested due to automatic review settings June 4, 2026 19:06
@fleet-release
fleet-release requested a review from eashaw June 4, 2026 19:06

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

@allenhouchins
allenhouchins merged commit 682ba68 into main Jun 4, 2026
29 of 30 checks passed
@allenhouchins
allenhouchins deleted the allenhouchins-reaper-fma branch June 4, 2026 19:07
@allenhouchins allenhouchins mentioned this pull request Jun 4, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds support for the REAPER macOS app across the maintained-apps registry and the SoftwarePage icon set.

Changes:

  • Added a new REAPER icon component and registered it in the software-name-to-icon map.
  • Introduced maintained-apps metadata for REAPER on darwin, including installer/uninstaller scripts and app catalog entry.

Reviewed changes

Copilot reviewed 5 out of 6 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
frontend/pages/SoftwarePage/components/icons/index.ts Registers the new Reaper icon and maps it to the reaper software key.
frontend/pages/SoftwarePage/components/icons/Reaper.tsx Adds the Reaper icon component (SVG wrapper around an embedded raster image).
ee/maintained-apps/outputs/reaper/darwin.json Adds REAPER darwin versioning, queries, and install/uninstall scripts.
ee/maintained-apps/outputs/apps.json Adds REAPER to the maintained apps catalog list.
ee/maintained-apps/inputs/homebrew/reaper.json Adds Homebrew input metadata for REAPER.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +4 to +8
"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);"
},
],
"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"
Comment on lines +6 to +9
<svg xmlns="http://www.w3.org/2000/svg" width={32} height={32} {...props}>
<image
width={32}
height={32}
import type { SVGProps } from "react";

const Reaper = (props: SVGProps<SVGSVGElement>) => (
<svg xmlns="http://www.w3.org/2000/svg" width={32} height={32} {...props}>
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 722d832d-4668-40d3-90a3-30bd3cdef4f0

📥 Commits

Reviewing files that changed from the base of the PR and between c7ae13e and dfe181f.

⛔ Files ignored due to path filters (1)
  • website/assets/images/app-icon-reaper-60x60@2x.png is excluded by !**/*.png
📒 Files selected for processing (5)
  • ee/maintained-apps/inputs/homebrew/reaper.json
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/reaper/darwin.json
  • frontend/pages/SoftwarePage/components/icons/Reaper.tsx
  • frontend/pages/SoftwarePage/components/icons/index.ts

Walkthrough

This PR adds complete support for REAPER, a macOS audio production application, to Fleet's maintained-apps system. The changes include: (1) defining REAPER's app metadata in the Homebrew input source, (2) registering it in the global apps registry with platform and identifier information, (3) configuring macOS installer metadata with version 7.73 detection SQL, installation/uninstallation scripts that manage the DMG install, app lifecycle, and user preferences cleanup, and (4) adding a frontend icon component and registering it in the UI icon map for the software name "reaper".

Possibly related PRs

  • fleetdm/fleet#46497: Extends the same frontend icon registry and adds new entries to the maintained-app inputs/outputs pipeline for a different app (Cryptomator).
  • fleetdm/fleet#46738: Adds a new macOS app to the maintained-apps registry and updates the frontend icon registry with the same pattern, registering a new key in SOFTWARE_NAME_TO_ICON_MAP.
  • fleetdm/fleet#46424: Follows the identical implementation pattern by adding a new app to maintained-apps metadata and updating the frontend icon registry and apps registry (adds Joplin instead of Reaper).
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch allenhouchins-reaper-fma

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants