---
title: 2026 Optimizely CMS 13 release notes
slug: cms-13/release-notes/2026-optimizely-cms-13-release-notes
docTags: 
createdAt: 2026-07-20T15:44:24.538Z
---

Subscribe to updates on this page using the notification and RSS feed options. Product packages are found on the [Optimizely NuGet server](https://nuget.optimizely.com/) and include the following products:

- [CMS Core](docId\:haCEqx2zmJDCnXzCSBzss)
- [Optimizely Forms](docId\:haCEqx2zmJDCnXzCSBzss)
- [Optimizely Graph](docId\:haCEqx2zmJDCnXzCSBzss)
- [Optimizely CMS JavaScript SDK](docId\:haCEqx2zmJDCnXzCSBzss)
- [Optimizely Language Manager](docId\:haCEqx2zmJDCnXzCSBzss)
- [Optimizely Marketing Automation (MA) connectors](docId\:haCEqx2zmJDCnXzCSBzss)
- [DXP](docId\:haCEqx2zmJDCnXzCSBzss)
- [Mark chat](docId\:haCEqx2zmJDCnXzCSBzss)
- [Optimizely Agent Platform tools](docId\:haCEqx2zmJDCnXzCSBzss)
- [Content Delivery API](docId\:haCEqx2zmJDCnXzCSBzss)

Are you looking for the [2026 CMS 12 release notes](docId\:jLmryYeBajFzzYlo8v_x8) or the [2026 CMS (SaaS) release notes](docId:8REViwwWCYnXrJKy_1PwK)?

## Release highlights

| **Date**     | **Release highlights**                                                                                                                                                                                                                                                                                                                                                                                                                                               | **Type**                   |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
| October 5    | [EPiServer.CMS.Core 13.3.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                            | Enhancements and bug fixes |
| September 29 | [EPiServer.Forms 6.0.2](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                | Bug fixes                  |
| September 28 | [DXP](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                                  | Enhancement                |
| September 23 | [Optimizely.Cms.Opal.Tools 13.3.1](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                     | Bug fixes                  |
| September 21 | [EPiServer.CMS.Core 13.2.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                            | Enhancement and bug fixes  |
| September 18 | [Optimizely.Cms.Forms 2.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                           | Enhancement                |
| September 11 | [Optimizely.Cms.Opal.Tools 13.2.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                     | Enhancements               |
| September 9  | [EPiServer.CMS.Core 13.1.3](docId\:haCEqx2zmJDCnXzCSBzss)<br />[EPiServer.MarketingAutomationIntegration.Marketo 13.0.0 EPiServer.MarketingAutomationIntegration.MSDynamics 13.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                    | Enhancements and bug fixes |
| August 31    | [Added support for the Astro frontend framework](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                       | Enhancement                |
| August 28    | [Optimizely.Cms.Opal.Tools 13.1.2](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                     | Bug fixes                  |
| August 27    | [Two new Optimizely Agent Platform agents](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                             | Enhancement                |
| August 21    | [Optimizely.Cms.Opal.Tools 13.1.1](docId\:haCEqx2zmJDCnXzCSBzss)<br />[EPiServer.CMS.Core 13.1.2](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                      | Bug fixes                  |
| August 19    | [Content Delivery API 13.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                          | Enhancement                |
| August 18    | [EPiServer.ConnectForMarketingAutomation 13.0.0 EPiServer.Marketing.Automation.Forms 13.0.0 EPiServer.Marketing.Connector.Delivra 13.0.0 EPiServer.MarketingAutomationIntegration.Eloqua 13.0.0 EPiServer.MarketingAutomationIntegration.ExactTarget 13.0.0 EPiServer.MarketingAutomationIntegration.HubSpot 13.0.0 EPiServer.MarketingAutomationIntegration.Pardot 13.0.0 EPiServer.MarketingAutomationIntegration.Salesforce 13.0.0](docId\:haCEqx2zmJDCnXzCSBzss) | Enhancements and bug fixes |
| August 6     | [Optimizely Graph migration from CMS 12 update](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                        | Enhancement                |
| July 30      | [EPiServer.CMS.Core 13.1.1](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                            | Enhancements and bug fixes |
| July 29      | [DXP](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                                  | Enhancement                |
| July 23      | [JavaScript SDK 2.2.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                 | Enhancements and bug fixes |
| June 30      | [3 new Optimizely Agent Platform agents](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                               | Enhancements               |
| July 7       | [JavaScript SDK 2.1.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                 | Enhancements and bug fixes |
| June 30      | [Optimizely.Cms.Opal.Tools 13.1.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                     | Enhancement                |
| June 23      | [EPiServer.Forms 6.0.1](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                | Bug fix                    |
| June 16      | [EPiServer.Labs.LanguageManager 6.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                 | Enhancement                |
| June 10      | Released the [Agent Visibility Analytics dashboard](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                    | Enhancement                |
| June 1       | [EPiServer.CMS.Core 13.1.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                            | Enhancements and bug fixes |
| May 22       | [Optimizely.Cms.Opal.Tools 13.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                     | Enhancement                |
| May 4        | [Added JavaScript SDK support to CMS 13](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                               | Enhancement                |
| April 28     | [DXP  added support for Incremental Static Regeneration (ISR)](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                         | Enhancement                |
| April 24     | [(Beta) Serve clean markdown to AI agents](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                             | Beta feature               |
| April 22     | [EPiServer.CMS.Core 13.0.2](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                            | Bug fixes                  |
| April 9      | [EPiServer.CMS.Core 13.0.1](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                            | Bug fixes                  |
| April 9      | [EPiServer.Forms 6.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                | Enhancement and bug fix    |
| April 7      | [Cms.OpalChat 2.0.0](docId\:haCEqx2zmJDCnXzCSBzss)                                                                                                                                                                                                                                                                                                                                                                                                                   | Enhancement                |
| March 31     | [CMS 13 general availability (GA) release](docId\:zZtUITvSiIUi8tVxpLQz7)                                                                                                                                                                                                                                                                                                                                                                                             | GA release                 |

## August 27

Released the following agents in the Agent Directory in Optimizely Agent Platform:&#x20;

- [Page Builder agent (CMS 13)](docId\:CTtiItBhaGfQDI5QsRukc) – Analyzes a document, image, or URL and creates a content item of a specified content type in Optimizely Content Management System (CMS) 13 (PaaS). The agent helps you move from ideation to publish-ready CMS content faster and keep content structured according to Optimizely CMS best practices.
- [Content Analysis agent (CMS 13)](docId\:gRDM54XLQuJxmp0olapYI) – Analyzes existing content of a specified CMS 13 (PaaS) content type and produces a markdown instruction set for creating content of that type. The agent helps you create consistent, on-pattern CMS (PaaS) content and reduce rework caused by inconsistent content structures.

## August 14

Released the following tools in Optimizely Agent Platform to help you manage your *Optimizely Graph* content in Optimizely Content Management System (SaaS), CMS 12 (PaaS), and CMS 13 (PaaS).

- `graph_pinned_result` – Manages pinned results and pinned result collections in Optimizely Graph.
- `graph_synonyms` – Manages synonyms in Optimizely Graph. Synonyms help you find content using alternative terms.

## June 30

Released the following agents to Agent Platform:

- [Content Model Creation agent](docId\:NJwE55HR00HskmUPi3kr8) – Analyzes URLs or images to build best-practice content models and references existing models to prevent duplicates, so your content architecture stays consistent in CMS 13.
- [GEO Schema Optimization agent](docId\:lAJ2Ci16x6KqqqIstIby1) – Analyzes page content and recommends or generates schema types and JSON-LD markup, so your content in CMS 13 is more discoverable across search engines and large language models (LLMs).
- [SEO Metadata Optimization agent](docId\:xzGjYvMEy2bTQ7f4zYDSM) – Analyzes webpages and generates optimized meta titles, descriptions, and OpenGraph tags, then applies them as drafts in CMS 13, so you improve search rankings without manual edits.

## June 10

**Enhancement**

- **Agent Visibility Analytics dashboard** – Released the [Agent Visibility Analytics dashboard in Optimizely Analytics](docId\:VTt_0k8-zyjqfW-t4z2ZQ), which shows how AI platforms interact with your website so you can refine your content strategy for AI optimization. It draws on content delivery network (CDN) log data and insights generated by Agent Platform, letting you monitor AI traffic patterns, see which AI platforms visit most often, and identify which pages attract the most AI attention.

## April 24—Beta feature

:::hint{type="success"}
Apply to join the **Markdown for Agents for CMS 12 and CMS 13** beta on the [Optimizely beta signup page](https://www.optimizely.com/beta/).
:::

- **(Beta) Markdown for AI agents** – Deliver a clean markdown version of your pages to AI agents at the edge, instead of full HTML. Because AI agents process markdown more efficiently than HTML, this reduces ingestion cost and improves the accuracy of AI-generated responses that reference your content. The feature does not affect the page experience for human visitors.

## CMS Core—`EPiServer.CMS.Core`

### October 5—13.3.0

**Enhancements**

- **Added DAM asset migration from CMS 12 to CMS 13** – [Migrate Optimizely Digital Asset Management (DAM) asset references](https://docs.developers.optimizely.com/content-management-system/v13.0.0-CMS/docs/migrate-dam-from-cms-12-to-cms-13) on sites upgraded from CMS 12, so images, videos, and documents display correctly in edit mode and on the site. The **Optimizely DAM Legacy Asset Migration** scheduled job, in the `EPiServer.Cms.DamMigration` package, updates references in all content versions and languages. It then removes the legacy asset tracking in Content Marketing Platform (CMP).
- **Faster loading times for Scheduled Jobs page** – The **Scheduled Jobs** list and the **History** tab for each [scheduled job](docId\:BQqAH5s9lZpCAp6f6om60) load faster, especially when the list is large.
- **Reduced Optimizely Graph full synchronization time on large sites** – The **Optimizely Graph Full Synchronization** job finishes sooner on large sites, so Optimizely Graph serves your complete content set sooner after a full reindex. The job now reads the content tree in parallel, scaled to the number of processors on the server. If you do not set `BatchMaxConcurrency`, its default changes from `3` to 1.5 times the processor count, up to 64. For example, an 8-core server runs 12 batches at a time. If the higher default causes memory pressure, database timeouts, or Graph throttling, lower `ConcurrencyPerProcessor`. The application fails to start if `BatchMaxConcurrency` is above 64 or `BatchMaxCount` is above 200.

**Bug fixes**

- [CMS-48062](https://world.optimizely.com/support/bug-list/bug/CMS-48062) – Fixed the issue where validation errors on bound content prevented publishing. This happened when values from the source content did not meet the target property's validation rules, such as a maximum length. CMS now ignores validation errors on properties included in the mapping, including errors from custom validators, because those values come from the source content.
- [CMS-51438](https://world.optimizely.com/support/bug-list/bug/CMS-51438) – Fixed the issue where the **Connect Content** window displayed no content when the source type in the mapping was a contract. The window now lists content of the content types that implement the contract.
- [CMS-55014](https://world.optimizely.com/support/bug-list/bug/CMS-55014) – Fixed the issue where sites upgraded from CMS 12 to CMS 13 displayed as not activated, even with a valid Cloud License.
- [CMS-55291](https://world.optimizely.com/support/bug-list/bug/CMS-55291) – Fixed the issue where Optimizely Graph structured rich text removed the `text-` prefix from inline style property names, such as `text-align` to `align`. Indexing also dropped style declarations whose values contain a colon, such as `background: url(https://example.com/image.png)`. Indexing now includes the full property name alongside the shortened name and keeps values that contain colons. Indexing no longer includes vendor-prefixed properties, such as `-webkit-transition`, or custom properties, such as `--brand-color`.
- [CMS-55494](https://world.optimizely.com/support/bug-list/bug/CMS-55494) – Fixed the issue where content type model synchronization repeated content type lookups, which slowed startup on sites with many content types. Startup is faster, but saving content types one at a time still adds startup time on these sites. Saving an unchanged content type no longer clears the content type cache across servers or raises content type saved events. A block list property that references a missing content type now returns a validation error instead of a `NullReferenceException`.
- [CMS-55619](https://world.optimizely.com/support/bug-list/bug/CMS-55619) – Fixed the issue where deleting a user, group, or visitor group took a long time on sites with large content structures.
- [CMS-55774](https://world.optimizely.com/support/bug-list/bug/CMS-55774) – Fixed the issue where selecting a Digital Asset Management (DAM) asset displayed `Could not use the selected file. Check that files are synchronized correctly from Optimizely DAM to Optimizely Graph and try again.` This happened when the application set a custom antiforgery header name or form field name in `AntiforgeryOptions`.
- [CMS-55835](https://world.optimizely.com/support/bug-list/bug/CMS-55835) – Fixed the issue where the debug log reported `Content type saved` at startup for content types that had not changed.
- [CMS-55862](https://world.optimizely.com/support/bug-list/bug/CMS-55862) – Fixed the issue where adding `[Display(Order)]` to an existing property on a content type model had no effect.
- [CMS-55926](https://world.optimizely.com/support/bug-list/bug/CMS-55926) – Fixed the issue where images inserted in the rich text editor had broken URLs in edit and preview modes. This happened when a site had a **Media** hostname but no **Edit** hostname.
- [CMS-56047](https://world.optimizely.com/support/bug-list/bug/CMS-56047) – Fixed the issue where content type synchronization applied models from an older build to databases upgraded from CMS 12, a regression in CMS 13.1.1. An older build has a lower major or minor assembly version than the build that last synchronized the database. Synchronization could delete unused property definitions that exist only in the newer model. Synchronization now ignores model changes from an older build and logs a warning. This check now also applies to databases created in CMS 13, so a local build versioned 1.0.0.0 does not update content types that a higher-versioned build synchronized.
- [CMS-56167](https://world.optimizely.com/support/bug-list/bug/CMS-56167) – Fixed the issue where the inline block dialog in a content area shifted position when editors clicked or dragged it.
- [CMS-56191](https://world.optimizely.com/support/bug-list/bug/CMS-56191) – Fixed the issue where a language branch that could not load stopped Optimizely Graph full synchronization with a `NullReferenceException`. This affected content providers without version support. Synchronization now leaves that language branch out of Optimizely Graph and continues.
- [CMS-56360](https://world.optimizely.com/support/bug-list/bug/CMS-56360) – Fixed the issue where creating a block in a content area inside a block property listed all block types instead of only the allowed types. This affected allowed types set in code and in the UI.
- [CMS-56419](https://world.optimizely.com/support/bug-list/bug/CMS-56419) – Fixed the issue where creating a block in a content area of an inline block offered the wrong block type. This happened when another block type had a content area property with the same name.
- [CMS-56435](https://world.optimizely.com/support/bug-list/bug/CMS-56435) – Fixed the issue where a long image name in an image property hid the action menu, a regression introduced in CMS 13.1.3. Editors could not remove or replace the image. The image property now truncates long names so the action menu stays visible.
- [CMS-56447](https://world.optimizely.com/support/bug-list/bug/CMS-56447) – Fixed the issue where creating a block from a content area closed the dialog without displaying custom validation errors. The dialog now displays the validation message and stays open until the content is valid.
- [CMS-56477](https://world.optimizely.com/support/bug-list/bug/CMS-56477) – Fixed the issue where Application Insights Profiler did not collect traces for CMS 13 sites that use `EPiServer.CloudPlatform.Cms`. You no longer need to reference `Microsoft.ApplicationInsights.Profiler.AspNetCore` directly as a workaround.
- [CMS-56545](https://world.optimizely.com/support/bug-list/bug/CMS-56545) – Fixed the issue where Optimizely Graph indexed content that the **SearchIndexer** group could not read. Removing read access for the **SearchIndexer** group now removes that content from Optimizely Graph. If you upgraded from CMS 12, grant the **SearchIndexer** group read access to content that does not inherit access rights from its parent. Read access for **Everyone** is not enough. Otherwise, Optimizely Graph removes that content and any descendants that inherit its access rights.

### September 21—13.2.0

**Enhancements**

- **Mark chat included in the CMS package** – Mark chat now ships inside the `EPiServer.CMS` package and registers when you call `services.AddCms()`. You no longer install the `Optimizely.Cms.OpalChat` NuGet package or call `AddOpalChat()`. Editors get AI assistance with no package reference and no `Startup.cs` change. Existing sites can drop the package reference when they upgrade. Sites on Optimizely Digital Experience Platform (DXP) need no configuration. Elsewhere, set `Optimizely:OpalChat:InstanceId`. If no instance ID resolves, the site starts normally and Mark chat does not render. Implement the public `IOpalInstanceChecker` interface to supply your own availability check.

**Bug fixes**

- [CMS-54969](https://world.optimizely.com/support/bug-list/bug/CMS-54969) – Fixed the issue where the Opti ID global header and its dropdown menus did not load. This happened when the host application set a global JSON naming policy.
- [CMS-55065](https://world.optimizely.com/support/bug-list/bug/CMS-55065) – Fixed the issue where the `ReloadOnChange` attribute did not refresh the Visual Builder view. Visual Builder now reloads the form when a property change alters which properties are visible.
- [CMS-55239](https://world.optimizely.com/support/bug-list/bug/CMS-55239) – Fixed the issue where copying and pasting content could fail with the error `There is already an open DataReader associated with this Connection which must be closed first.`
- [CMS-55319](https://world.optimizely.com/support/bug-list/bug/CMS-55319) – Fixed the issue where typed block list properties (`IList<TBlock>`) could not be created or updated through the CMS REST API. The `/v1/content` endpoint returned a `400 InvalidModel` response.
- [CMS-55349](https://world.optimizely.com/support/bug-list/bug/CMS-55349) – Fixed the issue where **View on website** was disabled for pages created outside an application. The default application can route these pages, so the action is now enabled.
- [CMS-55382](https://world.optimizely.com/support/bug-list/bug/CMS-55382) – Fixed the issue where CMS 13 did not support `Microsoft.Data.SqlClient` 7.x. CMS now requires version 7.0.2 or later. Managed-identity authentication moved out of the core package into `Microsoft.Data.SqlClient.Extensions.Azure`. `EPiServer.CloudPlatform.Cms` now references that package for managed-identity database connections on DXP. The upgrade also raises the minimum versions of the Azure SDK, Microsoft.Extensions, ASP.NET Core, and Entity Framework Core packages. Sites that pin older versions must update as well.
- [CMS-55417](https://world.optimizely.com/support/bug-list/bug/CMS-55417) – Fixed the performance regression where the `netContentChildrenReferences` query was slower than expected for parents with few children.
- [CMS-55649](https://world.optimizely.com/support/bug-list/bug/CMS-55649) – Fixed the issue where `AddVisitorGroupsMvc` did not appear in IntelliSense, even though the upgrade documentation tells you to call it.
- [CMS-56021](https://world.optimizely.com/support/bug-list/bug/CMS-56021) – Fixed the issue where you could create only one **Default** hostname per locale for an application. You can now create multiple **Default** hostnames that use the same locale, as in CMS 12 and earlier.

### September 9—13.1.3

**Enhancements**

- **Open the Search Management portal from within CMS 13** – A **Graph Portal** item in the CMS 13 navigation bar frames the Search Management portal in the interface, so you can monitor search performance, curate pinned results, and configure synonyms for Optimizely Graph without switching to a separate application. The item displays only for users who have access to the portal.
- **Facet configuration on Graph C# SDK results and boolean facet filtering** – `FacetResult<T>.Items` returns a `FacetFieldResult` for each field. Each result carries the field name and values alongside the `HasFilter`, `Selected`, `Filters`, and `Limit` configuration the query requested, so you can tell filter facets from plain terms facets without hard-coding field names. Boolean facets now filter through the same `filters` argument as every other facet type, which fixes queries that Optimizely Graph rejected. Use the new `FacetSelected` extension, which takes a nullable `bool`, to filter a boolean facet to either value. The `Facet` overloads that take a non-nullable `bool selected` are obsolete and keep their current behavior.

**Bug fixes**

- [CMS-52788](https://world.optimizely.com/support/bug-list/bug/CMS-52788) – Fixed an issue where custom properties defined on a page type displayed the internal property name instead of the translated display name in the Visual Builder overlay.
- [CMS-53287](https://world.optimizely.com/support/bug-list/bug/CMS-53287) – Fixed an issue where CMS assets referenced in a content reference field could not be queried through the `item` subfield in Optimizely Graph. Queries can now return DAM assets and CMS assets together.
- [CMS-53600](https://world.optimizely.com/support/bug-list/bug/CMS-53600) – Fixed an issue where the Swedish confirmation message shown after saving user display options stated that the options had not been saved.
- [CMS-53726](https://world.optimizely.com/support/bug-list/bug/CMS-53726) – Fixed an issue where the Optimizely Graph indexing job logged missing dependency and missing content type warnings for content area items that had no content reference. These non-actionable warnings made genuine warnings harder to spot.
- [CMS-54082](https://world.optimizely.com/support/bug-list/bug/CMS-54082) – Fixed a performance issue where the project overview loaded every project item to decide whether to enable **Publish project**. The overview now requests counts of checked-in and delayed-publish items instead, which keeps the project UI responsive for projects with many items.
- [CMS-54103](https://world.optimizely.com/support/bug-list/bug/CMS-54103) – Fixed an issue where copying a shared block that referenced other blocks in an application-specific assets folder duplicated the referenced blocks. Copied content now keeps the original references.
- [CMS-54453](https://world.optimizely.com/support/bug-list/bug/CMS-54453) – Fixed an issue where the project overview counted items that could not be published. Items moved to trash, and items the current user has no publish rights on, were included in the toolbar count, which left **Publish** and scheduling enabled when nothing could be published. The checked-in count now applies the same filter that publishing uses, for projects with 100 or fewer checked-in items.
- [CMS-54720](https://world.optimizely.com/support/bug-list/bug/CMS-54720) – Fixed an issue where upgrading from CMS 12 to CMS 13 created a duplicate assets root folder when the existing site assets folder used a URL segment other than `SysSiteAssets`, which hid existing shared blocks from the **Assets** pane. The upgrade now reuses the existing folder and corrects its URL segment.
- [CMS-54771](https://world.optimizely.com/support/bug-list/bug/CMS-54771) – Fixed an issue where the `17.0.0.sql` upgrade script ran all `tblBigTable` column changes in a single batch, which risked a SQL timeout on large tables. The script now separates each change into its own batch.
- [CMS-54881](https://world.optimizely.com/support/bug-list/bug/CMS-54881) – Fixed an issue where the block type selection dialog in a content area listed all block types instead of only the types allowed by the `[AllowedTypes]` attribute declared in code. When only one type is allowed, the dialog is skipped and that type is selected.
- [CMS-55057](https://world.optimizely.com/support/bug-list/bug/CMS-55057) – Fixed an issue where Optimizely Graph full sync stopped when a content item could not be loaded while resolving language settings. Unresolvable content is now skipped, and the job continues.
- [CMS-55218](https://world.optimizely.com/support/bug-list/bug/CMS-55218) – Fixed an issue where items added to a `PropertyList<T>` collection editor did not persist when the model type contained an `XhtmlString` property.
- [CMS-55237](https://world.optimizely.com/support/bug-list/bug/CMS-55237) – Fixed an issue where publishing a content item did not refresh every page that referenced it through a shared block. When several items referenced the same content, pages reached through a shared block could keep returning stale field values in Optimizely Graph until the block or page was republished. Pages using inline blocks updated correctly. Each referencing branch now gets its own re-indexing depth budget, so shared blocks reflect the latest published values.
- [CMS-55296](https://world.optimizely.com/support/bug-list/bug/CMS-55296) – Fixed an issue where published content could intermittently be indexed into Optimizely Graph with `_metadata.version` set to `0`, then return to the correct version later without being edited. Because preview mode and other integrations key on `_metadata.version`, this could break preview for the affected content.
- [CMS-55298](https://world.optimizely.com/support/bug-list/bug/CMS-55298) – Fixed an issue where deeply nested rich text (`XhtmlString`) failed to serialize when indexing to Optimizely Graph. The affected content was dropped silently, Graph kept serving the previously indexed version, and the sync reported a misleading `Status 500` object-cycle error. Rich text nested past the configured maximum depth is now indexed as HTML only, with the structured JSON projection dropped and a warning logged, and serialization failures report the real error.

### August 21—13.1.2

**Bug fix**

- [CMS-54652](https://world.optimizely.com/support/bug-list/bug/CMS-54652) – Fixed an issue where Visual Builder experiences on multilingual sites displayed content in the wrong language. The composition cache key omitted the language, so the first language version rendered was reused for all languages. The cache key now includes the language and content variation.

### July 30—13.1.1

**Enhancements**

- **Added type-safe configuration for Graph field mappings** – Configure how the Graph C# SDK maps content type properties to Optimizely Graph field names directly in startup code, with IntelliSense and compile-time checking of property names. Before this release, field mappings could be defined only in `appsettings.json`. Pass a configuration action to `AddGraphContentClient`, call `ConfigureType<T>()`, then chain `ConfigureField()` and `ObjectGraphName()`.
- **Added Graph C# SDK support for computed fields** – Query, filter, sort, facet, and autocomplete computed fields defined through the Conventions API using the strongly typed Graph C# SDK. Call the computed field method in a query expression, such as `Where(x => x.TotalPrice() > 100)`, and the SDK maps it to the indexed Graph field automatically.
- **Extended computed fields to content contract types** – Define computed fields on content contract (interface) types so that every concrete type fulfilling the contract inherits the field, instead of duplicating it on each type. The field is indexed for all implementing types and is queryable through the contract type in the Graph C# SDK.
- **Enabled smooth rebuild for CMS 13** – Rebuild your Optimizely Graph index without downtime through a Blue-Green deployment approach that populates and verifies a new slot before it goes live. Index provisioning now runs as a background scheduled job, so it continues even if the request is canceled.

**Bug fixes**

- [CMS-50095](https://world.optimizely.com/support/bug-list/bug/CMS-50095) – Fixed the issue where the Graph C# SDK did not support synonym expansion with the `Equals` filter operator. The SDK now supports synonyms through `SynonymSlot` arguments on `Equals`.
- [CMS-53921](https://world.optimizely.com/support/bug-list/bug/CMS-53921) – Fixed the issue where the `ContainsAny` filter in the Graph C# SDK did not support `IList<T>` properties, which caused a compile error. `ContainsAny` now works with `IList<T>` properties in lambda queries and the filter builder.
- [CMS-54163](https://world.optimizely.com/support/bug-list/bug/CMS-54163) – Fixed the issue where Optimizely Graph stream sync could send a batch larger than the 29 MB request limit when the final item pushed the accumulated batch past the limit, which caused the indexing job to fail with a `400` error. The batch now flushes before it exceeds the limit.
- [CMS-53681](https://world.optimizely.com/support/bug-list/bug/CMS-53681) – Fixed the issue where the Graph C# SDK could not filter string-array metadata fields, such as `_metadata.types`, with the `in` operator. The SDK now supports list `in` filters through the `ContainsAny` method in lambda queries and the filter builder.
- [CMS-44857](https://world.optimizely.com/support/bug-list/bug/CMS-44857) – Fixed the issue where the **Synchronize with Optimizely Graph** icon showed draft and variation content versions as not synced, even after they synced successfully to Optimizely Graph.
- [CMS-45596](https://world.optimizely.com/support/bug-list/bug/CMS-45596) – Fixed the issue where the trailing slash was omitted from a page URL when the name in URL contained a dot, because the URL was incorrectly treated as a static file. URL generation now checks whether the content is media instead of relying on the file extension.
- [CMS-50911](https://world.optimizely.com/support/bug-list/bug/CMS-50911) – Fixed the issue where a 500 error occurred when editing custom tabs named Content or Settings after upgrading a site from CMS 12 to CMS 13.
- [CMS-51275](https://world.optimizely.com/support/bug-list/bug/CMS-51275) – Fixed the issue where a validation error message disappeared after a user opened and canceled the inline block editor, even though the error was unresolved. Validation errors now persist unless the content actually changes.
- [CMS-51887](https://world.optimizely.com/support/bug-list/bug/CMS-51887) – Fixed the issue where the **View on website** option displayed for a page in the Draft version immediately after page creation, before the page was published. The option is now hidden until the page is published.
- [CMS-51935](https://world.optimizely.com/support/bug-list/bug/CMS-51935) – Fixed the issue where `ContentTree` API calls returned an HTTP `400` error in custom Admin plugins because the antiforgery token was read before the DOM was ready and never updated. The token is now read at call time.
- [CMS-52206](https://world.optimizely.com/support/bug-list/bug/CMS-52206) – Fixed the issue where the Create Page dialog did not display content type group names when multiple page types shared the same display name. Group names now display when more than one group exists, consistent with CMS 12.
- [CMS-52210](https://world.optimizely.com/support/bug-list/bug/CMS-52210) – Fixed the issue where `Facet` with `QueryContent` on certain date or integer metadata properties, such as `Created` and `SortIndex`, threw an exception even though the same query worked with `Query<T>`.
- [CMS-52531](https://world.optimizely.com/support/bug-list/bug/CMS-52531) – Fixed the issue where startup failed with a `ValidationException` when a content type that previously inherited a contract was removed from code. Contract validation now skips content types that no longer have a matching class.
- [CMS-52563](https://world.optimizely.com/support/bug-list/bug/CMS-52563) – Fixed the issue where the TinyMCE editor width shrank to fit the toolbar buttons when an `XhtmlString` property with a custom toolbar was used inside an `IList`. The editor now expands to the full width of the container.
- [CMS-52884](https://world.optimizely.com/support/bug-list/bug/CMS-52884) – Fixed the issue where republishing content without a version status transition could unintentionally remove the content from Optimizely Graph after a delta sync.
- [CMS-53047](https://world.optimizely.com/support/bug-list/bug/CMS-53047) – Fixed the issue where a call to `GET /_cms/v1/content/versions` returned a 500 error on a CMS 13 site because of a mismatched contracts package version.
- [CMS-53094](https://world.optimizely.com/support/bug-list/bug/CMS-53094) – Fixed the issue where the CMS REST API accepted numbers written as strings, which did not match the OpenAPI specification. Number handling now uses strict parsing through `JsonNumberHandling.Strict`.
- [CMS-53159](https://world.optimizely.com/support/bug-list/bug/CMS-53159) – Fixed the issue where the content type comparison could incorrectly determine that a content type needed updating, which caused unnecessary database updates each time the application started.
- [CMS-53273](https://world.optimizely.com/support/bug-list/bug/CMS-53273) – Fixed the issue where a Razor Page named `Index.cshtml` that inherited from `RazorPageModel<StartPage>` threw an exception when loading the start page.
- [CMS-53459](https://world.optimizely.com/support/bug-list/bug/CMS-53459) – Fixed the issue where the CMS 11 or CMS 12 to CMS 13 migration failed when `tblSiteDefinition.Saved` was `NULL`, because the value was inserted into the non-nullable `Created` column in `tblApplication`.
- [CMS-53464](https://world.optimizely.com/support/bug-list/bug/CMS-53464) – Fixed the issue where machine translation timed out after 10 seconds with no configuration option, which caused failures on pages with 150 or more translatable fields. The request timeout is now configurable through the `RequestTimeout` setting in `MachineTranslationOptions`.
- [CMS-53471](https://world.optimizely.com/support/bug-list/bug/CMS-53471) – Fixed the issue where Optimizely Graph returned a corrupted URL for a `LinkItem` when the remaining URL contained both `#` and `/`, returning an `EXTERNAL` URL type with an unresolved internal path instead of a `HIERARCHICAL` URL.
- [CMS-53703](https://world.optimizely.com/support/bug-list/bug/CMS-53703) – Fixed the issue where the content reference schema in Optimizely Graph used an incorrect type for the `item` and `ref` fields, which prevented GraphQL fragment casting. These fields now use the abstract `IData` type so consumers can resolve referenced content with inline fragments.

### June 1—13.1.0

**Enhancements**

- **Expanded property type mappings for external content** – [Property type mappings for external content sources are now more flexible](docId\:hJiySmVMLFd6ahdtwWta7) when you use external content without modifying existing content types. Text properties (`ShortString`, `LongString`) can now map to `LongString`, `XHTMLString`, `LinkItem`, and `URL`. Number properties (`Integer`, `Decimal`) can map to `Decimal`, `ShortString`, `LongString`, and `XHTMLString`. Content reference properties (`ContentReference`, `ContentReference<T>`) can map to `LinkItem`, `URL`, and `ContentReference`. These rules also apply to list types.
- **Applications endpoints in CMS REST API now generally available** – The experimental designation has been removed from the [Applications endpoints](docId\:TeXA93caiU-8yVd-eb-NA) in the CMS REST API.
- **Added external URL indexing for DAM assets in LinkItem properties** – When [DAM assets are referenced in \`LinkItem\` properties](docId:8sNTSprunXEsHeqbYcMzk) with the `_AssetItem` configuration, Optimizely Graph now indexes the external URL from `_AssetItem.url`. The `url.default` and `url.hierarchical` fields are now populated with the external DAM asset URL instead of the internal CMS URL. This behavior applies only to sites using the new `_AssetItem` DAM configuration. Existing sites with legacy DAM configuration are not affected.
- **Added VisibleInMenu to the Optimizely Graph schema** – The [\`VisibleInMenu\` property](docId:8sNTSprunXEsHeqbYcMzk) (displayed as **Display in Navigation&#x20;**&#x69;n the CMS edit UI) is now indexed in the Optimizely Graph schema and queryable for all page types. To hide it globally, set `CmsFeatureOptions.SectionsVisibility.VisibleInMenuProperty` in your startup configuration.
- **Released Graph Conventions API for CMS 13** – Use the [Conventions API](docId\:oCt_aukEgQzz4ZODGSsc1) to customize [how content is indexed in Optimizely Graph](docId\:nXwTyhMMzOa_EuQRBG3sZ) for CMS 13. Exclude content types from indexing or add computed fields to the Graph schema. Configure it using the `conventionsBuilder` parameter on `AddContentGraph()`.

**Bug fixes**

- [CMS-38305](https://world.optimizely.com/support/bug-list/bug/CMS-38305) – Fixed an issue where the preview token was not refreshed when switching between On-Page Editing, Visual Builder, and Preview modes, which caused "Not authorized" errors when the token expired.
- [CMS-50924](https://world.optimizely.com/support/bug-list/bug/CMS-50924) – Fixed an issue where a URL hash fragment entered in the **Remaining URL** field of a `LinkItem` was excluded from the URL indexed in Optimizely Graph.
- [CMS-51017](https://world.optimizely.com/support/bug-list/bug/CMS-51017) – Fixed an issue in the Graph C# SDK where GraphQL queries generated using `OrderBy()` on metadata properties such as `StartPublish`, `Status`, `Variation`, and `Language` were invalid and threw an exception when executed. The generated queries now correctly nest the sort field under `_metadata`.
- [CMS-51656](https://world.optimizely.com/support/bug-list/bug/CMS-51656) – Fixed an issue in multisite setups where block content stored in per-application asset folders had null values for `_metadata.url.base` and `_metadata.url.default` in Optimizely Graph queries, making it impossible to filter blocks by site.
- [CMS-51671](https://world.optimizely.com/support/bug-list/bug/CMS-51671) – Fixed an issue where synonym expansion was not available when using full-text search in the Graph C# SDK. The SDK now supports synonyms through the `BuildFilter<T>()` API with a `SynonymSlot`.
- [CMS-51700](https://world.optimizely.com/support/bug-list/bug/CMS-51700) – Fixed a performance issue in the Graph sync event handler where a redundant synchronous content comparison check caused UI slowdowns during content publish.
- [CMS-51711](https://world.optimizely.com/support/bug-list/bug/CMS-51711) – Fixed an issue where calling `Facet(x => x.Name)` in a Graph C# SDK query threw an `InvalidFacetFieldException` even though the `Name` property supports faceting in Optimizely Graph.
- [CMS-51811](https://world.optimizely.com/support/bug-list/bug/CMS-51811) – Fixed an issue in CMS 13 where a site could not start when the database was configured in ReadOnly mode using the `DatabaseMode` setting in `appsettings.json`.
- [CMS-51841](https://world.optimizely.com/support/bug-list/bug/CMS-51841) – Fixed an issue where custom localization providers were not applied to property captions and help text on content types. Property labels and help text are now resolved from the highest-priority registered localization provider.
- [CMS-51845](https://world.optimizely.com/support/bug-list/bug/CMS-51845) – Fixed an issue in the Graph C# SDK autocomplete validator where `ContentReference`, `LinkItem`, and `LinkItemCollection` properties incorrectly threw an exception even though these types support autocomplete in the Optimizely Graph schema. Also fixed an issue where string properties without `[IndexingType(IndexingType.Queryable)]` were silently accepted but failed at the Graph gateway.
- [CMS-52263](https://world.optimizely.com/support/bug-list/bug/CMS-52263) – Fixed an issue where upgrading from CMS 12 to CMS 13 could fail when the database contained content type names with characters that CMS 13 considers invalid, such as non-ASCII characters, hyphens, or dots. The upgrade process now includes a migration step to sanitize these names. Content type name validation has also been updated to work correctly regardless of SQL database collation.

### April 22—13.0.2

**Bug fixes**

- [CMS-49168](https://world.optimizely.com/support/bug-list/bug/CMS-49168) – Fixed the issue where content type conversion did not update the soft link table, which caused a database constraint error and prevented the site from starting after a converted content type was removed.
- [CMS-50885](https://world.optimizely.com/support/bug-list/bug/CMS-50885) – Fixed the issue where querying Optimizely Graph for a page with a block list property bound to an external content source returned null instead of the expected external content values.
- [CMS-50994](https://world.optimizely.com/support/bug-list/bug/CMS-50994) – Fixed the validation error that occurred during startup when an automatically created app name contained invalid characters, such as dashes.
- [CMS-51112](https://world.optimizely.com/support/bug-list/bug/CMS-51112) – Fixed the issue where a custom dijit property editor that did not implement the `onChange` method failed to render in the Visual Builder.
- [CMS-51171](https://world.optimizely.com/support/bug-list/bug/CMS-51171) – Fixed the site startup failure that occurred when an add-on or project containing custom property definition types was uninstalled and then reinstalled.
- [CMS-51200](https://world.optimizely.com/support/bug-list/bug/CMS-51200) – Fixed the issue where the **View on website** link appeared in the **Options** menu for root and block content items, where it is not applicable.
- [CMS-51273](https://world.optimizely.com/support/bug-list/bug/CMS-51273) – Fixed the issue where a language-shared list property did not display its value in translated language versions after the `[CultureSpecific]` attribute was removed from the property definition.
- [CMS-51481](https://world.optimizely.com/support/bug-list/bug/CMS-51481) – Fixed the site definition migration failure that occurred when a site definition name did not conform to the required naming format. The migration now uses the site's `UniqueId` instead of its display name.

### April 9—13.0.1

**Bug fixes**

- [CMS-49431](https://world.optimizely.com/support/bug-list/bug/CMS-49431) and [CMS-50893](https://world.optimizely.com/support/bug-list/bug/CMS-50893) – Fixed the issue where property values in deeply nested inline blocks were not persisted when the nesting was three or more levels deep.
- [CMS-50556](https://world.optimizely.com/support/bug-list/bug/CMS-50556) – Fixed the missing context menu icon for `IList<Block>` items in **All Properties** mode.
- [CMS-50716](https://world.optimizely.com/support/bug-list/bug/CMS-50716) – Fixed the syntax error that occurred when using `Contains`, `StartsWith`, or `EndsWith` in `FilterBuilder` due to a naming conflict with LINQ. These methods are renamed to `FilterContains`, `FilterStartsWith`, and `FilterEndsWith`.
- [CMS-50752](https://world.optimizely.com/support/bug-list/bug/CMS-50752) – Fixed the issue where URL fragment anchors (for example, `#section`) were stripped from shortcut target links in rich-text and link fields.
- [CMS-50870](https://world.optimizely.com/support/bug-list/bug/CMS-50870) – Fixed the 500 error that occurred when deleting a content source that was actively used in a content binding. The API now returns a 400 status code with a descriptive error message.
- [CMS-51034](https://world.optimizely.com/support/bug-list/bug/CMS-51034) – Changed the default behavior of the **Create a new block** option in content area properties to create inline blocks instead of shared blocks. Inline blocks are stored directly on the page, which reduces shared block sprawl in the Assets pane and makes content easier to manage.

## Optimizely Forms—`EPiServer.Forms`

### September 29—6.0.2

**Bug fixes**

- [CMS-53309](https://world.optimizely.com/support/bug-list/bug/CMS-53309) – Fixed the issue where form elements personalized with an audience displayed to visitors who did not match that audience. Audience rules now apply when a form renders on a published page. All elements still display in edit and admin views.
- [CMS-56207](https://world.optimizely.com/support/bug-list/bug/CMS-56207) – Fixed the issue where Forms rewrote its property definitions at each site start, even when nothing had changed. On sites with multiple instances, simultaneous restarts caused database contention that could exceed the query timeout and prevent startup. Forms now writes a property definition only when it changes, and logs a setup failure instead of stopping the site.

### September 18—Optimizely.Cms.Forms 2.0.0

**Enhancement**

- Upgraded the Headless Forms REST API (`Optimizely.Cms.Forms.Service`) package to support CMS 13. This update ensures full compatibility with CMS 13 and OpenID Connect (OIDC) authentication across all data flows, while maintaining backward compatibility with the existing Headless Forms JS SDK and data models. This upgrade does not require changes to form rendering.

### June 23—6.0.1

**Bug fix**

- [CMS-52251](https://world.optimizely.com/support/bug-list/bug/CMS-52251) – Fixed the issue where the `VisitorDataHiddenElementBlock.GetAttributes` method blocked synchronously on asynchronous visitor data retrieval. Under load, this could exhaust thread-pool threads, increase request latency, and risk deadlocks. Visitor data is now retrieved asynchronously.

### April 9—6.0.0

**Enhancement**

- Made `EPiServer.Forms` [version 6.0.0](https://nuget.optimizely.com/packages/episerver.forms/6.0.0) compatible with CMS 13. See [Optimizely Forms for CMS 13](docId\:OpAkYGUoWvAvv5L969GqE).

**Bug fix**

- [CMS-50238](https://world.optimizely.com/support/bug-list/bug/CMS-50238) – Fixed an issue where an exception was thrown during the import and export flow for newly created content due to security settings not being properly initialized. This fix ensures security is correctly set when content is saved during this process, and prevents unexpected errors when importing or exporting content that includes form field dependencies.

## Optimizely Graph

### August 6

**Enhancement**

- **Zero-downtime CMS 13 upgrade for Optimizely Graph** – Added support for [upgrading from CMS 12 to CMS 13 with Optimizely Graph](docId:5IIpWhRi9sd4hvXlqyaHY) without Graph downtime. CMS 13 introduces a breaking Optimizely Graph schema change, so a CMS 12 site and a CMS 13 site cannot share one Graph instance. In DXP Management Portal, the **Prepare for CMS 13** option provisions a separate Graph instance for the upgrade.
  - Eliminated the need to migrate to a separate CMS 13 project. You upgrade your existing project in place instead of moving to a whole new one, which avoids a time-consuming project migration.
  - Kept your live CMS 12 site on its existing Graph instance while the CMS 13 deployment slot validates against the new instance, so production is unaffected during the upgrade.
  - Removed the Graph schema migration from the maintenance window on this path, because the new instance already carries the CMS 13 schema. A maintenance page may still be needed for other breaking changes in the release.
  - Retired the old CMS 12 Graph instance automatically after the upgrade completes, rotating its keys after a grace period and deleting the instance after a further grace period.

## Optimizely CMS JavaScript SDK

### July 23

[@optimizely/cms-create-app ](https://www.npmjs.com/package/@optimizely/cms-create-app)– **New Stride sample site**

- **Reference implementation for headless CMS** – Stride is a complete Next.js sample application that demonstrates Optimizely CMS composition (experiences) built with the JavaScript SDK, so you have a working blueprint for structuring a headless build. It includes pre-built components, Tailwind CSS styling, and full TypeScript support, and works with any CMS instance that has Optimizely Graph, whether local or SaaS. Explore the [live demo](https://nextjs-sample-js-sdk.vercel.app/) or browse the [source](https://github.com/episerver/content-js-sdk/tree/main/templates/stride).
- **Get started with one command** – Scaffold a fully working Next.js application in minutes. The generated project includes `config:push` scripts to sync content-type configuration into your CMS, so you can go from an empty project to a running headless site with minimal setup.

[@optimizely/cms-sdk@2.2.0 ](https://github.com/episerver/content-js-sdk/releases/tag/%40optimizely%2Fcms-sdk%402.2.0)– **Stronger typing and more reliable tooling in the JavaScript SDK**

- The `contentType` function now has improved TypeScript typing, so content modeling in code is more type-safe. This release also corrects the `editor` type on `displaySettings` and adds a `selectOne` option.
- A new `toSchema` method parses data fetched with other GraphQL libraries (Apollo, urql, or plain `fetch`), so you can adopt the types in the SDK without changing your data-fetching stack.
- GraphQL query and fragment generation now handles the `graph` and `globalcontracts` namespaces correctly, which prevents naming collisions in generated output.
- The build configuration now supports language and locale settings across the SDK and CLI, which makes multilingual development easier.

[@optimizely/cms-cli@2.2.0 ](https://github.com/episerver/content-js-sdk/releases/tag/%40optimizely%2Fcms-cli%402.2.0)– **Bug fix**

- Fixed an issue where the CLI created duplicate entry-point content, and improved update detection when syncing application manifests, so manifest sync is more reliable with fewer manual fixes.

### July 7

[@optimizely/cms-sdk@2.1.0](https://github.com/episerver/content-js-sdk/releases/tag/%40optimizely%2Fcms-sdk%402.1.0)

- Queries now return all base type properties, so you can access more content data without extra configuration.
- Locale support now extends to `ContentType` and `RICHTEXT_PRESET`, which makes multilingual experiences easier to build.
- `OptimizelyComposition` now handles section fragments automatically, so you write less boilerplate when working with compositions.
- Content type contracts now support allowed and restricted types, fragment generation, and a component fallback. A single `expandContracts` boolean controls contract expansion, replacing the more complex `maxContractExpansionLimit`.

[@optimizely/cms-cli@2.1.0](https://github.com/episerver/content-js-sdk/releases/tag/%40optimizely%2Fcms-cli%402.1.0)

- Code generation now supports circular and self-referenced content types, so you can model more complex content relationships.
- The `pull` command now preserves editor settings on RichText properties, keeping richer authoring configuration in your codebase.
- The CLI now supports self-signed certificates, so you can run it against local or internal CMS environments more easily.
- The `pull` command now shows clearer progress messaging, giving you better visibility into what it is doing as it runs.

### May 4

**Added JavaScript SDK support to CMS 13** – The [Optimizely JavaScript SDK](https://github.com/episerver/content-js-sdk/releases/tag/%40optimizely%2Fcms-cli%402.0.0) provides developers with a modern, React-ready solution for modeling, fetching, and rendering CMS content, reducing manual tasks, accelerating development, and simplifying the creation and maintenance of content-driven experiences.

- **Structured content modeling** – Define content types, property groups, and display templates for clean, predictable content.
- **Simple content fetching** – Fetch, filter, and sort CMS content with built-in utilities and webhook support.
- **Modern rendering** – Render pages, experiences, and rich text with live preview and DAM asset support.
- **Developer-friendly tooling** – Full TypeScript support with autocomplete, error handling, and detailed logs.
- **Faster workflows** – CLI tools sync content and content types directly from the CMS.

## Optimizely Language Manager—`EPiServer.Labs.LanguageManager`

### June 16—6.0.0

**Enhancement**

- Added a configurable `RecursiveDepth` setting that caps how many content hierarchy levels [Language Manager](docId:_h8q9yi4B0Yoqw5ohApXO) includes when translating or copying content. In earlier versions, recursive translation was all-or-nothing, so translating one item cascaded through every linked `ContentArea`, `ContentReference`, `XhtmlString`, and `LinkItem` indefinitely. On sites with thousands of interconnected items, it silently overwrote manually curated translations and took days to revert. Now, you can set the `RecursiveDepth` setting to one of the following values (default is `1`):
  - `1` – Translates or copies only the selected content. This is the default.
  - `2` – Translates or copies the selected content and its directly linked content.
  - `3` – Translates or copies the selected content, its directly linked content, and the next level of linked content. This is the maximum.

## Optimizely MA connectors

### September 9

**Enhancements**

- **Added CMS 13 support for Marketo and Microsoft Dynamics CRM MA connectors** – The Marketo and Microsoft Dynamics CRM MA connectors now support CMS 13, completing the `EPiServer.ConnectForMarketingAutomation` 13.0.0 release. Both connectors require CMS 13.0.2 or later and .NET 10, and the Optimizely Forms integration requires Optimizely Forms 6.0.1 or later.
  - Released both connectors at version 13.0.0, built from the same code as the rest of `EPiServer.ConnectForMarketingAutomation` 13.0.0. Neither connector has functional changes of its own.
  - Clear your NuGet cache if you browsed the feed before September 9, 2026 and did not see these packages.
  - Review the CMS 13 changes that apply to all `EPiServer.ConnectForMarketingAutomation` packages before upgrading, including the `/Optimizely/` module path for connector administration pages and the removal of the `Newtonsoft.Json` dependency.

**Packages in this release**

- `EPiServer.MarketingAutomationIntegration.Marketo 13.0.0`
- `EPiServer.MarketingAutomationIntegration.MSDynamics 13.0.0`

### August 18

**Enhancements**

- **Added CMS 13 support for MA connectors** – `EPiServer.ConnectForMarketingAutomation` 13.0.0 supports CMS 13, so now you can keep your MA connectors when you upgrade from CMS 12. It requires CMS 13.0.2 or later and .NET 10, and the Optimizely Forms integration requires Optimizely Forms 6.0.1 or later.
  - Released CMS 13 versions of the Delivra, Eloqua, HubSpot, Pardot, Salesforce, and Salesforce Marketing Cloud connectors. Connect for Acoustic does not support CMS 13.
  - Aligned every `EPiServer.ConnectForMarketingAutomation` package to version 13.0.0, matching the CMS major version. Package versions previously advanced independently, so update the version pins and ranges in your project files.
  - Replaced `Newtonsoft.Json` with `System.Text.Json` and removed the `Newtonsoft.Json` dependency from the packages. Custom connectors and extensions that use it must reference it directly or migrate to `System.Text.Json`.
  - Moved the connector administration page to `/Optimizely/Episerver.Marketing.Connector/default/Connectors`, following the CMS 13 module path change. Update bookmarks and hardcoded links that use the `/EPiServer/` prefix.
  - Changed the Eloqua request payloads so that the `Uri` and `Type` members are no longer written and the `isSubscribed` and `isBounceBack` fields are written as JSON booleans.
  - Rebranded the package metadata from EPiServer to Optimizely. Package IDs are unchanged.
  - Updated the connectors for the CMS 13 and Optimizely Forms 6 API changes. If you maintain a custom connector, update it for `DynamicDataStoreFactory.Instance`, `IExternalFieldMappingService`, constructor injection of `UIPathResolver`, explicit validator registration, and ECMAScript module (ESM) audience criteria editors.

**Packages in this release**

- `EPiServer.ConnectForMarketingAutomation 13.0.0`
- `EPiServer.Marketing.Automation.Forms 13.0.0`
- `EPiServer.Marketing.Connector.Delivra 13.0.0`
- `EPiServer.MarketingAutomationIntegration.Eloqua 13.0.0`
- `EPiServer.MarketingAutomationIntegration.ExactTarget 13.0.0`
- `EPiServer.MarketingAutomationIntegration.HubSpot 13.0.0`
- `EPiServer.MarketingAutomationIntegration.Pardot 13.0.0`
- `EPiServer.MarketingAutomationIntegration.Salesforce 13.0.0`

**Bug fixes**

- [CMS-54699](https://world.optimizely.com/support/bug-list/bug/CMS-54699) – Fixed the issue where **Publish** stayed enabled after you published a form, which let you publish the same form repeatedly and created a draft version even though the form had not changed.
- [CMS-54722](https://world.optimizely.com/support/bug-list/bug/CMS-54722) – Fixed the issue where the data source and field lists did not load when you added Marketing Automation **Profile** criteria to an audience. Both fields displayed as text fields instead of drop-down lists, which made the criteria impossible to configure. The criteria editor is now an ECMAScript module (ESM), which CMS 13.0.1 and later require for custom audience criteria.
- [CMS-54793](https://world.optimizely.com/support/bug-list/bug/CMS-54793) – Fixed the issue where a form published without validation when the **MA System Database** mapping was selected but no data source was chosen, or when an ExtraFieldMappings row was enabled without a target field. Publishing now fails with a validation message until you select a value or clear the mapping.
- [CMS-54796](https://world.optimizely.com/support/bug-list/bug/CMS-54796) – Fixed the issue where the data source list in the **Mappings** and ExtraFieldMappings tabs of a form displayed on the same line as its radio button or checkbox and label instead of on its own line.

## DXP

### September 28

**Enhancement**

**Cloudflare AI crawler controls** – Added support for [Cloudflare AI crawler controls](https://blog.cloudflare.com/accountable-mixed-use-ai-crawlers/) on sites hosted on Optimizely DXP. Cloudflare sorts crawler activity into Search, Training, and Agent, replacing the single **Block AI Bots** setting. You choose how each type of crawler interacts with your site. **Disallow AI Training** keeps your site discoverable in search while opting your content out of AI training. Optimizely manages the Cloudflare zone for DXP environments, so submit a ticket to [Optimizely Support](https://support.optimizely.com/hc/en-us/requests/new) to request a setting change.

- **Search and agent traffic** – Keep search crawlers and agent crawlers allowed. Search crawlers index your pages, and agent crawlers fetch pages for a person who asked for them. Blocking either reduces discoverability.
- **Training traffic** – Disallow AI training when your business needs and content strategy call for it. Training crawlers collect content to build or fine-tune AI models.
- **Mixed-use crawlers** – Choose **Disallow AI Training** instead of **Block** to opt out of training and keep search access. Cloudflare's **Block** setting stops mixed-use crawlers such as Googlebot, Bingbot, and Applebot entirely, which also affects search.

### August 31

**Enhancement**

- **Added support for the Astro frontend framework** – Optimizely now supports [Astro](https://astro.build/) in addition to NextJS. Pick the framework that fits your site. Astro supports static site generation (SSG) and server-side rendering (SSR). An Astro site uses the same code package and deployment workflow as a NextJS site. For SSR sites, add [Incremental Static Regeneration (ISR) with a Redis cache and Optimizely Graph webhooks](docId\:v6s-PLCwm52JSc9IMEReT). Pages then refresh within seconds of publishing, without a redeploy. Astro requires Node.js 22.12.0 or later, and odd-numbered Node.js releases are not supported.

### July 29

**Enhancement**

- **Added the ability to apply app settings without a code deployment** – You can now [apply app settings and connection string changes](docId\:eyC72VUP7Rr1ZQNjEn4UW) to a specific environment from the **App Settings** tab in the PaaS portal, without running a full code deployment. Optimizely reads the settings from Key Vault and pushes them to the web app, which restarts automatically to load the new values. This applies configuration changes in minutes instead of requiring a full deployment. Code deployments to the environment are blocked while the operation runs, and you cannot start the operation if another deployment to the same environment is already in progress. The portal shows the operation status and a link to the Apply Settings job.

### April 28

**Enhancement**

- Added support for Incremental Static Regeneration (ISR), which lets you update individual pages without rebuilding your entire site. ISR reduces build times, improves performance for large or frequently updated sites, and reduces infrastructure load. See [Next.js ISR caching and Optimizely Graph webhooks](docId\:KSB4fJtt-vcRqYZoWCcWF).

## Mark chat—`Cms.OpalChat`

### April 7—2.0.0

Released the [Optimizely.Cms.OpalChat 2.0.0](https://nuget.optimizely.com/packages/Optimizely.Cms.OpalChat/) NuGet package that includes [Mark chat](docId\:J6ZsZrcv79GiVfnh3Jjsv), so editors can access AI-powered assistance without leaving CMS.

## Optimizely Agent Platform tools—`Optimizely.Cms.Opal.Tools`

### September 23—13.3.1

**Bug fixes**

- [CMS-56381](https://world.optimizely.com/support/bug-list/bug/CMS-56381) – Fixed the issue where the paas-cms-opal-tools README documented the wrong tool execution path. The documented path omitted the `tools/` segment and used underscores instead of hyphens in the tool name. The README now shows the correct path, for example `POST /opal/tools/paas-cms-list-content-types`.
- [CMS-56436](https://world.optimizely.com/support/bug-list/bug/CMS-56436) – Fixed the issue where the blueprint tools were registered for Mark chat but not for the MCP protocol endpoint. This affected `ListBlueprintsTool` and `GetBlueprintTool`, which MCP clients could not use to list or get blueprints. Both tools are now registered for MCP as well.

### September 11—13.2.0

**Enhancements**

- **Added a Model Context Protocol server for CMS 13** – The `Optimizely.Cms.Opal.Tools` package includes a Model Context Protocol (MCP) server that exposes the same CMS tools as Mark chat to any MCP-compatible AI client, such as Claude Code or Cursor. Manage content, content types, and display templates from your development environment instead of the CMS user interface. Register the server with `services.AddCmsMcpServer()` and map the endpoint with `endpoints.MapMcp("/mcp")`. This release supports client secret authentication. Opti ID authentication is planned for a later release.
- **Added blueprint tools to Agent Platform for CMS 13** – Agent Platform agents can list and inspect blueprints and create a content item from one. Agents can also save an existing content item, or a single section of an experience, as a blueprint with a generated thumbnail. Editors start from an approved layout instead of building each page from scratch. The tools mirror the blueprint tools in CMS (SaaS) and use the `paas_` name prefix.

### August 28—13.1.2

**Bug fixes**

- [CMS-55359](https://world.optimizely.com/support/bug-list/bug/CMS-55359) – Fixed six issues in the content area write path and the language branch read path of the CMS 13 Agent Platform tools:
  - Updating a content area through `paas_cms_update_content_item` deleted the items you did not include. Content areas now merge with the items already stored. To clear a content area, send an explicit empty array (`[]`).
  - Adding an inline block to a content area returned an "Invalid property value" error. Content areas now accept shared items, inline blocks, and a mix of both. Define an inline block with `contentType`, plus the optional `properties` and `displayName` fields.
  - `paas_cms_update_content_item` rejected the content area items that `paas_cms_get_content_data` returned. Shared, inline, and mixed item lists now write back unchanged, with no items lost or duplicated.
  - `paas_cms_update_content_item` discarded the properties sent alongside a shared content area item. The response now reports the property as written and names how many items had their properties ignored.
  - A read reported a missing language branch instead of an access error. `paas_cms_get_content_data`, `paas_cms_create_content_variation`, and `paas_cms_update_content_item` now check read access before they report anything about an item's languages.
  - The missing language branch error did not name the branches that exist. The error now lists the available branches so you can retry with a valid locale.

### August 21—13.1.1

**Bug fixes**

- [CMS-54984](https://world.optimizely.com/support/bug-list/bug/CMS-54984) – Fixed an issue where the paas\_cms\_update\_content\_item tool emptied a Visual Builder page and reported success when given an incomplete or empty composition. The tool now refuses a [composition write](docId\:v4llE83TvCJ0kzb27dct2) that would remove existing nodes and names what would be lost. To remove nodes intentionally, set allowNodeRemoval to true.
- [CMS-54985](https://world.optimizely.com/support/bug-list/bug/CMS-54985) – Fixed an issue where writing a Visual Builder composition back to a page replaced its nodes with new ones. The paas\_cms\_update\_content\_item tool now accepts the same node shape that the paas\_cms\_get\_content\_data tool returns, so writing a composition back unchanged keeps the existing nodes and their styling. See [Troubleshoot Optimizely Agent Platform tools](docId\:ZjlzwTDohbcqw0RGzE9vg) for troubleshooting help.
- [CMS-54986](https://world.optimizely.com/support/bug-list/bug/CMS-54986) – Fixed an issue where the paas\_cms\_update\_content\_item tool reported success for a [property write](docId\:v4llE83TvCJ0kzb27dct2) that did not take effect. The tool now reports an outcome for each supplied property and names any that did not persist.

### June 30—13.1.0

Released tools to help you work with display templates and upload media. See [Display template tools](docId\:v4llE83TvCJ0kzb27dct2) and [Media tool](docId\:v4llE83TvCJ0kzb27dct2).

- `paas_cms_list_display_templates` – Lists all display templates. Takes no parameters.
- `paas_cms_get_display_template` – Retrieves one or more display templates by key. 
- `paas_cms_create_display_template` – Creates a display template. Scope the template to exactly one of `NodeType`, `BaseType`, or `ContentType`.
- `paas_cms_update_display_template` – Updates an existing display template. Only provided fields are updated. Omitted fields are unchanged.
- `paas_cms_upload_media` – Downloads a file from a publicly accessible URL and uploads it as a media asset in CMS.

### May 22—13.0.0

Released tools to help you create and manage content and content types, optimize for search engines, and improve AI discoverability. See [Available tools for CMS 13](docId\:v4llE83TvCJ0kzb27dct2).

- `paas_cms_list_content_types` – Lists all content types in CMS.
- `paas_cms_get_content_type_details` – Retrieves detailed information about a specific content type, including all property definitions with types, validation rules, and group assignments.
- `paas_cms_create_content_type` – Creates a new content type with a key, display name, base type, and property definitions.
- `paas_cms_update_content_type` – Modifies an existing content type's display name, description, or property definitions.
- `paas_cms_delete_content_type` – Deletes a content type from CMS. The content type must not have any existing content instances.
- `paas_cms_list_property_groups` – Lists all property groups in the CMS with their names and sort order.
- `paas_cms_create_property_group` – Creates a new property group with a unique key and optional sort order.
- `paas_cms_get_content_data` – Retrieves a content item's data including all non-metadata properties. Fetches a specific version or the latest published version.
- `paas_cms_update_content_item` – Updates properties on a content item. Accepts a JSON object of property name and value pairs. If no contentkey is specified, creates a new content item as a draft. Returns a contentKey (GUID) and contentVersion for subsequent operations.
- `paas_cms_delete_content_item` – Moves a content item to the waste basket. An editor can restore the item.
- `paas_cms_publish_content_item` – Publishes a content item immediately or schedules it for a future date and time. Requires a content version number.
- `paas_cms_create_content_variation` – Creates a new locale variation of a page or experience content item.
- `paas_cms_get_content_preview_url`– Generates a preview URL for a specific content version, letting Mark fetch and analyze the rendered HTML.
- `paas_cms_seo_analysis` – Analyzes content SEO performance and provides AI-powered recommendations.
- `paas_cms_seo_edit` – Applies SEO recommendations to CMS content.
- `paas_cms_geo_analysis` – Performs an AI-powered audit of content for LLM discoverability.
- `paas_cms_geo_apply` – Applies JSON-LD schema templates to the content's JsonLdTemplates property. Creates a new draft version with the schema markup.

## Content Delivery API—EPiServer.ContentDeliveryApi&#x20;

### August 19—13.0.0

**Enhancement**

- Released Content REST API 13.0, which adds Content Delivery API support for Optimizely CMS 13 and .NET 10. See [Upgrade Content Delivery API from version 3 to version 13](docId\:D21J5kLhcT6kGMNbl7jJ3).
