Changelog

io.Connect Desktop 10.1

Release date: 06.04.2026

Components Version
Electron 40.8.3
Chromium 144.0.7559.236
Node.js 24.14.0

Breaking Changes

io.Insights

The "defaultMetricsEnabled" property of the "metrics" object under the "otel" top-level key in the system.json system configuration file of io.Connect Desktop has been renamed to "platformMetricsEnabled":

{
    "otel": {
        "enabled": true,
        "metrics": {
            "enabled": true,
            "platformMetricsEnabled": true
        }
    }
}

New Features

io.Insights - Traces, Metrics, Logs

io.Insights now publishes OpenTelemetry traces and logs and provides support for publishing custom metrics. This enables comprehensive observability of the platform and your interop-enabled apps, allowing you to monitor app and platform performance, diagnose issues, and analyze usage patterns through standard OpenTelemetry backends.

Trace Instrumentation

Extensive trace instrumentation of the io.Connect Desktop platform and the @interopio/desktop library has been added, which enables detailed observation of platform operations and API usage.

ℹ️ For more details on trace instrumentation, see the Trace Instrumentation section of the io.Insights documentation.

Insights API

The @interopio/otel library is now available and it provides an Insights API for publishing OpenTelemetry signals (metrics, traces, and logs) from your interop-enabled apps. It's designed to be used mainly as part of the @interopio/desktop library and can be configured when initializing the @interopio/desktop library in your interop-enabled apps. The Insights API is accessible via the io.insights object.

The following example demonstrates initializing the Insights API and using it to publish a custom metric:

import IODesktop from "@interopio/desktop";

const config = {
    insights: {
        enabled: true,
        metrics: {
            enabled: true
        }
    }
};

const io = await IODesktop(config);

const metricSettings = {
    name: "myApp.orderCount",
    type: "custom_counter",
    enabled: true
};

const metric = io.insights.metrics.getFromSettings(metricSettings);

metric.start();
metric.add(1, { client: "ACME" });

ℹ️ For more details on using the Insights API, see the Insights API section of the io.Insights documentation.

Custom Metrics

The following custom metrics are now supported and you can publish them by using the Insights API in your interop-enabled apps:

Metric Instrument Type Description
"custom_counter" Counter A monotonically increasing counter that tracks cumulative totals. Use the add() method to increment the metric value by a given amount.
"custom_gauge" Gauge A point-in-time measurement that records the current value. Use the record() method to report the current measurement.
"custom_histogram" Histogram A distribution of measurements aggregated into configurable buckets. Use the record() method to capture individual measurements.
"custom_observable_counter" ObservableCounter Asynchronous monotonically increasing counter. The OpenTelemetry SDK periodically invokes a provided callback to collect the current cumulative total.
"custom_observable_gauge" ObservableGauge Asynchronous point-in-time measurement. The OpenTelemetry SDK periodically invokes a provided callback to collect the current value.
"custom_observable_up_down_counter" ObservableUpDownCounter Asynchronous bidirectional counter. The OpenTelemetry SDK periodically invokes a provided callback to collect a cumulative value that can increase or decrease.
"custom_up_down_counter" UpDownCounter A bidirectional counter that tracks quantities which can go up and down. Use the add() method with positive or negative values.

Platform Configuration

The io.Insights configuration options available under the "otel" top-level key in the system.json system configuration file of io.Connect Desktop have been extended with many new properties that allow better control and customization of the OpenTelemetry signals published by the platform. All available settings have been extracted into a new schema - otel.json.

The following example demonstrates how to enable publishing all supported OpenTelemetry signals and provide additional settings for io.Insights:

{
    "otel": {
        "enabled": true,
        "metrics": {
            "enabled": true,
            "url": "http://localhost:4242/my-collector/metrics"
        },
        "traces": {
            "enabled": true,
            "url": "http://localhost:4242/my-collector/traces",
            "filters": [
                {
                    "source": "interopio.desktop.startup",
                    "level": "DEBUG",
                    "enabled": true
                },
                {
                    "source": "#^interopio\\.api\\.notifications",
                    "enabled": false
                }
            ]
        },
        "logs": {
            "enabled": true,
            "url": "http://localhost:4242/my-collector/logs",
            "filters": [
                {
                    "severity": "ERROR",
                    "enabled": true
                },
                {
                    "categoryName": "system",
                    "severity": "WARN",
                    "enabled": true
                }
            ]
        }
    }
}

ℹ️ For more details on all available configuration options for io.Insights, see the Configuration > io.Connect Desktop section of the io.Insights documentation and the otel.json schema.

Groups Visibility Operations in the Default Platform Mode

The group visibility operations (showing and hiding window groups) are now available in the default platform mode. This implementation was previously missing in the default platform mode when the different platform modes were introduced with io.Connect Desktop 10.0:

// Hiding a window group.
await myGroup.hide();

// Showing a previously hidden window group.
await myGroup.show(true);

User Agent Configuration

Besides a string value, the "userAgent" property for configuring a custom User-Agent request header now also accepts an object with settings as a value. You can use this object to specify the type of user agent ("chromium" or "custom"), a custom value, and an optional suffix to append.

The User-Agent request header can be set globally by using the "userAgent" property of the "windows" top-level key in the system.json system configuration file of io.Connect Desktop, and per app by using the "userAgent" property of the "details" top-level key in the app definition.

The following example demonstrates how to configure a custom User-Agent request header globally by using the clean Chromium User-Agent string and appending a custom suffix to it:

{
    "windows": {
        "userAgent": {
            "type": "chromium",
            "append": "MyCustomUserAgent"
        }
    }
}

The "userAgent" object has the following properties:

Property Type Description
"append" string String to append to the end of the clean Chromium User-Agent string. Valid only if "type" is set to "chromium". Use this to add custom tokens to the clean Chromium User-Agent string.
"type" "chromium" | "custom" Type of the User-Agent string. If set to "chromium", will use the default Chromium User-Agent string without the Electron token. If set to "custom", you must provide a custom string via the "value" property.
"value" string Custom string to use for the User-Agent request header. Valid only if "type" is set to "custom". This value will replace the entire default User-Agent string.

io.Connect Gateway Username Case Sensitivity

The io.Connect Gateway treats usernames as case-insensitive by default, allowing clients authenticated with different letter casing (e.g., "JohnDoe" and "johndoe") to connect and interoperate seamlessly. To instruct the io.Connect Gateway to treat usernames as case-sensitive, set the "usernameCaseSensitive" property to true under the "gw" top-level key in the system.json system configuration file of io.Connect Desktop:

{
    "gw": {
        "configuration": {
             "authentication": {
                 "basic": {
                     "usernameCaseSensitive": true
                 }
             }
        }
    }
}

Improvements & Bug Fixes

  • Upgraded to Electron 40.8.3 (Chromium 144).

  • Improved username handling when publishing OpenTelemetry signals via io.Insights.

  • Improved process memory reporting by using WorkingSetSize as a fallback when PrivateWorkingSetSize isn't available on Windows. WorkingSetSize includes both private and shared resident pages, whereas PrivateWorkingSetSize includes only private resident pages.

  • Updated the FDC3 implementation to version 2.8.4.

  • Fixed an issue related to using right-click context menu in the Dev Tools.