Summary
After upgrading from Photoshop 26 to 27, all XMP metadata read/write
operations in UXP plugins have stopped working. This appears to be an
undocumented breaking change that affects any plugin using XMP metadata
functionality.
Background
I maintain several UXP plugins that rely heavily on XMP metadata for
storing application data within Photoshop documents. These plugins worked
flawlessly in PS 26 and earlier versions. I also recently published “The
Definitive Guide to UXP XMP Integration” documenting best practices for
XMP operations in UXP.
What Worked in PS 26
The following standard XMP operations worked reliably:
// Direct XMP access (PS 26)
const doc = app.activeDocument;
const rawXMP = doc.xmpMetadata.rawData;
const xmp = new XMPMeta(rawXMP);
const value = xmp.getProperty(XMPConst.NS_DC, “description”);
// XMP writing (PS 26)
xmp.setProperty(XMPConst.NS_DC, “description”, “test data”);
doc.xmpMetadata.rawData = xmp.serialize();
// BatchPlay XMP access (PS 26)
const result = await action.batchPlay([{
“_obj”: “get”,
“_target”: [{ “_ref”: “property”, “_property”: “xmpMetadata” }]
}], {});
What’s Broken in PS 27
Complete XMP metadata access failure:
- Direct API Access:
console.log(app.activeDocument.xmpMetadata); // → undefined/false - ExecuteAsModal Context:
await core.executeAsModal(async () => {
const doc = app.activeDocument;
console.log(!!doc.xmpMetadata); // → false
console.log(!!doc.xmpMetadata?.rawData); // → false
}); - BatchPlay Commands:
// Returns error -25920: “The command ‘Get’ is not currently available”
const result = await action.batchPlay([{
“_obj”: “get”,
“_target”: [{ “_ref”: “property”, “_property”: “xmpMetadata” }]
}], {});
Test Case & Reproduction
I created a comprehensive test plugin to isolate this issue. The test
consistently shows:
- ✓ Document exists: “Untitled-1”
- ✗ Direct xmpMetadata: false
- ✗ Modal xmpMetadata: false
- ✗ BatchPlay fails: error -25920
Console Output:
[XMP-EXISTS] Document exists: “Untitled-1”
[XMP-EXISTS] Direct xmpMetadata: false
[XMP-EXISTS] Modal xmpMetadata: false
[XMP-EXISTS] BatchPlay failed: XMP Write Test: The command “Get” is not
currently available.
Impact on Plugin Ecosystem
This regression affects:
- Document-specific data storage via XMP
- Custom metadata workflows
- Integration with File > File Info dialog
- Cross-application metadata compatibility
- Any plugin following Adobe’s documented XMP patterns
My production plugin “Noteli” (a note-taking tool that stores notes in
XMP) completely stopped functioning after users upgraded to PS 27.
Questions for Adobe
- Is this an intentional security restriction or an unintended
regression?- No release notes mention removing XMP access
- This breaks fundamental plugin functionality without warning
- What is the official PS 27 method for XMP operations?
- Current UXP documentation still shows the broken methods
- Plugin developers need updated guidance
- Will XMP access be restored in a future update?
- Many plugins depend on this core functionality
- Need clarity for plugin maintenance planning
- Was this change made to restrict developer access to XMP metadata?
- If intentional, what’s the reasoning behind removing this capability?
- How should plugins handle document-specific metadata storage now?
Workaround Attempts
I’ve tested various approaches based on community suggestions:
- PS 27 compatible write pattern using executeAsModal() + save()
- Alternative XMP module imports (require(‘photoshop’).xmp vs
require(‘uxp’).xmp) - Permission escalation to fullAccess
- Different timing approaches with delays
None restore basic XMP read access.
Technical Environment
- Platform: macOS (Darwin 24.6.0)
- Photoshop: Version 27.x
- UXP Version: 6.2
- Plugin Type: Panel with fullAccess permissions
- Manifest Version: 5
Request for Action
This appears to be a critical regression that breaks existing plugin
functionality. Could Adobe engineering please:
- Confirm whether this is intentional or a bug
- Provide official guidance for PS 27 XMP operations
- Update UXP documentation to reflect current capabilities
- Restore XMP access if this was unintended
The plugin developer community needs clarity on this fundamental
capability that many plugins depend on.
Has anyone else experienced this XMP access regression in PS 27? Any
insights or workarounds would be greatly appreciated.