Skip to content

Add macOS Fleet-maintained apps (V) - #47187

Merged
allenhouchins merged 3 commits into
mainfrom
new-mac-fmas-v
Jun 9, 2026
Merged

Add macOS Fleet-maintained apps (V)#47187
allenhouchins merged 3 commits into
mainfrom
new-mac-fmas-v

Conversation

@allenhouchins

@allenhouchins allenhouchins commented Jun 9, 2026

Copy link
Copy Markdown
Member

Adds 16 Fleet-maintained app(s) whose cask token starts with 'V': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries.

Summary by CodeRabbit

  • New Features
    • Added support for 14 new macOS applications: Vanilla, Vellum, Vernier Spectral Analysis, Versions, VIA, Vimcal, Visual Paradigm, Vivid, Viz, VoiceInk, VPN Tracker 365, VueScan, VyprVPN, and Vysor

Adds 16 Fleet-maintained app(s) whose cask token starts with 'V':
inputs, outputs, app icons (TSX + website PNG), and the matching
index.ts and apps.json entries. Split out from #47121.
fleet-release
fleet-release previously approved these changes Jun 9, 2026
fleet-release
fleet-release previously approved these changes Jun 9, 2026
@codecov

codecov Bot commented Jun 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 14 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.15%. Comparing base (a66ad80) to head (2adba30).
⚠️ Report is 7 commits behind head on main.

Files with missing lines Patch % Lines
...nd/pages/SoftwarePage/components/icons/Vanilla.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Vellum.tsx 50.00% 1 Missing ⚠️
...ePage/components/icons/VernierSpectralAnalysis.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/Versions.tsx 50.00% 1 Missing ⚠️
...ontend/pages/SoftwarePage/components/icons/Via.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Vimcal.tsx 50.00% 1 Missing ⚠️
...s/SoftwarePage/components/icons/VisualParadigm.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/VividApp.tsx 50.00% 1 Missing ⚠️
...ontend/pages/SoftwarePage/components/icons/Viz.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/Voiceink.tsx 50.00% 1 Missing ⚠️
... and 4 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #47187      +/-   ##
==========================================
- Coverage   67.16%   67.15%   -0.01%     
==========================================
  Files        2946     2960      +14     
  Lines      226429   226457      +28     
  Branches    11866    11720     -146     
==========================================
+ Hits       152070   152084      +14     
- Misses      60619    60633      +14     
  Partials    13740    13740              
Flag Coverage Δ
frontend 57.88% <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.

Remove VeraCrypt and VNote from the maintained apps and UI. Deleted their EE maintained-apps input manifests (homebrew) and per-platform output manifests (darwin) including version metadata, installer/uninstaller script refs and checks. Removed frontend icon components and website image assets, and updated the apps index to drop the corresponding entries. Cleanup for apps no longer maintained/served by the repo.
@allenhouchins
allenhouchins marked this pull request as ready for review June 9, 2026 17:15
@allenhouchins
allenhouchins requested a review from a team as a code owner June 9, 2026 17:15
Copilot AI review requested due to automatic review settings June 9, 2026 17:15
@fleet-release
fleet-release requested a review from eashaw June 9, 2026 17:15
@allenhouchins
allenhouchins merged commit 34b73e0 into main Jun 9, 2026
29 of 30 checks passed
@allenhouchins
allenhouchins deleted the new-mac-fmas-v branch June 9, 2026 17:15

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

This PR adds a batch of macOS Fleet-maintained apps whose Homebrew cask tokens start with “V”, including the generated app manifests (inputs/outputs), new frontend icon components, and updated registries so the new apps appear with the correct metadata and icons in Fleet.

Changes:

  • Added/updated Fleet-maintained app metadata and install/uninstall scripts for the new “V*” macOS apps under ee/maintained-apps/inputs/ and ee/maintained-apps/outputs/.
  • Added new Software page icon components for the new apps and wired them into the SOFTWARE_NAME_TO_ICON_MAP.
  • Registered the new apps in ee/maintained-apps/outputs/apps.json.

