# io.Connect Browser 4.3

Source: https://docs.interop.io/browser/getting-started/changelog/4-3/index.html

## io.Connect Browser 4.3

*Release date: 03.04.2026*

Versions of all main and additional libraries of **io.Connect Browser** for the current release:

| Library | Version |
|---------|---------|
| [`@interopio/browser`](https://www.npmjs.com/package/@interopio/browser) | 4.3 |
| [`@interopio/browser-platform`](https://www.npmjs.com/package/@interopio/browser-platform) | 4.3 |
| [`@interopio/browser-worker`](https://www.npmjs.com/package/@interopio/browser-worker) | 4.3 |
| [`@interopio/cli`](https://www.npmjs.com/package/@interopio/cli) | 4.3 |
| [`@interopio/fdc3`](https://www.npmjs.com/package/@interopio/fdc3) | 2.9 |
| [`@interopio/home-ui-react`](https://www.npmjs.com/package/@interopio/home-ui-react) | 4.3 |
| [`@interopio/intent-resolver-ui`](https://www.npmjs.com/package/@interopio/intent-resolver-ui) | 4.3 |
| [`@interopio/modals-api`](https://www.npmjs.com/package/@interopio/modals-api) | 4.3 |
| [`@interopio/modals-ui`](https://www.npmjs.com/package/@interopio/modals-ui) | 4.3 |
| [`@interopio/ng`](https://www.npmjs.com/package/@interopio/ng) | 6.2 |
| [`@interopio/react-hooks`](https://www.npmjs.com/package/@interopio/react-hooks) | 4.3 |
| [`@interopio/search-api`](https://www.npmjs.com/package/@interopio/search-api) | 3.3 |
| [`@interopio/theme`](https://www.npmjs.com/package/@interopio/theme) | 4.3 |
| [`@interopio/widget`](https://www.npmjs.com/package/@interopio/widget) | 3.3 |
| [`@interopio/workspaces-api`](https://www.npmjs.com/package/@interopio/workspaces-api) | 4.3 |
| [`@interopio/workspaces-ui-react`](https://www.npmjs.com/package/@interopio/workspaces-ui-react) | 4.3 |
| [`@interopio/workspaces-ui-web-components`](https://www.npmjs.com/package/@interopio/workspaces-ui-web-components) | 4.3 |

> ⚠️ *Note that in this release the major version of some of the libraries has been incremented only for release purposes and procedural consistency, not due to breaking changes in the respective libraries.*

## New Features

> ⚠️ *Note that each new feature is listed under all libraries it affects.*

> ### @interopio/browser
>
> #### Retrieving App Definitions
>
> To retrieve the full [app definition](https://docs.interop.io/browser/capabilities/app-management/index.md#app_definitions) of an app, use the [`getConfiguration()`](https://docs.interop.io/browser/reference/javascript/app%20management/application/index.md#Application-getConfiguration) method of the [`Application`](https://docs.interop.io/browser/reference/javascript/app%20management/application/index.md) instance:
>
> ```javascript
> const definition = await myApp.getConfiguration();
>
> console.log(`Retrieved definition for app "${definition.name}".`);
> ```
> #### Ignoring Contexts when Saving Layouts
>
> The [`NewLayoutOptions`](https://docs.interop.io/browser/reference/javascript/layouts/newlayoutoptions/index.md) object passed as an argument to the [`save()`](https://docs.interop.io/browser/reference/javascript/layouts/api/index.md#API-save) method was expanded with an `ignoreContexts` property. Use this property to instruct the io.Connect platform to skip saving any window or Workspace contexts when saving a Layout:
>
> ```javascript
> const options = {
>     name: "My Layout",
>     ignoreContexts: true
> };
>
> const savedLayout = await io.layouts.save(options);
> ```

> ### @interopio/browser-platform
>
> #### Fetching Platform Configuration from io.Manager
>
> You can now supply a [remote platform configuration](https://docs.interop.io/browser/developers/browser-platform/setup/index.md#remote_configuration-iomanager) from [**io.Manager**](https://docs.interop.io/manager/overview/index.md).
>
> To instruct the platform to fetch its configuration from **io.Manager**, pass a `RemoteConfigFromManager` object and set its `type` property to `"manager"` when initializing the [`@interopio/browser-platform`](https://www.npmjs.com/package/@interopio/browser-platform) library:
>
> ```javascript
> import IOBrowserPlatform from "@interopio/browser-platform";
>
> const config = {
>     // Must be set to `"manager"`.
>     type: "manager",
>     managerURL: "https://my-io-manager.com:4242/api",
>     // Optional function for modifying the fetched configuration before the platform initializes.
>     modifyConfig: (config) => {
>         config.licenseKey = "my-license-key";
>
>         return config;
>     }
> };
>
> const { io } = await IOBrowserPlatform(config);
> ```
>
> The `RemoteConfigFromManager` object has the following properties:
>
> | Property | Type | Description |
> |----------|------|-------------|
> | `enableCache` | `boolean` | If `true` (default), will enable persisting locally the platform configuration fetched from **io.Manager**. |
> | `fetchTimeoutMs` | `number` | Interval in milliseconds to wait for fetch requests sent to **io.Manager** to complete. Defaults to `30000`. |
> | `managerURL` | `string` | **Required.** URL pointing to the **io.Manager** REST API. |
> | `modifyConfig` | `function` | Function that receives the fetched configuration as an argument. Use this to modify the configuration before the platform initializes. |
> | `platformVersion` | `string` | Exact platform version for which to fetch configuration from **io.Manager**. Defaults to the current platform version. |
> | `type` | `"manager"` | **Required.** Must be set to `"manager"`. |
>
> #### Managing Preferences for Apps Without Definitions
>
> You can now use `"all"` as a value for the `validNonExistentApps` property to control the validation behavior of the [App Preferences](https://docs.interop.io/browser/capabilities/app-preferences/index.md) API when saving preferences for apps. Use `"all"` to disable validation entirely, allowing preferences to be saved for any app name without checking whether the app exists in the app store.
>
> The following example demonstrates how to disable app validation entirely:
>
> ```javascript
> import IOBrowserPlatform from "@interopio/browser-platform";
>
> const config = {
>     licenseKey: "my-license-key",
>     applicationPreferences: {
>         validNonExistentApps: "all"
>     }
> };
>
> const { io } = await IOBrowserPlatform(config);
> ```
>
> #### Retrieving App Definitions
>
> Added support for retrieving the full app definition of an app by using the [`getConfiguration()`](https://docs.interop.io/browser/reference/javascript/app%20management/application/index.md#Application-getConfiguration) method of an [`Application`](https://docs.interop.io/browser/reference/javascript/app%20management/application/index.md) instance.
>
> #### io.Connect Gateway Username Case Sensitivity
>
> The [io.Connect Gateway](https://docs.interop.io/browser/developers/browser-platform/setup/index.md#ioconnect_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 of the `authentication` object to `true` under the `gateway` top-level key in the platform configuration:
>
> ```javascript
> import IOBrowserPlatform from "@interopio/browser-platform";
>
> const config = {
>     licenseKey: "my-license-key",
>     gateway: {
>         authentication: {
>             usernameCaseSensitive: true
>         }
>     }
> };
>
> const { io } = await IOBrowserPlatform(config);
> ```
>
> #### io.Bridge Configuration
>
> The [**io.Bridge**](https://docs.interop.io/browser/capabilities/bridge/index.md) configuration has been extended with settings for Interop server filtering for visibility rules and platform announce interval.
>
> **Interop Server Filtering for Visibility Rules**
>
> The [visibility rules](https://docs.interop.io/browser/capabilities/bridge/index.md#visibility_restrictions-interop_methods) for the Interop API now support an `identity` filter that enables more granular control over the visibility of Interop methods. Each key in the `identity` filter can be any property of the [`Instance`](https://docs.interop.io/browser/reference/javascript/interop/instance/index.md) object exposed by the Interop API. An Interop server will be matched only if all specified filter entries match against its identity. Using the `identity` filter in combination with the `method` filter is useful when several Interop servers have registered an Interop method with the same name:
>
> ```javascript
> import IOBrowserPlatform from "@interopio/browser-platform";
>
> const config = {
>     licenseKey: "my-license-key",
>     gateway: {
>         bridge: {
>             url: "https://my-io-bridge.com",
>             interop: {
>                 visibility: [
>                     // Restrict the Interop methods registered by a specific app to the local platform.
>                     { identity: { application: "my-private-app" }, restrictions: "local" }
>                 ]
>             }
>         }
>     },
>     user: {
>         id: "user-id"
>     }
> };
>
> const { io } = await IOBrowserPlatform(config);
> ```
>
> **Announce Interval**
>
> To configure the interval at which the platform announces itself to **io.Bridge** to keep the connection alive, use the `announceIntervalMS` property of the `bridge` object. The default value is `60000` (60 seconds):
>
> ```javascript
> import IOBrowserPlatform from "@interopio/browser-platform";
>
> const config = {
>     licenseKey: "my-license-key",
>     gateway: {
>         bridge: {
>             url: "https://my-io-bridge.com",
>             announceIntervalMS: 30000
>         }
>     },
>     user: {
>         id: "user-id"
>     }
> };
>
> const { io } = await IOBrowserPlatform(config);
> ```

> ### @interopio/home-ui-react
>
> You can now customize the icons for [app folders in the Launchpad](https://docs.interop.io/browser/capabilities/home-app/library-features/index.md#using_the_components-launchpad-default_sections) by using the `folderIconGetters` property of the `<ApplicationsSection />` component.
>
> The `folderIconGetters` property accepts an object with key/value pairs where each key is the name of the folder to customize and the value is a function that returns the icon class name based on whether the folder is open or closed. This allows you to provide different icons for open and closed states of the folders.
>
> It's also possible to customize the icons of nested folders. If you specify a nested folder, the folder names must be separated with a forward slash (`"/"`).
>
> The following example demonstrates how to use the `folderIconGetters` property to customize the icons of app folders in the Launchpad, including a nested folder:
>
> ```javascript
> import {
>     IOConnectHome,
>     ApplicationsSection
> } from "@interopio/home-ui-react";
> import "@interopio/workspaces-ui-react/dist/styles/workspaces.css";
> import "@interopio/home-ui-react/src/index.css";
>
> const getConfig = (userData) => {
>     // Define and return the required platform configuration.
> };
>
> // Custom icons for the app folders.
> const folderIconGetters = {
>     // Customizing the app folder icons also works for nested folders.
>     // Nested folders must be separated with a forward slash ("/").
>     "Trading/Sales": (isOpen) => isOpen ? "custom-trading-sales-open-icon" : "custom-trading-sales-closed-icon",
>     "Analytics": (isOpen) => isOpen ? "custom-analytics-open-icon" : "custom-analytics-closed-icon"
> };
>
> const config = {
>     getIOConnectConfig: getConfig,
>     launchpad: {
>         components: {
>             // Customizing the default sections.
>             sections: [
>                 {
>                     placementId: "applications-section",
>                     Component: () => <ApplicationsSection folderIconGetters={folderIconGetters} />
>                 }
>             ]
>         }
>     }
> };
>
> const App = () => <IOConnectHome config={config} />;
>
> export default App;
> ```

> ### @interopio/workspaces-ui-web-components
>
> The `@interopio/workspaces-ui-web-components` library now supports [Channel restrictions](https://docs.interop.io/browser/capabilities/data-sharing/channels/index.md#channel_restrictions) and directional multi Channels for Workspace windows.

## Improvements & Bug Fixes

> ⚠️ *Note that each improvement or bug fix is listed under all libraries it affects.*

> ### @interopio/browser
>
> - Improved handling subscriptions for theme changes in the Themes API.

> ### @interopio/browser-platform
>
> - Fixed an issue related to handling window titles in Layouts when `<iframe />` elements are registered as apps.
> - Fixed an issue related to correctly handling both full URLs and glob patterns in block lists.

> ### @interopio/fdc3
>
> - Fixed an issue related to handling targeted instances when `appId` is passed as a target to `raiseIntent()`.

> ### @interopio/home-ui-react
>
> - Improved handling the renaming of Workspaces in the "Workspaces" section of the Launchpad.
> - Fixed an issue related to icon sizing problems when the icon URL fails to load.
> - The `@interopio/browser` and the `@interopio/browser-platform` libraries are now optional peer dependencies of the `@interopio/home-ui-react` library.

> ### @interopio/ng
>
> - The `@interopio/browser`, `@interopio/browser-platform`, and the `@interopio/desktop` libraries are now optional peer dependencies of the `@interopio/ng` library. You now have to manually install the respective libraries depending on the targeted io.Connect platform.

> ### @interopio/react-hooks
>
> - The `@interopio/browser`, `@interopio/browser-platform`, and the `@interopio/desktop` libraries are now optional peer dependencies of the `@interopio/react-hooks` library. You now have to manually install the respective libraries depending on the targeted io.Connect platform.

> ### @interopio/workspaces-api
>
> - Fixed an issue related to saving Layouts when there are non-io.Connect windows in a Workspace.

> ### @interopio/workspaces-ui-react
>
> - Fixed an issue related to handling tooltip values.
