diff --git a/ee/maintained-apps/inputs/homebrew/egnyte.json b/ee/maintained-apps/inputs/homebrew/egnyte.json new file mode 100644 index 0000000000..8488465538 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/egnyte.json @@ -0,0 +1,8 @@ +{ + "name": "Egnyte", + "unique_identifier": "com.egnyte.DesktopApp", + "token": "egnyte", + "installer_format": "dmg", + "slug": "egnyte/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/elgato-control-center.json b/ee/maintained-apps/inputs/homebrew/elgato-control-center.json new file mode 100644 index 0000000000..85d9edabab --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/elgato-control-center.json @@ -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"] +} diff --git a/ee/maintained-apps/inputs/homebrew/elgato-stream-deck.json b/ee/maintained-apps/inputs/homebrew/elgato-stream-deck.json new file mode 100644 index 0000000000..6887b58c4e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/elgato-stream-deck.json @@ -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"] +} diff --git a/ee/maintained-apps/inputs/homebrew/expressvpn.json b/ee/maintained-apps/inputs/homebrew/expressvpn.json new file mode 100644 index 0000000000..ad241ae21e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/expressvpn.json @@ -0,0 +1,8 @@ +{ + "name": "ExpressVPN", + "unique_identifier": "com.expressvpn.ExpressVPN", + "token": "expressvpn", + "installer_format": "pkg", + "slug": "expressvpn/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/fork.json b/ee/maintained-apps/inputs/homebrew/fork.json new file mode 100644 index 0000000000..6afbe96e2f --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fork.json @@ -0,0 +1,8 @@ +{ + "name": "Fork", + "unique_identifier": "com.DanPristupov.Fork", + "token": "fork", + "installer_format": "dmg", + "slug": "fork/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/homebrew/front.json b/ee/maintained-apps/inputs/homebrew/front.json new file mode 100644 index 0000000000..6f07e71e1b --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/front.json @@ -0,0 +1,8 @@ +{ + "name": "Front", + "unique_identifier": "com.frontapp.Front", + "token": "front", + "installer_format": "zip", + "slug": "front/darwin", + "default_categories": ["Communication"] +} diff --git a/ee/maintained-apps/inputs/homebrew/ghostty.json b/ee/maintained-apps/inputs/homebrew/ghostty.json new file mode 100644 index 0000000000..d988fad098 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/ghostty.json @@ -0,0 +1,8 @@ +{ + "name": "Ghostty", + "unique_identifier": "com.mitchellh.ghostty", + "token": "ghostty", + "installer_format": "dmg", + "slug": "ghostty/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/gimp.json b/ee/maintained-apps/inputs/homebrew/gimp.json new file mode 100644 index 0000000000..500a2fea3c --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/gimp.json @@ -0,0 +1,8 @@ +{ + "name": "GIMP", + "unique_identifier": "org.gimp.gimp-3.0", + "token": "gimp", + "installer_format": "dmg", + "slug": "gimp/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/hyper.json b/ee/maintained-apps/inputs/homebrew/hyper.json new file mode 100644 index 0000000000..9af026e664 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hyper.json @@ -0,0 +1,8 @@ +{ + "name": "Hyper", + "unique_identifier": "co.zeit.hyper", + "token": "hyper", + "installer_format": "zip", + "slug": "hyper/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index d8ab194049..b6a72937b6 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -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", diff --git a/ee/maintained-apps/outputs/egnyte/darwin.json b/ee/maintained-apps/outputs/egnyte/darwin.json new file mode 100644 index 0000000000..dd1a103d71 --- /dev/null +++ b/ee/maintained-apps/outputs/egnyte/darwin.json @@ -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" + } +} diff --git a/ee/maintained-apps/outputs/elgato-control-center/darwin.json b/ee/maintained-apps/outputs/elgato-control-center/darwin.json new file mode 100644 index 0000000000..cc8943cee9 --- /dev/null +++ b/ee/maintained-apps/outputs/elgato-control-center/darwin.json @@ -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" + } +} diff --git a/ee/maintained-apps/outputs/elgato-stream-deck/darwin.json b/ee/maintained-apps/outputs/elgato-stream-deck/darwin.json new file mode 100644 index 0000000000..bb1f3c6d2c --- /dev/null +++ b/ee/maintained-apps/outputs/elgato-stream-deck/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "7.1.0.22321", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.elgato.StreamDeck';" + }, + "installer_url": "https://edge.elgato.com/egc/macos/sd/Stream_Deck_7.1.0.22321.pkg", + "install_script_ref": "2e2bb03f", + "uninstall_script_ref": "0561d07f", + "sha256": "39e5f0ee2c22097a0332d6dcce9867c3bfe4c55aa28be9bef7af33cedda59531", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0561d07f": "#!/bin/sh\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\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\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'com.elgato.StreamDeck'\nquit_application 'com.elgato.StreamDeck'\nremove_pkg_files 'com.elgato.StreamDeck'\nforget_pkg 'com.elgato.StreamDeck'\nsudo rm -rf '/Applications/Elgato Stream Deck.app'\nsudo rm -rf '/Library/LaunchAgents/com.elgato.StreamDeck.plist'\nsudo rm -rf '~/Library/LaunchAgents/com.elgato.StreamDeck.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.elgato.StreamDeck.plist'\n", + "2e2bb03f": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# install pkg files\nsudo installer -pkg \"$TMPDIR/Stream_Deck_7.1.0.22321.pkg\" -target /\n" + } +} diff --git a/ee/maintained-apps/outputs/expressvpn/darwin.json b/ee/maintained-apps/outputs/expressvpn/darwin.json new file mode 100644 index 0000000000..bbf052be4f --- /dev/null +++ b/ee/maintained-apps/outputs/expressvpn/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "11.71.0.90727", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.expressvpn.ExpressVPN';" + }, + "installer_url": "https://www.expressvpn.works/clients/mac/expressvpn_mac_11.71.0.90727_release.pkg", + "install_script_ref": "06187be7", + "uninstall_script_ref": "7b339d2f", + "sha256": "4a13d83a20426d7dc96848ae33850d85820606440053325edf349597badd9b67", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "06187be7": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# install pkg files\nsudo installer -pkg \"$TMPDIR/expressvpn_mac_11.71.0.90727_release.pkg\" -target /\n", + "7b339d2f": "#!/bin/sh\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\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\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'com.expressvpn.ExpressVPN.agent'\n(cd /Users/$LOGGED_IN_USER && sudo '/Applications/ExpressVPN.app/Contents/Resources/uninstall.tool')\nremove_pkg_files 'com.expressvpn.ExpressVPN'\nforget_pkg 'com.expressvpn.ExpressVPN'\ntrash $LOGGED_IN_USER '/Library/Application Support/com.expressvpn.ExpressVPN'\ntrash $LOGGED_IN_USER '/Library/LaunchDaemons/com.expressvpn.expressvpnd.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.expressvpn.ExpressVPN'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.expressvpn.ExpressVPN'\ntrash $LOGGED_IN_USER '~/Library/Logs/ExpressVPN'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.expressvpn.ExpressVPN.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/fork/darwin.json b/ee/maintained-apps/outputs/fork/darwin.json new file mode 100644 index 0000000000..de0eb76af7 --- /dev/null +++ b/ee/maintained-apps/outputs/fork/darwin.json @@ -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" + } +} diff --git a/ee/maintained-apps/outputs/front/darwin.json b/ee/maintained-apps/outputs/front/darwin.json new file mode 100644 index 0000000000..1e628056b9 --- /dev/null +++ b/ee/maintained-apps/outputs/front/darwin.json @@ -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" + } +} diff --git a/ee/maintained-apps/outputs/ghostty/darwin.json b/ee/maintained-apps/outputs/ghostty/darwin.json new file mode 100644 index 0000000000..da72fb12e6 --- /dev/null +++ b/ee/maintained-apps/outputs/ghostty/darwin.json @@ -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" + } +} diff --git a/ee/maintained-apps/outputs/gimp/darwin.json b/ee/maintained-apps/outputs/gimp/darwin.json new file mode 100644 index 0000000000..1eadb967b2 --- /dev/null +++ b/ee/maintained-apps/outputs/gimp/darwin.json @@ -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" + } +} diff --git a/ee/maintained-apps/outputs/hyper/darwin.json b/ee/maintained-apps/outputs/hyper/darwin.json new file mode 100644 index 0000000000..02e50b70ec --- /dev/null +++ b/ee/maintained-apps/outputs/hyper/darwin.json @@ -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" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Egnyte.tsx b/frontend/pages/SoftwarePage/components/icons/Egnyte.tsx new file mode 100644 index 0000000000..711726d9ad --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Egnyte.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Egnyte = (props: SVGProps) => ( + + + +); +export default Egnyte; diff --git a/frontend/pages/SoftwarePage/components/icons/ElgatoControlCenter.tsx b/frontend/pages/SoftwarePage/components/icons/ElgatoControlCenter.tsx new file mode 100644 index 0000000000..1553c60604 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/ElgatoControlCenter.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const ElgatoControlCenter = (props: SVGProps) => ( + + + +); +export default ElgatoControlCenter; diff --git a/frontend/pages/SoftwarePage/components/icons/ElgatoStreamDeck.tsx b/frontend/pages/SoftwarePage/components/icons/ElgatoStreamDeck.tsx new file mode 100644 index 0000000000..eb7d5b078f --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/ElgatoStreamDeck.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const ElgatoStreamDeck = (props: SVGProps) => ( + + + +); +export default ElgatoStreamDeck; diff --git a/frontend/pages/SoftwarePage/components/icons/ExpressVpn.tsx b/frontend/pages/SoftwarePage/components/icons/ExpressVpn.tsx new file mode 100644 index 0000000000..c34eee1856 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/ExpressVpn.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const ExpressVpn = (props: SVGProps) => ( + + + +); +export default ExpressVpn; diff --git a/frontend/pages/SoftwarePage/components/icons/Fork.tsx b/frontend/pages/SoftwarePage/components/icons/Fork.tsx new file mode 100644 index 0000000000..9d0304e1d8 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fork.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fork = (props: SVGProps) => ( + + + +); +export default Fork; diff --git a/frontend/pages/SoftwarePage/components/icons/Front.tsx b/frontend/pages/SoftwarePage/components/icons/Front.tsx new file mode 100644 index 0000000000..05a48c28be --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Front.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Front = (props: SVGProps) => ( + + + +); +export default Front; diff --git a/frontend/pages/SoftwarePage/components/icons/Ghostty.tsx b/frontend/pages/SoftwarePage/components/icons/Ghostty.tsx new file mode 100644 index 0000000000..fb587d7d62 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Ghostty.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Ghostty = (props: SVGProps) => ( + + + +); +export default Ghostty; diff --git a/frontend/pages/SoftwarePage/components/icons/Gimp.tsx b/frontend/pages/SoftwarePage/components/icons/Gimp.tsx new file mode 100644 index 0000000000..db8d60eea2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Gimp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Gimp = (props: SVGProps) => ( + + + +); +export default Gimp; diff --git a/frontend/pages/SoftwarePage/components/icons/Hyper.tsx b/frontend/pages/SoftwarePage/components/icons/Hyper.tsx new file mode 100644 index 0000000000..fb2e76410d --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hyper.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hyper = (props: SVGProps) => ( + + + +); +export default Hyper; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index b85c404cd0..ccb4d11646 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -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, diff --git a/website/assets/images/app-icon-egnyte-60x60@2x.png b/website/assets/images/app-icon-egnyte-60x60@2x.png new file mode 100644 index 0000000000..199116181a Binary files /dev/null and b/website/assets/images/app-icon-egnyte-60x60@2x.png differ diff --git a/website/assets/images/app-icon-elgato-control-center-60x60@2x.png b/website/assets/images/app-icon-elgato-control-center-60x60@2x.png new file mode 100644 index 0000000000..ea9d1c6643 Binary files /dev/null and b/website/assets/images/app-icon-elgato-control-center-60x60@2x.png differ diff --git a/website/assets/images/app-icon-elgato-stream-deck-60x60@2x.png b/website/assets/images/app-icon-elgato-stream-deck-60x60@2x.png new file mode 100644 index 0000000000..dae0092d4e Binary files /dev/null and b/website/assets/images/app-icon-elgato-stream-deck-60x60@2x.png differ diff --git a/website/assets/images/app-icon-expressvpn-60x60@2x.png b/website/assets/images/app-icon-expressvpn-60x60@2x.png new file mode 100644 index 0000000000..d92075c5f4 Binary files /dev/null and b/website/assets/images/app-icon-expressvpn-60x60@2x.png differ diff --git a/website/assets/images/app-icon-fork-60x60@2x.png b/website/assets/images/app-icon-fork-60x60@2x.png new file mode 100644 index 0000000000..16d3b6c35c Binary files /dev/null and b/website/assets/images/app-icon-fork-60x60@2x.png differ diff --git a/website/assets/images/app-icon-front-60x60@2x.png b/website/assets/images/app-icon-front-60x60@2x.png new file mode 100644 index 0000000000..373a63c2b6 Binary files /dev/null and b/website/assets/images/app-icon-front-60x60@2x.png differ diff --git a/website/assets/images/app-icon-ghostty-60x60@2x.png b/website/assets/images/app-icon-ghostty-60x60@2x.png new file mode 100644 index 0000000000..f81f053494 Binary files /dev/null and b/website/assets/images/app-icon-ghostty-60x60@2x.png differ diff --git a/website/assets/images/app-icon-gimp-60x60@2x.png b/website/assets/images/app-icon-gimp-60x60@2x.png new file mode 100644 index 0000000000..04d0d1d6d2 Binary files /dev/null and b/website/assets/images/app-icon-gimp-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hyper-60x60@2x.png b/website/assets/images/app-icon-hyper-60x60@2x.png new file mode 100644 index 0000000000..a098e2396e Binary files /dev/null and b/website/assets/images/app-icon-hyper-60x60@2x.png differ