---
title: "1.15 release notes"
canonical_url: "https://www.nutrient.io/guides/web/release-notes/1-15/"
md_url: "https://www.nutrient.io/guides/web/release-notes/1-15.md"
last_updated: "2026-05-15T00:00:00.000Z"
description: "Lists important changes for Nutrient Web SDK 1.15"
---

Nutrient Web SDK 1.15 introduces a structured headless annotation API namespace, refines the UI customization slot system, and expands `instance.search()` with whitespace-tolerant matching for multiline phrases. See the [changelog](https://www.nutrient.io/guides/web/changelog.md#1.15.0) for full details.

### Breaking changes

This release includes two breaking changes. Review the impact and restoration steps below before upgrading.

#### Document loading screen is now the skeleton UI

Pre-1.15 versions showed a hardcoded progress spinner/bar while documents loaded, with no API to configure it. 1.15 introduces the new [`ui.loader`](https://www.nutrient.io/api/web/interfaces/UI.Configuration.html#loader) option together with a new `skeleton` loader — a realistic placeholder of the viewer layout that reduces perceived load time and makes the skeleton the default. Any integration upgrading from 1.14 or earlier will see the skeleton during document load instead of the previous spinner, without changing any code.

**Impact:** No code change is required for the new behavior, but the loading UI users see during `NutrientViewer.load()` is visually different. Custom CSS or visual regression tests that asserted against the previous spinner may need updates.

**Restoring previous behavior:** Pass `{ type: "progress" }` to keep the pre-1.15 spinner:

```js

await NutrientViewer.load({
  //...your existing configuration
  ui: { loader: { type: "progress" } },
});

```

Refer to [configurable loader UI](#configurable-loader-ui) for the full set of options, including custom slot callbacks.

#### UI customization slot callbacks now receive `getInstance()`

The first argument to every `ui.*` slot callback changed from a captured `instance` reference to a `getInstance()` accessor. Call `getInstance()` at the point of use — typically inside `render` or an event handler — to read the latest viewer instance.

**Impact:** Existing `ui.*` slot callbacks that used the first argument as a synchronous `instance` reference will break at runtime once upgraded. Preload slots (`ui.loader`, `ui.passwordPrompt`) previously received `null` here because the viewer hadn’t finished loading; with `getInstance()`, the same callback can read the live instance from any render call or event handler that fires after `NutrientViewer.load()` resolves.

**Migration:** Update each callback to call `getInstance()` at the point of use.

Before:

```js

NutrientViewer.load({
  ui: {
    tools: {
      main: (instance, id) => ({
        render: () => createToolbar(instance),
      }),
    },
  },
});

```

After:

```js

NutrientViewer.load({
  ui: {
    tools: {
      main: (getInstance, id) => ({
        render: () => createToolbar(getInstance()),
      }),
    },
  },
});

```

The change applies to every `ui.*` slot, including:

- Preload slots — `ui.loader`, `ui.passwordPrompt`.

- Postload slots — `ui.tools.main`, `ui.tools.contextual`, `ui.annotations.*`, `ui.signatures.*`, `ui.search`, `ui.documentEditor`, `ui.commentThread`, `ui.sidebar.*`.

### Headless annotation APIs

This release introduces an `annotations.*` namespace on `instance` for working with annotations programmatically, organized by annotation type. Each sub-namespace exposes type-specific operations and shares a common selection, note, and clipboard infrastructure — usable without mounting the full viewer UI:

- `annotations.ink`

- `annotations.link`

- `annotations.measurement`

- `annotations.redaction`

- `annotations.shape`

- `annotations.textMarkup`

- `annotations.text`

The shared infrastructure is extensible — additional annotation types can plug into the same primitives. This is the foundation for richer headless and automation workflows. For more information, refer to the [headless annotations overview](https://www.nutrient.io/guides/web/headless.md), [headless measurement annotations](https://www.nutrient.io/guides/web/headless/measurement.md), and [headless redaction annotations](https://www.nutrient.io/guides/web/headless/redactions-from-selection.md). Let us know through our [support form](https://support.nutrient.io/hc/en-us/requests/new) which patterns you’d like to see expanded next.

### Cancelable load and conversion operations

`NutrientViewer.load()`, `convertToPDF()`, `convertToOffice()`, and `populateDocumentTemplate()` now accept an [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) to cancel in-flight operations. This is useful when users navigate away mid-load or you need to terminate a slow conversion:

```js

const controller = new AbortController();
const instance = await NutrientViewer.load({
  //...your existing configuration
  signal: controller.signal,
});

// Later, to cancel:
controller.abort();

```

For more information, refer to the [viewer troubleshooting](https://www.nutrient.io/guides/web/viewer/troubleshooting.md), [Office-to-PDF conversion](https://www.nutrient.io/guides/web/conversion/office-to-pdf.md), [PDF-to-Office conversion](https://www.nutrient.io/guides/web/conversion/pdf-to-office.md), and [Word template generation](https://www.nutrient.io/guides/web/pdf-generation/from-word-template.md) guides.

### Configurable loader UI

A new [`ui.loader`](https://www.nutrient.io/api/web/interfaces/UI.Configuration.html#loader) option controls what users see while a document loads. Three forms are supported:

**`skeleton` (default)** — A realistic placeholder of the viewer layout that reduces perceived load time:

```js

await NutrientViewer.load({
  //...your existing configuration
  ui: { loader: { type: "skeleton" } },
});

```

**`progress`** — The indeterminate spinner with a determinate progress bar (the pre-1.15 default):

```js

await NutrientViewer.load({
  //...your existing configuration
  ui: { loader: { type: "progress" } },
});

```

**Slot callback** — Fully replace the loader with custom DOM. Because the loader renders before `NutrientViewer.load()` resolves, `getInstance()` may return `null` inside this slot; use it for loading UI only:

```js

await NutrientViewer.load({
  //...your existing configuration
  ui: {
    loader: (getInstance, id) => ({
      render: () => {
        const div = document.createElement("div");
        div.innerText = "Loading your document...";
        return div;
      },
    }),
  },
});

```

To hide the loader entirely, return `null` from `render`: `(getInstance, id) => ({ render: () => null })`.

### Whitespace-tolerant search

A new opt-in, [`SearchType.WORD_BASED`](https://www.nutrient.io/api/web/enums/NutrientViewer.SearchType.html), makes `instance.search()` resilient to whitespace inconsistencies in extracted PDF text. The mode strips Unicode space variants (NBSP, em/en/thin spaces, ideographic space, etc.) plus tab/newline/CR from both the query and the document before matching, so multiline phrases that cross tables, columns, or line wraps with stray whitespace match cleanly. Annotation contents are matched with the same algorithm. Punctuation is preserved on both sides, and case-insensitive search (the default) now case-folds non-ASCII letters too — `"MÖCHTEN"` matches `"möchten"`.

```js

const results = await instance.search("Smith, John", {
  searchType: NutrientViewer.SearchType.WORD_BASED,
});

```

Default `instance.search()` behavior is unchanged. Additionally, the existing smart-search regex now tolerates a single space immediately before a line break, fixing cases where PDF text extraction inserts a trailing space at line wraps and a clean-newline query failed to match.

`SearchType.WORD_BASED` is available in Web SDK standalone mode immediately. Server-backed mode requires Document Engine 1.16.x.

For more information, refer to the [text search](https://www.nutrient.io/guides/web/features/customized-search.md) and [built-in search UI](https://www.nutrient.io/guides/web/search/built-in-ui.md) guides.

### Performance, fonts, and stability

- Dynamic font downloading and font substitution now work for linearized PDF loads, eliminating font-related fallbacks during progressive loading.

- A new API lets you control the visual rendering order of annotations on a page via a custom comparator function.

- Document Crop mode now supports keyboard input — arrow keys draw the crop region, Enter confirms, and Escape cancels.

- The standalone JWT signing service now forwards the `flatten` flag consistently from `prepareSign` to the `/sign_hash` request, producing valid signatures when `instance.signDocument()` is called with `flatten: true`.

- Fixes a regression introduced in 1.14.0 where cross-user updates to non-comment annotations could be rejected by Document Engine with `invalid_anonymity_update`, blocking collaborative editing of existing annotations.

- Additional fixes across RTL viewer trackpad scrolling and scrollbar visibility, IME composition in custom stamp text fields, content editor text drag-selection on Windows, ligature text selection, redaction font sizing, Arabic rich-text free text appearance streams, and several content editor and form creator edge cases.

For more information, refer to the [font substitution](https://www.nutrient.io/guides/web/viewer/fonts/substitution.md), [linearized downloads](https://www.nutrient.io/guides/web/viewer/linearized-downloads.md), [crop](https://www.nutrient.io/guides/web/editor/page-manipulation/crop.md), and [annotation customization](https://www.nutrient.io/guides/web/annotations/custom-rendered-annotations.md) guides.

Minimum Document Engine version required: [1.5.6](https://www.nutrient.io/guides/document-engine/changelog.md#1.5.6)

For more information, refer to the [UI customization introduction](https://www.nutrient.io/guides/web/user-interface/ui-customization/introduction.md), [supported slots reference](https://www.nutrient.io/guides/web/user-interface/ui-customization/supported-slots.md), and [slot examples](https://www.nutrient.io/guides/web/user-interface/ui-customization/examples.md) guides.

For a complete list of changes, bug fixes, and improvements, refer to the [changelog](https://www.nutrient.io/guides/web/changelog.md#1.15.0). For previous release notes, refer to the [Web SDK 1.14 release notes](https://www.nutrient.io/guides/web/release-notes/1-14.md). We appreciate your feedback and contributions as we continue to enhance Nutrient Web SDK.
---

## Related pages

- [1 0](/guides/web/release-notes/1-0.md)
- [1 1](/guides/web/release-notes/1-1.md)
- [1 10](/guides/web/release-notes/1-10.md)
- [1 11](/guides/web/release-notes/1-11.md)
- [1 12](/guides/web/release-notes/1-12.md)
- [1 13 1](/guides/web/release-notes/1-13-1.md)
- [1 13](/guides/web/release-notes/1-13.md)
- [1 14](/guides/web/release-notes/1-14.md)
- [1 16](/guides/web/release-notes/1-16.md)
- [1 17](/guides/web/release-notes/1-17.md)
- [1 18](/guides/web/release-notes/1-18.md)
- [1 2](/guides/web/release-notes/1-2.md)
- [1 3](/guides/web/release-notes/1-3.md)
- [1 4](/guides/web/release-notes/1-4.md)
- [1 5](/guides/web/release-notes/1-5.md)
- [1 6](/guides/web/release-notes/1-6.md)
- [1 7](/guides/web/release-notes/1-7.md)
- [1 8](/guides/web/release-notes/1-8.md)
- [1 9](/guides/web/release-notes/1-9.md)
- [2017 3](/guides/web/release-notes/2017-3.md)
- [2017 6](/guides/web/release-notes/2017-6.md)
- [Update your PSPDFKit for Web to version 2017.7](/guides/web/release-notes/2017-7.md)
- [Upgrade annotations in PSPDFKit Web 2017.8](/guides/web/release-notes/2017-8.md)
- [Explore new features in PSPDFKit for Web 2017.9](/guides/web/release-notes/2017-9.md)
- [New features in the 2018.1 migration guide](/guides/web/release-notes/2018-1.md)
- [PSPDFKit for Web 2018.2 migration insights](/guides/web/release-notes/2018-2.md)
- [Discover the new features in PSPDFKit for Web 2018.3](/guides/web/release-notes/2018-3.md)
- [Explore PSPDFKit for Web 2018.4 features](/guides/web/release-notes/2018-4.md)
- [Explore new features in PSPDFKit 2018.5](/guides/web/release-notes/2018-5.md)
- [Explore PSPDFKit for Web 2018.6 enhancements](/guides/web/release-notes/2018-6.md)
- [Explore the new features in PSPDFKit 2018.7](/guides/web/release-notes/2018-7.md)
- [Key updates in PSPDFKit for Web 2019.1](/guides/web/release-notes/2019-1.md)
- [2019 2](/guides/web/release-notes/2019-2.md)
- [PSPDFKit for Web 2019.3 migration highlights](/guides/web/release-notes/2019-3.md)
- [Essential updates in PSPDFKit for Web 2019.4](/guides/web/release-notes/2019-4.md)
- [PSPDFKit for Web 2019.5 migration insights](/guides/web/release-notes/2019-5.md)
- [Key changes in PSPDFKit for Web 2020.1](/guides/web/release-notes/2020-1.md)
- [Seamless migration to PSPDFKit for Web 2020.2](/guides/web/release-notes/2020-2.md)
- [Upgrade to PSPDFKit Web 2020.3 seamlessly](/guides/web/release-notes/2020-3.md)
- [PSPDFKit Web and Server 2020.4 migration update](/guides/web/release-notes/2020-4.md)
- [Unified CRUD API enhancements for easy migration](/guides/web/release-notes/2020-5.md)
- [PSPDFKit Web 2020.6 migration insights](/guides/web/release-notes/2020-6.md)
- [Upgrade to PSPDFKit for Web 2021.1 with ease](/guides/web/release-notes/2021-1.md)
- [Seamlessly migrate to PSPDFKit for Web 2021.2](/guides/web/release-notes/2021-2.md)
- [2021 3](/guides/web/release-notes/2021-3.md)
- [PSPDFKit 2021.4 migration guide for seamless updates](/guides/web/release-notes/2021-4.md)
- [Migration guide for PSPDFKit 2021.5](/guides/web/release-notes/2021-5.md)
- [2021 6](/guides/web/release-notes/2021-6.md)
- [PSPDFKit 2022.1.1 migration changes](/guides/web/release-notes/2022-1.md)
- [Enhancements in PSPDFKit for Web 2022.2](/guides/web/release-notes/2022-2.md)
- [Explore the new features of PSPDFKit for Web 2022.3](/guides/web/release-notes/2022-3.md)
- [PSPDFKit for Web 2022.4 migration overview](/guides/web/release-notes/2022-4.md)
- [Key improvements in PSPDFKit for Web 2022.5](/guides/web/release-notes/2022-5.md)
- [Discover the key updates in PSPDFKit for Web 2023.1](/guides/web/release-notes/2023-1.md)
- [PSPDFKit 2023.2 migration and updates](/guides/web/release-notes/2023-2.md)
- [Key updates in PSPDFKit for Web 2023.3](/guides/web/release-notes/2023-3.md)
- [Explore key updates in PSPDFKit for Web 2023.4](/guides/web/release-notes/2023-4.md)
- [Key updates in PSPDFKit for Web 2023.5](/guides/web/release-notes/2023-5.md)
- [Essential Nutrient Web SDK 2024.1 migration tips](/guides/web/release-notes/2024-1.md)
- [2024 2](/guides/web/release-notes/2024-2.md)
- [2024 3](/guides/web/release-notes/2024-3.md)
- [2024 4](/guides/web/release-notes/2024-4.md)
- [2024 5](/guides/web/release-notes/2024-5.md)
- [2024 7](/guides/web/release-notes/2024-7.md)
- [2024 8](/guides/web/release-notes/2024-8.md)
- [Upgrading Nutrient Web SDK](/guides/web/release-notes/upgrading.md)

