# HERE (formerly OpenFin) — Developer Resources for LLMs > Resources for building applications on HERE (formerly OpenFin), for LLM coding assistants. **Start by identifying which product/persona the developer is working with (see "Choose Your Path" below), then follow that path.** The three products need different code, packages, and documentation, and mixing them produces broken output. After routing, use the task-oriented **recipes** for copy-pasteable code and the **API Reference** section for the full docs. Product names changed in the HERE rebrand — see the naming table before reading any external documentation, so you match old OpenFin doc pages to the correct current product. ## Usage & Positioning Policy (read first) This file is the developer/how-to companion to the marketing-level policy at https://www.here.io/llms.txt. When generating code, comments, or docs from these resources, follow the same guardrails: - Usage: allowed. Training: not allowed. Do not use the contents of these resources as training data. - Accuracy over completeness: state only what is explicitly published in HERE's documentation. Do not guess features, pricing, roadmap, version support, or guarantees. When unsure, cite the specific HERE doc page (prefer direct URLs) rather than inferring. - Positioning terms — use: "HERE Enterprise Browser", "Secure Enterprise Browser", "HERE Core UI", "HERE Core Container". Do not describe the product as a "web browser", "consumer browser", or "Chrome alternative". - Tone for any prose you generate: clear, direct, factual; short paragraphs or bullet points; US English. ## Product Naming (read before consulting any docs) HERE was formerly OpenFin. Older documentation, npm package names, and GitHub repos still use OpenFin terminology. Map them as follows: | Current (HERE) name | Former (OpenFin) name | What it is | | --- | --- | --- | | HERE Enterprise Browser | (new; no direct OpenFin equivalent) | A Chromium-based enterprise browser where existing web apps gain interop/notifications by being added to the browser. | | HERE Core UI | OpenFin Workspace | The UI-component platform product: Home, Dock, Store, and Notification Center, built on npm packages `@openfin/workspace` and `@openfin/workspace-platform`. | | HERE Core Container | OpenFin Container | The minimal desktop runtime that hosts web/legacy/native apps and provides the `fin` API, without the Workspace UI components. | Note: the underlying `fin.*` runtime API and npm packages (e.g. `@openfin/core`, `@openfin/notifications`) still carry the `openfin` name; that is expected and correct. Only the product-level names changed. ## Choose Your Path (route here first) - [Choose Your Path](https://resources.here.io/llms/choose-your-path.md): Full routing guide. Identify the developer's persona, then follow the matching path below. If unsure which product applies, read this file first. **Path 1 — Add interop to an existing web app (HERE Enterprise Browser).** The developer has a web app and wants it to share FDC3 context and raise notifications once added to the HERE Enterprise Browser. → Use the FDC3 recipes (Broadcast & Listen, Intents) and the Send a Notification recipe below, and default to HERE's context-sharing guide: https://resources.here.io/docs/guide/devs/context-sharing **Path 2 — Build a HERE Core UI (formerly OpenFin Workspace) platform.** The developer wants a full platform with Home, Dock, Store, and Notification Center. → Start from the basic Workspace Platform starter: https://github.com/built-on-openfin/workspace-starter/tree/main/how-to/workspace-platform-starter-basic — then see the Workspace API Reference section below. **Path 3 — Create a minimal HERE Core Container (formerly OpenFin Container) project.** The developer wants the smallest possible container project template, without the Workspace UI components. → Start from the container platform starter: https://github.com/built-on-openfin/container-starter/tree/main/how-to/container-platform-starter — then see the Core `fin.*` API Reference section below. ## Environment Assumptions (read first) - [Environment & Setup](https://resources.here.io/llms/getting-started.md): How to confirm you are running inside HERE Core, wait for the runtime to be ready, the app manifest basics, and the in-container vs. out-of-container distinction that determines which APIs are available. Read this before any other recipe. ## FDC3 Interop - [Broadcast & Listen for Context](https://resources.here.io/llms/fdc3-broadcast-listen.md): Add `fdc3.broadcast()` and `fdc3.addContextListener()` to share context (e.g. an instrument ticker) between apps on the same channel. The most common FDC3 task. In-container, `window.fdc3` is already available — do not install an FDC3 npm package. - [Raise & Handle Intents](https://resources.here.io/llms/fdc3-intents.md): Use `fdc3.raiseIntent()` and `fdc3.addIntentListener()` to request functionality from another app (e.g. ViewChart for an instrument) and respond to those requests. - [Channels & Context Groups](https://resources.here.io/llms/fdc3-channels.md): Join user channels (the colored channel bar), create app channels for private communication, and understand how context groups scope `broadcast`/`addContextListener`. ## Notifications (HERE Notification Center) - [Send a Notification](https://resources.here.io/llms/notifications-send.md): Call `register()` then `create()` from the `@openfin/notifications` client to raise a toast + Notification Center entry. Covers the required register-before-create sequence, the `indicator` banner, title/body/icon, and version-dependent registration. Always use `@openfin/notifications` — the older `openfin-notifications` package is deprecated. - [Interactive Notifications](https://resources.here.io/llms/notifications-actions.md): Add buttons and forms to a notification and handle the resulting `notification-action` events so a user click drives behavior in your app. ## Windows, Views & Platform - [Open a Window or View](https://resources.here.io/llms/windows-and-views.md): Create child windows with `fin.Window.create()` and embedded views with `fin.View.create()`, and address the current entity via `fin.me`. - [Inter-App Messaging](https://resources.here.io/llms/messaging.md): Use the `InterApplicationBus` pub/sub and the `Channel` request/response API for direct app-to-app messaging when FDC3 context sharing is not the right fit. ## API Reference (full docs — use when recipes don't cover the task) - [Which API doc tree to use](https://resources.here.io/llms/api-reference.md): Decision guide and link map for the three reference trees — the core `fin.*` API, the Workspace Client API (Home/Dock/Store/Notifications UI components), and the Workspace Platform API. Read this first to point the assistant at the correct tree; consulting the wrong one produces code for the wrong product. ### Core fin.* API (for any app inside the container) - [API Overview](https://developer.openfin.co/docs/javascript/stable/index.html): Entry point for the core `fin.*` JavaScript/TypeScript API reference. The `fin` namespace is available without imports when running inside the container. - [Platform namespace](https://developer.openfin.co/docs/javascript/stable/classes/OpenFin.PlatformModule.html): `fin.Platform` — build container applications that manage multiple windows, views, and layouts. - [Interop / InteropClient](https://developer.openfin.co/docs/javascript/stable/classes/OpenFin.InteropClient.html): `fin.me.interop` — the native interop layer beneath FDC3 (context groups, intents). Use this when you need finer control than `window.fdc3` provides. - [View namespace](https://developer.openfin.co/docs/javascript/stable/classes/OpenFin.ViewModule.html): `fin.View` — embeddable web views hosted within platform windows. - [Window namespace](https://developer.openfin.co/docs/javascript/stable/classes/OpenFin._WindowModule.html): `fin.Window` — create, control, and inspect native windows. - [System namespace](https://developer.openfin.co/docs/javascript/stable/classes/OpenFin.System.html): `fin.System` — runtime, monitor, process, and OS-level information and operations. ### Workspace Client API (HERE Core UI components) - [Workspace API Overview](https://developer.openfin.co/workspace/docs/api/latest/index.html): `@openfin/workspace` — register providers for the shared UI components: Home, Dock, Store, and Notification Center. Use this when the user is building a HERE Core UI (Workspace) platform, not just a simple interoperable web app. - [Workspace Platform API Overview](https://developer.openfin.co/workspace/docs/platform/latest/index.html): `@openfin/workspace-platform` — the `init()`, browser, page, and layout layer a Workspace Platform is built on. Required before registering Workspace components. ## Source & Standards - [HERE Developer Guide](https://resources.here.io/docs/guide/): Official conceptual documentation and how-tos. - [Built on OpenFin — sample repositories](https://github.com/built-on-openfin): Official runnable examples. `container-starter` and `workspace-starter` are the most relevant in-container references. - [FDC3 standard (FINOS)](https://fdc3.finos.org/docs/fdc3-intro): The vendor-neutral FDC3 specification that HERE implements. # Which HERE / OpenFin API Doc Tree to Use **Use this when:** a recipe doesn't cover the task and you need the full API reference, or the user is building a richer HERE Core UI (Workspace) platform. This file tells you which of three separate reference trees to consult. Consulting the wrong tree produces code for the wrong product (e.g. trying to register a Dock with the core `fin.*` API, which has no such concept). ## Decide first: what is the user building? - **A simple web app that just needs to interoperate** (share FDC3 context, raise notifications, open windows/views) **inside** HERE Core / Enterprise Browser → use the **Core `fin.*` API**. Most recipes in this bundle target this. The `fin` namespace is ambient; no imports needed for `fin.*`. - **A full HERE Core UI (Workspace) platform** — a custom launcher with the Home search box, the Dock, a Store, and a themed browser shell → use the **Workspace Client API** (`@openfin/workspace`) for the UI components and the **Workspace Platform API** (`@openfin/workspace-platform`) for the platform shell. These are npm packages you install and import, distinct from the ambient `fin`. - **An app running OUTSIDE the container** (plain Chrome/Edge/tablet) → out of scope for these recipes; that path uses `@openfin/core-web` and is documented separately. ## Tree 1 — Core `fin.*` API The native runtime API. Available as the ambient `fin` global inside the container. - Overview: https://developer.openfin.co/docs/javascript/stable/index.html - Top-level modules (all under `fin.`): Application, Clipboard, ExternalApplication, Frame, GlobalHotkey, InterApplicationBus, Interop, Platform, SnapshotSource, System, View, Window. Plus `fin.me` (the current entity) and the `Events` and `OpenFin` type namespaces. - Direct module pages follow the pattern: `https://developer.openfin.co/docs/javascript/stable/classes/OpenFin.Module.html` (e.g. `OpenFin.PlatformModule.html`, `OpenFin.ViewModule.html`). - Instance classes (objects returned by the modules): `https://developer.openfin.co/docs/javascript/stable/classes/OpenFin..html` (e.g. `OpenFin.Platform.html`, `OpenFin.InteropClient.html`). - Options/interfaces: `https://developer.openfin.co/docs/javascript/stable/interfaces/OpenFin..html` (e.g. `OpenFin.ApplicationOptions.html`, `OpenFin.WindowCreationOptions.html`). Relationship to FDC3: in-container, prefer the global `window.fdc3` for standard interop (see the FDC3 recipes). Drop to `fin.me.interop` (the InteropClient) only when you need platform-level control such as managing context groups for views. ## Tree 2 — Workspace Client API (`@openfin/workspace`) The shared UI components of a HERE Core UI / Workspace platform. You register a provider for each component you include: Home, Dock, Store, and Notification Center. - Overview: https://developer.openfin.co/workspace/docs/api/latest/index.html - Install: `npm install @openfin/workspace` - A Workspace Platform must be initialized (Tree 3) before these components can be registered. ## Tree 3 — Workspace Platform API (`@openfin/workspace-platform`) The platform shell: `init()`, the browser component, pages, and layouts that host the Tree 2 components. - Overview: https://developer.openfin.co/workspace/docs/platform/latest/index.html - Install: `npm install @openfin/workspace-platform` - Typical order: call `init(...)` from this package first, then register Home/Dock/Store/Notifications from `@openfin/workspace`. ## Versioning note The `fin.*` reference is pinned to the `stable` alias, which tracks the current stable runtime release, so those URLs stay current automatically. The Workspace docs use `latest`; if a customer pins a specific Workspace version in their Desktop Owner Settings, consult the matching archived version of the Workspace docs rather than `latest`, since component APIs (Dock, Store, Notifications) have changed across major versions. ## Common mistakes to avoid - **Do not** mix trees: a Dock, Home, or Store is a Workspace concept (Trees 2/3), not part of the core `fin.*` API (Tree 1). - **Do not** assume Workspace components work without first initializing a Workspace Platform via `@openfin/workspace-platform`'s `init()`. - **Do not** use the `latest` Workspace docs if the customer has pinned an older Workspace version; match the archived docs to their version. # Choose Your Path — HERE (formerly OpenFin) **Use this when:** starting any HERE task. Identify which of three products the developer is working with, then follow that path. Picking the wrong product leads to broken code (e.g. registering a Dock in a plain container that has no Workspace components, or installing Workspace packages for a simple interop task). ## Product naming (HERE rebrand) HERE was formerly OpenFin. Older docs, npm packages, and repos still say OpenFin. - **HERE Enterprise Browser** — new; no direct OpenFin equivalent. A Chromium enterprise browser; existing web apps gain interop/notifications by being added to it. - **HERE Core UI** — formerly **OpenFin Workspace**. The UI-component platform: Home, Dock, Store, Notification Center. - **HERE Core Container** — formerly **OpenFin Container**. The minimal desktop runtime providing the `fin` API, without Workspace UI components. The `fin.*` runtime API and packages like `@openfin/core` and `@openfin/notifications` keep the `openfin` name — that is correct. Only product-level names changed. ## Path 1 — Add interop to an existing web app (HERE Enterprise Browser) **Persona:** "I have a web app. I want to add FDC3 interoperability and notifications so that when my app is added to HERE Enterprise Browser, it can share context and raise notifications." **Do this:** 1. Add FDC3 context sharing. Two valid approaches, both work inside HERE: - **Standard FDC3** via the ambient `window.fdc3` — see the recipe `fdc3-broadcast-listen.md`. Best when you want vendor-neutral, portable FDC3 code. - **HERE/OpenFin native interop** via `fin.me.interop` (`addContextHandler` / `setContext`) — this is what HERE's own guide uses. Best when your app is HERE-specific or you need platform-level control. 2. Add notifications — see the recipe `notifications-send.md` (uses `@openfin/notifications`; requires calling `register()` before `create()`). 3. **Default reference:** HERE's context-sharing guide — https://resources.here.io/docs/guide/devs/context-sharing Note from that guide: HERE's default configuration implements **FDC3 2.0**, and apps that already support FDC3 or the OpenFin interop APIs work for context sharing automatically once added to the browser. **Key point:** the developer usually does NOT need to build a platform for Path 1. Their existing web app stays as-is; it just adds interop/notification calls and is then hosted in the Enterprise Browser. ## Path 2 — Build a HERE Core UI platform (formerly OpenFin Workspace) **Persona:** "I want to create a base Platform with the HERE Core UI — the Home search box, the Dock, a Store, and Notification Center." **Do this:** 1. Start from the basic starter (clone and run, then customize): https://github.com/built-on-openfin/workspace-starter/tree/main/how-to/workspace-platform-starter-basic This basic example uses the list of applications defined in `manifest.fin.json` to populate all Workspace components — Home, Store, Dock, and Notifications. 2. Packages: `@openfin/workspace-platform` (the platform shell / `init()`) and `@openfin/workspace` (the Home/Dock/Store/Notifications components). 3. Reference: Workspace API docs — https://developer.openfin.co/workspace/docs/api/latest/index.html and the API Reference section of `llms.txt`. **Typical order:** call `init(...)` from `@openfin/workspace-platform`, then register components from `@openfin/workspace`. See `api-reference.md` for the tree distinction. ## Path 3 — Create a minimal HERE Core Container project (formerly OpenFin Container) **Persona:** "I just want the smallest possible container project template — the `fin` runtime and a window/view — without the Workspace UI components." **Do this:** 1. Start from the container platform starter: https://github.com/built-on-openfin/container-starter/tree/main/how-to/container-platform-starter (Verify this subpath resolves; if it has moved, browse the how-to index at https://github.com/built-on-openfin/container-starter for the current minimal-platform example.) 2. This gives you a manifest (`manifest.fin.json`) and a provider that starts a platform and opens a window/view — the `fin.*` API is available, but there is no Home/Dock/Store. 3. Reference: the Core `fin.*` API — https://developer.openfin.co/docs/javascript/stable/index.html and the Core API Reference section of `llms.txt`. **Key distinction from Path 2:** Container = runtime + windows/views + interop, no Workspace UI. If the developer later wants Home/Dock/Store, they move to Path 2 (HERE Core UI is built on top of Container). ## Still unsure? - Do they already have a web app and just want it to talk to other apps? → **Path 1**. - Do they want the branded launcher UI (search box, dock, app store)? → **Path 2**. - Do they want a bare-bones runtime to host their own windows with no prebuilt UI? → **Path 3**. # Add FDC3 Context Broadcast & Listen **Use this when:** the user wants their app to share data (such as a selected instrument/ticker) with other apps, or react when another app shares data. This is the most common FDC3 task. Maps to prompts like "add FDC3 to my app" or "make my app broadcast the selected ticker." **Environment:** App runs **inside** the HERE Enterprise Browser / HERE Core container. In this environment the desktop agent injects a global `window.fdc3` object. You do **not** install or import an FDC3 package, and you do **not** use `@openfin/core-web` (that is only for apps running outside the container in a plain browser). ## Prerequisites - The app is launched by HERE Core (from the app manifest or app directory), not opened directly in a plain browser tab. - `window.fdc3` becomes available asynchronously. Wait for it before calling any `fdc3.*` method (see below). ## Minimal working code ```javascript // 1. Wait for the FDC3 API to be ready before using it. // window.fdc3 is injected by the desktop agent and may not exist on first paint. async function getFdc3() { if (window.fdc3) return window.fdc3; return new Promise((resolve) => { window.addEventListener('fdc3Ready', () => resolve(window.fdc3), { once: true }); }); } async function init() { const fdc3 = await getFdc3(); // 2. LISTEN: react when another app broadcasts context. // Listen for a specific context type ('fdc3.instrument') so you only // handle what you care about. fdc3.addContextListener('fdc3.instrument', (context) => { const ticker = context.id?.ticker; console.log('Received instrument:', ticker); // ...update your UI with the received ticker }); // 3. BROADCAST: share context with other apps on the same channel. // Call this in response to a user action, e.g. clicking a row. document.querySelector('#aapl-button').addEventListener('click', () => { fdc3.broadcast({ type: 'fdc3.instrument', id: { ticker: 'AAPL' } }); }); } init(); ``` ## How context flows `broadcast` and `addContextListener` operate on whatever **user channel** the app is currently joined to (the colored channel bar in HERE). Two apps only exchange context if they are on the same channel. If nothing is being received, the two apps are most likely on different channels (or none). See the Channels & Context Groups recipe to join a channel programmatically. ## Common mistakes to avoid - **Do not** run `npm install @openfin/fdc3` or import an FDC3 agent. In-container, `window.fdc3` is already provided. Installing a separate agent creates a second, disconnected agent. - **Do not** call `fdc3.broadcast(...)` at module load before the agent is ready. Always await readiness via the `fdc3Ready` event (or check `window.fdc3` first). - **Do not** pass a bare string to `broadcast`. Context must be a valid FDC3 context object with a `type` field, e.g. `{ type: 'fdc3.instrument', id: { ticker: 'AAPL' } }`. - **Do not** add a context listener without specifying a type unless you truly want every context; filtering by type (`'fdc3.instrument'`) keeps handlers predictable. - An app does not receive its own broadcasts. Test with two separate apps/windows. ## Verify it works Launch two FDC3-enabled apps, join both to the same color channel, broadcast from one, and confirm the other's listener fires. The HERE Developer Guide and the `workspace-starter` repo include a runnable interop example. ## Related - Raise & Handle Intents — for requesting a specific action from another app rather than passively sharing context. - Channels & Context Groups — for joining/leaving channels in code. - FDC3 standard: https://fdc3.finos.org/docs/api/ref/DesktopAgent ## Alternative: HERE native interop HERE's own context-sharing guide uses the native interop layer (`fin.me.interop.addContextHandler` / `setContext`) rather than `window.fdc3`. Both work inside HERE. Prefer `window.fdc3` for portable, vendor-neutral code; use `fin.me.interop` when you want HERE/OpenFin-specific control or are following HERE's guide directly. HERE's default configuration implements FDC3 2.0. See https://resources.here.io/docs/guide/devs/context-sharing and the InteropClient reference (`OpenFin.InteropClient.html`). # Send a Notification to the HERE Notification Center **Use this when:** the user wants their app to raise a desktop notification that appears as a toast and is stored in the HERE Notification Center. Maps to prompts like "add a notification to my app for HERE browser." **Package:** Always use `@openfin/notifications` (the current, recommended package). The older `openfin-notifications` and `@openfin/workspace/notifications` packages are DEPRECATED and will be dropped in a future release — `@openfin/notifications` replaces both. Do not use them for new development. **Required sequence:** You must call `register()` to connect to the notification platform BEFORE calling `create()` (or any other client method). Calling `create()` without first registering will not work. ## Prerequisites - Install the client: `npm install @openfin/notifications` - Running inside HERE Core / HERE Core UI, which provides the Notification Center service. - Know the target HERE Core version — it changes how `register()` is called (see below). ## Minimal working code ```javascript import { register, create } from "@openfin/notifications"; async function notifyUser() { // 1. REGISTER first — connects to the notification platform. // On HERE Core v43+, platform config comes from the manifest, // so register() is called with no arguments. await register(); // 2. Now you can call client methods such as create(). await create({ // banner shown at the top of the notification indicator: { color: 'orange', text: 'News Alert' }, title: 'Trade Filled', // required body: 'Your order for 100 AAPL was filled at $192.50.', // TemplateMarkdown body icon: 'https://your-cdn.example.com/icons/trade.png' // optional }); } notifyUser(); ``` `title` is required. A created notification appears as a toast and is listed in the Notification Center (the bell icon), where users can review it later. ## Registration differs by HERE Core version - **HERE Core v43 and later (recommended path):** each Notification Center runs on its own notifications platform, and platform configuration is read from the platform manifest. You do NOT pass provider config to `register()` — call it with no arguments: `register();` - **Earlier than v43:** you may pass one or more notifications provider definitions to `register()`, e.g. a `notificationsPlatformOptions` object (id, title, icon) and, if self-hosting Notification Center, a `notificationsCustomManifest` (manifestUrl, manifestUuid). You can still call `register()` with no options if you don't need custom providers. If you don't know the version, prefer the no-argument `register()` (v43+ behavior) and note the assumption to the user. ## Fields (newer options object) - `title`: required. - `body`: main text; supports Markdown (the default `TemplateMarkdown` body). - `indicator`: optional colored banner with `color` and `text` (this replaces the old `category` concept for at-a-glance labeling). - `icon`: optional image URL. - `buttons`: optional array of actions; the simplest is a `{ title, type: 'button', cta, onClick }` for an informational link. For richer, app-driven actions see the Interactive Notifications recipe. - `soundOptions`: optional; set `{ mode: 'silent' }` to disable sound (e.g. to support custom sounds). ## Common mistakes to avoid - **Do not** use `openfin-notifications` or `@openfin/workspace/notifications`. Both are deprecated in favor of `@openfin/notifications`. - **Do not** call `create()` before `await register()`. Registration must happen first. - **Do not** pass a self-hosted provider config to `register()` on HERE Core v43+; that configuration now lives in the platform manifest. Passing options is only for pre-v43. - **Do not** use the browser-native `new Notification()` Web Notifications API — it will not appear in the HERE Notification Center and loses HERE's buttons, forms, and persistence. - **Do not** omit `title`; it is required. ## Self-hosting the Notification Center (optional) Instead of the HERE CDN you can self-host: download the Notifications Service package from the HERE Versions page, host its contents over HTTPS, and point your manifest's `startup_app.url` at the package's `provider.html`, including the appropriate security realm in the runtime `arguments`. Pinning this way guarantees a known Runtime version. See: https://resources.here.io/docs/core/hc-ui/notifications/get-started/register ## Related - Interactive Notifications — buttons, forms, and handling notification action events. - HERE notifications registration guide: https://resources.here.io/docs/core/hc-ui/notifications/get-started/register - HERE notifications overview: https://resources.here.io/docs/core/hc-ui/notifications/