Skip to content

Add macOS Fleet-maintained apps (Y) - #47175

Merged
allenhouchins merged 4 commits into
mainfrom
new-mac-fmas-y
Jun 9, 2026
Merged

Add macOS Fleet-maintained apps (Y)#47175
allenhouchins merged 4 commits into
mainfrom
new-mac-fmas-y

Conversation

@allenhouchins

@allenhouchins allenhouchins commented Jun 9, 2026

Copy link
Copy Markdown
Member

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

Summary by CodeRabbit

  • New Features
    • Added support for five macOS applications: Yaak, YACReader, Yattee, Yippy, and YouTube Music, with complete installation and uninstallation capabilities.
    • Added icon assets for the newly supported applications.

Adds 6 Fleet-maintained app(s) whose cask token starts with 'Y':
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
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 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.19%. Comparing base (17e860b) to head (bfcaf9f).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
...ntend/pages/SoftwarePage/components/icons/Yaak.tsx 50.00% 1 Missing ⚠️
.../pages/SoftwarePage/components/icons/Yacreader.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Yattee.tsx 50.00% 1 Missing ⚠️
...tend/pages/SoftwarePage/components/icons/Yippy.tsx 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #47175      +/-   ##
==========================================
- Coverage   67.19%   67.19%   -0.01%     
==========================================
  Files        2922     2926       +4     
  Lines      226386   226394       +8     
  Branches    11867    11720     -147     
==========================================
+ Hits       152124   152128       +4     
- Misses      60518    60523       +5     
+ Partials    13744    13743       -1     
Flag Coverage Δ
frontend 57.90% <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 yWorks yEd from the maintained apps and frontend. Deleted the homebrew input (ee/maintained-apps/inputs/homebrew/yed.json), the app output entry and its darwin release JSON (ee/maintained-apps/outputs/yed/darwin.json), and removed the apps.json entry. Also removed the frontend SVG icon component and PNG asset, and updated the icons index to drop the Yed import and mapping. This removes installer/uninstaller scripts, bundle queries, and UI icon usage for yEd.
@allenhouchins
allenhouchins marked this pull request as ready for review June 9, 2026 14:26
@allenhouchins
allenhouchins requested a review from a team as a code owner June 9, 2026 14:26
Copilot AI review requested due to automatic review settings June 9, 2026 14:26
@fleet-release
fleet-release requested a review from eashaw June 9, 2026 14:26
@allenhouchins
allenhouchins merged commit 3d1c326 into main Jun 9, 2026
30 checks passed
@allenhouchins
allenhouchins deleted the new-mac-fmas-y branch June 9, 2026 14:26

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

Adds new macOS Fleet-maintained apps whose Homebrew cask token starts with “Y” by committing the Homebrew input manifests, generated outputs/*/darwin.json installer manifests (including install/uninstall scripts), and adding corresponding frontend software icon components + icon map entries.

Changes:

  • Added 4 new software icon components (Yaak, YACReader, Yattee, Yippy) and wired them into the software-name → icon map.
  • Added 5 new maintained-app Homebrew input manifests and their generated outputs/*/darwin.json manifests.
  • Registered the new maintained apps in ee/maintained-apps/outputs/apps.json.

Reviewed changes

