Skip to main content

Changelog

io.Connect Desktop 10.2

Release date: 30.04.2026

Components Version
Electron 41.3.0
Chromium 146.0.7680.188
Node.js 24.15.0

The following libraries are bundled with io.Connect Desktop 10.2 and will be used for auto injection:

Injected Library Version
@interopio/desktop 6.20
@interopio/fdc3 2.9

New Features

Display Bounds

The Displays API has been extended with new methods that allow converting display bounds between the different coordinate systems supported by io.Connect Desktop and retrieving a display by provided bounds.

The following coordinate systems are supported, as described in theBoundsType enumeration:

Value Description
"electron" Electron DIP pixels.
"logical" Location scaled by the primary display scale, size scaled by the target display scale.
"physical" Physical screen pixels.

Converting Bounds

To convert bounds between the different coordinate systems, use the convertBounds() method of the Displays API. Pass a ConvertBoundsOptions object as a required argument. The method resolves with a ConvertBoundsResult object containing the converted bounds, the target coordinate system, and the target display:

const options = {
    bounds: { top: 100, left: 100, width: 400, height: 300 },
    // Coordinate system of the input bounds.
    type: "physical",
    // Coordinate system to which to convert the input bounds.
    targetType: "logical"
};

const { bounds, type, display } = await io.displays.convertBounds(options);

Retrieving Displays by Bounds

To retrieve a display by bounds, use the getByBounds() method of the Displays API. Pass a GetByBoundsOptions object as a required argument:

const options = {
    bounds: { top: 100, left: 100, width: 400, height: 300 },
    type: "logical"
};

const display = await io.displays.getByBounds(options);

Download Button for Web Groups

The download bar in web groups has been replaced with a "Download" button in the web group header that opens a download popup listing all downloads with controls for managing them. This provides a more compact and consistent visual experience for users when downloading files from windows participating in a web group.

⚠️ Note that the "Download" button is available only for web groups. If an io.Connect Window is inserted into a Workspace during an ongoing download, the "Download" button will disappear.

Download Popup

The "Download" button is enabled by default in the default platform mode and disabled by default in the advanced platform mode. It can be configured globally for all web apps via the "enableDownloadButton" property of the "downloadSettings" object under the "windows" top-level key in the system.json system configuration file of io.Connect Desktop, and per app via the "enableDownloadButton" property of the "downloadSettings" object under the "details" top-level key in the app definition.

The following example demonstrates enabling the "Download" button globally for all web apps:

{
    "windows": {
        "downloadSettings": {
            "enableDownloadButton": true
        }
    }
}

Platform Service Objects

The following io.Connect service objects injected in the global window object of the io.Connect platform apps (e.g., dialogs, alerts, splash screen, and more) are now exposed with the following aliases:

Legacy Name New Alias
glue42about ioAbout
glue42alert ioAlert
glue42basicAuth ioBasicAuth
glue42dialog ioDialog
glue42selectCertificate ioSelectCertificate
glue42splash ioSplash

The legacy names have been preserved for backwards compatibility. It's highly recommended to use the new aliases in any custom platform apps you may have.

The following example demonstrates how to use the ioDialog object in a custom dialog app to retrieve the dialog options provided by the client app and return data back to it:

// Retrieve the dialog options provided by the client app when it invokes the
// `io.modals.dialogs.request()` or the `myWindow.showDialog()` methods.
const { templateName, variables } = await ioDialog.getConfig();

// Apply the dialog options to the dialog UI.
document.getElementById("dialog-title").textContent = variables.title;
document.getElementById("dialog-message").textContent = variables.text;

// Apply the current io.Connect theme.
const currentTheme = ioDialog.getTheme();

document.documentElement.classList.add(currentTheme);

// React to theme changes.
const themeHandler = newTheme => document.documentElement.classList.replace(currentTheme, newTheme);

ioDialog.onThemeChanged(themeHandler);

// React to user interaction and return the result to the client app.
const result = { buttonClicked: null, context: 42 };
// Determine the template of the requested dialog and react accordingly.
if (templateName === "MyCustomDialog") {
    result.buttonClicked = { id: "confirm", text: "Confirm" };
}

const clickHandler = () => ioDialog.setResult(result);

document.getElementById("confirm-button").addEventListener("click", clickHandler);

Reusing Hidden App Instances

io.Connect apps can run as hidden instances (e.g., if the app is a service window, or if you want to have available instances of the app which to display later). By default, when the io.Connect platform starts an app instance, it won's look for existing hidden instances of the app to reuse.

To instruct io.Connect Desktop to reuse hidden app instances when starting apps, use the "reuseHiddenInstances" top-level key in the app definition. When a hidden instance is reused, it will be made visible, will be focused, and its context will be updated accordingly:

{
    "reuseHiddenInstances": true
}

Terminating Apps on Platform Shutdown

It's now possible to instruct io.Connect Desktop to preserve Node.js app processes on platform shutdown by setting the "terminateOnShutdown" property of the "details" top-level key in the app definition to true:

{
    "name": "node-server",
    "type": "node",
    "details": {
        "path": "%IO_CD_ROOT_DIR%/PathToMyServer/index.js",
        "terminateOnShutdown": false
    }
}

Improvements & Bug Fixes

  • Upgraded to Electron 41.3.0 (Chromium 146).

  • As of @interopio/desktop 6.20, plain object validation has been made stricter across the platform which affects the app preferences data passed to the App Preferences API methods. It's no longer possible to pass anything other than a plain object as an argument to the update() and set() methods. This means that passing arrays, class instances, or other non-plain object values will be rejected. A new Data object type with Record<string, unknown> & { [n: number]: never } signature has been introduced in the App Preferences API types to reflect this change.

  • Improved the algorithms for building Layouts on macOS by using a Chromium-style breadth-first search (BFS) algorithm to better match the display arrangement reported by the OS.

  • Improved the behavior of the getIcon() and setIcon() methods for managing window icons. The getIcon() method now returns the icon in the same format as it was set via the setIcon() method (and not a processed image file as before), and the setIcon() method has been hardened against invalid input.

  • Improved the format in which the io.Connect Gateway exposes connection information (e.g., when queried by apps running outside the io.Connect environment).

  • Fixed an issue related to displaying the "Default" label in the Layouts section of theLaunchpad.

  • Fixed an issue related to saving changes in the Default Global Layout on exit when the Default Global Layout is empty.

  • Fixed an issue related to the autoSave download setting and triggering the system save dialog.

  • Fixed an issue related to io.Insights OpenTelemetry signals to avoid a possible infinite loop when publishing both trace and log signals is enabled.