Reviewed changes

Copilot reviewed 44 out of 58 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
frontend/pages/SoftwarePage/components/icons/Vanilla.tsx Adds Vanilla icon component.
frontend/pages/SoftwarePage/components/icons/Vellum.tsx Adds Vellum icon component.
frontend/pages/SoftwarePage/components/icons/VernierSpectralAnalysis.tsx Adds Vernier Spectral Analysis icon component.
frontend/pages/SoftwarePage/components/icons/Versions.tsx Adds Versions icon component.
frontend/pages/SoftwarePage/components/icons/Via.tsx Adds VIA icon component.
frontend/pages/SoftwarePage/components/icons/Vimcal.tsx Adds Vimcal icon component.
frontend/pages/SoftwarePage/components/icons/VisualParadigm.tsx Adds Visual Paradigm icon component.
frontend/pages/SoftwarePage/components/icons/VividApp.tsx Adds Vivid icon component.
frontend/pages/SoftwarePage/components/icons/Viz.tsx Adds Viz icon component.
frontend/pages/SoftwarePage/components/icons/Voiceink.tsx Adds VoiceInk icon component.
frontend/pages/SoftwarePage/components/icons/VpnTracker365.tsx Adds VPN Tracker 365 icon component.
frontend/pages/SoftwarePage/components/icons/Vuescan.tsx Adds VueScan icon component.
frontend/pages/SoftwarePage/components/icons/Vyprvpn.tsx Adds VyprVPN icon component.
frontend/pages/SoftwarePage/components/icons/Vysor.tsx Adds Vysor icon component.
frontend/pages/SoftwarePage/components/icons/index.ts Wires new icon components into the icon map.
ee/maintained-apps/outputs/apps.json Registers new apps (name/slug/identifier/description).
ee/maintained-apps/inputs/homebrew/vanilla.json Adds Homebrew input metadata for Vanilla.
ee/maintained-apps/inputs/homebrew/vellum.json Adds Homebrew input metadata for Vellum.
ee/maintained-apps/inputs/homebrew/vernier-spectral-analysis.json Adds Homebrew input metadata for Vernier Spectral Analysis.
ee/maintained-apps/inputs/homebrew/versions.json Adds Homebrew input metadata for Versions.
ee/maintained-apps/inputs/homebrew/via.json Adds Homebrew input metadata for VIA.
ee/maintained-apps/inputs/homebrew/vimcal.json Adds Homebrew input metadata for Vimcal.
ee/maintained-apps/inputs/homebrew/visual-paradigm.json Adds Homebrew input metadata for Visual Paradigm.
ee/maintained-apps/inputs/homebrew/vivid-app.json Adds Homebrew input metadata for Vivid.
ee/maintained-apps/inputs/homebrew/viz.json Adds Homebrew input metadata for Viz.
ee/maintained-apps/inputs/homebrew/voiceink.json Adds Homebrew input metadata for VoiceInk.
ee/maintained-apps/inputs/homebrew/vpn-tracker-365.json Adds Homebrew input metadata for VPN Tracker 365.
ee/maintained-apps/inputs/homebrew/vuescan.json Adds Homebrew input metadata for VueScan.
ee/maintained-apps/inputs/homebrew/vyprvpn.json Adds Homebrew input metadata for VyprVPN.
ee/maintained-apps/inputs/homebrew/vysor.json Adds Homebrew input metadata for Vysor.
ee/maintained-apps/outputs/vanilla/darwin.json Adds generated Vanilla manifest + scripts.
ee/maintained-apps/outputs/vellum/darwin.json Adds generated Vellum manifest + scripts.
ee/maintained-apps/outputs/vernier-spectral-analysis/darwin.json Adds generated Vernier Spectral Analysis manifest + scripts.
ee/maintained-apps/outputs/versions/darwin.json Adds generated Versions manifest + scripts.
ee/maintained-apps/outputs/via/darwin.json Adds generated VIA manifest + scripts.
ee/maintained-apps/outputs/vimcal/darwin.json Adds generated Vimcal manifest + scripts.
ee/maintained-apps/outputs/visual-paradigm/darwin.json Adds generated Visual Paradigm manifest + scripts.
ee/maintained-apps/outputs/vivid-app/darwin.json Adds generated Vivid manifest + scripts.
ee/maintained-apps/outputs/viz/darwin.json Adds generated Viz manifest + scripts.
ee/maintained-apps/outputs/voiceink/darwin.json Adds generated VoiceInk manifest + scripts.
ee/maintained-apps/outputs/vpn-tracker-365/darwin.json Adds generated VPN Tracker 365 manifest + scripts.
ee/maintained-apps/outputs/vuescan/darwin.json Adds generated VueScan manifest + scripts.
ee/maintained-apps/outputs/vyprvpn/darwin.json Adds generated VyprVPN manifest + scripts.
ee/maintained-apps/outputs/vysor/darwin.json Adds generated Vysor manifest + scripts.

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

],
"refs": {
"0b2fad48": "#!/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.goldenfrog.VyprVPN'\nif [ -d \"$APPDIR/VyprVPN.app\" ]; then\n\tsudo mv \"$APPDIR/VyprVPN.app\" \"$TMPDIR/VyprVPN.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/VyprVPN.app\" \"$APPDIR\"\nrelaunch_application 'com.goldenfrog.VyprVPN'\n",
"d438da2e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\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 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 return\n fi\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\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\nremove_launchctl_service 'com.goldenfrog.resourcewatchdog'\nremove_launchctl_service 'com.goldenfrog.VyprVPNUserAgent'\nremove_launchctl_service 'vyprvpnservice'\nquit_application 'com.goldenfrog.VyprVPN*'\nsudo rm -rf \"$APPDIR/VyprVPN.app\"\nremove_launchctl_service 'org.openvpn'\ntrash $LOGGED_IN_USER '/Library/LaunchDaemons/vyrpvpnservice.plist'\ntrash $LOGGED_IN_USER '/Library/PrivilegedHelperTools/vyprvpnservice'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.goldenfrog.VyprVPN'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/com.goldenfrog.VyprVPNUserAgent.plist'\ntrash $LOGGED_IN_USER '~/Library/Logs/GoldenFrog/VyprVPN.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.goldenfrog.VyprVPN.plist'\n"
],
"refs": {
"efea8e55": "#!/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.hamrick.vuescan'\nif [ -d \"$APPDIR/VueScan.app\" ]; then\n\tsudo mv \"$APPDIR/VueScan.app\" \"$TMPDIR/VueScan.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/VueScan.app\" \"$APPDIR\"\nrelaunch_application 'com.hamrick.vuescan'\n",
"f869d88a": "#!/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/VueScan.app\"\nsudo rmdir '~/Pictures/VueScan'\ntrash $LOGGED_IN_USER '~/.vuescanrc'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hamrick.vuescan.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.hamrick.vuescan.savedState'\ntrash $LOGGED_IN_USER '~/Pictures/VueScan/vuescan.ini'\ntrash $LOGGED_IN_USER '~/Pictures/VueScan/vuescan.log'\n"
@coderabbitai

coderabbitai Bot commented Jun 9, 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: 30cbe545-1161-4cf6-b441-e47abc553e6b

📥 Commits

Reviewing files that changed from the base of the PR and between a66ad80 and 2adba30.

⛔ Files ignored due to path filters (14)
  • website/assets/images/app-icon-vanilla-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vellum-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vernier-spectral-analysis-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-versions-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-via-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vimcal-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-visual-paradigm-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vivid-app-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-viz-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-voiceink-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vpn-tracker-365-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vuescan-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vyprvpn-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-vysor-60x60@2x.png is excluded by !**/*.png
📒 Files selected for processing (44)
  • ee/maintained-apps/inputs/homebrew/vanilla.json
  • ee/maintained-apps/inputs/homebrew/vellum.json
  • ee/maintained-apps/inputs/homebrew/vernier-spectral-analysis.json
  • ee/maintained-apps/inputs/homebrew/versions.json
  • ee/maintained-apps/inputs/homebrew/via.json
  • ee/maintained-apps/inputs/homebrew/vimcal.json
  • ee/maintained-apps/inputs/homebrew/visual-paradigm.json
  • ee/maintained-apps/inputs/homebrew/vivid-app.json
  • ee/maintained-apps/inputs/homebrew/viz.json
  • ee/maintained-apps/inputs/homebrew/voiceink.json
  • ee/maintained-apps/inputs/homebrew/vpn-tracker-365.json
  • ee/maintained-apps/inputs/homebrew/vuescan.json
  • ee/maintained-apps/inputs/homebrew/vyprvpn.json
  • ee/maintained-apps/inputs/homebrew/vysor.json
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/vanilla/darwin.json
  • ee/maintained-apps/outputs/vellum/darwin.json
  • ee/maintained-apps/outputs/vernier-spectral-analysis/darwin.json
  • ee/maintained-apps/outputs/versions/darwin.json
  • ee/maintained-apps/outputs/via/darwin.json
  • ee/maintained-apps/outputs/vimcal/darwin.json
  • ee/maintained-apps/outputs/visual-paradigm/darwin.json
  • ee/maintained-apps/outputs/vivid-app/darwin.json
  • ee/maintained-apps/outputs/viz/darwin.json
  • ee/maintained-apps/outputs/voiceink/darwin.json
  • ee/maintained-apps/outputs/vpn-tracker-365/darwin.json
  • ee/maintained-apps/outputs/vuescan/darwin.json
  • ee/maintained-apps/outputs/vyprvpn/darwin.json
  • ee/maintained-apps/outputs/vysor/darwin.json
  • frontend/pages/SoftwarePage/components/icons/Vanilla.tsx
  • frontend/pages/SoftwarePage/components/icons/Vellum.tsx
  • frontend/pages/SoftwarePage/components/icons/VernierSpectralAnalysis.tsx
  • frontend/pages/SoftwarePage/components/icons/Versions.tsx
  • frontend/pages/SoftwarePage/components/icons/Via.tsx
  • frontend/pages/SoftwarePage/components/icons/Vimcal.tsx
  • frontend/pages/SoftwarePage/components/icons/VisualParadigm.tsx
  • frontend/pages/SoftwarePage/components/icons/VividApp.tsx
  • frontend/pages/SoftwarePage/components/icons/Viz.tsx
  • frontend/pages/SoftwarePage/components/icons/Voiceink.tsx
  • frontend/pages/SoftwarePage/components/icons/VpnTracker365.tsx
  • frontend/pages/SoftwarePage/components/icons/Vuescan.tsx
  • frontend/pages/SoftwarePage/components/icons/Vyprvpn.tsx
  • frontend/pages/SoftwarePage/components/icons/Vysor.tsx
  • frontend/pages/SoftwarePage/components/icons/index.ts

Walkthrough

This PR adds support for 14 new macOS applications distributed via Homebrew. For each app, the PR defines input metadata (identifiers and installer format), output configurations with installation/uninstallation bash scripts and version detection logic, registers each app in the centralized apps registry, and supplies React icon components with corresponding UI mappings. The changes are organized in a single cohesive flow: backend definitions, automation configuration, app registry, then frontend UI.

Possibly related PRs

  • fleetdm/fleet#46906: Updates the same icon registry (SOFTWARE_NAME_TO_ICON_MAP in frontend/pages/SoftwarePage/components/icons/index.ts) and adds new icon components for newly supported apps.
  • fleetdm/fleet#47175: Updates the same icon registry and adds parallel Homebrew/maintained-app JSON entries alongside icon imports and mappings.
  • fleetdm/fleet#47014: Modifies the shared registries ee/maintained-apps/outputs/apps.json and the icons lookup map SOFTWARE_NAME_TO_ICON_MAP by appending new macOS app metadata and icons.
✨ 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 new-mac-fmas-v

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