Add multiple macOS FMA (#37060)

This pull request adds support for several new macOS applications to the
maintained apps catalog. It introduces metadata, installation, and
uninstallation scripts for each app, and updates the main `apps.json`
output to include these new entries. The changes are grouped into new
app additions and corresponding installer/uninstaller script
implementations.

**New macOS app additions:**

* Added metadata and catalog entries for the following applications:
Egnyte, Elgato Control Center, Elgato Stream Deck, ExpressVPN, Fork,
Front, Ghostty, GIMP, and Hyper. Each app now has a dedicated input JSON
file and an entry in `apps.json` with platform, identifier, and
description.
[[1]](diffhunk://#diff-23ba1125ec0779e89bd0e70b112583b332e841bc14a4920419e0c116f6718aecR1-R8)
[[2]](diffhunk://#diff-c0489d22fc52f53b7a44c4fb6b16c25eb8e22d53772c62bad36c3a874138cc65R1-R8)
[[3]](diffhunk://#diff-96bdb6025cdcaefdb9c689401cfd102ed248ce0360a178da5e208b570967d459R1-R8)
[[4]](diffhunk://#diff-a5441bc7fd33cb26cc4bc787bfec51f8a0384f7270cd7e97958c3a814e71fa7cR1-R8)
[[5]](diffhunk://#diff-82a6115c15a63073e97e105400f396f3b6a6181e787dde23c5b038c1018c4b9eR1-R8)
[[6]](diffhunk://#diff-ddee5c0aabd18f5cbdb8d3cab2a9f069e895401e9dd5f94db2b06af940f286f8R1-R8)
[[7]](diffhunk://#diff-f11cb1fa827924b89af074a0ec08aae96f962abf08133df45a8d326f22ff467bR1-R8)
[[8]](diffhunk://#diff-a481e356326319c0bd932ece074bdd533294a19a333da5dbfc0c081b4052fa1dR1-R8)
[[9]](diffhunk://#diff-ffe0600fd34e997bde34d076822e13354866d9dbc6c6fd43865b4a70f0a479a0R1-R8)
[[10]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R515-R549)
[[11]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R578-R605)
[[12]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R683-R689)

**Installer and uninstaller script implementations:**

* For each new app, added output JSON files containing version info,
installer URLs, SHA256 hashes, and install/uninstall scripts. These
scripts handle application installation and cleanup, including quitting
running apps and removing associated files and directories.
[[1]](diffhunk://#diff-458d8f6eb15663b336e76a6964ca22f83e940b0bef4474391d46a1698cd3dcb4R1-R21)
[[2]](diffhunk://#diff-5f9bd670a42a11fb7ab0bf3575557a938a96d8652497c14e2e8f60369f735bf8R1-R21)
[[3]](diffhunk://#diff-c31491a17eb8dff09d145de13e703188c032a446a8e74060505024c239db208fR1-R21)

These updates expand the catalog’s coverage and ensure proper lifecycle
management for each newly supported app.
This commit is contained in:
Allen Houchins
2025-12-10 11:41:18 -06:00
committed by GitHub
parent 69ac473694
commit 1e003edfd7
38 changed files with 468 additions and 0 deletions
@@ -0,0 +1,8 @@
{
"name": "Egnyte",
"unique_identifier": "com.egnyte.DesktopApp",
"token": "egnyte",
"installer_format": "dmg",
"slug": "egnyte/darwin",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,8 @@
{
"name": "Elgato Control Center",
"unique_identifier": "com.corsair.ControlCenter",
"token": "elgato-control-center",
"installer_format": "zip",
"slug": "elgato-control-center/darwin",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,8 @@
{
"name": "Elgato Stream Deck",
"unique_identifier": "com.elgato.StreamDeck",
"token": "elgato-stream-deck",
"installer_format": "pkg",
"slug": "elgato-stream-deck/darwin",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,8 @@
{
"name": "ExpressVPN",
"unique_identifier": "com.expressvpn.ExpressVPN",
"token": "expressvpn",
"installer_format": "pkg",
"slug": "expressvpn/darwin",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,8 @@
{
"name": "Fork",
"unique_identifier": "com.DanPristupov.Fork",
"token": "fork",
"installer_format": "dmg",
"slug": "fork/darwin",
"default_categories": ["Developer tools"]
}
@@ -0,0 +1,8 @@
{
"name": "Front",
"unique_identifier": "com.frontapp.Front",
"token": "front",
"installer_format": "zip",
"slug": "front/darwin",
"default_categories": ["Communication"]
}
@@ -0,0 +1,8 @@
{
"name": "Ghostty",
"unique_identifier": "com.mitchellh.ghostty",
"token": "ghostty",
"installer_format": "dmg",
"slug": "ghostty/darwin",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,8 @@
{
"name": "GIMP",
"unique_identifier": "org.gimp.gimp-3.0",
"token": "gimp",
"installer_format": "dmg",
"slug": "gimp/darwin",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,8 @@
{
"name": "Hyper",
"unique_identifier": "co.zeit.hyper",
"token": "hyper",
"installer_format": "zip",
"slug": "hyper/darwin",
"default_categories": ["Productivity"]
}
+63
View File
@@ -512,6 +512,27 @@
"unique_identifier": "epp.package.committers",
"description": "Eclipse IDE is an Eclipse integrated development environment for Java."
},
{
"name": "Egnyte",
"slug": "egnyte/darwin",
"platform": "darwin",
"unique_identifier": "com.egnyte.DesktopApp",
"description": "Egnyte is a client for the Egnyte cloud storage service."
},
{
"name": "Elgato Control Center",
"slug": "elgato-control-center/darwin",
"platform": "darwin",
"unique_identifier": "com.corsair.ControlCenter",
"description": "Elgate Control Center is an app to control your Elgato key lights."
},
{
"name": "Elgato Stream Deck",
"slug": "elgato-stream-deck/darwin",
"platform": "darwin",
"unique_identifier": "com.elgato.StreamDeck",
"description": "Elgateo Stream Deck is an app to assign keys, and then decorate and label them, on a Stream Deck."
},
{
"name": "Evernote",
"slug": "evernote/darwin",
@@ -519,6 +540,13 @@
"unique_identifier": "com.evernote.Evernote",
"description": "Evernote is an app for note taking, organising, task lists, and archiving."
},
{
"name": "ExpressVPN",
"slug": "expressvpn/darwin",
"platform": "darwin",
"unique_identifier": "com.expressvpn.ExpressVPN",
"description": "ExpressVPN is a VPN client for secure internet access and private browsing."
},
{
"name": "Figma",
"slug": "figma/darwin",
@@ -547,6 +575,34 @@
"unique_identifier": "Mozilla Firefox (x64 en-US)",
"description": "Firefox is a powerful, open-source web browser built for speed, privacy, and customization."
},
{
"name": "Fork",
"slug": "fork/darwin",
"platform": "darwin",
"unique_identifier": "com.DanPristupov.Fork",
"description": "Fork is a git client."
},
{
"name": "Front",
"slug": "front/darwin",
"platform": "darwin",
"unique_identifier": "com.frontapp.Front",
"description": "Front is a customer communication platform."
},
{
"name": "Ghostty",
"slug": "ghostty/darwin",
"platform": "darwin",
"unique_identifier": "com.mitchellh.ghostty",
"description": "Ghostty is a terminal emulator that uses platform-native UI and GPU acceleration."
},
{
"name": "GIMP",
"slug": "gimp/darwin",
"platform": "darwin",
"unique_identifier": "org.gimp.gimp-3.0",
"description": "GIMP is a free and open-source image editor."
},
{
"name": "GitHub Desktop",
"slug": "github-desktop/windows",
@@ -624,6 +680,13 @@
"unique_identifier": "com.granola.app",
"description": "Granola is an AI-powered notepad for meetings."
},
{
"name": "Hyper",
"slug": "hyper/darwin",
"platform": "darwin",
"unique_identifier": "co.zeit.hyper",
"description": "Hyper is a terminal built on web technologies."
},
{
"name": "iMazing Profile Editor",
"slug": "imazing-profile-editor/darwin",
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "1.12.1",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.egnyte.DesktopApp';"
},
"installer_url": "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/1.12.1/Egnyte_1.12.1_2304.dmg",
"install_script_ref": "808a634e",
"uninstall_script_ref": "14159466",
"sha256": "a46e13d4ea42580c440369a4f738a799191e9244f100470d8feec2345a5b93e0",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"14159466": "#!/bin/sh\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 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/Egnyte.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp.FileProvider'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp.FinderHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.egnyte.DesktopApp.FinderHelper.FinderSync'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/FELUD555VC.group.com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.egnyte.desktopapp.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/FileProvider/com.egnyte.DesktopApp.FileProvider'\ntrash $LOGGED_IN_USER '~/Library/Caches/SentryCrash/EgnyteLaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/Caches/SentryCrash/EgnyteUpgradeChecker'\ntrash $LOGGED_IN_USER '~/Library/CloudStorage/Egnyte-*'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp.FileProvider'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp.FinderHelper'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.egnyte.DesktopApp.FinderHelper.FinderSync'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/FELUD555VC.group.com.egnyte.DesktopApp'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apple.FileProvider/com.egnyte.DesktopApp.FileProvider'\n",
"808a634e": "#!/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>/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 && \"$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 < 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\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.egnyte.DesktopApp'\nif [ -d \"$APPDIR/Egnyte.app\" ]; then\n\tsudo mv \"$APPDIR/Egnyte.app\" \"$TMPDIR/Egnyte.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Egnyte.app\" \"$APPDIR\"\n"
}
}
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "1.8.2",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.corsair.ControlCenter';"
},
"installer_url": "https://edge.elgato.com/egc/macos/eccm/1.8.2/ElgatoControlCenter-1.8.2.20643.zip",
"install_script_ref": "e49ffe80",
"uninstall_script_ref": "f6271677",
"sha256": "c84270f56f4adacd1c47058cc5a3824b0911886f3519c21b4f54c4ebf9dce869",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"e49ffe80": "#!/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>/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 && \"$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 < 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\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.corsair.ControlCenter'\nif [ -d \"$APPDIR/Elgato Control Center.app\" ]; then\n\tsudo mv \"$APPDIR/Elgato Control Center.app\" \"$TMPDIR/Elgato Control Center.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Elgato Control Center.app\" \"$APPDIR\"\n",
"f6271677": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/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 && \"$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 < 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\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\nquit_application 'com.corsair.ControlCenter'\nsudo rm -rf \"$APPDIR/Elgato Control Center.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.corsair.ControlCenterLauncher'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.corsair.ControlCenter'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.corsair.ControlCenter'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.corsair.ControlCenter'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.corsair.ControlCenterLauncher'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.corsair.ControlCenter.plist'\n"
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "2.60.4",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.DanPristupov.Fork';"
},
"installer_url": "https://cdn.fork.dev/mac/Fork-2.60.4.dmg",
"install_script_ref": "e6e8997c",
"uninstall_script_ref": "92b40975",
"sha256": "5dbf9cfdef2d89de3251d6b2669ca77138e15be170a5ab7f43e76cfc9062ff5f",
"default_categories": [
"Developer tools"
]
}
],
"refs": {
"92b40975": "#!/bin/sh\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 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/Fork.app\"\nsudo rm -rf 'fork'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.danpristupov.fork.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fork'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.DanPristupov.Fork.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.DanPristupov.Fork'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.DanPristupov.Fork.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/Fork.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.DanPristupov.Fork.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.DanPristupov.Fork.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.DanPristupov.Fork'\n",
"e6e8997c": "#!/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>/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 && \"$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 < 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\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.DanPristupov.Fork'\nif [ -d \"$APPDIR/Fork.app\" ]; then\n\tsudo mv \"$APPDIR/Fork.app\" \"$TMPDIR/Fork.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fork.app\" \"$APPDIR\"\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/Fork.app/Contents/Resources/fork_cli\" \"fork\"\n"
}
}
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "3.67.6",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.frontapp.Front';"
},
"installer_url": "https://dl.frontapp.com/desktop/builds/3.67.6/Front-3.67.6-arm64.zip",
"install_script_ref": "9cfdb848",
"uninstall_script_ref": "b3154f7f",
"sha256": "f97adced8553e769d42c6f975f52f59bcd41cebd308fe601a58d3f1e1ae21129",
"default_categories": [
"Communication"
]
}
],
"refs": {
"9cfdb848": "#!/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>/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 && \"$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 < 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\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.frontapp.Front'\nif [ -d \"$APPDIR/Front.app\" ]; then\n\tsudo mv \"$APPDIR/Front.app\" \"$TMPDIR/Front.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Front.app\" \"$APPDIR\"\n",
"b3154f7f": "#!/bin/sh\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 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/Front.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Front'\ntrash $LOGGED_IN_USER '~/Library/FrontBoard'\ntrash $LOGGED_IN_USER '~/Library/Logs/Front'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.frontapp.Front.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.frontapp.Front.savedState'\n"
}
}
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "1.2.3",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.mitchellh.ghostty';"
},
"installer_url": "https://release.files.ghostty.org/1.2.3/Ghostty.dmg",
"install_script_ref": "8af82cab",
"uninstall_script_ref": "cf87f8a0",
"sha256": "f35ee91f116e28027ab9f8def45098c7575b44b407ff883a2dcd2985c483206b",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"8af82cab": "#!/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>/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 && \"$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 < 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\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.mitchellh.ghostty'\nif [ -d \"$APPDIR/Ghostty.app\" ]; then\n\tsudo mv \"$APPDIR/Ghostty.app\" \"$TMPDIR/Ghostty.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Ghostty.app\" \"$APPDIR\"\n",
"cf87f8a0": "#!/bin/sh\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 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/Ghostty.app\"\ntrash $LOGGED_IN_USER '~/.config/ghostty/'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.mitchellh.ghostty'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.mitchellh.ghostty'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.mitchellh.ghostty'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.mitchellh.ghostty.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.mitchellh.ghostty.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.mitchellh.ghostty'\n"
}
}
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "3.0.6",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.gimp.gimp-3.0';"
},
"installer_url": "https://download.gimp.org/gimp/v3.0/macos/gimp-3.0.6-arm64.dmg",
"install_script_ref": "6f15971b",
"uninstall_script_ref": "2cdb3a30",
"sha256": "6f4e7f8ed7ebfa80dcb6e0c05f9b1d6bd3d5a991e99abc2f3391cf37bfd97d70",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"2cdb3a30": "#!/bin/sh\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 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/GIMP.app\"\nsudo rm -rf 'gimp'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Gimp'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.gimp.gimp-3.0.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.gimp.gimp-3.0.savedState'\n",
"6f15971b": "#!/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>/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 && \"$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 < 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\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 'org.gimp.gimp-3.0'\nif [ -d \"$APPDIR/GIMP.app\" ]; then\n\tsudo mv \"$APPDIR/GIMP.app\" \"$TMPDIR/GIMP.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/GIMP.app\" \"$APPDIR\"\n"
}
}
@@ -0,0 +1,21 @@
{
"versions": [
{
"version": "3.4.1",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'co.zeit.hyper';"
},
"installer_url": "https://github.com/vercel/hyper/releases/download/v3.4.1/Hyper-3.4.1-mac-arm64.zip",
"install_script_ref": "c2e48c1b",
"uninstall_script_ref": "524382b3",
"sha256": "7d2440fdd93fde4101e603fe2de46732b54292a868ad17dbcb55288e6f8430a8",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"524382b3": "#!/bin/sh\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 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/Hyper.app\"\ntrash $LOGGED_IN_USER '~/.hyper.js'\ntrash $LOGGED_IN_USER '~/.hyper_plugins'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/co.zeit.hyper.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Hyper'\ntrash $LOGGED_IN_USER '~/Library/Caches/co.zeit.hyper'\ntrash $LOGGED_IN_USER '~/Library/Caches/co.zeit.hyper.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Cookies/co.zeit.hyper.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/Hyper'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/co.zeit.hyper.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/co.zeit.hyper.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/co.zeit.hyper.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/co.zeit.hyper.savedState'\n",
"c2e48c1b": "#!/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>/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 && \"$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 < 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\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'co.zeit.hyper'\nif [ -d \"$APPDIR/Hyper.app\" ]; then\n\tsudo mv \"$APPDIR/Hyper.app\" \"$TMPDIR/Hyper.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hyper.app\" \"$APPDIR\"\n"
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -67,13 +67,21 @@ import Drawio from "./DrawIo";
import Dropbox from "./Dropbox";
import Eclipse from "./Eclipse";
import Edge from "./Edge";
import Egnyte from "./Egnyte";
import EightXEightWork from "./8X8Work";
import ElgatoControlCenter from "./ElgatoControlCenter";
import ElgatoStreamDeck from "./ElgatoStreamDeck";
import Evernote from "./Evernote";
import Excel from "./Excel";
import ExpressVpn from "./ExpressVpn";
import Extension from "./Extension";
import Falcon from "./Falcon";
import Figma from "./Figma";
import Firefox from "./Firefox";
import Fork from "./Fork";
import Front from "./Front";
import Ghostty from "./Ghostty";
import Gimp from "./Gimp";
import GitHubDesktop from "./GitHubDesktop";
import GitKraken from "./GitKraken";
import GoLand from "./GoLand";
@@ -81,6 +89,7 @@ import GoogleDrive from "./GoogleDrive";
import GpgKeychain from "./GpgKeychain";
import GrammarlyDesktop from "./GrammarlyDesktop";
import Granola from "./Granola";
import Hyper from "./Hyper";
import IMazingProfileEditor from "./IMazingProfileEditor";
import ITerm from "./ITerm";
import Insomnia from "./Insomnia";
@@ -244,11 +253,19 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
"draw.io": Drawio,
dropbox: Dropbox,
eclipse: Eclipse,
egnyte: Egnyte,
"elgato control center": ElgatoControlCenter,
evernote: Evernote,
expressvpn: ExpressVpn,
falcon: Falcon,
figma: Figma,
firefox: Firefox,
fork: Fork,
front: Front,
ghostty: Ghostty,
gimp: Gimp,
"gpg keychain": GpgKeychain,
hyper: Hyper,
keepassxc: KeePassXc,
libreoffice: LibreOffice,
"microsoft autoupdate": MicrosoftAutoUpdate,
@@ -319,6 +336,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
snagit: Snagit,
sourcetree: Sourcetree,
spotify: Spotify,
"stream deck": ElgatoStreamDeck,
"sublime text": SublimeText,
tableau: TableauDesktop,
tableplus: TablePlus,
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB