Skip to main content

Outline

At a glance:
  • What you're doing: Adding Optimizely.Cms.OpalChat as a NuGet dependency and shipping it via the standard DXP promotion flow.
  • Hidden gotcha: Package version boundaries (for example EPiServer.CMS.UI (>= 12.29.0 && < 13.0.0)) can force upgrades or break restores.
  • PaaS reality: A successful build/deploy does not guarantee Opal appears - tenant provisioning, Opti ID, and browser cookie policy still gate usability.
  • Operational principle: Treat the resulting build as an immutable artifact; promote the same output Integration to Preproduction to Production.

Introduction

Optimizely Opal Chat is delivered to CMS 12 (PaaS) as an installable app (add-on) via NuGet. From a developer operations perspective, this means Opal enablement is treated like any other dependency change: it becomes part of the application build output and must flow through the same promotion pipeline (Dev to Test/Staging to Production).

This page focuses on the technical mechanics: package acquisition, version alignment, and deployment artifact implications in CMS 12 PaaS.

1. Prerequisites and platform constraints

Opal Chat for CMS 12 has explicit platform prerequisites that affect whether installation will succeed and whether the feature will function after deployment.

Key requirements include:

  • CMS 12 must be hosted on Optimizely DXP (DXP-only capability for CMS 12).
  • The product instance must be enabled for Opti ID.
  • Opal must be provisioned at the organizational level (typically coordinated via Customer Success).
  • Third-party cookies must be allowed for the Opal UI experience.

These prerequisites are operational gates: installing the package in code does not guarantee the feature will be usable without the corresponding tenant-level enablement.

Triage: code problem or tenant/browser problem?

Select a category to expand and see the signals.

Code problem signals
  • Startup exceptions on application launch.
  • Failed restores or build errors after adding the package reference.
  • CMS UI not loading or missing assemblies after publish.
  • NuGet dependency graph conflicts during restore.
Tenant problem signals
  • Site runs fine, but Opal entry points never appear in the CMS UI.
  • Users lack entitlement or provisioning for the feature.
Browser policy signals
  • Opal UI loads inconsistently across browsers or sessions.
  • Embedded UI elements fail to render.
  • Cookie prompts or browser policy blocks third-party cookies required by the Opal experience.

2. Identify the Opal package and version boundaries

For CMS 12, the Opal Chat integration is distributed as a NuGet package: Optimizely.Cms.OpalChat.

The package declares a CMS UI version constraint. For example, version 1.2.0 requires:

  • EPiServer.CMS.UI (>= 12.29.0 && < 13.0.0)

This matters for build stability:

  • If the CMS UI package is below the minimum required version, NuGet restore can fail or resolve incompatible dependency graphs.
  • If the solution targets CMS 13 packages (or pre-release lines), the package's < 13.0.0 boundary becomes a hard incompatibility.

Important: Treat add-on installs as "package graph changes," not "feature toggles." Verify your resolved CMS UI version and confirm the rest of your CMS package family stays aligned after restore.

3. Add the Optimizely NuGet feed

Optimizely apps are distributed through Optimizely's NuGet feed. In many CMS 12 codebases, this feed is already present due to core package usage. Where it is not, add it in a controlled manner.

A common enterprise approach is to store feed configuration in NuGet.Config at repository level (or in the build agent's secured configuration).

Example: NuGet.Config snippet

XML
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="Optimizely" value="https://nuget.optimizely.com/feed/packages.svc/" /> </packageSources> </configuration>

Operational notes:

  • Some organizations proxy NuGet feeds through an internal artifact repository (Azure Artifacts, Nexus, Artifactory) to centralize caching and access control.
  • If the Optimizely feed requires authentication in the environment, credentials should be injected securely and never committed to source control.

CI-safe feed setup checklist

Select a topic to expand and read the details.

Local development

Restore must succeed without manual per-machine hacks. Developers should be able to clone the repo and restore immediately using only the committed NuGet.Config.

Build agents

Restore must succeed using injected credentials or secrets where required. Feed authentication should be wired through the CI system's secret management - never hardcoded in the repo.

No secrets in Git

No usernames or tokens should appear in the NuGet.Config file that is checked into the repository. Use environment-specific credential injection at build time.

4. Install Opal Chat via NuGet

Three installation methods are supported. Choose the one that fits your team's workflow.

Option A: .NET CLI

Bash
dotnet add package Optimizely.Cms.OpalChat

Option B: Project file (.csproj)

XML
<ItemGroup> <PackageReference Include="Optimizely.Cms.OpalChat" Version="1.2.0" /> </ItemGroup>

Option C: Visual Studio NuGet Package Manager

Optimizely's add-on installation guidance supports installing apps via Visual Studio as a standard pattern. A notable operational note applies for Azure environments: app modules should be installed through Visual Studio rather than through the Add-ons UI.

5. Restore, build, and validate dependency resolution

After adding the package reference:

  • Restore packages locally and in CI.
  • Compile the solution.
  • Verify that the resolved package graph aligns with the CMS 12 baseline.

Recommended validation steps:

  • Confirm the resolved EPiServer.CMS.UI version meets the minimum constraint required by the Opal package.
  • Confirm no unintended major upgrades occurred (for example, upgrading CMS UI packages without coordinating with the rest of the CMS package family).
  • Run automated tests, especially any CMS UI smoke tests and authentication-related tests (Opal relies on Opti ID enablement).

What "version alignment" means in practice

Select a topic to expand and read the details.

Goal

Avoid upgrading one Optimizely package family member (like CMS UI) without upgrading the rest intentionally. The entire CMS package family should be treated as a coordinated set.

Why it matters

Transitive dependencies can drift, leading to mismatched package versions that manifest as unexplained UI issues - the kind that are easy to misdiagnose as code bugs when they are actually packaging problems.

How to do it

Review the resolved dependency graph after restore both locally and in CI. Keep versions centrally managed where possible (for example, via Directory.Packages.props with Central Package Management).

6. Deployment artifact implications

Installing Opal via NuGet changes the deployment artifact in the same way as any other dependency addition. The compiled output now includes the Opal integration assembly, and the application must be rebuilt and redeployed to each environment where Opal is intended to be available.

In a typical CI/CD workflow, this means:

  • The repository contains a new package reference.
  • Build outputs must be produced from the updated commit.
  • The same build artifact (or an equivalent promoted artifact) should be deployed across environments to ensure parity.

A common pattern is to enforce a deterministic restore - locking dependency versions and using locked mode in CI to prevent dependency drift.

Locked restore in CI

Bash
dotnet restore --locked-mode

Note: If restore results differ between local and CI, you can ship different binaries (and different runtime behavior) than what you validated. For add-ons, that's how "it worked yesterday" turns into "why is the UI different today?"

7. Post-deploy verification in CMS 12 PaaS

Once deployed, confirm the following:

  • CMS loads normally with no startup exceptions.
  • The CMS UI shows expected authentication behavior under Opti ID.
  • Opal entry points appear in the CMS UI as documented.

If Opal does not appear after a successful deployment, the cause is typically outside the codebase:

  • The tenant is not provisioned for Opal.
  • Opti ID is not enabled for the instance.
  • Browser policies (third-party cookies) prevent the UI experience.

Post-deploy minimum proof checklist

Select a check to expand and read what to verify.

App boots cleanly

No startup errors in application logs. CMS UI loads and is accessible to editors. If startup exceptions appear, this is a code/assembly problem - not a tenant issue.

Authentication behaves as expected

Opti ID sign-in and role-based access control behave as expected for editors. No unexpected auth redirects or permission errors that did not exist prior to the Opal install.

Opal entry points visible

Opal UI entry points are visible in the CMS for provisioned tenants. If absent on a correctly deployed instance, escalate to Customer Success to verify organizational provisioning.

Browser policy confirmed

Confirm that the browser's cookie policy is not blocking the embedded Opal experience. Test in a clean browser profile with third-party cookies permitted if the UI appears inconsistently.

8. Why deployment discipline matters

From a business-operations angle, Opal installation is not just "adding a feature." It introduces a new capability surface in the authoring workflow. Deployment discipline matters because:

  • AI-assisted authoring changes editorial velocity and content production patterns.
  • Access and availability must be predictable across environments, especially for training, UAT, and controlled rollouts.
  • Rollback paths must be clear if governance or operational constraints require disabling the capability.

Pro tip: The technical implementation is straightforward (NuGet add-on). Operational success depends on environment parity, tenant provisioning, and disciplined release management - not just the code change.

Conclusion

Installing Opal in CMS 12 (PaaS) is a standard add-on deployment: introduce the Optimizely.Cms.OpalChat NuGet package, validate dependency constraints (notably CMS UI version alignment), and promote the resulting build artifact across environments.

Successful enablement also requires DXP hosting, Opti ID, organizational provisioning, and browser policy compatibility. A successful deployment is necessary - but not sufficient - for Opal to be usable.