An update on this:
Optimizely responded on the ticket and advised that, as of 12.34.4, .NET is intended to be fully supported, as per World blog post: https://world.optimizely.com/blogs/bien-nguyen/dates/2026/5/optimizely-cms-12-now-fully-supports-.net-10
I have provided full reproduction steps for an empty project, as well as within Alloy.
I am providing those reproduction steps below for information.
Please see below basic reproduction steps, showing the issue with the dependency pruning only via .deps.json:
dotnet new web -n MinRepro -f net8.0
dotnet add package EPiServer.CMS --version 12.34.4
dotnet restore
dotnet build
"EPiServer.CMS.TinyMce/4.8.3": {
"dependencies": {
"EPiServer.CMS.UI": "12.34.4"
},
"runtime": {
"lib/net6.0/EPiServer.Cms.TinyMce.SpellChecker.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/EPiServer.Cms.TinyMce.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/WeCantSpell.Hunspell.dll": {
"assemblyVersion": "0.0.0.0",
"fileVersion": "0.0.0.0"
}
}
},
<PackageReference Include="EPiServer.CMS" Version="12.34.4" />
<PackageReference Include="EPiServer.CMS.UI.Admin" Version="12.34.4" />
<PackageReference Include="EPiServer.CMS.UI.Core" Version="12.34.4" />
<PackageReference Include="EPiServer.CMS.UI.Settings" Version="12.34.4" />
dotnet restore
dotnet build
"EPiServer.CMS.TinyMce/4.8.3": {
"runtime": {
"lib/net6.0/EPiServer.Cms.TinyMce.SpellChecker.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/EPiServer.Cms.TinyMce.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/WeCantSpell.Hunspell.dll": {
"assemblyVersion": "0.0.0.0",
"fileVersion": "0.0.0.0"
}
}
},
{
"sdk": {
"version": "8.0.412",
"rollForward": "latestFeature"
}
}
dotnet --version = 8.0.421
dotnet restore
dotnet build
"EPiServer.CMS.TinyMce/4.8.3": {
"dependencies": {
"EPiServer.CMS.UI": "12.34.4"
},
"runtime": {
"lib/net6.0/EPiServer.Cms.TinyMce.SpellChecker.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/EPiServer.Cms.TinyMce.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/WeCantSpell.Hunspell.dll": {
"assemblyVersion": "0.0.0.0",
"fileVersion": "0.0.0.0"
}
}
},
Whilst these steps allow for showing the impact on the .deps.json file, I have also put together steps for reproducing via Alloy, showing the impact on the RTE.
dotnet new install EPiServer.Templates@1.7.2 --force
dotnet new epi-alloy-mvc
dotnet add package EPiServer.CMS --version 12.34.4
dotnet run
RTE works:

<PackageReference Include="EPiServer.CMS" Version="12.34.4" />
<PackageReference Include="EPiServer.CMS.UI.Admin" Version="12.34.4" />
<PackageReference Include="EPiServer.CMS.UI.Core" Version="12.34.4" />
<PackageReference Include="EPiServer.CMS.UI.Settings" Version="12.34.4" />
"EPiServer.CMS.TinyMce/4.8.3": {
"runtime": {
"lib/net6.0/EPiServer.Cms.TinyMce.SpellChecker.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/EPiServer.Cms.TinyMce.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/WeCantSpell.Hunspell.dll": {
"assemblyVersion": "0.0.0.0",
"fileVersion": "0.0.0.0"
}
}
},

{
"sdk": {
"version": "8.0.412",
"rollForward": "latestFeature"
}
}
dotnet --version = 8.0.421
Clear bin/obj folders: Remove-Item -Recurse -Force bin, obj -ErrorAction SilentlyContinue
dotnet restore
dotnet build
Dependency present in .deps.json:
"EPiServer.CMS.TinyMce/4.8.3": {
"dependencies": {
"EPiServer.CMS.UI": "12.34.4"
},
"runtime": {
"lib/net6.0/EPiServer.Cms.TinyMce.SpellChecker.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/EPiServer.Cms.TinyMce.dll": {
"assemblyVersion": "4.8.3.0",
"fileVersion": "4.8.3.0"
},
"lib/net6.0/WeCantSpell.Hunspell.dll": {
"assemblyVersion": "0.0.0.0",
"fileVersion": "0.0.0.0"
}
}
},
RTE works:

Hopefully, with these steps, you can see that there's an issue when a solution has the EPiServer.CMS.UI dependencies (EPiServer.CMS.UI.Core, EPiServer.CMS.UI.Admin and EPiServer.CMS.UI.Settings) installed directly and is built using .NET 10.
A further update here:
Through conversations with Optimizely support, it appears that the following breaking change in .NET 10 is the root cause of the observed behaviour: https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/deps-json-trimmed-packages
Applying the documented recommended action for disabling the behaviour means that the issue can no longer be reproduced.
Whilst this is a workaround to restore functionality in this scenario, I have asked Optimizely if they will look at making a change within their product to prevent this being required, meaning we can keep this new feature turned on without it having an impact on Optimizely functionality
Further update:
Optimizely have confirmed this behaviour is a bug, which can be tracked here: https://world.optimizely.com/support/Bug-list/bug/CMS-52767
TL;DR
If your CMS 12 project's .csproj explicitly references EPiServer.CMS.UI.Core, EPiServer.CMS.UI.Admin, and EPiServer.CMS.UI.Settings, and your build host uses .NET SDK 10.x, TinyMce will silently stop working. No errors at startup, but the rich-text editor on XhtmlString properties doesn't render, and EditorDescriptors defined in EPiServer.Cms.TinyMce.dll (including XhtmlStringEditorDescriptor) silently disappear from the IoC container.How you probably got here
The trigger is having all three of EPiServer.CMS.UI's declared leaf dependencies (UI.Core, UI.Admin, UI.Settings) as explicit top-level <PackageReference> entries. The common path to it is upgrade tooling - anything that runs dotnet list package --outdated --include-transitive and then dotnet add package on each result. That kind of script pins every transitive to a top-level reference, which is what trips the bug.How to spot it
Drop this in Program.cs after var app = builder.Build();:The fix
Pick whichever fits better.Option A - pin the .NET SDK to 8.0.x
Drop a global.json next to your .sln:
Substitute whatever 8.0.x version dotnet --list-sdks lists on your machine. Confirm with dotnet --version from that folder (should print 8.0.x). Then:
Option B - un-pin the redundant leaves
Open your .csproj and remove the <PackageReference> lines for at least one of:What's actually happening (short version)
EPiServer.CMS.UI's nuspec declares three direct dependencies - UI.Core, UI.Admin, UI.Settings. When all three are also top-level PackageReferences in your project, NuGet treats EPiServer.CMS.UI as redundant (its only contribution to the graph is already in your direct references). Under .NET SDK 10.x the SDK then prunes it from .deps.json. When the SDK prunes a package, every inbound dependency edge to it is also stripped.
Credit and prior art
Francisco Quintanilla published a great post in December 2025 spotting the same symptom and identifying the SDK-version dependency: https://powerbuilder.home.blog/2025/12/08/fixing-tinymce-initialization-failures-in-optimizely-cms-a-hidden-pipeline-issue-with-net-sdk-versions/.Open question for Optimizely
I've raised a query with Optimizely support to ask whether this behaviour is expected, whether the proposed workaround is recommended and if there is anything that can be done Opti-side to mitigate such a workaround being required.Affected versions, summarised
.NET SDK 10.0.x