From 334d83ae80bbc8a5a6f7de6d13737a7cac11041b Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Fri, 19 Jun 2026 10:04:39 -0500 Subject: [PATCH] Add Windows FMAs (Letter C) (#47732) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This pull request adds support for three new Windows applications—Chef Workstation, Cherry Keys, and Colour Contrast Analyser—along with Cribl Edge, to the maintained apps system. It introduces their metadata, installation/uninstallation scripts, and icon assets, ensuring these apps can be managed and displayed within the platform. **New Windows Application Support:** * Added metadata input files for: - `Chef Workstation` (`chef-workstation.json`), including detection queries and categorization as a Developer tool. - `Cherry Keys` (`cherry-keys.json`), with fuzzy name matching and categorized as a Utility. - `Colour Contrast Analyser` (`colour-contrast-analyser.json`), specifying publisher and categorized as a Utility. - `Cribl Edge` (`cribl-edge.json`), with detection queries and categorized as a Developer tool. **Application Output and Versioning:** * Added output JSON files for each new app with: - Latest version info, detection and patch queries, installer URLs, SHA256 hashes, install/uninstall script references, and upgrade codes: - `chef-workstation/windows.json` - `cherry-keys/windows.json` - `colour-contrast-analyser/windows.json` - `cribl-edge/windows.json` **App Catalog Updates:** * Updated `apps.json` to include the new Windows apps, each with a description and unique identifier for catalog display. [[1]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R1411-R1424) [[2]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R1712-R1718) [[3]](diffhunk://#diff-4c1446cfc02c6bb0bda874481e333c65b84e184fcea52f656b49a6489f73c9c2R1803-R1809) **UI/Icon Assets:** * Added a new SVG icon component for Chef Workstation in the frontend (`ChefWorkstation.tsx`). --- .../inputs/winget/chef-workstation.json | 11 +++++++ .../inputs/winget/cherry-keys.json | 11 +++++++ .../winget/colour-contrast-analyser.json | 11 +++++++ .../inputs/winget/cribl-edge.json | 10 +++++++ ee/maintained-apps/outputs/apps.json | 28 ++++++++++++++++++ .../outputs/chef-workstation/windows.json | 23 ++++++++++++++ .../outputs/cherry-keys/windows.json | 23 ++++++++++++++ .../colour-contrast-analyser/windows.json | 23 ++++++++++++++ .../outputs/cribl-edge/windows.json | 23 ++++++++++++++ .../components/icons/ChefWorkstation.tsx | 14 +++++++++ .../components/icons/CherryKeys.tsx | 14 +++++++++ .../components/icons/CriblEdge.tsx | 14 +++++++++ .../SoftwarePage/components/icons/index.ts | 6 ++++ .../app-icon-chef-workstation-60x60@2x.png | Bin 0 -> 5027 bytes .../images/app-icon-cherry-keys-60x60@2x.png | Bin 0 -> 4114 bytes .../images/app-icon-cribl-edge-60x60@2x.png | Bin 0 -> 4687 bytes 16 files changed, 211 insertions(+) create mode 100644 ee/maintained-apps/inputs/winget/chef-workstation.json create mode 100644 ee/maintained-apps/inputs/winget/cherry-keys.json create mode 100644 ee/maintained-apps/inputs/winget/colour-contrast-analyser.json create mode 100644 ee/maintained-apps/inputs/winget/cribl-edge.json create mode 100644 ee/maintained-apps/outputs/chef-workstation/windows.json create mode 100644 ee/maintained-apps/outputs/cherry-keys/windows.json create mode 100644 ee/maintained-apps/outputs/colour-contrast-analyser/windows.json create mode 100644 ee/maintained-apps/outputs/cribl-edge/windows.json create mode 100644 frontend/pages/SoftwarePage/components/icons/ChefWorkstation.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/CherryKeys.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/CriblEdge.tsx create mode 100644 website/assets/images/app-icon-chef-workstation-60x60@2x.png create mode 100644 website/assets/images/app-icon-cherry-keys-60x60@2x.png create mode 100644 website/assets/images/app-icon-cribl-edge-60x60@2x.png diff --git a/ee/maintained-apps/inputs/winget/chef-workstation.json b/ee/maintained-apps/inputs/winget/chef-workstation.json new file mode 100644 index 0000000000..05cd0ae4f6 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/chef-workstation.json @@ -0,0 +1,11 @@ +{ + "name": "Chef Workstation", + "slug": "chef-workstation/windows", + "package_identifier": "ChefSoftware.Workstation", + "unique_identifier": "Chef Workstation", + "exists_query": "SELECT 1 FROM programs WHERE name LIKE 'Chef Workstation v%' AND publisher LIKE '%Chef Software%';", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/winget/cherry-keys.json b/ee/maintained-apps/inputs/winget/cherry-keys.json new file mode 100644 index 0000000000..53cee49701 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/cherry-keys.json @@ -0,0 +1,11 @@ +{ + "name": "Cherry Keys", + "slug": "cherry-keys/windows", + "package_identifier": "CHERRY.CHERRYKEYS", + "unique_identifier": "CHERRY KEYS", + "fuzzy_match_name": "CHERRY KEYS (x64) V%", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Utilities"] +} diff --git a/ee/maintained-apps/inputs/winget/colour-contrast-analyser.json b/ee/maintained-apps/inputs/winget/colour-contrast-analyser.json new file mode 100644 index 0000000000..2b48ca7f5f --- /dev/null +++ b/ee/maintained-apps/inputs/winget/colour-contrast-analyser.json @@ -0,0 +1,11 @@ +{ + "name": "Colour Contrast Analyser", + "slug": "colour-contrast-analyser/windows", + "package_identifier": "TPGi.CCAe", + "unique_identifier": "Colour Contrast Analyser", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "program_publisher": "Cédric Trévisan", + "default_categories": ["Utilities"] +} diff --git a/ee/maintained-apps/inputs/winget/cribl-edge.json b/ee/maintained-apps/inputs/winget/cribl-edge.json new file mode 100644 index 0000000000..09741c7f18 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/cribl-edge.json @@ -0,0 +1,10 @@ +{ + "name": "Cribl Edge", + "slug": "cribl-edge/windows", + "package_identifier": "Cribl.CriblEdge", + "unique_identifier": "Cribl Edge", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 5073f1e029..cedef3a142 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -1408,6 +1408,20 @@ "unique_identifier": "de.wengenmayer.Cheetah3D", "description": "Cheetah3D is a 3D modelling, rendering and animation software." }, + { + "name": "Chef Workstation", + "slug": "chef-workstation/windows", + "platform": "windows", + "unique_identifier": "Chef Workstation", + "description": "Chef Workstation is a toolkit from Progress Chef for authoring, testing, and running infrastructure automation code." + }, + { + "name": "Cherry Keys", + "slug": "cherry-keys/windows", + "platform": "windows", + "unique_identifier": "CHERRY KEYS", + "description": "Cherry Keys is a utility for individually reassigning the keys of Cherry keyboards, mice, and desktop sets." + }, { "name": "Cherry Studio", "slug": "cherry-studio/darwin", @@ -1695,6 +1709,13 @@ "unique_identifier": "com.electron.cca", "description": "Colour Contrast Analyser is a colour contrast checker." }, + { + "name": "Colour Contrast Analyser", + "slug": "colour-contrast-analyser/windows", + "platform": "windows", + "unique_identifier": "Colour Contrast Analyser", + "description": "Colour Contrast Analyser is a tool for checking the contrast of text and visual elements against WCAG accessibility guidelines." + }, { "name": "Comet", "slug": "comet/darwin", @@ -1779,6 +1800,13 @@ "unique_identifier": "CrashPlan", "description": "CrashPlan is backup and recovery software." }, + { + "name": "Cribl Edge", + "slug": "cribl-edge/windows", + "platform": "windows", + "unique_identifier": "Cribl Edge", + "description": "Cribl Edge is an observability agent for collecting and processing logs, metrics, and other telemetry at the edge." + }, { "name": "CrossOver", "slug": "crossover/darwin", diff --git a/ee/maintained-apps/outputs/chef-workstation/windows.json b/ee/maintained-apps/outputs/chef-workstation/windows.json new file mode 100644 index 0000000000..add3aca421 --- /dev/null +++ b/ee/maintained-apps/outputs/chef-workstation/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "25.13.7.1", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'Chef Workstation v%' AND publisher LIKE '%Chef Software%';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Chef Workstation v%' AND publisher LIKE '%Chef Software%' AND version_compare(version, '25.13.7.1') < 0);" + }, + "installer_url": "https://packages.chef.io/files/stable/chef-workstation/25.13.7/windows/10/chef-workstation-25.13.7-1-x64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "c136f86e", + "sha256": "fd6dea9b5983510402851b6166848e0275c2cc45890b91e835e5028c9f394aa1", + "default_categories": [ + "Developer tools" + ], + "upgrade_code": "{9870C512-DF2C-43D9-8C28-7ACD60ABBE27}" + } + ], + "refs": { + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "c136f86e": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{9870C512-DF2C-43D9-8C28-7ACD60ABBE27}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n" + } +} diff --git a/ee/maintained-apps/outputs/cherry-keys/windows.json b/ee/maintained-apps/outputs/cherry-keys/windows.json new file mode 100644 index 0000000000..af8e646e71 --- /dev/null +++ b/ee/maintained-apps/outputs/cherry-keys/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "1.0.7", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'CHERRY KEYS (x64) V%' AND publisher = 'Cherry GmbH';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'CHERRY KEYS (x64) V%' AND publisher = 'Cherry GmbH' AND version_compare(version, '1.0.7') < 0);" + }, + "installer_url": "https://www.cherry.de/fileadmin/media/Corporate/Software/CherryKeys_x64_1_0_7__1_.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "d2b500dc", + "sha256": "e7b91d2e9a7f7074252d5fb011831b5a6247e6a33bdabb73e68f2ffc198eaed3", + "default_categories": [ + "Utilities" + ], + "upgrade_code": "{9811A1CD-1BB2-415C-A60C-AF84715E03C8}" + } + ], + "refs": { + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "d2b500dc": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{9811A1CD-1BB2-415C-A60C-AF84715E03C8}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n" + } +} diff --git a/ee/maintained-apps/outputs/colour-contrast-analyser/windows.json b/ee/maintained-apps/outputs/colour-contrast-analyser/windows.json new file mode 100644 index 0000000000..5b0562fec0 --- /dev/null +++ b/ee/maintained-apps/outputs/colour-contrast-analyser/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "3.5.5", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Colour Contrast Analyser' AND publisher = 'Cédric Trévisan';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Colour Contrast Analyser' AND publisher = 'Cédric Trévisan' AND version_compare(version, '3.5.5') < 0);" + }, + "installer_url": "https://github.com/ThePacielloGroup/CCAe/releases/download/v3.5.5/CCA-Setup-3.5.5.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "f8db8d2e", + "sha256": "1267404c1cd7c1c2a19f3bbe7ddd325039c0f9ba4d8bcee0b8e04136388a85a8", + "default_categories": [ + "Utilities" + ], + "upgrade_code": "{7D893A49-4DD7-5CD4-B448-974E017023D3}" + } + ], + "refs": { + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "f8db8d2e": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{7D893A49-4DD7-5CD4-B448-974E017023D3}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n" + } +} diff --git a/ee/maintained-apps/outputs/cribl-edge/windows.json b/ee/maintained-apps/outputs/cribl-edge/windows.json new file mode 100644 index 0000000000..f0f15b0e4a --- /dev/null +++ b/ee/maintained-apps/outputs/cribl-edge/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "4.18.1", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Cribl Edge' AND publisher = 'Cribl, Inc.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Cribl Edge' AND publisher = 'Cribl, Inc.' AND version_compare(version, '4.18.1') < 0);" + }, + "installer_url": "https://cdn.cribl.io/dl/4.18.1/cribl-4.18.1-37206a7f-win32-x64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "00e56c03", + "sha256": "d956338874f15176450121faaf563b99b0369b56ec23c4a43d048dc71630f6a4", + "default_categories": [ + "Developer tools" + ], + "upgrade_code": "{2412301F-2415-4BE7-8D8B-5827722564B0}" + } + ], + "refs": { + "00e56c03": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{2412301F-2415-4BE7-8D8B-5827722564B0}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n", + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/ChefWorkstation.tsx b/frontend/pages/SoftwarePage/components/icons/ChefWorkstation.tsx new file mode 100644 index 0000000000..252e9ba363 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/ChefWorkstation.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const ChefWorkstation = (props: SVGProps) => ( + + + +); +export default ChefWorkstation; diff --git a/frontend/pages/SoftwarePage/components/icons/CherryKeys.tsx b/frontend/pages/SoftwarePage/components/icons/CherryKeys.tsx new file mode 100644 index 0000000000..dfa96f65be --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/CherryKeys.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const CherryKeys = (props: SVGProps) => ( + + + +); +export default CherryKeys; diff --git a/frontend/pages/SoftwarePage/components/icons/CriblEdge.tsx b/frontend/pages/SoftwarePage/components/icons/CriblEdge.tsx new file mode 100644 index 0000000000..3e79fd48e3 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/CriblEdge.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const CriblEdge = (props: SVGProps) => ( + + + +); +export default CriblEdge; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 9e056ae876..50efe66ecd 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -161,6 +161,8 @@ import ChatGpt from "./ChatGpt"; import ChatGptAtlas from "./ChatGptAtlas"; import Chatwise from "./Chatwise"; import Cheetah3D from "./Cheetah3D"; +import ChefWorkstation from "./ChefWorkstation"; +import CherryKeys from "./CherryKeys"; import CherryStudio from "./CherryStudio"; import Chime from "./Chime"; import Choosy from "./Choosy"; @@ -207,6 +209,7 @@ import Cork from "./Cork"; import CotEditor from "./CotEditor"; import CrashPlan from "./CrashPlan"; import CreativeCloud from "./AdobeCreativeCloud"; +import CriblEdge from "./CriblEdge"; import Crossover from "./Crossover"; import Cryptomator from "./Cryptomator"; import Crystalfetch from "./Crystalfetch"; @@ -1198,6 +1201,8 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { "chatgpt atlas": ChatGptAtlas, chatwise: Chatwise, cheetah3d: Cheetah3D, + "chef workstation": ChefWorkstation, + "cherry keys": CherryKeys, "cherry studio": CherryStudio, chime: Chime, choosy: Choosy, @@ -1242,6 +1247,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { cork: Cork, coteditor: CotEditor, crashplan: CrashPlan, + "cribl edge": CriblEdge, crossover: Crossover, cryptomator: Cryptomator, crystalfetch: Crystalfetch, diff --git a/website/assets/images/app-icon-chef-workstation-60x60@2x.png b/website/assets/images/app-icon-chef-workstation-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bcd54b0087c626b752e15733a3f37103221956 GIT binary patch literal 5027 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ðqc9%xu+$B20U_*@WYhw(%uaUSyr0oIp<07C61j! zqemPFDFh~I8=G{_GXvf%gzT-Y(;)ZGNz3l+=Fx15_M^K{S5=1WVvHrHA{XDIw93ny zozI#K!G(S#q?=G%d&_-AUkZsAi5g^Fp?lQD%QHgjl-#oAQi9;K*psiu?@=g`+k5oR z3oOh;4fOh3#N%5(-1(G6BBSPXBG5?|mdIEuVi^e|f2_eJR0RWh>6U5++S!R!YVjaTU^U*U=Q_vm3_x zPVz~yW?_&6&`<2zqS;%kSHKkB%N?f165{{!h|0zP!wH_B+cse4Q{$R#ckg)rE=7Kz;Qp-nsevS5-yXSMM5?VXdhkyC*FNq9SpNzuFca z5!|vEVxU`|qb{{&j4Ky1rVairxGF1LpCFwEzGB literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-cribl-edge-60x60@2x.png b/website/assets/images/app-icon-cribl-edge-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..96cd61fc0aa0dd163223385617d83fadbd068ba8 GIT binary patch literal 4687 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
ta$$@ zMa$|Yvwd%;Wr3XNYwCVXJIBS%T7;_keEM_I#kSxy9$m|qdXt&4g^koT1O0~P%6dW} zCXyLTKY9E~Iic~aA$IYOa)A|1XJ(uhThhQW7A1#$?uDCL#|K((aF}A`!gKgoF&z`k zxp=NL_K@^hK7ZUW_v^Ko){q>+xRWTY{ zOv4fcbv?;m%c)sggGHu&MPDmd<+aPH0oKtQkLv1u#*oH&Z?UKnJzJb6=}&F>&~x3E zeYQR;expvzLY1Nf%39>Fj1;v0GZ>{g#_qo0)|N8zVF|j;9 zcMV}i`_(ScEdCVy)C5JCIs>>zb-@^&yx+8zn4}Qm_$!Y7!%=Wh3}6$Z%S|xROhLU2 zh&)477rH7KTSK)JBy;g;D(FhRH#ja>fgk7bE77^Cb@61lA0v{JFbUD-bEU6&c5T}g zNunRctG@?D)Qso1U=|=X;cK=NvN@6mc9wqjE4|K&6a8-`#GKJ1qn1u8P9OF75+!sUw21CLXNuRC;kM66J*S( zk1n1bER}SLrQ*BQ!j3Y=P}-zCY%71*cPJO4d15nzQ@@bSHs6Rch#4Fk&dzQpZJ+Nl z(z{2<1hQkYVxUZ#*e*>Vn=<=G)+DYmbIF5*9z27Gpy6|k{;czem0rNohTYIQPa1g#VlmM?u?IGzhe z$$pZ6BqtioNC1Cfpxj;V8)P!Qakz$Iueo$G2WpqjWhN2cOq8}ywVH7@r3Hu$d-H|Nfs*d7UQ7}-dBu9 z%T+-=a=ww(U#Oq&ww|+D7-iFm?ZR*n!W!HQ@Q1muv&(4vhTv#5u5UJ9zsB3{92>sw z7)5L?XQm2CD>2=TA+J4CdfQ)1wfxd5_2K*aDuuX|AN_XrP)7Z<9Md_>=3zY{5=UYvtGW#E1yHui8z6&{GwROy<=q{xf#>4TD$HN&Oi z#WgYh6*CRc&4UXnC{rTOz3cV^Za|bR=M1BOkN$*cL&GopP3`-4ZDeOp<-v?ES&Am{ z<+eMo_Y`epNZ9i+LM8eD(zeJ&cBC=Xgt4djr=;ZYNX^`;kblf^i8cVS@7&m%D<2&F z2bK{c<*kCf_8igTfAg!Lb*1WyVf2onPR5dIovXRsYCo4#|&g0To4)JqC{OW z&W7w5*{?jQnU=u~T${0iQ4&E`_=xS3%|98(Q=>Gl@$ckxN`j(JNklf9>kFnmCR9D$ z+83edYO%kv`A|e)CZKo;y{=t)cGqqfD$4+Ap+sluz)V8EOC4CWlz~&X@3L?&V<~Un zYUr)oArMyGf2ueC1AVGavA_gmCDfmkS;k)cd{i}bP8QhV&;&q29x!HacoY zyYOz2J-07aQBL95!S45lrUvEj>{jgyM>khyXP&>aoAuBAe@7qx9gO(XzrG=E&|-cw TwMM}3?=T0hrl(q?Y!m(;h?~BH literal 0 HcmV?d00001