Follow this article to receive email notifications when new packages are available for Optimizely Content Management System (CMS) 13. Product packages are found on the Optimizely NuGet server and include the following products:
- CMS Core
- Optimizely Forms
- Optimizely Graph
- Optimizely CMS JavaScript SDK
- Optimizely Language Manager
- DXP
- Optimizely Opal chat
- Optimizely Opal tools
Are you looking for the 2026 CMS 12 release notes or the 2026 CMS (SaaS) release notes?
Release highlights
June 30
Released the following agents to Optimizely Opal:
- Content Model Creation agent – 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 – 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 – 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, 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 Opal-generated insights, 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
- (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
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 toAddGraphContentClient, callConfigureType<T>(), then chainConfigureField()andObjectGraphName(). -
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 – Fixed the issue where the Graph C# SDK did not support synonym expansion with the
Equalsfilter operator. The SDK now supports synonyms throughSynonymSlotarguments onEquals. -
CMS-53921 – Fixed the issue where the
ContainsAnyfilter in the Graph C# SDK did not supportIList<T>properties, which caused a compile error.ContainsAnynow works withIList<T>properties in lambda queries and the filter builder. -
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
400error. The batch now flushes before it exceeds the limit. -
CMS-53681 – Fixed the issue where the Graph C# SDK could not filter string-array metadata fields, such as
_metadata.types, with theinoperator. The SDK now supports listinfilters through theContainsAnymethod in lambda queries and the filter builder. - 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 – 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 – 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 – 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 – 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 – Fixed the issue where
ContentTreeAPI calls returned an HTTP400error 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 – 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 – Fixed the issue where
FacetwithQueryContenton certain date or integer metadata properties, such asCreatedandSortIndex, threw an exception even though the same query worked withQuery<T>. -
CMS-52531 – Fixed the issue where startup failed with a
ValidationExceptionwhen 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 – Fixed the issue where the TinyMCE editor width shrank to fit the toolbar buttons when an
XhtmlStringproperty with a custom toolbar was used inside anIList. The editor now expands to the full width of the container. - 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 – Fixed the issue where a call to
GET /_cms/v1/content/versionsreturned a 500 error on a CMS 13 site because of a mismatched contracts package version. -
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 – 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 – Fixed the issue where a Razor Page named
Index.cshtmlthat inherited fromRazorPageModel<StartPage>threw an exception when loading the start page. -
CMS-53459 – Fixed the issue where the CMS 11 or CMS 12 to CMS 13 migration failed when
tblSiteDefinition.SavedwasNULL, because the value was inserted into the non-nullableCreatedcolumn intblApplication. -
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
RequestTimeoutsetting inMachineTranslationOptions. -
CMS-53471 – Fixed the issue where Optimizely Graph returned a corrupted URL for a
LinkItemwhen the remaining URL contained both#and/, returning anEXTERNALURL type with an unresolved internal path instead of aHIERARCHICALURL. -
CMS-53703 – Fixed the issue where the content reference schema in Optimizely Graph used an incorrect type for the
itemandreffields, which prevented GraphQL fragment casting. These fields now use the abstractIDatatype 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 when you use external content without modifying existing content types. Text properties (
ShortString,LongString) can now map toLongString,XHTMLString,LinkItem, andURL. Number properties (Integer,Decimal) can map toDecimal,ShortString,LongString, andXHTMLString. Content reference properties (ContentReference,ContentReference<T>) can map toLinkItem,URL, andContentReference. 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 in the CMS REST API.
-
Added external URL indexing for DAM assets in LinkItem properties – When DAM assets are referenced in
LinkItemproperties with the_AssetItemconfiguration, Optimizely Graph now indexes the external URL from_AssetItem.url. Theurl.defaultandurl.hierarchicalfields are now populated with the external DAM asset URL instead of the internal CMS URL. This behavior applies only to sites using the new_AssetItemDAM configuration. Existing sites with legacy DAM configuration are not affected. -
Added VisibleInMenu to the Optimizely Graph schema – The
VisibleInMenuproperty (displayed as Display in Navigation in the CMS edit UI) is now indexed in the Optimizely Graph schema and queryable for all page types. To hide it globally, setCmsFeatureOptions.SectionsVisibility.VisibleInMenuPropertyin your startup configuration. -
Released Graph Conventions API for CMS 13 – Use the Conventions API to customize how content is indexed in Optimizely Graph for CMS 13. Exclude content types from indexing or add computed fields to the Graph schema. Configure it using the
conventionsBuilderparameter onAddContentGraph().
Bug fixes
- 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 – Fixed an issue where a URL hash fragment entered in the Remaining URL field of a
LinkItemwas excluded from the URL indexed in Optimizely Graph. -
CMS-51017 – Fixed an issue in the Graph C# SDK where GraphQL queries generated using
OrderBy()on metadata properties such asStartPublish,Status,Variation, andLanguagewere invalid and threw an exception when executed. The generated queries now correctly nest the sort field under_metadata. -
CMS-51656 – Fixed an issue in multisite setups where block content stored in per-application asset folders had null values for
_metadata.url.baseand_metadata.url.defaultin Optimizely Graph queries, making it impossible to filter blocks by site. -
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 aSynonymSlot. - 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 – Fixed an issue where calling
Facet(x => x.Name)in a Graph C# SDK query threw anInvalidFacetFieldExceptioneven though theNameproperty supports faceting in Optimizely Graph. -
CMS-51811 – Fixed an issue in CMS 13 where a site could not start when the database was configured in ReadOnly mode using the
DatabaseModesetting inappsettings.json. - 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 – Fixed an issue in the Graph C# SDK autocomplete validator where
ContentReference,LinkItem, andLinkItemCollectionproperties 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 – 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 – 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 – 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 – Fixed the validation error that occurred during startup when an automatically created app name contained invalid characters, such as dashes.
-
CMS-51112 – Fixed the issue where a custom dijit property editor that did not implement the
onChangemethod failed to render in the Visual Builder. - 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 – 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 – 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 – 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
UniqueIdinstead of its display name.
April 9—13.0.1
Bug fixes
- CMS-49431 and 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 – Fixed the missing context menu icon for
IList<Block>items in All Properties mode. -
CMS-50716 – Fixed the syntax error that occurred when using
Contains,StartsWith, orEndsWithinFilterBuilderdue to a naming conflict with LINQ. These methods are renamed toFilterContains,FilterStartsWith, andFilterEndsWith. -
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 – 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 – 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
June 23—6.0.1
Bug fix
CMS-52251 – Fixed the issue where the
VisitorDataHiddenElementBlock.GetAttributesmethod 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.Formsversion 6.0.0 compatible with CMS 13. See Optimizely Forms for CMS 13.
Bug fix
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 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@1.0.0
-
Stride sample site – A single command now scaffolds a fully working Next.js starter, the Stride sample site, so you can go from zero to a running headless CMS app in minutes. It ships pre-built components that demonstrate composition and experiences, styled with Tailwind CSS, and full TypeScript typing. Stride connects to any CMS instance that has Optimizely Graph, local or SaaS, and includes
config:pushscripts to sync its content-type configuration into the CMS.
- The
contentTypefunction now has improved TypeScript typing, so content modeling in code is more type-safe. This release also corrects theeditortype ondisplaySettingsand adds aselectOneoption. - A new
toSchemamethod parses data fetched with other GraphQL libraries (Apollo, urql, or plainfetch), so you can adopt the types in the SDK without changing your data-fetching stack. - GraphQL query and fragment generation now handles the
graphandglobalcontractsnamespaces 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.
- 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
- Queries now return all base type properties, so you can access more content data without extra configuration.
- Locale support now extends to
ContentTypeandRICHTEXT_PRESET, which makes multilingual experiences easier to build. -
OptimizelyCompositionnow 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
expandContractsboolean controls contract expansion, replacing the more complexmaxContractExpansionLimit.
- Code generation now supports circular and self-referenced content types, so you can model more complex content relationships.
- The
pullcommand 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
pullcommand 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 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
RecursiveDepthsetting that caps how many content hierarchy levels Language Manager includes when translating or copying content. In earlier versions, recursive translation was all-or-nothing, so translating one item cascaded through every linkedContentArea,ContentReference,XhtmlString, andLinkItemindefinitely. On sites with thousands of interconnected items, it silently overwrote manually curated translations and took days to revert. Now, you can set theRecursiveDepthsetting to one of the following values (default is1):-
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.
-
DXP
July 29
- Added the ability to apply app settings without a code deployment – You can now apply app settings and connection string changes 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.
Optimizely Opal chat—Cms.OpalChat
April 7—2.0.0
Released the Optimizely.Cms.OpalChat 2.0.0 NuGet package that includes Opal Chat, so editors can access AI-powered assistance without leaving CMS.
Optimizely Opal tools—Optimizely.Cms.Opal.Tools
June 30—13.1.0
Released tools to help you work with display templates and upload media. See Display template tools and Media tool.
-
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 ofNodeType,BaseType, orContentType. -
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.
-
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 nocontentkeyis specified, creates a new content item as a draft. Returns acontentKey(GUID) andcontentVersionfor 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 Opal 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'sJsonLdTemplatesproperty. Creates a new draft version with the schema markup.
Please sign in to leave a comment.