Changelog
io.Connect Desktop 10.3
Release date: 30.06.2026
| Components | Version |
|---|---|
| Electron | 42.3.3 |
| Chromium | 148.0.7778.218 |
| Node.js | 24.15.0 |
The following libraries are bundled with io.Connect Desktop 10.3 and will be used for auto injection:
| Injected Library | Version |
|---|---|
@interopio/desktop |
6.21 |
@interopio/fdc3 |
2.9 |
New Features
Retrieving Layout Contents
The Layouts API has been extended with a new
getLayoutContents()method that allows you to retrieve the contents of Global Layouts and Workspace Layouts. The method receives aGetContentsOptionsobject as a required argument.When used for retrieving the contents of a Global Layout, the returned
LayoutContentsobject will contain all components participating in the Global Layout: individual app instances (including all Workspaces App instances), all Workspace instances hosted in all Workspaces App instances, and all windows participating in all Workspaces.When used for retrieving the contents of a Workspace Layout, the returned
LayoutContentsobject will contain only the windows participating in the Workspace.The following example demonstrates how to retrieve the contents of a Global Layout:
const options = { name: "My Layout", type: "Global" }; const { appComponents, workspaceComponents, workspaceWindows } = await io.layouts.getLayoutContents(options); // List all apps in the Layout. console.log("Apps:", appComponents); // List all Workspaces App instances in the Layout. console.log("Workspaces App instances:", workspaceComponents); // List all windows participating in all Workspaces. console.log("Workspace windows:", workspaceWindows);
Interacting with io.Manager
The
@interopio/manager-apilibrary now exposes aManagerLib()factory function that can be included in thelibrariesarray of the optional configuration object for initializing the@interopio/desktoplibrary.Including the
ManagerLib()factory function in the configuration object will add a newmanagerproperty to the initialized io.Connect API object which you can use to access methods for interacting with io.Manager. The exposed methods allow apps to monitor the connection state to io.Manager and to trigger data fetching operations programmatically.The following example demonstrates including the
ManagerLib()factory function when initializing the@interopio/desktoplibrary and using the methods available on theio.managerobject:import IODesktop from "@interopio/desktop"; import { ManagerLib } from "@interopio/manager-api/desktop"; const config = { libraries: [ManagerLib] }; const io = await IODesktop(config); // Retrieving the state of the connection to io.Manager. const connectionState = await io.manager.getConnectionState(); // Providing a handler and subscribing for changes in the connection state. const handler = connectionState => console.log(`Connection state: ${JSON.stringify(connectionState)}`); const unsubscribe = io.manager.onConnectionStateChange(handler); // Refreshing the available apps and Layouts. const dataToFetch = { layouts: true, applications: true }; await io.manager.fetchData(dataToFetch);This feature is available in
@interopio/manager-api4.2 and later.ℹ️ For more details on the available methods, see the APIs > Initiating Interaction from io.Connect section in the io.Manager documentation.
Workspace Frame On Top State
It's now possible to dynamically control the z-order of a Workspace App instance by using the
setOnTop()method of aFrameinstance:const myFrame = await io.workspaces.getMyFrame(); // Instruct the framework to keep the `Frame` instance always on top of other windows. const options = { onTop: true }; await myFrame.setOnTop(options);By default, the
onTopproperty of aFrameinstance is set tofalse.If you extract a Workspace from a Workspace App instance that has its
onTopproperty set totrue, theonTopproperty of the newly created Workspace App instance that will host the extracted Workspace will be set tofalseby default.It's possible to set more than one Workspace App instance to be always on top. In this case, the users will be able to switch between these Workspace App instances if they overlap visually, but they will always remain above all other windows in the z-order.
This feature is available in
@interopio/workspaces-api4.5 and later.
Workspace Tab Reorder Events
You can now get notified when Workspace tabs or window tabs are reordered within their respective containers (Workspace Frames and window tab groups). These events are triggered only when dragging a tab to a different position without removing it from its current container.
To subscribe for Workspace tab reorder events at the API level, use the
onWorkspaceTabReordered()method. The event handler receives the reorderedWorkspaceinstance with the updatedpositionIndex:const handler = ({ title, positionIndex }) => console.log(`Workspace "${title}" was reordered to position ${positionIndex}.`); const unsubscribe = await io.workspaces.onWorkspaceTabReordered(handler);To subscribe for window tab reorder events at the API level, use the
onWindowTabReordered()method. The event handler receives the reorderedWorkspaceWindowinstance with the updatedpositionIndex:const handler = ({ title, positionIndex }) => console.log(`Window "${title}" was reordered to position ${positionIndex}.`); const unsubscribe = await io.workspaces.onWindowTabReordered(handler);Tab reorder events are also available for:
Workspaceinstances via theontabReordered()andonWindowTabReordered()methods.
WorkspaceWindowinstances via theontabReordered()method.This feature is available in
@interopio/workspaces-api4.4 and later.
Workspace Splitter Size
It's now possible to customize the size of the Workspace splitters (the draggable dividers between the windows in a Workspace).
To specify a splitter size in pixels, use the
splitterSizeproperty of thesettingsobject within thecomponentsprop of the<Workspaces />component:import Workspaces from "@interopio/workspaces-ui-react"; const App = () => { return ( <Workspaces components={{ settings: { splitterSize: 10 } }} /> ); }; export default App;This feature is available in
@interopio/workspaces-ui-react4.5 and later.
Download Path
The
DownloadOptionsobject passed as a second argument to thedownload()method of anIOConnectWindowinstance now accepts apathproperty. Use it to specify a download destination for each individual download:const downloadURL = "https://example.com/logo.png"; const options = { path: "C:/Downloads/my-folder" }; const { path, size, url } = await myWindow.download(downloadURL, options);The
pathproperty inDownloadOptionstakes precedence over the global download path set via thesetSavePath()method of theiodesktopobject. Using thedownload()method of anIOConnectWindowinstance may prevent potential race conditions when multiple windows attempt to download files concurrently and set different save paths globally via thesetSavePath()method.
Download Auto Save State
You can now use the
setAutoSave()andgetAutoSave()methods accessible via thedownloadsproperty of theiodesktopobject injected in the globalwindowobject, which enable you to control the auto save behavior for downloads at runtime:// Disabling auto saving of downloads. await iodesktop.downloads.setAutoSave(false); // Retrieving the current auto save state. const autoSave = await iodesktop.downloads.getAutoSave(); if (autoSave) { console.log("Auto saving of downloads is enabled."); } else { console.log("Auto saving of downloads is disabled."); }The
setAutoSave()method takes precedence over the"autoSave"property specified in the system configuration or the app definition, and can be overridden by using theautoSaveproperty of theDownloadOptionsobject when using thedownload()method of anIOConnectWindowinstance.If auto saving is enabled, but the download path specified via configuration or dynamically can't be resolved, a system save dialog will be shown to the user.
Closing Blank Download Windows
When a download is initiated from a link with
target="_blank", a new window is opened to handle the download, which by default stays open after the download is complete.To instruct io.Connect Desktop to automatically close the download window after the download is complete, use the
"closeBlankDownloadWindows"property of the"downloadSettings"object under the"windows"top-level key in thesystem.jsonsystem configuration file of io.Connect Desktop:{ "windows": { "downloadSettings": { "closeBlankDownloadWindows": true } } }
Zoom Keyboard Shortcuts
To customize the keyboard shortcuts for zoom in, zoom out, and zoom reset, use the
"shortcuts"property of the"zoom"object under the"windows"top-level key insystem.jsonsystem configuration file of io.Connect Desktop.The following example demonstrates the default settings for the zoom keyboard shortcuts:
{ "windows": { "zoom": { "shortcuts": { "zoomIn": ["ctrl+=", "ctrl+shift+=", "ctrl+numadd"], "zoomOut": ["ctrl+-", "ctrl+numsub"], "resetZoom": ["ctrl+0", "ctrl+num0"] } } } }The
"shortcuts"object has the following properties:
Property Type Description "resetZoom"string[]Keyboard shortcuts for resetting the zoom factor to the default value. Defaults to ["ctrl+0", "ctrl+num0"]."zoomIn"string[]Keyboard shortcuts for zooming in. Defaults to ["ctrl+=", "ctrl+shift+=", "ctrl+numadd"]."zoomOut"string[]Keyboard shortcuts for zooming out. Defaults to ["ctrl+-", "ctrl+numsub"].
URL Filter
The
"urlFilter"property of the"windows"top-level key insystem.jsonsystem configuration file of io.Connect Desktop used for filtering web requests now also accepts an array of regular expressions.This enables you to define multiple allowed domain patterns without combining them into a single complex regular expression:
{ "windows": { "urlFilter": [ "^https://.*\\.example\\.com", "^https://.*\\.another-example\\.com" ] } }
Hardware Metadata in io.Insights
It's now possible to include hardware metadata as resource attributes in all OpenTelemetry signals (metrics, traces, and logs) when using io.Insights. This helps correlate performance data with the underlying hardware, enabling more informed analysis of startup times and resource usage across deployments with varied hardware configurations.
To enable hardware metadata collection, set the
"addHardwareDataToAttributes"property totruein the"otel"top-level key ofsystem.jsonsystem configuration file of io.Connect Desktop:{ "otel": { "addHardwareDataToAttributes": true } }The following hardware data will be added as resource attributes to all OpenTelemetry signals:
Attribute Description "cpuCores"Number of logical CPU cores. "cpuModel"CPU model name. "cpuSpeedGHz"CPU speed in GHz. "memoryTotalGB"Total system memory in GB. "osArch"OS CPU architecture (e.g., "x64")."osPlatform"OS platform identifier (e.g., "win32")."osRelease"OS release version string. "osVersion"OS version string (e.g., the Windows version).
HTML Windows in the Default Platform Mode
HTML windows are now partially supported in the default platform mode - you can define apps as HTML windows, but only the move area at the top of the window is supported and configurable and the HTML buttons aren't available. currently, only the OS buttons configurable via the
"useOSSystemButtons"property of the"details"object in the Web Groups App definition can be used.Previously, when the different platform modes were introduced in io.Connect Desktop 10.0, HTML windows were available only in the advanced platform mode.
To configure a web app as an HTML window, set the
"mode"property of the"details"top-level key to"html"in the app definition:{ "name": "my-html-app", "type": "window", "details": { "url": "https://example.com/my-app", "mode": "html" } }The following move area properties are supported for HTML windows in the default platform mode:
"hasMoveAreas","moveAreaThickness", and"moveAreaTopMargin". Currently, the rest of the properties for configuring the window move areas aren't supported for HTML windows in the default platform mode.
Improvements & Bug Fixes
Upgraded to Electron 42.3.3 (Chromium 148).
Improved the mechanism for applying configurations from remote sources (REST and io.Manager) to enable overriding the platform logging configuration when the
logger.jsonfile is specified in a remote source.Improved the platform log filtering to prevent logging of custom headers set via the
iodesktop.customHeaders.set()method and extra headers configured via the"extraHeaders"property of the"urlLoadOptions"object in the app definitions of web apps in order to avoid exposure of sensitive data.Improved handling case conversion of Layout context property names to prevent issues when exporting and importing Layouts.
Improved the Launcher UI for handling secondary actions for search results when a main action hasn't been defined. Now, if a main action isn't available, the secondary actions will be accessible by clicking directly on the result row - a context menu with the available secondary actions will appear on click and the row won't contain a three-dot menu.
Fixed an issue related to executing a protocol handler command when an instance of io.Connect Desktop hasn't been started yet.