2026 CMS (SaaS) release notes
Subscribe to updates on this page using the notification and RSS feed options.
Note Optimizely CMS (SaaS) release notes provide information on the latest innovations. To ensure stability and high quality, Optimizely rolls out features progressively in ring deployments, so you may see announcements for features before they are universally available.
November 12
Requests to the retired Preview3 CMS REST API now return the 410 Gone status code. Preview3 reached end-of-life on August 1, 2026. If an integration calls an endpoint with /preview3/ in the URL, move it to CMS REST API v1 with the migration guide. Integrations that already use v1 need no changes.
November 10
Added UI extensions, which bring custom tools and pages into the CMS (SaaS) interface. Editors can work with external data, run custom checks, or use richer input fields without leaving CMS. Each extension is part of an Optimizely Connect Platform (OCP) app that you install for your CMS instance. An extension displays in one of the following places:
- Sidebar – A panel next to the content you are editing, such as an analytics tool or a checklist.
- Extensions view – A full page, such as a dashboard, that you open from Extensions in the CMS navigation menu.
- Property editor – A custom input, such as a color picker, that replaces a text or number field.
Administrators assign property editors in a property's Editor setting and check installed extensions on the Extensions Diagnostics page.
Rich-text editors now have image and video buttons, so you can insert media from CMS (SaaS) or Optimizely Digital Asset Management (DAM) without leaving the editor. The image button replaces the TinyMCE image button in every toolbar, and the Expanded toolbar preset also has a video button. Each button lets you browse CMS media, pick a DAM asset when DAM is configured, or upload an image to CMS (SaaS).
- Size and alt text – Images keep the width and height of the asset and use its alt text, or its name if it has no alt text. To change the alt text, select the image and click Set Alt Text.
- DAM assets in rich text – CMS (SaaS) stores DAM assets as permanent links, like other content links, which redirect to the DAM URL. Link validation reports the link as broken if the asset is deleted from DAM. DAM usage tracking includes assets used in rich text.
- Optimizely Graph and the Content Management API – In Optimizely Graph, the html field of rich text contains the public URL of each asset, and the json field adds a cms://content reference. To add media through the Content Management API, put a cms://content reference in the src of an img element or of a source element inside a video element. Content reference and link properties that point to DAM assets are also indexed with the asset URL. Existing content gets the URL when it is reindexed.
- Limitations – Add DAM assets with the picker, not by drag and drop. Go to media and the image editor are not available for DAM images. Only images and video are supported, so add documents as links.
Visual Builder now shows the rows, columns, and elements of every section in the outline , so you can edit an experience and its sections in one view without opening each section separately. One view makes it easier to work across sections, such as when you copy content from one section to another.
- Components as tiles – Elements and blocks used as sections display as tiles with their content type icon, so they stand out from sections, rows, and columns. Click the icon or name of a tile to open the component for editing.
- Section settings in the context menu – Open the properties of a section with Properties in its context menu. Rename a section in the outline the same way you rename rows and columns.
- Form steps in place – Form steps also display in the outline, so you can work with each step without opening it separately.
- Select and expand separately – Click a section, row, or column to select it and highlight it in the preview. Click the arrow next to it to expand or collapse it. The outline remembers what you expanded when you return from editing a component.
- Preview and outline in sync – Click a section or element in the preview to select it in the outline. The preview scrolls only when you click an item in the outline, not when you hover over it.
Pickers that accept pages now list Browse page tree with Browse, so you can find a page by where it sits in your site structure. Use it when you add a link to a page or select a page for a property. Browse page tree displays when the property allows every page type. Browse still opens the Content Manager picker, where you can search and pick content from sources such as DAM.
The Optimizely Graph full sync now does less work for assets, so sites with many assets sync with less load. The job skips the assets of permanently deleted content before it loads them and checks each asset folder only once per run. Optimizely Graph now leaves out every asset of permanently deleted content, including blocks, not only images and other media.
CMS (SaaS) now uses version 4 of the ImageSharp library to resize, crop, and otherwise process your images, so image processing stays on a version that gets security fixes. Static images look the same as before. When you resize or crop an animated PNG, it now keeps its animation instead of showing only the first frame. You do not need to take any action.
- CMS-54168 – Fixed the issue where a long file name hid the options menu of an item in Visual Builder. This affected list properties for images, documents, and pages. The menu now stays available however long the name is.
- CMS-56382 – Fixed the issue where content too large for Optimizely Graph could make CMS (SaaS) run out of memory. Each sync processed the oversized content in full again, so memory use kept growing. CMS (SaaS) now stops when content passes the 29 MB limit. The content size indicator also tells you when another version of the item is too large to sync.
- CMS-57352 – Fixed the issue where CMS (SaaS) accepted a custom composition property named Composition on block types and other types that are not experiences or sections. CMS (SaaS) now rejects this property, as it rejects other custom composition properties on these types. You cannot save a content type that has this property until you remove it.
- CMS-57801 – Fixed the issue where editing a block property in on-page editing cleared its existing values. Your changes were also lost, even though the save appeared to succeed.
November 3
- CMS-58391 – Fixed the issue where Content Manager could not list content from an Optimizely Graph source. This happened when the content type had a required block list, such as a list of tags. These content types connected through Connect From Graph, but their content did not load in Content Manager.
November 2
Mark (Optimizely Agent Platform) now uploads images and other files to CMS (SaaS) even when your media types require properties, such as alt text. Add the media you need without leaving the conversation.
Include property values in your upload request, or let Mark fill in alt text from the file's display name or file name. If another required property is missing, Mark tells you which one, so you can provide it and try again.
Mark reads the requirements from the media types on your instance, so customized media types work too.
October 30
CMS (SaaS) now has clear limits on how deeply you can nest content. If you save content that goes past a limit, the message names the limit, such as Blocks cannot be nested more than 8 levels deep. Previously, deeply nested content could save in the CMS UI and then fail to update through the CMS (SaaS) REST API, with an error that did not explain why.
- Blocks – Inline blocks can be nested up to eight levels in content areas, block properties, block lists, and Visual Builder sections.
- Visual Builder layouts – Layouts can be nested up to four levels, counting the section, rows, columns, and elements.
- JSON properties – Values can be nested up to eight levels.
- REST API requests – Request bodies can now be nested up to 64 levels, up from 32. A deeper request returns The request exceeds the maximum allowed JSON nesting depth of 64.
The limits apply in the CMS UI and through the REST API. You cannot save existing content that is nested deeper than a limit, even after an unrelated edit, until you reduce its nesting. A shared block counts as one level, and CMS (SaaS) checks the blocks inside it when you save the shared block.
Optimizely Graph no longer indexes fallback content for languages that are not available. Visitors cannot see those languages, so skipping their fallback content keeps your index smaller and each sync faster. Optimizely Graph still indexes content that exists in those languages, and fallback content for available languages does not change.
Subscribe a webhook to the Completed event in the Import category (import:preview1:completed) to know when a content import finishes. CMS (SaaS) sends the event once, after the whole import completes, so your systems can start follow-up work, such as re-indexing or warming a cache, at the right time. The event includes how many content items, content types, blueprints, and other entities the import brought in, and whether the import logged any errors. CMS (SaaS) does not send the event when an import is aborted.
Give each content type an icon, so editors can recognize it at a glance. Pick the icon from the Icon list on the Settings tab of the content type . To set icons in code, use the icon property in the CMS (SaaS) REST API. Visual Builder shows the icon next to sections and elements in the outline, which makes them easier to tell apart.
Name rows and columns in Visual Builder after their content, as you can for sections. Descriptive names make it easier to find what you need in large and complex layouts. Rename is available in the context menu of each row and column.
- CMS-57938 – Fixed the issue where a single content type could make an entire Optimizely Graph source unusable in Connect From Graph. This happened when one content type had two properties whose names differed only in capitalization. The dialog then listed no schemas from that source, and content already connected to the source could stop loading. The problem is now limited to the affected content type, so you can still connect and use the other content types in the source. If you connect the affected content type, CMS (SaaS) shows a clear message that names the property instead of a server error.
- CMS-57992 – Fixed the issue where Connect From Graph failed for content types that had a required single block property, such as a logo. CMS (SaaS) does not allow a single block property to be required, so the content type could not be created. You can now connect these content types. CMS (SaaS) keeps the required setting on block lists but does not apply it to single block properties.
- CMS-52917 – Fixed the issue where blueprint thumbnails were not available to Optimizely Content Marketing Platform (CMP). CMP can now show the thumbnail of each blueprint that has one, so you can pick a blueprint by how it looks.
- CMS-56899 – Fixed the issue where CMS (SaaS) could occasionally load the wrong version of a content item, including a version from a different item or language. This could also make Optimizely Graph skip an item or index the wrong one.
- CMS-57236 – Fixed the issue where Visual Builder showed the language selector for media that cannot have language versions. Choosing a language opened the Add Language dialog even though the media could not be translated. The language selector is now hidden for this media.
- CMS-57293 – Fixed the issue where long values in inline blocks, such as rich text over 255 characters, could be missing when CMS (SaaS) loaded several content items at once. This happened in content areas and Visual Builder experiences when the first item was a different block type or a shared block. For example, if you copied a page after you expanded its parent in the page tree, the copy could lose that text.
- CMS-57295 – Fixed the issue where the Optimizely Graph sync stopped with the error Value cannot be null. (Parameter 'key') when it reached media or folders that have no language. The sync now continues past these items.
- CMS-57428 – Fixed the issue where uploading a large animated image, such as a GIF, could make CMS (SaaS) unavailable until it restarted. Large animations now get a static thumbnail of their first frame, and smaller animations keep an animated thumbnail.
- CMS-57429 – Fixed the issue where the publish menu closed and you could not select Publish if you opened the menu while CMS (SaaS) was saving a change. The menu now stays open, and CMS (SaaS) saves your change before it publishes the content.
- CMS-57581 – Fixed the issue where fields in a nested block kept their content source values after you disconnected the parent block from the source. Disconnect now clears every field the source filled in, including fields in nested blocks. Fields that are not mapped keep their values.
- CMS-57585 – Fixed the issue where, on pages with a content area, you could not edit properties in on-page editing after your preview reloaded itself. Clicking a property did not open an editor until you refreshed the browser.
October 21
Link, Link collection, and URL properties now open the Content Manager picker, so links can reach beyond CMS (SaaS) content. The picker lists DAM assets and content from other connected sources whose content types the property allows. Content Reference and Image properties already use this picker.
The Create Link dialog in the rich-text editor uses the same picker for its Page and Media options. Links you add in text now work the same way as link properties.
- CMS-56343 – Fixed the issue where content type descriptions did not display when you created content in Visual Builder. Content types with a description now show it, so you can choose one without relying on its name alone.
- CMS-56489 – Fixed the issue where the Optimizely Graph Delta Synchronization job started a full sync immediately and ignored its schedule. If a restart interrupted the full sync, it could also start again every hour. The Optimizely Graph Full Synchronization job now runs on the schedule you set.
- CMS-56545 – Fixed the issue where content stayed in Optimizely Graph after you removed Read access for the SearchIndexer group. Optimizely Graph now removes content that this group cannot read, including content it indexed before you removed access.
- CMS-56724 – Fixed the issue where the AI translation option in the Visual Builder Add Language dialog still showed the Opal logo and name. The option now reads Mark AI.
- CMS-56901 – Fixed the issue where the Link Validation job did not report links to unreachable sites, such as deleted domains. The Link Status report now lists them as broken, with the status Service Unavailable (503). These links also count toward the limit of consecutive broken external links that stops the job.
- CMS-56991 – Fixed the issue where a content area in an unsaved block listed every content type, not only its allowed types. The list now shows only the allowed types, even before you save the block.
October 20
Mark can now create, change, and delete the rules that control how your forms respond to visitor answers. Describe the behavior you want in plain language , such as showing a field only for a certain answer, hiding a step, or jumping ahead to a later step. Finish a form you started building with Mark without leaving the conversation.
Before saving, Mark lists every rule on the form in plain language and asks you to confirm. Ask Mark to show the rules on an existing form, and nothing changes. If the form is published, Mark saves your changes to a draft, so the published version stays as it is. If CMS (SaaS) rejects a rule, Mark marks the rule that needs fixing and explains why. Rules are saved for one language version at a time.
Mark works with the same form rules that you configure in the form builder, including rules you set up by hand.
October 13
A new agent is now available in the Agent Directory to help you find and fix accessibility issues in your CMS (SaaS) content.
- WCAG Compliance Auditor – Audits CMS (SaaS) content against Web Content Accessibility Guidelines (WCAG) standards and applies approved accessibility fixes, which helps you reduce accessibility risk before you publish.
October 9
When you pick an image or video from Optimizely DAM, you can choose one of its renditions, such as a crop or a smaller size, rather than the full original. The rendition you pick is stored on the property and delivered to your frontend through Optimizely Graph. The correct asset arrives ready to render, so a developer does not have to adjust it in frontend code.
Renditions are available in Content Manager and in the DAM asset picker. The detail pane has an Info tab and, for assets that have renditions, a Renditions tab with a size comparison that shows each rendition against the original. DAM usage tracking records the rendition you used, so asset lineage reflects the exact file on the page.
Rendition content sources are created for you, including on instances already connected to DAM, so no configuration is required.
When you select a content item in Content Manager, the detail pane now shows its categories as chips on the Info tab, alongside details such as status and language. You can check how content is categorized without opening it for editing. If an item has more categories than fit, you can expand the list to see the rest.
View on website in the publish menu now opens the published page in a new tab. Your draft stays open behind it, so you can pick up editing where you left off instead of navigating back. An arrow icon on the link shows that it opens a new tab.
- CMS-34036 – Fixed the issue where deleting a sub page of a page in the trash left the loading indicator spinning. If the page had several sub pages, the trash could also display as empty. The trash now reloads correctly after you delete a sub page.
- CMS-52482 – Fixed the issue where opening or publishing content in Visual Builder displayed a blank page while the content loaded. This was most noticeable on content with many or deeply nested blocks. Visual Builder now displays a centered loading spinner while the content loads, matching the other editing views, and a message if the content cannot load.
- CMS-55034 – Fixed the issue where media upload checked only the final file extension, so a name such as report.exe.png passed a .png allow list. Upload can now also reject a file whose name claims to be a type the file is not, across the editing interface, digital asset management (DAM), the CMS (SaaS) REST API, and data import. Only the segments between the base name and the final extension are matched, so ordinary names such as my.holiday.photo.jpg are unaffected.
- CMS-55198 – Fixed the issue where the expand icon and the folder name were misaligned in the content tree when a folder name was long. This affected the Add Shared Block dialog as well as import and export.
- CMS-56191 – Fixed the issue where a language version that could not load stopped a full sync to Optimizely Graph and discarded the work that had already finished. The sync now skips that version and continues.
October 7
Closed a gap that let an uploaded file bypass content sanitization by disguising its actual file type, such as SVG or HTML content saved with a mismatched file extension. CMS (SaaS) now inspects file content directly instead of relying on the file extension, so these files are sanitized like any other upload. No action is required.
Added support for granular, resource-based scopes on the CMS (SaaS) REST API, such as read-only access to content types, instead of only full administrator access. A compromised or misconfigured API client is limited to what its scope allows. Existing clients using full administrator access continue to work without changes.
Content indexing now generates and processes content references in parallel instead of one at a time, and retrieves version information without an extra lookup per item. Content-heavy instances sync to Optimizely Graph faster, with no configuration required.
- CMS-52409 – Fixed the issue where editing a block from the assets panel in a folder with more than 25 items moved the block to the bottom of the list instead of keeping its sorted position.
- CMS-55290 – Fixed the issue where a category with no translation in the selected language showed an empty Display name and Description in Settings > Categories. These fields now fall back to the master language value, shown in italics with a badge naming the language, such as EN. Each field falls back independently, sorting uses the displayed value, and editing an untranslated category shows the master language value as a placeholder that is never saved as a translation.
- CMS-55748 – Fixed the issue where the order of compositions in Visual Builder did not match the property order configured on the content type.
- CMS-55835 – Fixed the issue where content type synchronization could log a content type as saved even though nothing was written.
- CMS-56076 – Fixed the issue where importing content with a file that exceeded the configured maximum file size replaced the existing file with a zero-byte file. The size check now runs before CMS (SaaS) opens the file for writing, so a rejected file leaves the existing content in place.
September 24
- Optimizely Forms support in the SDK is now generally available. Build forms with the same content types and authoring workflow as the rest of your site, instead of adding a third-party form service. The SDK detects that Forms is enabled on your instance and registers the form content types. It renders each field through a component you supply, validates input, and handles multi-step and conditional flows. Forms is a rendering API rather than a hosted form service, so you own the endpoint that receives submissions.
- Breaking change – content and contentReference properties must declare a contentType, or a non-empty allowedTypes or restrictedTypes. A content model that pushed cleanly on the previous version is now rejected, so add constraints before you upgrade. Narrower constraints also mean smaller queries and faster responses.
- Breaking change – Rich Text properties return json only, so any component that renders the raw html string renders nothing. Set fragment.richTextFormat to 'html' or 'both' to keep the previous payload. The 'standard' editor preset is also removed, so use 'default', 'expanded', or 'minimal'.
- Breaking change – config() options are regrouped into fragment (settings that shape the generated query) and query (per-request defaults). maxFragmentThreshold is renamed to maxThreshold, and options left at the top level are ignored. fragment also accepts compositionDepth, which sets how many composition levels an experience query fetches, and dam, which turns digital asset management (DAM) fragments on or off instead of relying on schema detection.
- Preview updates in PreviewComponent and NextPreviewComponent arrive faster and are no longer dropped when a single save in the CMS emits a burst of events. PreviewComponent also accepts a busy prop, which keeps the loading indicator visible while the new content is still on its way.
- Breaking change – config push stops before uploading when a content or contentReference property is missing type constraints, declares empty ones, or combines contentType with allowedTypes or restrictedTypes. These were warnings in earlier versions.
- The config delete command removes only the content types declared in your project configuration, after a confirmation prompt. Use it instead of danger delete-all-content-types, which removes every user-defined type.
- config pull can generate a registry.ts file that registers every pulled content type and display template, which removes a manual wiring step when you sync your model into code.
- Content type properties support displayMode. Set displayMode: 'hidden' to keep properties your code needs out of the editing interface, so editors see a shorter form. config pull preserves the setting in the generated content types.
- config pull round-trips more faithfully. It always writes allowedTypes and restrictedTypes (empty lists used to be dropped, which quietly opened a property to everything), and it includes contracts in the generated registry.
- The SDK core is framework-neutral, so you can build an Astro frontend rather than only host one. Content type registration, querying, and preview come from @optimizely/cms-sdk, and the React helpers sit in a separate @optimizely/cms-sdk/react/server entry point.
- A complete Astro sample application shows the pattern end to end. It carries 21 example content types with matching components, and it uses Astro islands so only the interactive parts of a page ship JavaScript.
- The sample registers experiences and display templates, so content editors can compose and lay out pages in Visual Builder against an Astro site.
- Routes come from a live Optimizely Graph query, and the sample includes a preview page, so editors see their changes as they work.
- The sample is a private package in the repository rather than an npm release. Copy it into your own project as a starting point.
- CMS-56221 – Fixed the issue where a content area, block list, or Visual Builder experience occasionally resolved to the wrong content type after importing content with Keep identity enabled. Content already affected by this issue is not automatically corrected and needs a separate fix.
- CMS-56533 – Fixed the issue where the first edit to an existing Visual Builder experience after an upgrade cleared every field that references other content, such as a list of pages, blocks, or images, across every component, including ones you did not touch. If the draft was published, the referenced items also disappeared from the live experience.
September 22
Mark can now work with the blueprints your team already maintains. Ask Mark which blueprints exist, or whether you have one for a particular purpose. Mark lists what is on your instance and describes the structure and default values inside any of them.
You can then ask Mark to build from a blueprint instead of from scratch. Mark can create a content item seeded from a blueprint. It can also add a saved section blueprint to an experience you are already working on. Values you give in your request override the blueprint's defaults. You get your template's structure with your own content in it.
Mark can now set up and maintain the categories that organize your content. Ask Mark to list your existing categories or look up a specific one. Mark can also create, update, and remove categories, including nested categories that sit under a parent. You can organize content by describing what you want instead of setting up each category by hand.
Mark recognizes the words you already use, so requests phrased as categories, labels, or tags reach the category tools. These tools manage categories only, and do not set the separate Tags field on a content item.
Managing categories with Mark requires CMS administrator rights.
Visual Builder now includes Preview in the toolbar. Select it to see how an experience looks to a visitor without leaving the editor.
Preview renders the experience through your application's preview URL, so the page displays without property overlays or edit outlines. The Visual Builder canvas keeps those overlays because it is an editable preview. Previously, seeing the page without them meant switching to compare view first.
Preview displays only when a preview URL is configured for the content type.
- CMS-52334 – Fixed the issue where selecting a folder in the assets pane did not load the folder's contents. This occurred when the browser's local storage was full.
- CMS-55494 – Fixed the issue where content type synchronization repeated the same lookups at startup. Instances with many content types now initialize faster. A block list property that references a missing content type now returns a validation error instead of an unhandled error.
- CMS-54210 – Fixed the issue where the CMS REST API returned a 400 error when you tried to create a blueprint for a page or block. The API now supports creating blueprints for pages and blocks, consistent with experiences and sections.
September 14
An experience can now hold several independent layouts instead of a single canvas. Model a main content area and a sidebar as separate compositions . Then lay out each one in Visual Builder with its own sections, rows, columns, and elements. Previously, an experience had one linear canvas. Anything more complex meant using Content Area properties, which cannot use display templates or blueprints.
Content administrators can now add a composition property to an experience content type in Settings > Content Types. Set its Layout Type to Outline or Grid, and restrict the content types the composition accepts so content managers see only what belongs in that region. The built-in Composition layout stays on every experience and section, and you cannot remove it.
When an experience has more than one composition, Visual Builder lists Properties alongside each composition by name. Select one to edit that layout on its own.
- CMS-52979 – Fixed the 400 Bad Request error that occurred when you created or updated a content type through the CMS (SaaS) REST API with the formsElementEnabled composition behavior.
- CMS-53671 – Fixed the issue where scheduled content could take up to 30 minutes to publish on instances created before the publishing interval was shortened. Scheduled content now publishes within about five minutes.
- CMS-54103 – Fixed the issue where copying content that referenced shared blocks in an application's assets folder duplicated those shared blocks. Copied content now keeps its references to the original blocks.
- CMS-54849 – Fixed the issue where a DateTime property displayed the wrong time after you saved content while working in a time zone other than UTC.
- CMS-55057 – Fixed the issue where Optimizely Graph full sync stopped completely when it reached a content item that could not be loaded, such as a deleted or orphaned reference. The sync now continues instead of stopping.
- CMS-55093 – Fixed the issue where the Style option displayed for a shared form in an outline, even though those style settings could not be saved. The option is now hidden for shared forms.
- CMS-55097 – Fixed the issue where styles applied to a shared form did not sync to Optimizely Graph after you added the form to an experience. Only the default section styles were delivered to the front end.
- CMS-55237 – Fixed the issue where publishing a content item did not refresh every page that referenced it. When several items referenced the same content, pages that reached it through a shared block could keep returning stale values in Optimizely Graph. Pages using inline blocks updated correctly, and republishing the block or the page was the only workaround. All referencing content is now re-indexed on publish, so shared blocks reflect the latest published values.
- CMS-55239 – Fixed the database connection errors that occurred when you copied and pasted pages that other content referenced.
- CMS-55291 – Fixed the issue where inline CSS property names in rich-text content were shortened in the JSON delivered to Optimizely Graph, such as text-decoration becoming decoration. The JSON now includes the full property names alongside the earlier short names, and omits vendor-prefixed and custom CSS properties.
August 31
Optimizely CMS (SaaS) supports webhooks, so another system can react the moment your content changes instead of polling for updates. Subscribe to content lifecycle events (such as a page being created, updated, published, or deleted), and CMS (SaaS) sends the event data to an endpoint you choose. Use webhooks to trigger a translation service, notify a downstream system, or start a Mark agent when content changes. Create and manage webhooks in Settings > Webhooks, or use the REST API.
You can now create and manage categories to classify content across Optimizely CMS (SaaS). Administrators can create, edit, organize, and localize hierarchical categories. Editors assign one or more categories to a content item in the Edit view, then filter content by category in Content Manager. Categories give you a consistent way to organize large content libraries and help editors find content by browsing the hierarchy instead of relying on search keywords.
Optimizely CMS (SaaS) indexes your categories into Optimizely Graph, so you can build category-based navigation, filtering, and faceted search in your front-end applications. Content carries its assigned categories on the _itemMetadata.categories field, and each category is available as a standalone _TaxonomyTerm type with its key, display name, and parent term. See Taxonomies in Optimizely Graph for the schema and query examples.
You can now open the Optimizely Graph Search Management portal directly inside Optimizely CMS (SaaS). A Graph Portal item in the CMS navigation bar frames the portal in the UI, so you manage your CMS and Graph settings side by side instead of switching to a separate application. The menu item displays only for users who have administrator access to Graph.
The CMS REST API OpenAPI specification is updated to OpenAPI 3.1. Fields that used strict enum definitions now list their standard values as examples instead, so the specification matches how the API already behaves. Generate an API client from the updated specification, and it accepts the full range of valid values, and it keeps working when Optimizely adds standard values later. The specification also includes richer field descriptions.
If you use an API client generated from an earlier version of the specification, regenerate it from the updated specification. A client built from the previous enum definitions can reject valid values, and later additions to the standard values can break a client that was not regenerated. The runtime behavior of the API does not change.
The CMS toolbar shows a size indicator for the content item you are editing, so you can tell when an item is approaching the 29 MB limit for syncing to Optimizely Graph. The indicator updates as you edit and uses color and a status—Within Graph limit, Approaching Graph limit, or Exceeds Graph limit—to warn you before an item becomes too large to sync. You catch oversized content while you edit, instead of finding out when a sync fails.
If you build and host your own frontend, Optimizely now supports Astro 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. 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.
- CMS-52863 – Fixed the issue where a blank page and a 500 error displayed after you connected content in which an integer property was mapped to a choice property, such as a drop-down list.
- CMS-53613 – Fixed the issue where importing content that used Optimizely Graph content types failed with a validation error when the export package did not include the required global contracts. The import now resolves those contracts by name in the target environment.
- CMS-54086 – Fixed the issue where updating one field in a block property on a content variation cleared the other fields in that block after you reloaded the variation.
- CMS-54100 – Fixed the issue where a local block created for one content item displayed in the For this page or For this block folder of other content items.
- CMS-54210 – Fixed the issue where the CMS REST API returned a 400 error when you tried to create a blueprint for a page or block. The API now supports creating blueprints for pages and blocks, consistent with experiences and sections.
- CMS-54814 – Fixed the issue where the CMS admin view did not display a clear error message when connecting to an Optimizely Graph content source failed because the source could not be found or its content types could not load.
- CMS-54851 – Fixed the issue where translating a page to a new language failed with the message "There was a problem translating the content." This occurred when you copied values from the master language and the page's content area contained a block with a long text property value over 255 characters. A non-language-specific property was incorrectly marked as modified during the copy.
- CMS-55231 – Fixed the issue where updates to a shared block were not reflected in the compositions that reference it. Compositions are now re-indexed when the content they reference changes.
August 14
- Manage pinned results and pinned result collections in Optimizely Graph using graph_pinned_result tool.
- Manage synonyms in Optimizely Graph using the graph_synonyms tool. Synonyms help you find content using alternative terms.
See System tools for Optimizely Graph for details.
August 7
You can now create a content item directly from an existing blueprint using the CMS REST API. Include the blueprint's key in your create request, and Optimizely copies the blueprint's composition and properties into the content for you.
Previously, you had to fetch the blueprint, copy its composition into your request by hand, and regenerate the identifiers yourself. Each item you create this way gets its own layout and node identifiers, so you can reuse the same blueprint as often as you want without collisions.
In a multi-step form, you can now build rules that show or hide an entire step, not just individual fields, based on a respondent's answers.
A rule's conditions can reference fields from any step, so a step can appear or stay hidden based on what someone entered earlier in the form. You build these rules in the same form rules dialog you already use for fields.
When a background request in the editing interface fails, the failure is now recorded with an accurate error in the logs, so administrators and developers can identify the real cause instead of a generic message.
Editors no longer see a vague system-error notice with no explanation, and their work is not interrupted.
- 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-52788 – Fixed an issue where custom properties defined directly on a page type showed their internal property name instead of the translated display name in the Visual Builder overlay.
- CMS-53269 – Fixed an issue where default display templates and display settings were not applied to Visual Builder content created through the CMS REST API and Mark tools, unlike content created in the editing interface.
- 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, which prevented unified queries across DAM assets and CMS assets.
- CMS-53464 – Fixed an issue where machine translation failed after 10 seconds when translating pages with a large amount of content (around 150 or more translatable fields). The request timeout is now 60 seconds by default, so large pages translate successfully.
- CMS-53600 – Fixed an issue where the Swedish confirmation message shown after saving user display options incorrectly stated that the options had not been saved.
- CMS-53702 – Fixed an issue where validation errors were not shown for an inline block added as a section in Visual Builder, so editors did not see when a required property was empty.
- CMS-53726 – Fixed an issue where the indexing job summary listed non-actionable warnings about content area items that could not be loaded, which made genuine warnings harder to spot.
- CMS-53789 – Fixed an issue where saving an inline block as a blueprint failed with a server error when content approvals were configured on the root.
- CMS-53940 – Fixed an issue where the Dynamic Data Store (DDS) could fail to convert datetime2 values from the database, limiting them to the older SQL datetime range and causing SQL parameter overflow errors when storing dates outside that range.
- CMS-54163 – Fixed an issue where the Optimizely Graph indexing job failed with a 400 error when a content batch exceeded the 29 MB request limit, which could happen when several items together crossed the limit even though no single item did. Batches are now split so each request stays under the limit, and any individual item that is still too large to index is skipped with an error instead of failing the entire job.
- CMS-54614 – Fixed an issue where links added with the TinyMCE link button in a rich-text field were indexed incorrectly in Optimizely Graph.
July 23
- 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 or browse the source .
- 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.
- 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.
- 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.
Action required: Migrate Preview3 API integrations to CMS REST API v1 before August 1, 2026
If your CMS (SaaS) applications use the Preview3 CMS REST API endpoints, migrate to CMS REST API v1 before August 1, 2026. On August 1, 2026, Optimizely retires the Preview3 endpoints and begins disabling access. Applications that rely on Preview3 after this date may experience failed requests and service interruptions.
Who is affected – This change affects CMS (SaaS) integrations that make requests to Preview3 endpoints (typically URLs containing /preview3/). If your applications already use CMS REST API v1, no action is required. Optimizely has maintained support for both versions since CMS REST API v1 was released in May 2026 and provides a migration guide to support the transition.
What is changing – With the general availability of CMS REST API v1 on May 5, 2026, the Preview3 APIs entered a deprecation phase and are now approaching end-of-life.
- Preview3 support ends August 1, 2026.
- Preview3 was released as an experimental API and was not recommended for production workloads.
- CMS REST API v1 provides the same core capabilities through stabilized, production-ready endpoints.
- Mixing Preview3 and v1 endpoints is supported until the August 1, 2026 retirement date.
- Preview3 receives no further fixes, enhancements, or support updates. Ongoing investment focuses on v1 and future releases.
Breaking changes – The transition from Preview3 to v1 introduced some breaking changes. Before migrating, review the migration guide and the experimental APIs documentation for detailed guidance and the recommended migration approach.
Why Preview3 is being retired – Maintaining multiple API versions increases complexity for both customers and Optimizely. Because v1 has been generally available for several months and provides a stable, supported alternative, retiring Preview3 lets Optimizely focus on higher reliability, better performance, and faster innovation across the platform.
How to stay informed – For future API lifecycle and platform updates, subscribe to the following channels, which are typically the first to communicate deprecations, support timelines, and migration guidance:
- CMS release notes
- Optimizely Slack Community
If you have questions about your migration strategy or encounter challenges during the transition, contact Optimizely.
July 15
Narrow a large content list to exactly what you need by filtering on the properties that belong to your content source. The Content Manager filter panel now includes property-based filters, like file type, width, height, or date range, alongside the existing type, status, and language filters. Because each content source exposes different properties, the available filters update when you switch between sources, like CMS, DAM, and OCP, so you only see filters that apply to what you are viewing.
Form submissions now map more reliably to the correct storage columns. Each input element uses a unique submission field name behind the scenes to keep your collected data and exports consistent as forms grow more complex. This works automatically, with no change to how you build or manage forms.
Break a long form into smaller, more digestible steps instead of showing visitors every question at once. Add steps to a form, rename them, and edit each step on its own detail screen while an outline view shows the whole form at a glance. Rather than hitting visitors with 15 questions in one go, you walk them through the form step by step, which reduces friction, keeps them engaged, and boosts conversion rates.
Content sources that you connect from Graph now display in Content Manager under their own name, automatically. For example, connect Commercetools, and it displays as its own source in the Content Manager sidebar, streamlining content filtering. You can browse, filter, and select content from a connected source as soon as you add it in Settings > Content Types > Create New > Connect from Graph.
Set and retrieve a content item's global fallback locale through the Locales endpoints in the CMS REST API. The API now mirrors the fallback behavior already available in CMS (SaaS) and Optimizely Graph, so applications that manage languages programmatically stay consistent with what editors see in the UI.
- CMS-44857 – Fixed an issue where draft and published variation content versions that were synced to Optimizely Graph displayed the icon for unsynced versions instead of the synced (double-check) icon.
- CMS-45596 – Fixed an issue where the trailing slash was omitted from a page URL when the page's name in the URL contained a dot, because the URL was treated as a static file.
- CMS-49188 – Fixed an issue where a block list property marked read-only could still be edited, which created an unintended draft version.
- CMS-49484 – Fixed an issue where listing child items in the UI could fail with a ContentNotFoundException when a referenced content item was missing.
- CMS-51887 – Fixed an issue where the View on website option displayed for a page's draft version immediately after the page was created, before it was published.
- CMS-52222 – Reduced the interval for the Publish delayed pages scheduled job from 30 minutes to 5 minutes on new instances so that scheduled content changes publish closer to their intended time.
- CMS-52992 – Fixed an issue where removing content sources through the API could break the CMS (SaaS) UI, including Reset to default, full sync, and smooth rebuild, by making content-source queries tolerant of the removed sources.
- CMS-53289 – Fixed an issue where external identifiers from a GUID-based OCP content source, such as a Bynder asset, could not be used to create references through the CMS API, because the source was not registered with a matching GUID key format.
- CMS-52462 – Marked the SystemTabNames.PageHeader constant as obsolete and updated its inline documentation to reflect that the page header area was removed.
- CMS-52801 – Fixed an issue where editing one field could revert another field to its previously saved value on new, unpublished pages in Visual Builder.
- CMS-52884 – Fixed an issue where republishing a content item without a version status change could unintentionally remove the item from Optimizely Graph, making published content undiscoverable through Graph.
- CMS-53094 – Fixed an issue where the CMS REST API accepted numbers sent as strings instead of enforcing the strict number handling defined in its OpenAPI specification.
- CMS-53444 – Fixed an issue where copying, saving as a blueprint, or importing an experience that had been translated produced empty rows, columns, and elements in the original-language version.
- CMS-53491 – Fixed an issue where a long image file name in a content reference image field hid the options menu or pushed it out of view.
- CMS-53567 – Fixed an issue where importing an experience with the Update existing content items with matching ID option could create duplicate inline-block data, which could cause a component to display the wrong type or value.
- CMS-53694 – Fixed an issue where some content within an experience's blocks could be missing after you copied and pasted the experience or created content from a blueprint.
July 7
- 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.
- 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.
July 3
- CMS-53444 – Fixed an issue where copying, exporting, or saving an experience as a blueprint produced empty rows, columns, and elements in the copy when the original experience had been translated into another language.
- CMS-53567 – Fixed an issue where importing an experience with the Update existing content items with matching ID option could leave duplicate block data behind, causing blocks to show the wrong type or field values.
June 30
- CMS-52666 – Fixed the issue where asking Mark to create a page in a language that did not exist yet created a separate new page instead of adding a language version to the existing page. Mark now adds the requested language as a version of the existing page.
June 23
- CMS-53365 – Fixed an issue where expanding a page tree node with a large number of child items failed to load when those items contained large amounts of property data.
June 18
Action required: Migrate Preview3 API integrations to CMS REST API v1 before August 1, 2026
If your CMS (SaaS) applications use the Preview3 CMS REST API endpoints, migrate to CMS REST API v1 before August 1, 2026. On August 1, 2026, Optimizely retires the Preview3 endpoints and begins disabling access. Applications that rely on Preview3 after this date may experience failed requests and service interruptions.
Who is affected – This change affects CMS (SaaS) integrations that make requests to Preview3 endpoints (typically URLs containing /preview3/). If your applications already use CMS REST API v1, no action is required. Optimizely has maintained support for both versions since CMS REST API v1 was released in May 2026 and provides a migration guide to support the transition.
What is changing – With the general availability of CMS REST API v1 on May 5, 2026, the Preview3 APIs entered a deprecation phase and are now approaching end-of-life.
- Preview3 support ends August 1, 2026.
- Preview3 was released as an experimental API and was not recommended for production workloads.
- CMS REST API v1 provides the same core capabilities through stabilized, production-ready endpoints.
- Mixing Preview3 and v1 endpoints is supported until the August 1, 2026 retirement date.
- Preview3 receives no further fixes, enhancements, or support updates. Ongoing investment focuses on v1 and future releases.
Breaking changes – The transition from Preview3 to v1 introduced some breaking changes. Before migrating, review the migration guide and the experimental APIs documentation for detailed guidance and the recommended migration approach.
Why Preview3 is being retired – Maintaining multiple API versions increases complexity for both customers and Optimizely. Because v1 has been generally available for several months and provides a stable, supported alternative, retiring Preview3 lets Optimizely focus on higher reliability, better performance, and faster innovation across the platform.
How to stay informed – For future API lifecycle and platform updates, subscribe to the following channels, which are typically the first to communicate deprecations, support timelines, and migration guidance:
- CMS release notes
- Optimizely Slack Community
If you have questions about your migration strategy or encounter challenges during the transition, contact Optimizely.
June 10
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 insights generated by Mark, letting you monitor AI traffic patterns, see which AI platforms visit most often, and identify which pages attract the most AI attention.
June 8
The Content Manager picker now supports multi-select when adding content to a Content Reference List property. Select as many items as you need in a single session, then confirm to add them all at once.
If a property has a configured item limit, the picker shows your running count and alerts you as you approach the minimum or maximum, keeping you informed without blocking your selection. Multi-select works across all content sources in the picker, including CMS content, DAM assets, and Commerce products.
- CMS-38305 – Fixed an issue where switching between On-Page Editing, Visual Builder, and Preview caused "Not authorized" errors after an authentication token expired.
- CMS-48545 – Fixed an issue where saving a media content type with an invalid file extension showed an empty error message instead of a descriptive one.
- CMS-49112 – Fixed an issue where helper text tooltips were not shown for block properties when editing content in Visual Builder.
- CMS-49360 – Fixed an issue where posting a manifest failed when two content types referenced each other in a circular mayContainTypes configuration.
- CMS-49431 – Fixed an issue where block properties inside nested blocks did not save correctly.
- CMS-51656 – Fixed an issue where blocks in multisite setups returned null for _metadata.url.base and _metadata.url.default in Optimizely Graph responses, making it impossible to filter blocks by site.
- CMS-51841 – Fixed an issue where field labels and help text used different localization providers, causing inconsistent translations between captions and help text.
- CMS-51935 – Fixed an issue where the content tree returned a 400 error in certain admin plugins due to an antiforgery token timing problem.
- CMS-52030 – Fixed an issue where user synchronization failed when the synchronized users table contained NULL values in the Email or GivenName columns.
- CMS-52100 – Fixed an issue where converting a block property to a non-block property left orphaned data in the database, which could cause warnings about mismatched property definitions.
- CMS-52436 – Fixed an issue where pages with deeply nested block list properties caused Visual Builder to fail to load due to an excessively large metadata response.
- CMS-52661 – Fixed an issue where content type inheritance silently dropped inherited types when circular references existed among content type definitions, causing missing contracts, properties, or schema entries.
June 4
The CMS (SaaS) MCP server is now available, letting developers use AI tools like Claude with full CMS context to accelerate front-end development and CMS-connected workflows. Generate components, model content, and run CMS operations using natural language grounded in your real CMS structure and data.
After you configure the MCP server, you can ask questions like What content types were updated in the last year? or Create a page using this design file and get real results from your CMS instance.
The MCP server lets you do the following:
- Generate front-end components – Create CMS-ready front-end components using AI tools based on your content types.
- Model content – Define CMS content types and contracts through natural language.
- Configure live preview – Set up or troubleshoot live preview workflows in React applications.
- Set up the JavaScript SDK – Configure the CMS JavaScript SDK in new projects.
- Run bulk content operations – Perform bulk CMS content operations through AI-assisted workflows.
- Build reporting workflows – Create CMS reporting workflows joined with external data sources.
CMS (SaaS) platform releases now roll out progressively through ring deployments, replacing the previous all-at-once global deployment approach. Each release advances through controlled groups of accounts, called rings, only after passing validation, limiting the impact of potential issues before they reach production.
Assign different projects or environments to different rings to match your team's needs. For example, keep production in the Main ring for maximum stability, and move staging to the Early Adopter ring for advance access to new features and early validation.
Contact Optimizely support to change your ring assignment.
May 21
(Beta) Released the Optimizely Graph Search Management Portal, a dedicated UI that lets content editors and marketers configure search behavior directly, without developer involvement for day-to-day tasks. Find the portal in the Optimizely global navigation bar. The portal includes:
- Overview dashboard – Shows total query volume, click-through rate, and problematic queries (those with low or no click-through), so you can spot where search is underperforming. Refreshes on demand and supports date-range filtering.
- Pinned Results – Promotes selected content to the top of search results for chosen queries. Create, edit, and delete rules in the portal, and changes take effect immediately. (Formerly Best Bets in Search & Navigation.)
- Synonyms – Expands query matching by defining term relationships, supporting two-way (equivalent) and one-way (directional) synonyms. Changes take effect within minutes.
Access requires Opti ID and Admin Center permissions for your Graph tenant. Pinned Results and Synonyms also require a one-time developer configuration. Use the in-portal feedback link to share feedback during the beta.
May 18
Define a default fallback language at the instance level so visitors always see content in a supported language, even when a translation is not yet available. Global fallback languages are now available in the CMS UI under Settings > Languages.
Smooth rebuild is now enabled for CMS (SaaS). Use Settings > Smooth Rebuild to build a new Graph index in the background while the current one stays live. When the rebuild is complete, review the new index, then promote it or revert to the previous state.
This follows a blue-green deployment strategy: a new slot receives a full content sync in the background while the current slot continues serving queries. After verifying the new slot, accept it to swap instantly or abandon it to keep the current data unchanged.
Content type binding property mappings are now more flexible. Property types with fewer capabilities automatically map to types with more capabilities, reducing the need to modify existing content types when working with external content or content type bindings.
The expanded mappings include:
- Text properties – ShortString maps to LongString, XhtmlString, LinkItem, or URL. LongString maps to XhtmlString, LinkItem, or URL.
- Number properties – Integer maps to Decimal, ShortString, LongString, or XhtmlString. Decimal maps to ShortString, LongString, or XhtmlString.
- Content reference properties – ContentReference maps to LinkItem or URL. Typed content references (ContentReference<T>) map to untyped ContentReference, LinkItem, or URL.
These rules also apply to list versions of each property type.
The DAM integration is now generally available.
The Applications endpoints in the CMS REST API are now generally available. Manage applications (websites) programmatically through the CMS REST API with confidence in CMS (SaaS) environments. The experimental attribute has been removed from the Applications endpoints.
When you reference DAM assets through LinkItem properties, Optimizely Graph now indexes the actual external DAM URL instead of the internal representation. Queries return the correct public URL in the url.default and url.hierarchical fields.
- CMS-50981 – Fixed an issue where the ContentVersionPatch API included non-changeable fields (locale, variation, contentType, status, delayPublishUntil, lastModified, lastModifiedBy) in the response.
- CMS-51138 – Fixed an issue where some v1 API endpoints (POST Manifest and POST Credentials) were missing the Prefer header in the OpenAPI documentation.
- CMS-37256 – Fixed an issue where list properties lost their values in non-master languages after removing the [CultureSpecific] attribute. Values now display correctly without requiring the master language version to be republished.
- CMS-48202 – Fixed an issue where static properties from the Settings group did not display in the Properties panel when editing a section in Visual Builder.
- CMS-48364 – Fixed an issue where creating a new tab named Settings or Content returned an error instead of creating the tab.
- CMS-48779 – Fixed an issue in Visual Builder where the filter elements pop-up disappeared when scrolling to the bottom of a long section.
- CMS-49109 – Fixed an issue in Visual Builder where entering 0 for a number property appeared blank after saving. The zero value now persists and displays correctly.
- CMS-50556 – Fixed styling issues with nested block lists (IList<Block>) in All Properties mode where context menu icons were missing for inner block items.
- CMS-50752 – Fixed an issue where URL hash fragments (for example, #section-name) were stripped from shortcut targets when linked through rich-text or link fields. Fragments are now preserved in the resolved URL.
- CMS-50835 – Fixed an issue where Optimizely Graph returned null for block list properties when one of the blocks was connected to an external content source.
- CMS-50924 – Fixed an issue where the URL hash fragment entered in a LinkItem's Remaining URL field was excluded from Optimizely Graph query results. The fragment is now included in the returned URL.
- CMS-51200 – Fixed an issue where the View on website link displayed in the Options menu for Root and Block content items. This link is now hidden for content types that do not have a public URL.
- CMS-51416 – Fixed an intermittent issue where property edits in On-Page Editing did not refresh the preview. The fix uses a more reliable view model reference instead of the view component, which could be null when the view mode application loads slowly.
May 11
Use the new CMS (SaaS) Mark tools to list, view, create, and update styles for rows, columns, sections, and content types, all directly through Mark chat. Combined with Mark's existing ability to create and manage CMS content, you can now handle the full content creation and editing experience without leaving Mark.
- List available styles – Ask Mark to return all styles available in your instance, including what content they apply to, whether they are set as default, and a summary of their settings.
- View style details – Ask Mark for the full details of any style, including its settings and available choices.
- Create a style – Describe the style you want, including its name, what it applies to, settings, and choices. Mark creates it for you.
- Update an existing style – Change a style's name, default state, or settings without rebuilding it from scratch.
- CMS-50522 – Fixed an issue where the cms_create_content_item Mark tool accepted invalid locales or locales that were not enabled in the instance. The tool now validates the locale against the instance's enabled locales and returns an error listing the available options when the locale is not enabled.
May 5
Build content-driven experiences faster with the JavaScript SDK , now generally available. Developers can model, fetch, and render CMS content using a modern, React-ready SDK that reduces manual overhead.
- Structured content modeling – Define content types, property groups, and display templates for clean, predictable content.
- Simple content fetching – Fetch, filter, and sort 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 – Take advantage of full TypeScript support with autocomplete, error handling, and detailed logs.
- Faster workflows – Use CLI tools to sync content and content types directly from CMS.
April 21
The CMP Library picker is now available as a full asset selection option directly within the CMS editor. Alongside the existing Content Manager picker, you can browse and select CMP DAM assets without leaving the CMS editor, giving you more flexibility in how you find and manage assets across both systems, all in one place.
Access the CMP Library picker by clicking Browse DAM from supported content types in the CMS editor.
Assets are validated against Optimizely Graph before being applied. Renditions are not supported. The Browse action now fulfils the role previously held by the legacy Replace command.
You can now access open-source license agreements for third-party packages directly from the Help menu in edit mode (go to Help > License Agreement). This gives you visibility into the licenses behind the software delivered to your browser, without needing to look elsewhere.
- CMS-41162 – Fixed the issue where the Select Content tree for a content area with allowed experience types only displayed experiences directly under the root page, rather than all matching content.
- CMS-46562 – Fixed the issue where duplicate content loading during delta synchronization caused content items to be re-indexed multiple times in the same sync cycle.
- CMS-48944 – Fixed the issue where the UnstructuredData property was incorrectly shown as a mapping option when converting a page to an experience in Settings > Convert Pages.
- CMS-49311 – Fixed the issue where the Compare tool displayed empty properties and images due to race conditions in the async loading chain when toggling the Compare view.
- CMS-49330 – Fixed the issue where Undo and Redo did not work in Visual Builder after an autosave.
- CMS-49456 – Fixed the issue where hovering over a property overlay in Visual Builder caused the page to scroll unexpectedly to that property.
- CMS-49671 – Fixed the issue where variation names longer than 50 characters caused content indexing to fail. Variation names are now limited to 50 characters.
- CMS-50192 – Increased the service bus PrefetchCount to improve message consumption throughput under high load, such as during large content imports.
- CMS-50326 – Optimized the URL address SQL lookup query to significantly reduce logical reads and SQL Server resource utilization during address resolution.
- CMS-50454 – Fixed the crash in the RequiredType validator that occurred when a ContentReference property contained an external reference to a non-existing content item, such as after an export, import, or database restoration.
- CMS-50978 – Fixed the issue where expanding or embedding content area item properties in nested page content areas was incorrectly blocked.
March 28
The impersonation option is no longer available when creating or managing API keys. This aligns the UI with the deprecation of this feature at the API level.
URL paths for the following CMS modules now align with the Optimizely brand, delivering a cleaner navigation experience. These changes affect URL segments only. Underlying package, assembly, and class names remain unchanged, so no compatibility issues or breaking changes are introduced.
The following updates are formatted as module – new URL segment.
- EPiServer.Cms.UI.Admin – Settings
- EPiServer.Cms.UI.Settings – Profile
- EPiServer.Cms.UI.VisitorGroups – VisitorGroups
- EPiServer.Cms.UI.ContentManager – ContentManager
- EPiServer.Cms.Forms.UI – Forms
- EPiServer.Cms.UI.Webhooks – Webhooks
- EPiServer.Cms.UI.Credentia – Credentials
- Optimizely.Graph.Cms – GraphQL
- Optimizely.Cms.OpalChat – OpalChat
- EPiServer.Cms.TinyMce – TinyMce
- EPiServer.Cms.UI.Extensibility – Extensibility
- EPiServer.Cms.DamIntegration.UI – DamIntegration
Content import now enforces the AllowedFileExtensions allow list. Any file with an extension not on the allowlist is blocked, while all other valid files continue to import as normal. A message identifies any blocked files so you know exactly what to address.
CMS now validates values provided for select list and dropdown list choice properties, including those submitted through the API, against their predefined selectable options. This prevents invalid values from being applied to content instances and keeps your content data consistent.
The preview2 version of the CMS REST API reached end-of-life on December 1, 2025, and is no longer available. Update any integrations still using preview2 endpoints to avoid service disruption. See the July 3, 2025 enhancements for guidance on migrating to a supported version.
- CMS-26909 – Fixed an issue where user deletion did not adhere to the same access control policies as user update and creation. User handling now applies consistent access control for delete, update, and create operations.
- CMS-28236 – Fixed an issue where scheduled jobs that stopped running (for example, due to a server restart) did not display a clear status. Now, the Scheduled Jobs page includes a new Unresponsive status to indicate when a job is no longer running as expected.
- CMS-40097 – Fixed an issue where the authentication token renewal flow could leave you in a logged-in state with an expired authentication token. Now, improved error handling guarantees that either the token renewal succeeds or your authentication cookie is invalidated, triggering a re-authentication challenge.
- CMS-43990 – Fixed an issue where you could not scroll inside drop-down lists, preventing you from accessing all available choices. You can now scroll within drop-down lists.
- CMS-44592 – Fixed an issue where the Translate button was incorrectly enabled when a user without permission to the active language tried to translate content into that language. The button is now disabled in this scenario, and the warning message has been updated to inform users that they do not have the necessary language permissions to perform the translation.
- CMS-44606 – Fixed an issue where the Translate button was incorrectly disabled when a user viewed a page that existed only in a language they did not have permission to edit. Users can now use the Translate button to translate that content into a language they have access to, even when the source language is read-only for them.
- CMS-46541 – Fixed an issue where you received an error and could not save a ContentReference property that references an external content item that no longer exists. Now, the system handles unresolved content references gracefully, letting you save the ContentReference property while providing appropriate warnings about broken references.
- CMS-46610 – Fixed an issue that prevented users from saving external links exceeding 255 characters. The system now supports external links up to 2000 characters, enabling users to share full URLs without encountering saving restrictions.
- CMS-48035 – Fixed an issue where the number of failed items in the delta indexing job output was printed twice, displaying an incorrect count (for example, 303303 instead of 303). The output now correctly displays the number of failed items once (for example, 303).
- CMS-48891 – Fixed an issue where some properties did not load correctly for variations when several variation versions were loaded in a batch.
- CMS-49280 – Fixed an issue where changes did not save to nested blocks within content areas. Now, you can save all modifications to such nested blocks, improving content-editing reliability in CMS.
- CMS-49418 – Fixed an issue where content serialization to Optimizely Graph failed when an XHTML string property contained an invalid or malformed link. Now, the serialization process gracefully handles invalid links within XHTML strings, ensuring you can publish content without errors.
- CMS-49486 – Fixed an issue where internal permanent link formats were incorrectly exposed in Optimizely Graph indexing. Now, these internal permanent links are exposed as internal, improving the consistency and security of Optimizely Graph.
- CMS-49693 – Fixed an issue where XHTML string parsing failed to recognize a link to a content image when TinyMCE sent it as an absolute URL with the CMS hostname.
February 24
Contracts now let you define shared interfaces that enforce common properties across multiple content types, keeping your editing experience and metadata consistent at scale. Contracts also integrate directly with Optimizely Graph, automatically generating GraphQL schemas so developers can query all implementing content types through a single unified query. This reduces complexity, improves code reusability, and decouples frontend development from specific content type implementations.
February 13
The JavaScript SDK is now generally available, giving developers a modern, React-ready toolkit for modeling, fetching, and rendering CMS content. It reduces manual overhead and accelerates 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 – Take advantage of full TypeScript support with autocomplete, error handling, and detailed logs.
- Faster workflows – Use CLI tools to sync content and content types directly from the CMS.
You can now configure rules that dynamically show, hide, enable, or disable form fields based on the values of other fields, all directly in the form builder. This lets you control which fields are visible or active depending on user input.
- Personalized form experiences – Display only relevant fields to reduce clutter and increase completion rates.
- Intuitive configuration – Set up conditions with AND/OR logic and comparison types, including equals, not equals, contains, and regular expressions.
You can now bind block properties in the Visual Builder, similar to content binding. This applies to first-level content such as pages or shared blocks.
Nested block properties within content areas, lists of blocks, or blocks used as sections are not supported.
Content connections in nested block dialogs now save together with other property changes, following the standard save-and-cancel workflow, rather than saving immediately on entry.
- CMS-39991 – Fixed an issue where hyperlinks in the user interface (UI) were incorrect (like the feedback link). The affected links are now updated, improving consistency in CMS.
- CMS-43532 – Fixed an issue where the Link Validation job incorrectly displayed broken link warnings across all language versions of a page, even when the broken link only existed in a specific language version. Broken link warnings now accurately display only in the content version containing the invalid link.
- CMS-44090 – Fixed an issue where the API incorrectly returned an HTTP 500 error when you created a variation version and then tried to update its variation key. The API now correctly returns an HTTP 400 error with the message "Variation key cannot be changed once variation version has been created."
- CMS-46270 – Fixed an issue where CMS incorrectly reported "This item is not used anywhere" for media files linked within blocks, specifically when the external link included a URL with spaces. The system now accurately identifies and displays all instances where a media item is referenced, ensuring users receive correct usage information.
- CMS-46633 – Fixed an issue where the system automatically published copy-and-pasted content for editors with publish permissions, preventing necessary review and updates to fields, like Page Title and Page URL. Duplicated content now remains in draft status, allowing authors to review and edit before publication.
- CMS-46811 – Fixed an issue where content failed validation if you removed a DisplaySetting from its DisplayTemplate. This occurred because obsolete settings were incorrectly persisted in the layout information. The system now correctly handles the removal of DisplaySettings, preventing validation failures.
- CMS-46881 – Fixed an issue where removing a choice from a DisplaySetting in a DisplayTemplate caused content previously saved with that setting to block publishing with an unclear validation error. The system now provides a validation warning instead of blocking publication.
- CMS-47137 – Fixed an issue where the Last changed by date in the user interface (UI) displayed an incorrect date that did not align with a user’s server time settings. The date now accurately reflects the server's time settings.
- CMS-47166 – Fixed an issue where the edit dialog box for an inline block failed to open, and an error message displayed during data binding, when the inline block was within a content area on a page that had undergone multiple publish, remove, and re-create cycles, particularly when the source and target blocks had a binding definition.
- CMS-47171 – Fixed an issue where you could not open a newly created inline block, nested within another inline block in a Content Area, immediately after its creation.
- CMS-47188 – Fixed an issue where the system lost mapping definitions for block properties when you updated composition settings, properties, child content types, or permissions in the target content type.
- CMS-47269 – Fixed an issue where Cloudflare could cache login redirects or protected media files, potentially blocking access for authenticated users or exposing restricted content. Protected files without public access now include no-cache headers.
- CMS-47320 – Fixed an issue where a missing content source in Optimizely Graph caused an error loading edit mode and the broken links gadget on the dashboard.
- CMS-47349 – Fixed an issue where the edit dialog box for an inline block did not open, resulting in a console error, when attempting to edit an inline block nested within a Content Area property of a block used on a page in edit view.
- CMS-48580 – Fixed an issue in the API where the creation of experiences with nested block structures could fail, throwing a 500 response.
February 3
You can now connect external content sources, such as Digital Asset Management (DAM) and Product Information Management (PIM), directly to CMS (SaaS). Configure data synchronization, map external content types to CMS content types, and use synced assets within CMS without duplicating content across systems.
Content Manager now lets you filter content by source (All, CMS, DAM, and OCP). This lets you locate and manage content from different sources without navigating away from CMS.
The Content Manager table view now supports dynamic column display and personalized customization. Columns default intelligently based on the content source, and you can add, remove, and reorder columns with preferences saved between sessions. Additional options include reset to default, select all columns, and a sticky first column for consistent reference while scrolling.
You can now bind blocks and content instances to data sources directly in the Visual Builder edit view.
- Visual data binding – A link badge next to the block or content title indicates when an instance is data-bound. This badge is visible on content area items and when the block is open in quick edit.
- Connection management – For unbound blocks or content, select Connect content to open a filtered Content Manager picker. For bound items, select Replace or Disconnect to manage the data source.
- Read-only mapped properties – Properties configured in the data source mapping are read-only, preserving data integrity.
- Platform support – Data-bound content loading is supported in ContentLoader and Graph indexing, with separate caching for bound and unbound models.
Content Sources and Shadow content types are now created automatically for each content type indexed in Graph. This removes the need for manual provisioning when connecting content sources.
- CMS-45965 – Fixed the issue where the content selector dialog closed without adding the selected image to the content area when an image was selected from search results and the content area was limited to a single content type.
- CMS-46164 – Fixed the issue where the Save and Cancel buttons in the edit dialog for nested blocks were unreachable when the dialog exceeded screen dimensions at 1280x800 resolution.
- CMS-46387 – Fixed the placeholder that remained in the content type deletion warning message in the Page Type Settings view. It now shows the name of the content type.
- CMS-46456 – Fixed an issue where background tasks could encounter conflicts, particularly with database contexts, due to running in shared environments with other parallel threads or tasks. This fix ensures that all background tasks now execute within an isolated context, preventing such conflicts and improving overall system stability and data integrity.
- CMS-46562 – Fixed degraded performance and increased resource usage that occurred when referenced content was repeatedly loaded and re-indexed during delta synchronization due to a missing de-duplication check.
- CMS-46880 – Fixed the issue where validation for DisplaySettings failed for checkbox settings that lacked associated choices.
- CMS-46919 – Fixed the validation error The identifier for Composition nodes must be formatted as a GUID (UUID) that occurred when publishing pages with node IDs in the API format. The system now supports node IDs in both dashed and undashed UUID formats.
- CMS-46881 – Fixed an issue where removing a choice from a DisplaySetting in a DisplayTemplate caused content previously saved with that setting to block publishing with an unclear validation error. The system now provides a validation warning instead of blocking publication.
- CMS-47171 – Fixed an issue where a newly created inline block, nested within another inline block in a Content Area, could not be opened for editing immediately after its creation.
- CMS-47349 – Fixed an issue where the edit dialog box for an inline block did not open, resulting in a console error, when attempting to edit an inline block nested within a Content Area property of a block used on a page in Edit view.
- CMS-48710 – Fixed an issue where the edit view re-rendered and updated content value during autosave, even when the value from the backend was not different. This caused problems with focus, mouse cursor, and expand-collapse list properties. The system only re-renders when the value is different.
- CMS-48967 – Fixed an issue where the edit dialog for a newly added block in a content area did not open for new blocks that you added to a page with existing blocks in its content area. Now, you can open the edit dialog and successfully edit any block on the page.
- CMS-49004 – Fixed an issue where the XhtmlString field refreshed, and the cursor jumped to the top or disappeared when adding a table. Now, the cursor remains in the same position, and the table is created in the correct location.
January 28
The new Generative Engine Optimization (GEO) Analytics dashboard in Optimizely Reporting gives you visibility into how AI platforms interact with your site. Use it to track AI traffic trends, identify the most active AI agents, and discover which pages are most frequently visited by AI platforms. This lets you refine your content strategy for AI optimization and improve overall engagement.
The Crawl-to-Refer Ratio dashboard now displays the top six AI platforms by request volume, aligned with the top six entries in the AI-Agent Analysis table. This gives you a consistent view of AI platform activity across both reports.
January 27
Five new Mark system tools for CMS let you create, update, publish, delete, and retrieve CMS content without leaving the Mark interface. All tools support all base content types, including pages, blocks, components, and media.
- cms_create_content_item – Create a new empty draft content instance based on an existing content type. Specify a language branch, an optional container, and an initial collection of properties. You must manually publish drafts in the CMS UI.
- cms_update_content_item – Update property values on a content item using its content key, version, and language. If the current version is published, a new draft is created automatically; if a draft already exists, it is updated. Also supports updating the outline for an Experience. This tool uses the Preview3 API.
- cms_publish_content_item – Publish a specific content instance programmatically. Specify the language branch and an optional container.
- cms_delete_content_item – Move a specific content instance to recoverable trash. Accepts the content item's ID and an optional language branch.
- cms_get_content_data – Retrieve content data for a specific content item. Include a ContentVersion to retrieve a specific version, or omit it to retrieve the published version.
Three new agents are now available in the Agent Directory to help you audit, optimize, and improve the discoverability of your CMS (SaaS) content.
- Content Refresh Analysis agent – Identifies duplicate and outdated content across your site, sorts it by last edit date, and helps you resolve issues against your content guidelines. Use it to improve SEO performance, site credibility, compliance, and content maintenance efficiency.
- GEO Schema Optimization – Automatically identifies opportunities for structured data markup in your CMS (SaaS) content to improve visibility and discoverability by large language models (LLMs).
- SEO Metadata Implementation – Evaluates existing SEO properties, identifies optimization opportunities, and recommends improvements. Upon your approval, it creates or updates SEO metadata fields directly in your CMS (SaaS) instance.