data-slots=heading, text
data-variant=centered
data-textColor=white
data-background=linear-gradient(135deg, #30186E 0%, #6432C8 100%)
CEP to UXP Migration Center
Creative Cloud CEP to UXP plugin transition
For FAQs related to how the transition affects Creative Cloud plugins and their users, see Creative Cloud CEP to UXP plugin transition.
CEP to UXP migration milestones
This timeline combines UXP plugin availability with the planned Marketplace and end-user milestones for transitioning existing CEP panels in each application. Yellow marks milestones affecting third-party developers; pink marks changes affecting end users. GA means generally available.
Milestones by application
- Photoshop: By MAX 2026, UXP Plugins, UXP Scripts, and UXP Hybrid Plugins reach GA. The Marketplace stops accepting new CEP Panels in Q2 2027. In Q3 2027, users and developers are to be notified that CEP Panels will be disabled by default in December; CEP Panels are scheduled to be disabled by default in December 2027.
- InDesign: UXP Plugins and UXP Scripts reach GA by MAX 2026, followed by UXP Hybrid Plugins in Q3 2027. The Marketplace stops accepting new CEP Panels in January 2028. Users are to be notified, and CEP Panels disabled by default, in December 2028.
- Premiere: UXP Plugins and UXP Hybrid Plugins reach GA by MAX 2026. The Marketplace stops accepting new CEP Panels in December 2027. Users are to be notified, and CEP Panels disabled by default, in December 2028.
- After Effects: UXP Plugins enter Public Beta by MAX 2026 and reach GA, with UXP Hybrid Plugins, in Q2 2027. The Marketplace cutoff for CEP Panels, user notification, and default disabling of CEP Panels are scheduled for December 2028.
- Illustrator: UXP Plugins enter Private Beta by MAX 2026 and Public Beta in Q2 2027. UXP Plugins and UXP Hybrid Plugins are scheduled to reach GA in Q4 2027. The Marketplace cutoff for CEP Panels, user notification, and default disabling of CEP Panels are scheduled for December 2028.
- Media Encoder: UXP Plugins enter Public Beta by MAX 2026 and reach GA, with UXP Hybrid Plugins, in Q1 2027. The Marketplace cutoff for CEP Panels, user notification, and default disabling of CEP Panels are scheduled for December 2028.
Across products, CEP Panels are scheduled for removal in December 2029; the roadmap notes they remain available in N-1 and N-2. Assuming N means the product release in which removal occurs, N-1 is the immediately preceding release and N-2 is the release before that. The roadmap does not map these labels to calendar dates or specific host-app versions. Treat the dates as high-level targets.
How to approach it
There's no single fixed recipe, since every CEP plugin is different, but here's a sample approach that works for most:
-
Inventory what your CEP extension actually depends on. Go through your
manifest.xmland code, and sort what you find into categories: ExtendScript/evalScriptcalls, native CEP functions (window.cep.fs,window.cep.process,window.cep.encoding,window.cep.util), CEP JavaScript libraries (CSInterface, Vulcan), and any Node.js modules you're relying on through CEP's unrestricted access. This inventory becomes your migration checklist, separate from the code that implements it. -
Check what's already built in. Some features that once required a CEP extension are now native in the latest version of the host application. Confirm before you rebuild anything; you may be able to drop a feature entirely.
-
Map each remaining item in your checklist to its UXP equivalent. A few of the most common ones:
window.cep.fs→ UXP'sstoragemodule, which requires user consent (a file picker) for most file access instead of CEP's unrestricted access.window.cep.process→ UXP has no comprehensive process API; the closest options areshell.openPath()andshell.openExternal()for launching files and URIs, gated by thelaunchProcesspermission in the manifest.- ExtendScript/
evalScript→ the host application's UXP DOM API directly. In Photoshop,batchPlaycan cover operations that the Photoshop DOM API does not expose.batchPlayis Photoshop-specific; use your host's UXP API reference to assess DOM coverage in Premiere, InDesign, and Media Encoder. CSInterface→ direct calls to host UXP APIs, plus UXP's own lifecycle events (uxpcreateplugin,uxpshowpanel, and similar) for things CSInterface used events for.- Vulcan (cross-plugin messaging) →
invokeCommandandshowPanel(UXP 6.0.2+, manifest v5), currently limited to plugins within the same host application.
See Migrating Native CEP Functions (common across host apps), Migrating CEP JavaScript Libraries (Photoshop), and Migrating ExtendScript/EvalScript to the Photoshop DOM API in the Technical Migration Guide for the full API-by-API breakdown, including limitations and permission requirements for each.
-
Rebuild feature by feature. Start with
manifest.jsonand yourentrypoints.setup()handlers, then work through the UI and each mapped feature using the manifest, entry point, and packaging guidance in the guides below. -
If a feature still isn't covered, for example something that depends on native code, an external process, or a performance-intensive operation, look into building a Hybrid Plugin instead of waiting for a UXP API to catch up. A Hybrid Plugin combines a UXP plugin with C++ native libraries, so you can keep that logic and call it from UXP. See the Hybrid Plugins guide for details.
Where to Start
data-slots=image, heading, text, links
data-repeat=3
data-width=100%
CEP to UXP Technical Migration Guide
UXP for ExtendScript Developers
UXP in Photoshop vs Other Host Applications
What changes at a glance
- No embedded Chromium. CEP ran each extension in its own full Chromium instance. UXP plugins run in a single shared, sandboxed JavaScript engine, with no Chromium Embedded Framework bridge and no
CSInterface. - One JavaScript engine, not two. CEP split logic between a Chromium panel and ExtendScript host code, connected through
evalScriptcalls. UXP plugins call host DOM APIs directly from the same JavaScript context. - A new manifest.
manifest.xmlbecomesmanifest.json. Panel entry points, permissions, and plugin IDs are declared differently; see each host's own UXP API reference for the exact manifest field mapping. - Sandboxed by default. UXP plugins declare the file system, network, and process permissions they need in the manifest, instead of relying on unrestricted Node.js access. If your CEP extension shelled out to Node.js, plan for a manifest permission review; see the Knowledge Base for a documented pattern for restructuring around this constraint.
- Native UI controls. UXP plugins can use Spectrum UI components that match the host application's own interface, instead of hand-styling HTML to approximate it.