From feaaf8f34cc1900957dfb525e185dfd4d5381f4f Mon Sep 17 00:00:00 2001 From: Harrison Ravazzolo <38767391+harrisonravazzolo@users.noreply.github.com> Date: Mon, 17 Nov 2025 13:39:28 -0800 Subject: [PATCH] Add Loom as a macOS Fleet-maintained app (#35573) Resolves: #35574 --------- Co-authored-by: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> --- ee/maintained-apps/inputs/homebrew/loom.json | 8 +++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ ee/maintained-apps/outputs/loom/darwin.json | 21 ++++++++++++++++++ .../SoftwarePage/components/icons/Loom.tsx | 14 ++++++++++++ .../assets/images/app-icon-loom-60x60@2x.png | Bin 0 -> 13027 bytes 5 files changed, 50 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/loom.json create mode 100644 ee/maintained-apps/outputs/loom/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/Loom.tsx create mode 100644 website/assets/images/app-icon-loom-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/loom.json b/ee/maintained-apps/inputs/homebrew/loom.json new file mode 100644 index 0000000000..310dc27f0e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/loom.json @@ -0,0 +1,8 @@ +{ + "name": "Loom", + "slug": "loom/darwin", + "unique_identifier": "com.loom.desktop", + "token": "loom", + "installer_format": "dmg", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 8c2e1aa7cf..c84de0b5a8 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -232,6 +232,13 @@ "unique_identifier": "com.logi.optionsplus", "description": "Software for managing Logitech devices." }, + { + "name": "Loom", + "slug": "loom/darwin", + "platform": "darwin", + "unique_identifier": "com.loom.desktop", + "description": "Screen and video recording software." + }, { "name": "Microsoft Edge", "slug": "microsoft-edge/darwin", diff --git a/ee/maintained-apps/outputs/loom/darwin.json b/ee/maintained-apps/outputs/loom/darwin.json new file mode 100644 index 0000000000..a2f10d9cc6 --- /dev/null +++ b/ee/maintained-apps/outputs/loom/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "0.320.17", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.loom.desktop';" + }, + "installer_url": "https://packages.loom.com/desktop-packages/Loom-0.320.17-arm64.dmg", + "install_script_ref": "a84ce4ca", + "uninstall_script_ref": "393b959f", + "sha256": "65f235ab2b855537d6849b104b122948991ddd2181da159a53ad759899dbfda8", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "393b959f": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil \u003c\u003c\u003c \"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 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/Loom.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Loom'\ntrash $LOGGED_IN_USER '~/Library/Logs/Loom'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.loom.desktop.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.loom.desktop.savedState'\n", + "a84ce4ca": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2\u003e/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 \u0026\u0026 \"$console_user\" == \"root\" ]]; 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 \u003c timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" \u003e/dev/null 2\u003e\u00261; then\n if ! pgrep -f \"$bundle_id\" \u003e/dev/null 2\u003e\u00261; 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\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.loom.desktop'\nif [ -d \"$APPDIR/Loom.app\" ]; then\n\tsudo mv \"$APPDIR/Loom.app\" \"$TMPDIR/Loom.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Loom.app\" \"$APPDIR\"\n" + } +} \ No newline at end of file diff --git a/frontend/pages/SoftwarePage/components/icons/Loom.tsx b/frontend/pages/SoftwarePage/components/icons/Loom.tsx new file mode 100644 index 0000000000..d39c83a39b --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Loom.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Loom = (props: SVGProps) => ( + + + +); +export default Loom; diff --git a/website/assets/images/app-icon-loom-60x60@2x.png b/website/assets/images/app-icon-loom-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c01c07eb7f355c9c0f58379b3da58d2a7783ac56 GIT binary patch literal 13027 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