CEP to UXP Migration: What Plugin Developers Need to Know

📅 November 2025 ✍️ Koray Taşan ⏱️ 8 min read

Adobe's shift from Common Extensibility Platform (CEP) to Unified Extensibility Platform (UXP) is the most significant change to plugin development in a decade. If you're maintaining a CEP-based extension, here's what you need to know — and why rushing to migrate might be a mistake.

Why Adobe Is Killing CEP

CEP was built on Chromium Embedded Framework — essentially, each panel ran as a full Chrome browser instance. This architectural choice had consequences:

For creative apps already pushing hardware limits (looking at you, After Effects), this was unsustainable. Enter UXP.

UXP: Faster, Lighter, More Restrictive

UXP replaces Chromium with a native JavaScript engine. The benefits are immediate:

But there's a catch: UXP is far more restrictive. Features that were trivial in CEP now require workarounds or are impossible.

What You Lose in UXP

Critical Reality Check: Some advanced features (like Premiere Pro's Export Controller API) still require CEP or C++ plugins. UXP can't access everything yet.

When to Migrate vs. When to Wait

Migrate to UXP If:

Stick with CEP (For Now) If:

The Hybrid Approach (Our Recommendation)

The smartest strategy for complex plugins: UXP for UI, C++ for backend.

Here's how it works:

  1. Build your panel UI in UXP (fast, lightweight)
  2. Write performance-critical logic in C++ as a native plugin
  3. Communicate between them via Adobe's scripting bridge
// UXP Panel (JavaScript) const { entrypoints } = require("uxp"); entrypoints.setup({ plugin: { create() { // Call C++ plugin via ExtendScript const result = app.executeScript("MyCppPlugin.processVideo()"); console.log("C++ returned:", result); } } });

This gives you UXP's performance benefits while bypassing its limitations. Kreative Core's Vision plugin uses this exact architecture.

File System Access: The Biggest Pain Point

In CEP, you could read/write anywhere:

// CEP (Old Way) const fs = require('fs'); fs.writeFileSync('/Users/editor/Desktop/export.json', data);

In UXP, users must grant explicit permission:

// UXP (New Way) const { localFileSystem } = require("uxp").storage; async function saveFile() { const folder = await localFileSystem.getFolder(); // User picks folder const file = await folder.createFile("export.json"); await file.write(data); }

This adds friction but improves security. Power users appreciate the control.

UI Changes: Spectrum or Bust

CEP let you use any CSS framework (Bootstrap, Tailwind, custom). UXP enforces Adobe Spectrum:

<sp-button variant="cta">Process Footage</sp-button> <sp-slider min="0" max="100" value="50"></sp-slider>

Pro: Your plugin looks native.
Con: Less design freedom.

For SaaS-like plugins (where brand identity matters), this can be limiting. But for utility tools, Spectrum is perfect.

Migration Timeline: Plan for 6-12 Months

Here's a realistic migration path:

Don't Rush: Adobe still supports CEP. Premiere Pro 2025 runs CEP panels perfectly. Migrate when UXP truly benefits your users, not just to chase the new platform.

Our Experience: Kreative Core Vision

When building Vision, we initially tried pure UXP. We hit walls immediately:

Solution: UXP panel + Node.js backend running as a separate process. Best of both worlds.

Key Takeaways