From 7be1d2bb42f906b19d4bf46e37cab79e3ab6bbfc Mon Sep 17 00:00:00 2001 From: Mitch Francese <2227948+tux234@users.noreply.github.com> Date: Mon, 23 Mar 2026 13:15:07 -0400 Subject: [PATCH] Add kitty as a Fleet-maintained app (#41574) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Adds kitty (macOS) to the Fleet maintained apps catalog - Input: `ee/maintained-apps/inputs/homebrew/kitty.json` - Output generated via ingester script ## Validation checklist - [ ] App can be downloaded using manifest URL - [ ] App installs successfully using manifest install script - [ ] App exists in software inventory after install - [ ] App uninstalls successfully using manifest uninstall script 🔍 Note: @ mention #g-software Product Designer in a comment pointing to the new icon once added. --- ee/maintained-apps/inputs/homebrew/kitty.json | 8 +++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ ee/maintained-apps/outputs/kitty/darwin.json | 21 ++++++++++++++++++ .../SoftwarePage/components/icons/Kitty.tsx | 14 ++++++++++++ .../SoftwarePage/components/icons/index.ts | 2 ++ .../assets/images/app-icon-kitty-60x60@2x.png | Bin 0 -> 8238 bytes 6 files changed, 52 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/kitty.json create mode 100644 ee/maintained-apps/outputs/kitty/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/Kitty.tsx create mode 100644 website/assets/images/app-icon-kitty-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/kitty.json b/ee/maintained-apps/inputs/homebrew/kitty.json new file mode 100644 index 0000000000..938321127e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/kitty.json @@ -0,0 +1,8 @@ +{ + "name": "kitty", + "slug": "kitty/darwin", + "unique_identifier": "net.kovidgoyal.kitty", + "token": "kitty", + "installer_format": "dmg", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 1d947be736..b8610e6bc3 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -946,6 +946,13 @@ "unique_identifier": "com.aone.keka", "description": "Keka is a file archiver." }, + { + "name": "kitty", + "slug": "kitty/darwin", + "platform": "darwin", + "unique_identifier": "net.kovidgoyal.kitty", + "description": "kitty is a fast, feature-rich, GPU-based terminal emulator." + }, { "name": "Krita", "slug": "krita/darwin", diff --git a/ee/maintained-apps/outputs/kitty/darwin.json b/ee/maintained-apps/outputs/kitty/darwin.json new file mode 100644 index 0000000000..5ecd44c882 --- /dev/null +++ b/ee/maintained-apps/outputs/kitty/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "0.46.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.kovidgoyal.kitty';" + }, + "installer_url": "https://github.com/kovidgoyal/kitty/releases/download/v0.46.0/kitty-0.46.0.dmg", + "install_script_ref": "909796ec", + "uninstall_script_ref": "e1f2ff2b", + "sha256": "4474db515795ede5e1dee17725c553170a514e324f77644d409c24443bcd5ff9", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "909796ec": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Try to launch the application\n if osascript -e \"tell application id \\\"$bundle_id\\\" to activate\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\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_and_track_application 'net.kovidgoyal.kitty'\nif [ -d \"$APPDIR/kitty.app\" ]; then\n\tsudo mv \"$APPDIR/kitty.app\" \"$TMPDIR/kitty.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/kitty.app\" \"$APPDIR\"\nrelaunch_application 'net.kovidgoyal.kitty'\n", + "e1f2ff2b": "#!/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/kitty.app\"\nsudo rm -rf 'kitty'\nsudo rm -rf 'kitten'\ntrash $LOGGED_IN_USER '~/.config/kitty'\ntrash $LOGGED_IN_USER '~/Library/Caches/kitty'\ntrash $LOGGED_IN_USER '~/Library/Preferences/kitty'\ntrash $LOGGED_IN_USER '~/Library/Preferences/net.kovidgoyal.kitty.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/net.kovidgoyal.kitty.savedState'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Kitty.tsx b/frontend/pages/SoftwarePage/components/icons/Kitty.tsx new file mode 100644 index 0000000000..51ca7001e6 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Kitty.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Kitty = (props: SVGProps) => ( + + + +); +export default Kitty; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index d46155b9f6..3f5aebc7e2 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -11,6 +11,7 @@ import Charles from "./Charles"; import ConnectFonts from "./ConnectFonts"; import CrashPlan from "./CrashPlan"; import Iina from "./Iina"; +import Kitty from "./Kitty"; import Krita from "./Krita"; import LastPass from "./LastPass"; import Nextcloud from "./Nextcloud"; @@ -312,6 +313,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { "connect fonts": ConnectFonts, crashplan: CrashPlan, iina: Iina, + kitty: Kitty, krita: Krita, lastpass: LastPass, "microsoft.companyportal": IntuneCompanyPortal, diff --git a/website/assets/images/app-icon-kitty-60x60@2x.png b/website/assets/images/app-icon-kitty-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b36cdd2fd1f37901de5c5a3a1102d9907bb76547 GIT binary patch literal 8238 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