# io.Connect Desktop 9.10

Source: https://docs.interop.io/desktop/getting-started/changelog/9-10/index.html

## io.Connect Desktop 9.10

*Release date: 29.10.2025*

| Components | Version |
|------------|---------|
| Electron | [38.2.2](https://releases.electronjs.org/release/v38.2.2) |
| Chromium | 140.0.7339.133 |
| Node.js | 22.19.0 |

The following libraries are bundled with **io.Connect Desktop** 9.10 and will be used for [auto injection](https://docs.interop.io/desktop/getting-started/how-to/interop-enable-your-apps/javascript/index.md#auto_injection):

| Injected Library | Version |
|------------------|---------|
| [`@interopio/desktop`](https://www.npmjs.com/package/@interopio/desktop) | [6.14](https://docs.interop.io/desktop/getting-started/how-to/interop-enable-your-apps/javascript/index.md#changelog-interopiodesktop-6140) |
| [`@interopio/fdc3`](https://www.npmjs.com/package/@interopio/fdc3) | 2.5 |

## Deprecated Platform Apps

> ### Application Monitor & Performance Report
>
> The Application Monitor and the Performance Report apps that were previously part of the io.Connect [Dev Tools](https://docs.interop.io/desktop/developers/dev-tools/index.md) have been deprecated. Fixes for these app won't be available and they won't be distributed as part of the io.Connect platform starting from this release onward. If you are using an [extensible installer](https://docs.interop.io/desktop/getting-started/how-to/rebrand-io-connect/installer/index.md#extensible_installer) configuration that includes these apps, you must make sure to remove them from the configuration file when upgrading to **io.Connect Desktop** 9.10 or later.
>
> The Application Monitor and the Performance Report tools will still work in all minor and fix versions that are part of the **io.Connect Desktop** 9.0 stream, but may stop working with later major version streams.
>
> Legacy Application Monitor:
>
> ![Legacy Application Monitor](https://docs.interop.io/desktop/images/deprecated-apps/app-monitor.png)
>
> Legacy Performance Report:
>
> ![Legacy Performance Report](https://docs.interop.io/desktop/images/deprecated-apps/performance-report.png)

## New Features

> ### io.Insights Metrics
>
> New [default metrics](https://docs.interop.io/insights/configuration/io-connect-desktop/index.md#metrics-default_metrics) have been added to [**io.Insights**](https://docs.interop.io/insights/general-overview/index.md) and some of the existing metrics have been improved.
>
> #### Changed Metric Types
>
> The `"app_duration"`, `"app_startup"`, `"workspace_startup"`, and `"layout_startup"` default metrics are now of type `Gauge` instead of `Histogram`.
>
> #### Metrics Recalibration
>
> The `"app_crash"` metric is now published when the following conditions are met:
>
> - For web apps, when the process renderer is gone.
> - For native apps, when the process is killed, when the process exits with a non-zero exit code, or when the process is terminated due to a fatal error. You can use the `"reason"` attribute to determine the cause for the crash.
>
> The value of the `"reason"` attribute of the `"app_crash"` metric is derived from the following sources:
>
> - For web apps, the value of this attribute is derived from the value of the `reason` property of the [`RenderProcessGoneDetails`](https://www.electronjs.org/docs/latest/api/structures/render-process-gone-details) Electron object.
> - For native apps, the value of this attribute can be:
>     - `"crashed"` - when the process exited with a non-zero exit code;
>     - the [signal](https://nodejs.org/api/process.html#process_signal_events) sent to the process - when the process was terminated or killed and the exit event includes a signal;
>     - the message from the error event - when the process couldn't be started or controlled due to a fatal OS-level error;
>
> The measuring points for the `"app_startup"` metric have been adjusted to reflect more correctly the measured process:
>
> - For web apps running in the Electron container of **io.Connect Desktop**, this metric measures the interval from receiving the request for starting the app until the `"did-finish-load"` Electron event is fired. This ensures that the web page has been fully loaded. For native apps running in **io.Connect Desktop** and using the io.Connect libraries, this metric measures the interval from receiving the request for starting the app until the [Interop](https://docs.interop.io/desktop/capabilities/data-sharing/interop/overview/index.md) instance of the app is ready. This metric isn't published for native apps that don't use the io.Connect libraries, as in this case, a reliable signal for completing the app initialization process isn't available.
> - For web apps running in **io.Connect Browser**, this metric measures the interval from receiving the request for starting the app until the io.Connect API has been initialized in it.
>
> The measuring points for the `"platform_startup"` metrics have been adjusted to reflect more correctly the measured process:
>
> - For **io.Connect Desktop**, this metric measures the moment from starting the actual executable file (not the gilding executable) and includes the entire platform startup sequence until the moment the shell app starts loading.
> - For **io.Connect Browser**, this metric measures the time it takes for the [`@interopio/browser-platform`](https://www.npmjs.com/package/@interopio/browser-platform) library to initialize.
>
> #### New Workspaces Metrics
>
> The following improvements and additions were made to the default published metrics related to Workspaces:
>
> - The `"workspace_startup"` startup metric was recalibrated and now measures the entire process of loading a Workspace - the time from receiving the request for opening a Workspace until the time all apps in it have been loaded.
> - The `"workspace_startup"` startup metric was enriched with additional sub-metrics (published in parallel with `"workspace_startup"`) in order to measure more accurately the various stages of loading a Workspace - initializing the Workspaces App (the `"workspace_startup_frame"` sub-metric - published only when the Workspace is being loaded in a new Workspaces App instance), loading the `<Workspaces />` component (the `"workspace_startup_component"` sub-metric - always published), and loading the apps in the Workspace (the `"workspace_startup_apps"` sub-metric - always published).
> - The `"workspace_startup_frame"` is published only when the Workspace is being loaded in a new Workspaces App instance. You can determine this by using the newly added `"includesFrameCreation"` attribute of the `"workspace_startup"` metric.
> - The `"workspace_startup_frame"` metric is published in parallel with the following sub-metrics that measure the separate stages of initializing a Workspaces App instance - creating the underlying browser window (the `"workspace_startup_frame_init"` sub-metric), loading the web page of the Workspaces App (the `"workspace_startup_frame_page_load"` sub-metric), and loading the `<Workspaces />` component (the `"workspace_startup_frame_workspace_render"` sub-metric).
> - Besides the already available `"layout"` attribute, all Workspaces metrics now have two new additional attributes - `"complexLoad"` and `"includesFrameCreation"`.
>
> The following table describes the new Workspaces metrics:
>
> | Metric | Instrument Type | Unit | Description |
> |--------|-----------------|------|-------------|
> | `"workspace_startup"` | `Gauge` | milliseconds | The total time it took to load a Workspace. Measures the interval from initiating the request for creating or restoring the Workspace until all visible apps in it have been loaded. For web apps, this means that the `DOMContentLoaded` event has been fired. For native apps (**io.Connect Desktop** only), this means that the app has completed its window registration within the io.Connect framework. For **io.Connect Browser**, this metric doesn't measure the time for initializing a Workspaces App instance, only the time for loading the actual Workspace in it. For **io.Connect Desktop**, this is the root metric for measuring Workspace startup times and it's published in parallel with several sub-metrics that measure the separate intervals for completing the consecutive stages of loading a Workspace. You can use the `"includesFrameCreation"` attribute to determine whether the measurement includes the time for initializing a Workspaces App instance. If the Workspace is created or restored in a new Workspaces App instance, the `"workspace_startup_frame"` metric and its sub-metrics will also be published in parallel with `"workspace_startup"`. The `"workspace_startup_component"` and the `"workspace_startup_apps"` metrics are always published in parallel with `"workspace_startup"` regardless of whether a new Workspaces App instance has been created. |
> | `"workspace_startup_apps"` | `Gauge` | milliseconds | The time it took to load all apps in the Workspace. For web apps, this means that the `DOMContentLoaded` event has been fired. For native apps, this means that the app has completed its window registration within the io.Connect framework. Measures the interval from initiating the loading of the first app in the Workspace until all apps have been loaded. You can use the `"complexLoad"` attribute to determine whether all apps in the Workspace have been started as new app instances, or one or more of them has been included in the Workspace as an already existing window. |
> | `"workspace_startup_component"` | `Gauge` | milliseconds | The time it took to create and render the `<Workspaces />` [component](https://docs.interop.io/desktop/capabilities/windows/workspaces/overview/index.md#extending_workspaces-workspaces_component) within an already existing Workspaces App instance (i.e., when the Workspace is created or restored in an already existing Workspaces App instance). Measures the interval from initiating the initialization of the `<Workspaces />` component inside the Workspaces App instance until the component is fully rendered and interactive. |
> | `"workspace_startup_frame"` | `Gauge` | milliseconds | The total time it took to load the Workspace App instance. This is measured from initiating the request for creating or restoring the Workspace until the Workspaces App instance has been fully loaded and the `<Workspaces />` component has been rendered. This metric is published only when a new Workspaces App instance is being created and is published in parallel with the following sub-metrics that measure the separate intervals for completing the consecutive stages of initializing a Workspaces App instance: `"workspace_startup_frame_init"`, `"workspace_startup_frame_page_load"`, and `"workspace_startup_frame_workspace_render"`. |
> | `"workspace_startup_frame_init"` | `Gauge` | milliseconds | Published in parallel with the `"workspace_startup_frame"` metric. Measures the interval from initiating the creation of the underlying browser window until the browser window is ready for loading the web page of the Workspaces App instance. |
> | `"workspace_startup_frame_page_load"` | `Gauge` | milliseconds | Published in parallel with the `"workspace_startup_frame"` metric. Measures the interval from initiating the navigation to the web page of the Workspaces App instance (after the underlying browser window has been created) until the `DOMContentLoaded` event is fired for the web page. |
> | `"workspace_startup_frame_workspace_render"` | `Gauge` | milliseconds | Published in parallel with the `"workspace_startup_frame"` metric. Measures the interval from initiating the initialization of the `<Workspaces />` component inside the Workspaces App instance (after the web page of the Workspaces App instance has already been loaded) until the component is fully rendered and interactive. |
>
> The following table describes the new additional attributes for all Workspaces metrics:
>
> | Attribute | Description |
> |-----------|-------------|
> | `"complexLoad"` |  Differentiates between launching Workspaces in which all apps are loaded as new instances (this is the normal loading scenario, i.e. the value of `"complexLoad"` will be `"false"`), and Workspaces in which one or more of the app windows are already existing windows that have been included in the Workspace (this is the complex loading scenario, i.e. the value of `"complexLoad"` will be `"true"`). If `"complexLoad"` is `"true"`, the time for loading the Workspace may be slightly or significantly decreased and it's important to keep in mind that this won't be due to performance optimizations, but due to loading one or more already existing app instances into the Workspace which is a faster procedure than starting new app instances. |
> | `"includesFrameCreation"` | If the value of this attribute is `"true"`, this means that the measurement includes the time it took to initialize a Workspaces App instance (e.g., if the Workspace has been loaded into an already existing Workspaces App instance, the value of this attribute will be `"false"`). |

> ### Workspaces Frame Visibility
>
> The [`isVisible()`](https://docs.interop.io/desktop/reference/javascript/workspaces/frame/index.md#Frame-isVisible), [`hide()`](https://docs.interop.io/desktop/reference/javascript/workspaces/frame/index.md#Frame-hide), and [`show()`](https://docs.interop.io/desktop/reference/javascript/workspaces/frame/index.md#Frame-show) methods have been added to the [`Frame`](https://docs.interop.io/desktop/reference/javascript/workspaces/frame/index.md) instance in the [Workspaces API](https://docs.interop.io/desktop/reference/javascript/workspaces/frame/index.md). These methods enable you to [retrieve and control the visibility](https://docs.interop.io/desktop/capabilities/windows/workspaces/javascript/index.md#frame-frame_visibility) state of the Workspaces App instance:
>
> ```javascript
> // Checking the current visibility state of the Workspaces App instance.
> const isFrameVisible = await myFrame.isVisible();
>
> if (isFrameVisible) {
>     // Hiding the Workspaces App instance.
>     await myFrame.hide();
> } else {
>     // Optional settings for showing the Workspaces App instance.
>     // Settings `activate` to `true` will make the Workspaces Frame window gain focus, restore its normal state
>     // (e.g., if it has been previously minimized), and bring it in front of other existing windows.
>     const frameShowSettings = { activate: true };
>
>     // Showing the Workspaces App instance.
>     await myFrame.show(frameShowSettings);
> }
> ```
>
> You can also specify the visibility state of the Workspaces App instance by using the `isVisible` property of the [`NewFrameConfig`](https://docs.interop.io/desktop/reference/javascript/workspaces/newframeconfig/index.md) when [creating](https://docs.interop.io/desktop/capabilities/windows/workspaces/javascript/index.md#workspace-creating_workspaces) or [restoring](https://docs.interop.io/desktop/capabilities/windows/workspaces/javascript/index.md#workspace-restoring_workspaces) Workspaces and when [creating empty `Frame` instances](https://docs.interop.io/desktop/capabilities/windows/workspaces/javascript/index.md#frame-empty_frame):
>
> ```javascript
> // Creating a hidden empty `Frame`.
> const definition = {
>     frameConfig: {
>         isVisible: false
>     }
> };
>
> const emptyFrame = await io.workspaces.createEmptyFrame(definition);
> ```

> ### Platform Initialization Success & Failure Signals
>
> In certain scenarios, you may want your app that has been started in one of the early [boot sequence](https://docs.interop.io/desktop/capabilities/more/features/index.md#boot_sequence) stages to [receive a signal from the io.Connect platform](https://docs.interop.io/desktop/capabilities/more/features/index.md#boot_sequence-platform_initialization_success__failure_signals) when the platform has been successfully initialized or in case of initialization failure.
>
> To receive such signals, register an Interop method and name it `"T42.Platform.Events"`. If registered, this method will be invoked by the platform when it initializes successfully or in case of failure.
>
> Registering the `"T42.Platform.Events"` Interop method:
>
> ```javascript
> const methodName = "T42.Platform.Events";
> const handler = ({ eventType, timestamp, data }) => {
>     console.log(`Platform initialization ${eventType === "platform-started" ? "successful" : "failed"}.`);
>
>     if (data.error) {
>         console.log(`Error message: ${data.error.message}, error stack: ${data.error.stack}.`);
>     }
> };
>
> await io.interop.register(methodName, handler);
> ```
>
> Each invocation of the method will return data in the shape of an object with the following properties:
>
> | Property | Type | Description |
> |----------|------|-------------|
> | `data` | `object` | Data object containing event details. In case of successful platform initialization, this will be an empty object. In case of platform initialization failure, this will be an object with an `error` object property. The `error` object will have `message` and `stack` string properties containing the error message and the error stack respectively. |
> | `eventType` | `"platform-started"` \| `"platform-failed"` | Type of the platform event (i.e., whether the platform was started successfully or failed to initialize). |
> | `timestamp` | `string` | Timestamp of the platform event. |

> ### Intent Handler Exclusion List
>
> To [exclude Intent handlers](https://docs.interop.io/desktop/capabilities/data-sharing/intents/javascript/index.md#excluding_intent_handlers) from the results when using the [`filterHandlers()`](https://docs.interop.io/desktop/reference/javascript/intents/api/index.md#API-filterHandlers) method, use the `excludeList` property of the [`HandlerFilter`](https://docs.interop.io/desktop/reference/javascript/intents/handlerfilter/index.md) object and pass an array of [`HandlerExclusionCriteria`](https://docs.interop.io/desktop/reference/javascript/intents/handlerexclusioncriteria/index.md) as a value.
>
> It's possible to exclude Intent handlers by app name and by app instance ID:
>
> ```javascript
> const filter = {
>     intent: "ViewChart",
>     openResolver: false,
>     // Excluding an app by its name and a running instance of another app from the Intent handler result.
>     excludeList: [
>         {
>             // This will exclude the app, but won't exclude any running instances of it.
>             applicationName: "my-app-name"
>         },
>         {
>             // This will exclude a running instance of an app, but won't exclude the app itself.
>             instanceId: "my-other-app-instance-id"
>         }
>     ]
> };
>
> const result = await io.intents.filterHandlers(filter);
> ```

> ### Disabling the Feedback Form
>
> The io.Connect [Feedback Form](https://docs.interop.io/desktop/capabilities/more/features/index.md#feedback_form) opens automatically in case of a platform crash and can also be opened by users from the **io.Connect Desktop** tray menu and from the ["Feedback" button](https://docs.interop.io/desktop/developers/configuration/application/index.md#feedback_button) of running app instances.
>
> To prevent this behavior, you can now use the `"enabled"` property of the `"issueReporting"` top-level key in the `system.json` [system configuration](https://docs.interop.io/desktop/developers/configuration/system/index.md) file of **io.Connect Desktop**:
>
> ```json
> {
>     "issueReporting": {
>         // Disabling the Feedback Form.
>         "enabled": false
>     }
> }
> ```

> ### Independent Zoom Factors for Same-Origin Apps
>
> The default zoom behavior for web apps (as is in all standard web browsers) is that all apps within the same domain have the same zoom factor. Now, it's possible to instruct the platform to use individual zoom levels for same-origin apps.
>
> To [configure the zoom behavior](https://docs.interop.io/desktop/developers/configuration/system/index.md#window_settings-zooming) for same-origin apps globally, use the `"mode"` property of the `"zoom"` object under the `"windows"` top-level key in the `system.json` [system configuration](https://docs.interop.io/desktop/developers/configuration/system/index.md) file of **io.Connect Desktop**. It accepts `"domain"` (default) and `"window"` as values.
>
> The following example demonstrates how to configure **io.Connect Desktop** to use individual zoom levels for same-origin apps:
>
> ```json
> {
>     "windows": {
>         "zoom": {
>             "enabled": true,
>             "mode": "window"
>         }
>     }
> }
> ```
>
> To define zoom behavior settings per app, use the `"mode"` property of the `"zoom"` object under the `"details"` top-level key in the [app definition](https://docs.interop.io/desktop/developers/configuration/application/index.md). The app definition settings will override the global system configuration:
>
> ```json
> {
>     "details": {
>         "zoom": {
>             "enabled": true,
>             "mode": "domain"
>         }
>     }
> }
> ```

> ### Window Resizing Areas for Native Apps
>
> The `"hasSizeAreas"` property of the `"details"` top-level key in the [app definition](https://docs.interop.io/desktop/developers/configuration/application/index.md) is now valid for native apps as well.
>
> The following example demonstrates how to remove the [resizing areas](https://docs.interop.io/desktop/developers/configuration/application/index.md#resizing_areas) of a native app running in **io.Connect Desktop**:
>
> ```json
> {
>     "name": "my-exe-app",
>     "title": "My EXE App",
>     "type": "exe",
>     "details": {
>         "path": "%GDDIR%/../PathToWPFApplication/",
>         "command": "WPFApplication.exe",
>         "hasSizeAreas": false
>     }
> }
> ````

> ### App Preferences REST Store Settings
>
> It's now possible to specify the number of retries and a backoff factor when configuring an [app preferences store](https://docs.interop.io/desktop/capabilities/app-preferences/overview/index.md#app_preferences_stores) provided by a REST service. The following properties are now available in `"rest"` mode:
>
> | Property | Type | Description |
> |----------|------|-------------|
> | `"restBackoffFactor"` | `number` | Exponential backoff factor in milliseconds used for determining the waiting interval between retries when fetching data from the REST store. The waiting interval is calculated with the `<restBackoffFactor>*2^<retry>` formula and is limited to a maximum of 5 minutes between retries. Valid only in `"rest"` mode. Defaults to `1000`. |
> | `"restRetries"` | `number` | Number of retries when fetching data from the REST store. Valid only in `"rest"` mode. Defaults to `3`. |
>
> The following example demonstrates configuring the backoff factor and the number of retries for connecting to an app preferences store provided by a REST service:
>
> ```json
> {
>     "applicationPreferences": {
>         "store": {
>             "type": "rest",
>             "restURL": "https://my-rest-service.com/app-preferences",
>             "restClientAuth": "no-auth",
>             "restBackoffFactor": 2000,
>             "restRetries": 5
>         }
>     }
> }
> ```

> ### CSS Variables for Customizing the io.Connect Platform
>
> Added CSS variables for customizing the styles of the following **io.Connect Desktop** apps and UI components:
>
> #### Notifications
>
> Use the following CSS variables for customizing the styles of the **io.Connect Desktop** [notifications](https://docs.interop.io/desktop/developers/platform-styles/index.md#notifications-notification):
>
> ![Notification](https://docs.interop.io/desktop/images/platform-styles/notification.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--notification-background-color` | Background color for the notifications. |
> | `--notification-body-content-gap` | Gap between the title and the text in the notification body content. |
> | `--notification-body-icon-gap` | Gap between the notification icon and the notification body content. |
> | `--notification-body-padding` | Padding for the notification body. |
> | `--notification-border` | Border for the notifications. |
> | `--notification-border-radius` | Border radius for the notifications. |
> | `--notification-footer-padding` | Padding for the notification footer. |
> | `--notification-gap` | Gap between the header, the body, and the footer of the notifications. |
> | `--notification-header-button-group-max-width` | Maximum width for the action buttons ("Snooze", "Close") in the notification header. |
> | `--notification-header-gap` | Gap between elements in the notification header. |
> | `--notification-header-height` | Height for the notification header. |
> | `--notification-header-timestamp-badge-height` | Height for the timestamp badge in the notification header. |
> | `--notification-header-timestamp-badge-radius` | Border radius for the timestamp badge in the notification header. |
> | `--notification-header-timestamp-badge-width` | Width for the timestamp badge in the notification header. |
> | `--notification-header-timestamp-gap` | Gap between the timestamp badge and the timestamp in the notification header. |
> | `--notification-header-timestamp-max-width` | Maximum width for the timestamp in the notification header. |
> | `--notification-height` | Height for the notifications. |
> | `--notification-icon-height` | Height for the icon displayed in the notification. |
> | `--notification-icon-width` | Width for the icon displayed in the notification. |
> | `--notification-padding` | Padding for the notifications. |
> | `--notification-severity-critical-color` | Color for notifications with severity "Critical". |
> | `--notification-severity-high-color` | Color for notifications with severity "High". |
> | `--notification-severity-low-color` | Color for notifications with severity "Low". |
> | `--notification-severity-medium-color` | Color for notifications with severity "Medium". |
> | `--notification-severity-none-color` | Color for notifications with severity "None". |
> | `--notification-title-line-height` | Line height for the title in the notification. |
> | `--notification-width` | Width for the notifications. |
>
> #### Notification Panel
>
> Use the following CSS variables for customizing the styles of the [Notification Panel](https://docs.interop.io/desktop/developers/platform-styles/index.md#notifications-notification_panel):
>
> ![Notification Panel](https://docs.interop.io/desktop/images/platform-styles/notification-panel.png)
>
> ![Notification Panel Bulk Actions](https://docs.interop.io/desktop/images/platform-styles/notification-panel-bulk-actions.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--notification-list-gap` | Gap between notifications in the notification list of the Notification Panel and the toasts wrapper. |
> | `--notification-panel-badge-font-size` | Font size for the Notification Panel badge. |
> | `--notification-panel-badge-height` | Height for the Notification Panel badge. |
> | `--notification-panel-badge-margin` | Margin for the Notification Panel badge. |
> | `--notification-panel-badge-min-width` | Minimum width for the Notification Panel badge. |
> | `--notification-panel-bulk-action-list-gap` | Gap between the editable items when the "Bulk Edit" button is pressed. |
> | `--notification-panel-bulk-edit-buttons-gap` | Gap between the buttons that appear in the Notification Panel header when the "Bulk Edit" button is pressed. |
> | `--notification-panel-gap` | Gap between the header and the body of the Notification Panel. |
> | `--notification-panel-header-actions-button-gap` | Gap between the "Sort by" and "View" dropdowns and between the "Clear All" and "Bulk Edit" buttons in the Notification Panel header. |
> | `--notification-panel-header-actions-button-padding` | Padding for the action buttons in the Notification Panel header. |
> | `--notification-panel-header-actions-width` | Width for the element that contains action buttons in the Notification Panel header. |
> | `--notification-panel-header-caption-gap` | Gap between the caption, the badge, and the system buttons in the Notification Panel header. |
> | `--notification-panel-header-search-gap` | Gap between the search bar and the search results. |
> | `--notification-panel-header-search-width` | Width for the search bar in the Notification Panel header. |
> | `--notification-panel-header-width` | Width for the Notification Panel header. |
> | `--notification-panel-height` | Height for the Notification Panel. |
> | `--notification-panel-width` | Width for the Notification Panel. |
>
> #### Toasts Wrapper & Notification Stacks
>
> Use the following CSS variables for customizing the styles of the [toasts wrapper and the notification stacks](https://docs.interop.io/desktop/developers/platform-styles/index.md#notifications-toasts_wrapper__notification_stacks):
>
> ![Toasts Wrapper](https://docs.interop.io/desktop/images/platform-styles/notification-toasts-wrapper-open-stack.png)
>
> ![Toasts Wrapper Notification Stack](https://docs.interop.io/desktop/images/platform-styles/notification-toasts-wrapper-stack.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--notification-stack-badge-color` | Color for the badge that displays the number of stacked notifications. |
> | `--notification-stack-button-border-radius` | Border radius for the "Clear All" button of the notification stack. |
> | `--notification-stack-button-height` | Height for the "Clear All" button of the notification stack. |
> | `--notification-stack-button-left-position` | Left offset for the "Clear All" button of the notification stack. |
> | `--notification-stack-button-max-width` | Maximum width for the "Clear All" button of the notification stack. |
> | `--notification-stack-button-top-position` | Top offset for the "Clear All" button of the notification stack. |
> | `--notification-stack-button-width` | Width for the "Clear All" button of the notification stack. |
> | `--notification-stack-effect-size` | Top, right, and left offset for the notification stack effect. |
> | `--notification-stack-gap` | Gap between the notification stacks. |
> | `--notification-stack-open-vertical-margin` | Vertical (top and bottom) margin for the notification stack when open. |
> | `--notification-toasts-wrapper-faded-mask` | Faded mask for the toasts wrapper. |
> | `--notification-toasts-wrapper-height` | Height for the toasts wrapper. |
> | `--notification-toasts-wrapper-padding` | Padding for the toast wrapper. |
>
> #### Notification Settings
>
> Use the following CSS variables for customizing the styles of the [Notification Settings](https://docs.interop.io/desktop/developers/platform-styles/index.md#notifications-notification_settings) panel:
>
> ![Notification Settings Panel](https://docs.interop.io/desktop/images/platform-styles/notification-settings-panel.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--notification-panel-settings-dropdown-width` | Width for the dropdown menus in the Notification Settings panel. |
> | `--notification-panel-settings-height` | Height for the Notification Settings panel. |
> | `--notification-panel-settings-sections-gap` | Gap between the sections in the Notification Settings panel. |
> | `--notification-panel-settings-subscriptions-column-titles-color` | Color for the column titles of the "Subscribe & Mute" section. |
> | `--notification-panel-settings-subscriptions-column-titles-letter-spacing` | Letter spacing for the column titles of the "Subscribe & Mute" section. |
> | `--notification-panel-settings-subscriptions-column-titles-line-height` | Line height for the column titles of the "Subscribe & Mute" section. |
> | `--notification-panel-settings-subscriptions-column-titles-size` | Font size for the column titles of the "Subscribe & Mute" section. |
> | `--notification-panel-settings-subscriptions-grid-2-column-width` | Column width for a grid layout with two columns in the "Subscribe & Mute" section. |
> | `--notification-panel-settings-subscriptions-grid-3-column-width` | Column width for a grid layout with three columns in the "Subscribe & Mute" section. |
> | `--notification-panel-settings-subscriptions-grid-gap` | Gap between the columns of the grid layout in the "Subscribe & Mute" section. |
>
> #### Channel Selector
>
> Use the following CSS variables for customizing the styles of the [Channel Selector](https://docs.interop.io/desktop/developers/platform-styles/index.md#channel_selector):
>
> ![Channel Selector Panel](https://docs.interop.io/desktop/images/platform-styles/channel-selector-panel.png)
>
> ![Channel Selector Buttons](https://docs.interop.io/desktop/images/platform-styles/channel-selector-button.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--channel-selector-badge-height` | Height for the Channel Selector badge displayed in the Channel Selector panel. |
> | `--channel-selector-badge-radius` | Border radius for the Channel Selector badge displayed in the Channel Selector panel. |
> | `--channel-selector-badge-width` | Width for the Channel Selector badge displayed in the Channel Selector panel. |
> | `--channel-selector-button-directional-gap` | Gap between Channel letter and the Channel direction icon in the Channel Selector button when using directional Channels. |
> | `--channel-selector-button-directional-height` | Height for the Channel Selector button when using directional Channels. |
> | `--channel-selector-button-directional-max-width` | Maximum width for the Channel Selector button when using directional Channels. |
> | `--channel-selector-button-directional-min-width` | Minimum width for the Channel Selector button when using directional Channels. |
> | `--channel-selector-button-directional-padding` | Padding for the Channel Selector button when using directional Channels. |
> | `--channel-selector-button-height` | Height for the Channel Selector button. |
> | `--channel-selector-button-radius` | Border radius for the Channel Selector button. |
> | `--channel-selector-button-width` | Width for the Channel Selector button. |
> | `--channel-selector-panel-background` | Background color for the Channel Selector panel. |
> | `--channel-selector-panel-border` | Border for the Channel Selector panel. |
> | `--channel-selector-panel-directional-toggles-gap` | Gap between the direction labels and the respective toggles in the Channel Selector panel when using directional Channels. |
> | `--channel-selector-panel-directional-width` | Width for the Channel Selector panel when using directional Channels. |
> | `--channel-selector-panel-padding` | Padding for the Channel Selector panel. |
> | `--channel-selector-panel-radius` | Border radius for the Channel Selector panel. |
> | `--channel-selector-panel-title-background-hover` | Background color for the title of the Channel Selector panel when hovered. |
> | `--channel-selector-panel-width` | Width for the Channel Selector panel. |
> | `--io-channel-selector-button-multi-2-mask` | Mask for the Channel Selector button if two Channels are selected when using multiple Channels. |
> | `--io-channel-selector-button-multi-3-mask` | Mask for the Channel Selector button if three Channels are selected when using multiple Channels. |
> | `--io-channel-selector-button-multi-4-mask` | Mask for the Channel Selector button if four Channels are selected when using multiple Channels. |
>
> #### Intent Resolver
>
> Use the following CSS variables for customizing the styles of the [Intent Resolver](https://docs.interop.io/desktop/developers/platform-styles/index.md#intent_resolver):
>
> ![Intent Resolver](https://docs.interop.io/desktop/images/platform-styles/intent-resolver.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--intent-resolver-dropdown-menu-gap` | Gap between the items in the dropdown menu of the Intent Resolver panel for selecting an app instance. |
> | `--intent-resolver-dropdown-menu-z` | Z-order for the dropdown menu of the Intent Resolver for selecting an app instance. |
> | `--intent-resolver-panel-border-radius` | Border radius for the Intent Resolver panel. |
> | `--intent-resolver-panel-height` | Height for the Intent Resolver panel. |
> | `--intent-resolver-panel-padding` | Padding for the Intent Resolver panel. |
> | `--intent-resolver-panel-width` | Width for the Intent Resolver panel. |
>
> #### Feedback Form
>
> Use the following CSS variables for customizing the styles of the [Feedback Form](https://docs.interop.io/desktop/developers/platform-styles/index.md#feedback_form):
>
> ![Feedback Form](https://docs.interop.io/desktop/images/platform-styles/feedback-form.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--feedback-attachments-items-gap` | Gap between the rows with attachment items. |
> | `--feedback-attachments-max-height` | Maximum height for the "Attachments" section of the Feedback Form. |
> | `--feedback-attachments-min-height` | Minimum height for the "Attachments" section of the Feedback Form. |
> | `--feedback-error-color` | Color for error messages in the Feedback Form. |
> | `--feedback-panel-height` | Height for the Feedback Form panel. |
> | `--feedback-panel-width` | Width for the Feedback Form panel. |
> | `--feedback-text-area-height` | Height for the text area input of the Feedback Form. |
> | `--feedback-text-area-line-height` | Line height for the text in the text area input of the Feedback Form. |
>
> #### Download Manager Panel
>
> Use the following CSS variables for customizing the styles of the [Download Manager Panel](https://docs.interop.io/desktop/developers/platform-styles/index.md#download_manager-panel):
>
> ![Download Manager](https://docs.interop.io/desktop/images/platform-styles/download-manager.png)
>
> ![Download Manager Empty State](https://docs.interop.io/desktop/images/platform-styles/download-manager-empty.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--download-manager-header-search-wrapper-gap` | Gap between the search bar and the element displaying the number of search results. |
> | `--download-manager-header-vertical-gap` | Gap between the title and the search bar in the header of the Download Manager. |
> | `--download-manager-item-background` | Background for the download items in the Download Manager. |
> | `--download-manager-item-border` | Border for the download items in the Download Manager. |
> | `--download-manager-item-border-radius` | Border radius for the download items in the Download Manager. |
> | `--download-manager-item-icon-close-offset` | Top and right offset for the "Close" button icon of the download items in the Download Manager. |
> | `--download-manager-item-inside-gap` | Gap between the header, body, and footer of the download items in the Download Manager. |
> | `--download-manager-item-padding` | Padding for the download items in the Download Manager. |
> | `--download-manager-item-status-critical-background-color` | Background color for the critical status icon in the footer of the download item. |
> | `--download-manager-item-status-gap` | Gap between the status icon and the status text in the element displaying the download item status in the footer of the download item. |
> | `--download-manager-item-status-icon-border-radius` | Border radius for the status icon in the footer of the download item. |
> | `--download-manager-item-status-icon-color` | Color for the status icon in the footer of the download item. |
> | `--download-manager-item-status-icon-height` | Height for the status icon in the footer of the download item. |
> | `--download-manager-item-status-icon-width` | Width for the status icon in the footer of the download item. |
> | `--download-manager-item-status-padding` | Padding for the element displaying the download item status in the footer of the download item. |
> | `--download-manager-item-status-success-background-color` | Background color for the success status icon in the footer of the download item. |
> | `--download-manager-item-status-warning-background-color` | Background color for the warning status icon in the footer of the download item. |
> | `--download-manager-item-status-warning-border-radius` | Border radius for the warning status icon in the footer of the download item. |
> | `--download-manager-item-status-warning-color` | Text color for the warning status icon in the footer of the download item. |
> | `--download-manager-item-status-warning-mask-image` | Mask image for the warning status icon in the footer of the download item. |
> | `--download-manager-item-status-warning-mask-size` | Mask size for the warning status icon in the footer of the download item. |
> | `--download-manager-panel-background` | Background for the Download Manager panel. |
> | `--download-manager-panel-empty-state-gap` | Gap between the icon and the text displayed in the Download Manager when it's empty. |
> | `--download-manager-panel-gap` | Gap for the Download Manager panel. |
> | `--download-manager-panel-height` | Height for the Download Manager panel. |
> | `--download-manager-panel-items-gap` | Gap between the items in the Download Manager panel. |
>
> #### Download Manager Settings Panel
>
> Use the following CSS variables for customizing the styles of the [Download Manager Settings panel](https://docs.interop.io/desktop/developers/platform-styles/index.md#download_manager-settings_panel):
>
> ![Download Manager Settings Panel](https://docs.interop.io/desktop/images/platform-styles/download-manager-settings.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--download-manager-panel-settings-gap` | Gap between the header and the body of the Settings panel of the Download Manager. |
> | `--download-manager-panel-settings-z-index` | Z-index for the Settings panel of the Download Manager. |
>
> #### Launchpad Platform Preferences Panel
>
> Use the following CSS variables for customizing the styles of the Launchpad [Platform Preferences panel](https://docs.interop.io/desktop/developers/platform-styles/index.md#launchpad-platform_preferences_panel):
>
> ![Platform Preferences Panel](https://docs.interop.io/desktop/images/platform-styles/platform-preferences-panel.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--preferences-panel-dropdown-width` | Width for the dropdowns menus in the Platform Preferences panel. |
> | `--preferences-panel-gap` | Gap between the header and the body of the Platform Preferences panel. |
> | `--preferences-panel-height` | Height for the Platform Preferences panel. |
> | `--preferences-panel-row-height` | Height for each row in the sections of the Platform Preferences panel. |
> | `--preferences-panel-section-gap` | Gap between the items in each section of the Platform Preferences panel. |
> | `--preferences-system-scheduler-controls-grid-3-column-width` | Column width for a grid layout with three columns in the "System" section. |
> | `--preferences-system-scheduler-controls-grid-columns-gap` | Gap between the columns of the grid layout containing the scheduler controls in the "System" section. |
>
> #### Launchpad Profile Panel
>
> Use the following CSS variables for customizing the styles of the Launchpad [Profile panel](https://docs.interop.io/desktop/developers/platform-styles/index.md#launchpad-profile_panel):
>
> ![Profile Panel](https://docs.interop.io/desktop/images/platform-styles/profile-panel.png)
>
> | Variable | Description |
> |----------|-------------|
> | `--profile-font-family` | Font family for the Profile panel. |
> | `--profile-font-size` | Font size for the Profile panel. |
> | `--profile-section-container-gap` | Gap between sections in the Profile panel. |
> | `--profile-section-gap` | Gap between the items in each section of the Profile panel. |
> | `--profile-section-item-gap` | Gap between the title and the value of a section item. |
> | `--profile-section-item-title-color` | Color for the title of a section item. |
> | `--profile-section-item-title-font-weight` | Font weight for the title of a section item. |
> | `--profile-section-title-line-height` | Line height for the titles of the Profile panel sections. |
> | `--profile-text-color` | Text color for the Profile panel. |
> | `--profile-trademark-background` | Background color for the trademark section. |
> | `--profile-trademark-border-radius` | Border radius for the trademark section. |
> | `--profile-trademark-gap` | Gap between the title and the text of the trademark section. |
> | `--profile-trademark-letter-spacing` | Letter spacing for title and the text of the trademark section. |
> | `--profile-trademark-link-color` | Color for the link in the trademark section. |
> | `--profile-trademark-padding` | Padding for the trademark section. |
> | `--profile-trademark-title-color` | Color for the title of the trademark section. |
> | `--profile-trademark-title-font-weight` | Font weight for the title of the trademark section. |
> | `--profile-user-avatar-background` | Background color for the user avatar. |
> | `--profile-user-avatar-border` | Border for the user avatar. |
> | `--profile-user-avatar-color` | Color for the user avatar initials. |
> | `--profile-user-avatar-font-size` | Font size for the user avatar initials. |
> | `--profile-user-avatar-height` | Height for the user avatar. |
> | `--profile-user-avatar-radius` | Border radius for the user avatar. |
> | `--profile-user-avatar-width` | Width for the user avatar. |
> | `--profile-user-container-gap` | Gap between the user avatar and the user info section. |

## Improvements & Bug Fixes

> - Upgraded to Electron 38.2.2 (Chromium 140).
>
> - Improved handling of clicks on the window header for native apps registered as io.Connect Windows.
>
> - Improved handling of Channels for apps running outside of **io.Connect Desktop**.
>
> - Improved handling of theme names in the Launchpad.
>
> - Fixed not displaying a dialog to the user for changes made to a Layout when restarting or shutting down **io.Connect Desktop**.
>
> - Fixed an intermittent issue related to searching in web pages with `CTRL + F` that would cause the search window to become inactive.
>
> - Fixed an issue related to inconsistencies in reporting memory and CPU measurements for apps running in **io.Connect Desktop**.
