SupportCompanion 3.0.0.81129
Pre-release
Pre-release
Notes
This is a pre-release version of Support Companion created by GitHub Actions.
SupportCompanion.app has been signed and notarized. The package has been signed, notarized and stapled.
Changelog
Breaking changes
- Privileged settings are only read when set by an administrator.
IsPrivilegedonActions,RequirePrivilegedActionAuthentication, and the elevation settings (EnableElevation,MaxElevationTime,RequireResonForElevation,ReasonMinLength,ElevationWebhookUrl,ElevationSeverity) are now only honored when they come from a configuration profile or/Library/Preferences. Before, a standard user could set them in their own preferences withdefaults writeand gain root through the helper or add themselves to the admin group. Actions defined in the user's own preferences still run, but never with privileges, andRequirePrivilegedActionAuthenticationdefaults totrueunless an administrator sets it. If you deploy these settings withdefaults writeas the user, move them to a configuration profile or/Library/Preferences. - Fleet mode is selected automatically on Macs with Fleet's agent (orbit) installed when no other mode matches. Before, these Macs used System Profiler mode. Set
Modeexplicitly to keep a different mode. - The privileged helper is installed with
SMAppServiceinstead ofSMJobBless, which is deprecated in macOS 14 and later. - Existing helper installs: the helper is only installed when it's missing, so Macs upgrading from an earlier version keep their old helper until it's reinstalled. Commands run through the old helper can still hang on large output until then.
Added
- Fleet mode. Support Companion now integrates with Fleet, using the Fleet device API with the device's own token, so no API keys are needed. Fleet mode is used when Fleet's agent (orbit) is installed, when the MDM server is the Fleet server, or when
Modeis set toFleet. The Fleet server URL is read from fleetd's configuration profile or orbit's LaunchDaemon. It can be overridden withFleetUrl, which is only honored when set by a configuration profile or in/Library/Preferences, since the device token is sent to that server. Example configuration:
<key>Mode</key>
<string>Fleet</string>- Self-service apps. In Fleet mode the Apps page shows the device's Fleet self-service software, with search, category filters and collapsible Updates Available, Available and Installed sections. Apps can be installed, updated, reinstalled and uninstalled. Progress is followed until Fleet reports the result, and the output of failed installs can be viewed from the app card. Updates stay listed until the new version is actually installed.
- Custom button text per app, for example "Request" for an app named "Request software". Keys are the software title ID, display name or name; values are either a string that replaces the Install label, or a dictionary with
Install,Update,ReinstallandUninstall. Example configuration:
<key>FleetButtonLabels</key>
<dict>
<key>Request software</key>
<string>Request</string>
<key>42</key>
<dict>
<key>Install</key>
<string>Get</string>
<key>Uninstall</key>
<string>Remove</string>
</dict>
</dict>- A highlighted Recommended section at the top of the Apps page, listing apps IT recommends in the configured order. Entries are title IDs or names, and the section title can be changed. Example configuration:
<key>FleetRecommendedApps</key>
<array>
<string>Slack</string>
<string>42</string>
</array>
<key>FleetRecommendedTitle</key>
<string>Start here</string>- App icons come from Fleet (custom and App Store icons), from the installed app, or from the icon set Fleet's own web pages use. That icon set is loaded from Fleet's GitHub repository and cached, and apps without an icon get a letter tile. To stop requests to GitHub:
<key>FleetIconsFromGitHub</key>
<false/>- Updates blocked by an open app. When an install doesn't run because the app is open, the app card shows "Waiting for app to close" instead of "Install failed", with a Quit & Update button that quits the app gracefully (it can still prompt to save) and installs again. This works for Fleet-maintained apps with patch when closed, and for custom packages whose install script prints a message about the app being open. The built-in phrases can be replaced with your scripts' exact messages; an empty array turns detection off for custom packages. Example configuration:
<key>FleetAppOpenMessages</key>
<array>
<string>Please close Chrome before updating</string>
</array>- Home cards. In Fleet mode the patching progress and pending updates cards use Fleet's self-service updates, and the Apps sidebar item shows the number of updates.
- A Device Compliance card listing failing Fleet policies with their resolution text, critical ones first, and a collapsible list of passing checks. Its Re-check button asks Fleet to refresh the device's details and re-run its policies. While any check fails, a banner at the top of Home shows what needs attention. The card can be hidden using
HiddenCards, which also hides the banner, badges and policy notifications:
<key>HiddenCards</key>
<array>
<string>FleetPolicies</string>
</array>- A Fleet card showing the device's Fleet host ID, team, last check-in, last inventory update and server. It can be hidden using
HiddenCards:
<key>HiddenCards</key>
<array>
<string>Fleet</string>
</array>- The tray menu shows compact Device Compliance and Fleet cards in Fleet mode. The compliance card has Re-check and Details buttons.
- Fleet notifications, each on by default:
- When an install, update, reinstall or uninstall started from Support Companion finishes or fails, or needs the app to be closed (with a Quit & Update button). Turn off with
FleetNotifyInstallResults. - When updates are available, listing the apps, with an Update Now button that installs them. Clicking the notification opens the Apps page. Uses
AppUpdateNotificationMessage,AppUpdateNotificationButtonTextandNotificationInterval. Turn off withFleetNotifyUpdates. - When a policy starts failing, sent once per failure. Turn off with
FleetNotifyPolicies.
- When an install, update, reinstall or uninstall started from Support Companion finishes or fails, or needs the app to be closed (with a Quit & Update button). Turn off with
<key>FleetNotifyInstallResults</key>
<false/>
<key>FleetNotifyUpdates</key>
<false/>
<key>FleetNotifyPolicies</key>
<false/>- Failing compliance checks count toward the tray menu icon's badge and the Dock badge, and are shown as a badge on the Home sidebar item.
- Support for Background Security Improvements. If the pending update is a background security improvement, clicking the update will open the relevant pane in system settings.
- WiFi SSID information is now included in the device information
- New option to hide tray menu icon. This allows for using the desktop information window without displaying the tray menu icon. Example configuration:
<key>TrayMenuShowIcon</key>
<false/>- Support for monitoring Jamf application patches. When in Jamf mode, the app will now monitor for pending application patches and display them in the tray menu as well as in the main app. The badge will also be displayed in the tray menu icon when there are pending application patches. Requires the use of Self Service+.
- Correctly monitoring application patches from Self Service+ requires that Self Service+ is configured for SSO and that
Enable Self Service user loginis not checked in the Self Service configuration in Jamf Pro. This is because the data in the app is lazy updated when the user starts and authenticates in Self Service+. To work around this, Support Companion will briefly launch Self Service+ in the background to update the patch data. An icon will appear in the dock while this is happening. This process should only take a few seconds. - Can be turned off by setting
RefreshSelfServicetofalsein the configuration. Example configuration:
- Correctly monitoring application patches from Self Service+ requires that Self Service+ is configured for SSO and that
<key>RefreshSelfService</key>
<false/>- A new default card for Jamf mode that displays the last time the device checked in, the last inventory time and the MDM enrollment time as well as the ID of the device in Jamf. This card is only displayed when in Jamf mode and can be hidden using the
HiddenCardsconfiguration.
<key>HiddenCards</key>
<array>
<string>Jamf</string>
</array>- A new option for Jamf mode to set the polling interval for logs collection to gather last check in time and last inventory time. This allows for admins to set how often the app should check for new log data. By default, the interval is set to 36 hours. Example configuration:
<key>JamfLogPollHours</key>
<integer>46</integer>- Logging will now be done in a log file located at
~/Library/Logs/SupportCompanion/SupportCompanion.login addition to os log. This allows for easier troubleshooting of issues with the app. The log file will be rotated when it reaches 5 MB in size. Debug logging can be enabled by settingDebugLoggingtotruein the configuration. Example configuration:
<key>DebugLogging</key>
<true/>Changed
- Pending updates count is now shown as a badge on the sidebar navigation item, making it visible without opening the updates view.
- Accessibility labels added to icon-only buttons for improved VoiceOver support.
- Significant internal code quality improvements: preferences split into focused sub-objects, helpers refactored into dedicated files, Timer-based polling migrated to Swift structured concurrency, and improved error handling with logging throughout.
- If
BrandNameis configured, it will now be displayed in the desktop information window as well as the header instead of "Device Information". - A new localized message will be displayed in the applications view stating that the apps are installed by the
mode. This is to clarify the view only displays apps installed by the MDM and not all apps installed on the device. - User info will now use OpenDirectory to gather user information instead of
fingercommand. - A delay has been added to
InfoHelpwhen hovering over the info icon to prevent accidental triggering of the help popup. - App update names line limit has been increased to
2lines to prevent truncation of long app names. - Add support for a custom Company Portal URL (e.g. GCC High / sovereign cloud endpoints) and harden the Intune MDM detection logic so it correctly identifies Intune across all manage.microsoft.* domains while avoiding obvious false positives. Thanks @Actu4l-Human.
- Clicking a notification about apps now opens the relevant page in Support Companion, handled by the running app.
- The Dock badge updates as soon as the number of pending items changes, and no longer counts items whose card or button is hidden.
- Much lower resource use on the Home page: the patch progress wave is drawn with Core Animation. With Home open, memory use went from about 140 MB to about 55 MB, and CPU use from 30–40% to about 0%. Reduce Motion still stops the animation.
- Views only update when the data they show changes, and preference changes from a configuration profile or
defaults writeshow up right away. - The battery card's Time to Full shows Fully Charged, Not Charging or Calculating… instead of N/A while on external power. The temperature row is hidden when no reading is available, and copied device info uses the system's temperature unit.
- The tray menu popover closes when clicking outside it, pressing Escape, or opening the main window.
Fixed
- File watcher would not correctly detect changes on custom JSON cards if the file was replaced instead of modified. This has been fixed by using a different method to monitor file changes.
- The pending updates badge on
Software Updateswas transparent in the main app. FileVaultdid not hide the item on the desktop information window when configured to be hidden.- The MDM enrollment date is now found by the MDM payload instead of the profile name, so it works for MDMs other than Jamf and Intune instead of failing.
- Mode detection now compares the MDM server's host correctly. The MDM URL is read without its scheme, so the host comparison never ran before.
- A notification without a button could remove the button from earlier notifications still in Notification Center.
- On macOS 27 the tray menu popover closed a few seconds after opening, for example in Jamf mode while Self Service+ was refreshed in the background.
- On macOS 27 the battery card showed 0% health and 0.0 °C.
- Commands that print a lot of output, such as gathering logs over a long period, could hang.
- Commands and actions containing single quotes didn't run correctly.
- Jamf patches ran as the user with UID 504 instead of the logged-in user.
- Mode detection stopped before choosing a mode when the MDM server was Intune or Jamf, so the mode was never set on those Macs.
- On non-English systems, hiding the Battery or Evergreen card with
HiddenCardsdidn't stop their background refresh. - The "Updating…" label for Jamf patches didn't update.
- Web views could be created twice for the same tab, and monitoring (for example battery) kept running after the main window was closed.
- Swedish and French restart countdown translations.
Notes for Fleet mode
- Requires Fleet's agent (orbit) on the device. Features follow what the Fleet server supports; the Fleet flag for skipped patch-when-closed installs (
skipped_install) is newer than Fleet 4.91, and older servers are handled through the install output instead. - Fleet Desktop single sign-on isn't supported yet. It hasn't shipped in a Fleet release.
Changes
- 63d4142 - Add support for Jamf updates and enhance application management
- 0cb0b3f - Refactor FileWatcher and JsonCardManager for improved file handling and debugging
- 298a084 - Add SSID retrieval and display in DeviceInfo and CardGridViewModel
- 4698595 - Refactor getMDMEnrollmentTime to use profile names for command execution
- 7247036 - Remove unused variables in SSOInfoHelpers, NotificationService, and ImageUtilities for cleaner code
- ac1a40a - Add support for Jamf mode in CardGrid and CompactPatchProgressCard
- bec124b - Refactor ContentView to use SidebarListView for improved sidebar handling and enhance CircularProgressWithWave for smoother wave animation
- 87ad2ee - Enhance badge display in ScButton with improved styling and animation
- 943c993 - Add support for Jamf in tray menu
- 8d3547a - Replace button image with InfoHelp component in ScCard for improved accessibility
- 888ab57 - Update localized strings for device restart messages to improve formatting consistency
- 5744ca7 - Update installation paths for helper tool and migrate helper to AppService
- fbf0070 - Add WiFi SSID information to device info output
- 1475710 - bump version
- a2bd521 - Fix patch progress percentage display format in CompactPatchProgressCard
- 1dffa12 - Enhance patch handling by adding ID to Patch model and improving update evaluation logic
- 4da0619 - Add optional fields to PendingJamfUpdate and Patch models for enhanced data handling
- 43196ea - Add Jamf update functionality and enhance PendingUpdatesCard display
- f9af623 - Add translations for "Due by" in German, French, Japanese, Norwegian, and Swedish
- dc9f7f7 - Update changelog
- 8586e93 - Update screenshots
- 2fc1595 - Add Jamf functionality with info retrieval and UI integration
- 8bfd12e - Add Jamf info card to BatteryEvergreenStack
- 69851e5 - Enhance version normalization logic and update self-service refresh behavior
- be8dd68 - Add brand name and fix fielvault hide logic
- c9125de - Add localization strings for Jamf info and general time labels
- 6445d36 - Add general preferences for self-service refresh and Jamf log polling hours
- 90e6fb4 - bump version
- 5a3a160 - Add custom Company Portal Url support and improve intune detection for any non-commercial microsoft cloud.
- 5c11d41 - Merge branch 'dev' into support-more-intune
- 2e75bab - Update Preferences.swift
- b60d777 - Add additional logging
- e739dfc - Add logging to file with rotation
- 7617c46 - Move user info to open directory
- 2316f93 - Add delay before showing info help
- 9e059af - Keep track of current running Jamf app updates
- 831a8dd - Add localized string for installed applications message
- ac3d72e - Increase line limit for update names and add minimum scale factor for better text visibility
- ea0ca7b - Rename AppStorage key for debug logging
- f7e3bda - Version bump
- 5b06871 - Merge branch 'dev' into support-more-intune
- fed8940 - Sync readme with upstream
- f2acc62 - Merge pull request #79 from Actu4l-Human/support-more-intune
- 5734863 - Bump version
- a5c228e - Improve support button visibility checks in ActionsCard and TrayMenu
- 98c889f - Refactor: code quality improvements across codebase
- 976d008 - Adopt Swift structured concurrency and add SSID/badge features
- 8e32796 - remove commented-out code across multiple files for improved code clarity
- 426aa69 - Fix XPC code signing requirement string for debug builds
- ef7934d - Fix NWPathMonitor reuse after stop by reinitializing on startMonitoring
- 6dff6ed - Add Background Security Improvement support
- 8148050 - Fix naming conventions and typos across codebase
- 7ab0193 - Fix typo in localized string for privileged session message
- 66e3073 - Update changelog
- 06cf398 - Merge pull request #81 from macadmins/code-quality
- 4d83075 - Change command execution to use privileged method in getLastCheckIn and getLastInventoryUpdate
- 143de17 - Refactor sidebar item generation to safely unwrap URLs for Company Portal and Knowledge Base
- 4324d82 - Merge pull request #82 from macadmins/code-quality
- 83e57d7 - Fix view model and web view lifecycle issues
- ec7c1d7 - Keep tray popover open when app activation changes on macOS 27
- 5f8c092 - Only honor privileged settings from administrator-managed preferences
- f099975 - Fix command execution hangs and broken quoting
- 793a642 - Run Jamf patches as the current user instead of hardcoded UID 504
- edd8007 - Use 4-space indentation instead of tabs in Swift sources
- bbb080e - Fix typos in HelperConstants and ElevationCard file names
- a5d910d - Share process running code between the app, helper, and CLI
- ae6b241 - Route MDM-specific behavior through the active updates manager
- ab16b2b - Check hidden cards against config keys instead of localized titles
- 58f60f4 - Move top-level source files into App, Preferences, and Services folders
- 7ad114b - Fix battery health, temperature, and time to full on macOS 27
- 181ca04 - Restore Due by translation in the pending updates list
- 7c061c7 - Migrate from ObservableObject to the Observation framework
- f59c7cf - Render the patch progress wave with Core Animation
- 5f0a453 - Fix mode detection stopping before a mode is chosen
- fb40cf0 - Add Fleet device API client and Fleet mode detection
- d0ebd96 - Add a unit test target with Fleet model tests
- b06b226 - Find the MDM enrollment date by payload type instead of profile name
- 66b74dd - Match the MDM server by host during mode detection
- 72900d4 - Read the Fleet server URL from fleetd's configuration profile
- 06db43e - Add the Fleet self-service app catalog
- 0391fa7 - Show Fleet updates in the Home cards and update notifications
- c5f6d6b - Add Fleet device compliance and host details
- 9d3ec8a - Handle Fleet installs blocked by an open app, and add notification actions
- ad0237b - Add Fleet mode to the changelog
- b98f9cf - Merge pull request #85 from macadmins/code-quality
- 21a60be - Merge pull request #86 from macadmins/fleet
- 3a72a10 - bump version
- 86cc045 - Bump version to 3.0.0 and update the changelog
- 886b89b - Fix the release build with Xcode 26
- 9453e91 - Fix the Fleet app card build with Xcode 26