A complete guide to every communication pattern — and exactly when to use each one.
io.Connect Desktop is a real-time UI integration platform that connects web, native, and legacy apps — enabling them to share data and interoperate as a single unified experience.
Tab Groups, sticky Windows, and Workspaces give users one unified desktop surface.
A click in one app instantly updates all connected apps — no copy-paste, no delays.
JS · .NET · Java · VBA · Delphi · Python (Dash) · React · Angular · Node.js and more.
Full FDC3 support — interoperate with any third-party fintech app out of the box.
The central message router and bus. Every app connects on startup over a WebSocket. All messages pass through it — no direct app-to-app connections.
A persistent, full-duplex TCP connection. Unlike HTTP, it stays open so the Gateway can push data at any time with zero polling overhead.
Registers methods, streams, or contexts. Capabilities are advertised to all peers.
Discovers and invokes methods, or subscribes to streams and contexts.
💡 Every interop-enabled app is a Gateway client. Within the Interop API, the same app can be both a server and a client simultaneously.
Topic-based broadcast. For migrating existing pub/sub integrations. No persistence, no discovery — prefer higher-level APIs for new work.
Named global key/value object — great for "selected client", "current order", "active instrument". Late joiners get current value immediately.
Shared Contexts plus a Channel Selector UI. Best when users should decide which apps link together — including directional restrictions.
Lets apps inside a Workspace share state with each other — scoped, portable, and persistable in layouts.
Explicit, service-like capability. The caller knows exactly what it needs. Supports targeting and invoke-all.
Raise an action, not a target. The platform finds matching handlers, can launch an app, and lets the user choose via the Intents Resolver UI.
Continuous real-time data push. Best for live alerts, telemetry, and any producer→many-subscribers flow. Supports branches.
Per-window state and launch context. Best for restoring or initialising a specific window. Not intended for dynamic inter-app messaging.
Match the interaction pattern you want users to experience — then pick the lightest mechanism that satisfies it.
Apps publish messages on a named topic. All currently-subscribed apps receive it. No persistence — a late joiner never receives messages sent before they subscribed.
A named global object stored in the Gateway. Any app can read, write, or subscribe. Late joiners receive the current value immediately. Context persists if a client disconnects and reconnects.
Shared Contexts plus a Channel Selector UI. Users assign apps to a named colour; all apps on the same colour synchronise automatically.
The Channel Selector supports a directional mode — users can restrict a window to publish-only or subscribe-only.
Lets apps inside a Workspace share state with each other. The context is scoped to that Workspace, travels with it, and can be persisted in layouts.
Explicit, service-like capability. The caller knows exactly what it needs. An app registers a named function and other apps can discover and invoke it — receiving a response back.
Raise an action, not a target. The caller says "handle this" — the platform finds matching handlers, can launch the app if not running, and routes context to it.
Phone "Share / Open with…" UI for desktop workflows.
Both are request/response patterns — the difference is coupling, targeting, and who resolves the handler.
Continuous, real-time data push. Best for live alerts, telemetry, and any producer→many-subscribers flow. The server controls who can subscribe via branches.
Named sub-channels within a stream (e.g. per region). The provider pushes to a branch only.
Per-window state and launch context. Scoped to one window. Best for restoring or initialising a specific window. Can be saved as part of a Global Layout.
Answer each question top-to-bottom — first Yes wins.
Hover cells with a indicator for additional details.
| Feature | 📡 Pub/Sub | 🗂️ Shared Ctx | 🎨 Channels | 🏢 Workspace Ctx | 🔧 Methods | 🎯 Intents | 📶 Streams | 🪟 Window Ctx |
|---|---|---|---|---|---|---|---|---|
| Communication Model | Broadcast | Broadcast | Broadcast | Broadcast | Req/Resp | Req/Resp | Streaming | Window-specific |
| Publish Data | ✓ | ✓ | ✓*Based on Channel Restrictions | ✓ | ✓ | ✓ | ✓ | ✗*Not intended for dynamic interop |
| Read Data | ✓ | ✓ | ✓*Based on Channel Restrictions | ✓ | ✓*Servers could restrict access to data | ✓*Servers could restrict access to data | ✓*Servers could restrict access to data | ✗*Not intended for dynamic interop |
| Discovery | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| User Controlled | ✗ | ✗ | ✓*Users assign Application Instances to Color Channels | ✓*Users control the Workspace grouping of Windows | ✗ | ✓*Users are responsible for resolving ambiguous Intents through the Intents Resolver UI | ✗ | ✗ |
| Defined Statically | ✗ | ✗ | ✗ | ✓*Could be defined as part of a Workspace Layout | ✗ | ✓*Intents could also be defined dynamically | ✗ | ✓*Could be defined as part of a Global Layout |
| Global | ✓ | ✓ | ✗*By design, scoped to the Application Instances joined on the same Color Channel | ✗*By design, scoped to the Applications Instances within a Workspace | ✓ | ✓ | ✓ | ✗ |
| Persist (restarts) | ✗ | ✗ | ✗ | ✓*Data could be persisted as part of a Workspace Layout | ✗ | ✗ | ✗ | ✓*Data could be persisted as part of a Global Layout |
| Persist (disconnect) | ✗ | ✓ | ✓ | ✓*The Harmony Workspaces Application could automatically destroy a Workspace Context when the Workspace is closed, based on configuration | ✗ | ✗ | ✗ | ✗ |
| Reannouncement (e.g., after a machine state change) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Caller / Updater ID | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| Cardinality | 1→Many | 1→Many | 1→Many | 1→Many | 1→Many | 1→1 | 1→Many | 1→1 |
| Instance Launch | ✗ | ✗ | ✗ | ✗ | ✗ | ✓*Can launch new Instances of Applications, if needed | ✗ | ✓*Can be provided as an initial context by the launching Application Instance via the AppManager API |
| io.Connect API |
publish()subscribe()
|
all()set()get()subscribe()
|
all()join()publish()subscribe()
|
setContext()updateContext()getContext()onContextUpdated()
|
methods()register()invoke()unregister()
|
all()register()raise()
|
createStream()stream.push()subscribe()stream.close()
|
setContext()updateContext()getContext()onContextUpdated()
|
| Interception | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✗ | ✗ |
| FDC3 Mapping | — | App Channels | User Channels | — | — | Intents | Private Channels | — |
Keep exploring io.Connect data sharing