Copilot reviewed 16 out of 20 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
frontend/pages/SoftwarePage/components/icons/Yaak.tsx Adds Yaak icon component.
frontend/pages/SoftwarePage/components/icons/Yacreader.tsx Adds YACReader icon component.
frontend/pages/SoftwarePage/components/icons/Yattee.tsx Adds Yattee icon component.
frontend/pages/SoftwarePage/components/icons/Yippy.tsx Adds Yippy icon component.
frontend/pages/SoftwarePage/components/icons/index.ts Registers new Y* icons in imports and SOFTWARE_NAME_TO_ICON_MAP.
ee/maintained-apps/outputs/yaak/darwin.json Generated Yaak installer manifest (DMG) with install/uninstall scripts.
ee/maintained-apps/outputs/yacreader/darwin.json Generated YACReader installer manifest (DMG) with install/uninstall scripts.
ee/maintained-apps/outputs/yattee/darwin.json Generated Yattee installer manifest (ZIP) with install/uninstall scripts.
ee/maintained-apps/outputs/yippy/darwin.json Generated Yippy installer manifest (ZIP) with install/uninstall scripts.
ee/maintained-apps/outputs/yt-music/darwin.json Generated YouTube Music installer manifest (ZIP) with install/uninstall scripts.
ee/maintained-apps/outputs/apps.json Registers new maintained apps in the aggregated app list.
ee/maintained-apps/inputs/homebrew/yaak.json Adds Yaak Homebrew input manifest.
ee/maintained-apps/inputs/homebrew/yacreader.json Adds YACReader Homebrew input manifest.
ee/maintained-apps/inputs/homebrew/yattee.json Adds Yattee Homebrew input manifest.
ee/maintained-apps/inputs/homebrew/yippy.json Adds Yippy Homebrew input manifest.
ee/maintained-apps/inputs/homebrew/yt-music.json Adds YouTube Music Homebrew input manifest.

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

}
],
"refs": {
"390de351": "#!/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.yacreader.YACReader'\nif [ -d \"$APPDIR/YACReader.app\" ]; then\n\tsudo mv \"$APPDIR/YACReader.app\" \"$TMPDIR/YACReader.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/YACReader.app\" \"$APPDIR\"\nrelaunch_application 'com.yacreader.YACReader'\n# copy to the applications folder\nquit_and_track_application 'com.yacreader.YACReader'\nif [ -d \"$APPDIR/YACReaderLibrary.app\" ]; then\n\tsudo mv \"$APPDIR/YACReaderLibrary.app\" \"$TMPDIR/YACReaderLibrary.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/YACReaderLibrary.app\" \"$APPDIR\"\nrelaunch_application 'com.yacreader.YACReader'\n",
Comment on lines +19 to +20
"064e2880": "#!/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 'app.yaak.desktop'\nif [ -d \"$APPDIR/yaak.app\" ]; then\n\tsudo mv \"$APPDIR/yaak.app\" \"$TMPDIR/yaak.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/yaak.app\" \"$APPDIR\"\nrelaunch_application 'app.yaak.desktop'\n",
"7041eb1f": "#!/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/yaak.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/app.yaak.desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/app.yaak.desktop'\ntrash $LOGGED_IN_USER '~/Library/Logs/app.yaak.desktop'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/app.yaak.desktop.savedState'\ntrash $LOGGED_IN_USER '~/Library/Webkit/app.yaak.desktop'\n"
Comment on lines +3231 to +3236
{
"name": "YouTube Music",
"slug": "yt-music/darwin",
"platform": "darwin",
"unique_identifier": "uk.co.wearecocoon.YT-Music",
"description": "YouTube Music is an app wrapper for music.youtube.com."
@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: 3fb2b404-7809-43e0-9626-b0354e0837d1

📥 Commits

Reviewing files that changed from the base of the PR and between 17e860b and bfcaf9f.

⛔ Files ignored due to path filters (4)
  • website/assets/images/app-icon-yaak-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-yacreader-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-yattee-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-yippy-60x60@2x.png is excluded by !**/*.png
📒 Files selected for processing (16)
  • ee/maintained-apps/inputs/homebrew/yaak.json
  • ee/maintained-apps/inputs/homebrew/yacreader.json
  • ee/maintained-apps/inputs/homebrew/yattee.json
  • ee/maintained-apps/inputs/homebrew/yippy.json
  • ee/maintained-apps/inputs/homebrew/yt-music.json
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/yaak/darwin.json
  • ee/maintained-apps/outputs/yacreader/darwin.json
  • ee/maintained-apps/outputs/yattee/darwin.json
  • ee/maintained-apps/outputs/yippy/darwin.json
  • ee/maintained-apps/outputs/yt-music/darwin.json
  • frontend/pages/SoftwarePage/components/icons/Yaak.tsx
  • frontend/pages/SoftwarePage/components/icons/Yacreader.tsx
  • frontend/pages/SoftwarePage/components/icons/Yattee.tsx
  • frontend/pages/SoftwarePage/components/icons/Yippy.tsx
  • frontend/pages/SoftwarePage/components/icons/index.ts

Walkthrough

This PR adds five new macOS applications to Fleet's maintained-apps catalog: Yaak, YACReader, Yattee, Yippy, and YouTube Music. Each application receives a Homebrew input manifest defining metadata and installer format, an output registry entry in the application catalog, versioned Darwin installation metadata with embedded shell scripts for install/uninstall automation, and frontend icon components with UI mappings. The installation scripts handle mounting disk images or extracting ZIP files, copying applications to /Applications, quitting and relaunching running processes with GUI session awareness, and removing applications and related user Library directories on uninstall.

Possibly related PRs

  • fleetdm/fleet#46906: Both PRs extend frontend/pages/SoftwarePage/components/icons/index.ts's SOFTWARE_NAME_TO_ICON_MAP by adding new app icon entries.
  • fleetdm/fleet#45858: Both PRs add new maintained macOS apps end-to-end with input/output manifests and corresponding frontend icon registration.
  • fleetdm/fleet#47018: Both PRs add new maintained-app definitions and update the same SOFTWARE_NAME_TO_ICON_MAP code path for registering new app 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-y

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