Lightroom Classic Plugin Support for the Adobe Exchange for Creative Cloud
︎
Around July 27th the Exchange Marketplace supports uploads of ZXP files for Lightroom Classic
If you distribute plugins, brushes, or preset packs for Lightroom Classic via the Adobe Exchange for Creative Cloud, (or you would like to do so), this article is for you.
The Adobe Exchange Marketplace supports uploads of ZXP files for sale and distribution for most Creative Cloud desktop applications. The Partner Portal also supports uploading ZIP files which are then converted automatically into ZXP files. Prior to the release of the Creative Cloud desktop app 5.8, Lightroom and Lightroom Classic were exceptions; ZXP uploads were not supported. Developers could only upload ZIP files for Lightroom and Lightroom Classic.
︎Lightroom Classic downloads in the Creative Cloud desktop app.
Starting at MAX of 2020, end users could install and manage plugins for Creative Cloud apps using the Creative Cloud desktop application. However, Lightroom Classic was excluded from this improved process; users obtained a ZIP from the Exchange, unarchived it, and moved files into the correct directories by hand. (For example; move brushes to the brushes directory and presets to the preset directory.)
Starting with the release of Creative Cloud desktop app 5.8 (scheduled to roll out between July 18 and July 31st, 2022), the Exchange will begin to support ZXP uploads for Lightroom Classic. This means that developers and other Exchange producers can create customized ZXP packages that can install files into the correct directory automatically for end users.
To check which version of the Creative Cloud desktop app you have, on macOS go to Creative Cloud in the menu bar and click “About Creative Cloud”, and on Windows, select the Help menu, “About Creative Cloud”.
This does not mean that current Lightroom Classic listings on the Exchange will automatically be installable via the Creative Cloud desktop app. To find out how to update your listing for automated installation, read on!
ZIPs, ZXPs, Lua and Lightroom Classic
A Lightroom add-on listed in the Exchange may contain scripts, brushes, presents, or any combination thereof. For example, a Lightroom downloads in the Exchange may look like this:
myLrCdownloads.zip
├- myTemplate.lrtemplate
├- myCustomPreset.lrtemplate
└- myCustomBrush.lrtemplate
Lightroom Classic is also scriptable, and it’s possible to create Lightroom plugins. Scripts are written in Lua. Here’s the Lua documentation, (if that link gives you “Access Denied” try downloading this PDF, or follow these steps to log into the Developer Console).
A typical Lightroom plugin is structured like this:
myLrCplugin.lrplugin
├- info.lua
├- myScript1.lua
└- myScript2.lua
The Exchange can package ZIP files like the above into ZXP files. It’s then up to the end user to unarchive the ZIP, and move each file into the correct folders “by hand”. Here’s an example of a typical installation (source):
Click the ”Install now” button and let ”Creative Cloud Desktop App” unpack and create the ”jalbum.lrplugin” folder to your hard disk (usually your Downloads folder)
Move jalbum.lrplugin to one of the folders below, replacing your-username with, well, your username. - Mac OSX: /Users/your-username/Library/Application Support/Adobe/Lightroom/Modules - Windows Vista/7/8/10: C:\Users\your-username\AppData\Roaming\Adobe\Lightroom\Modules - Windows XP: C:\Documents and Users\your-username\Application Data\Adobe\Lightroom\Modules
[…]
Now that you’ve got the plug-in, let’s help Lightroom Classic find and install it:
Start Lightroom Classic.
Select File > Plug-in Manager.
Click the Add button.
Browse to the folder where you saved the plugin and select it. Then click Add Plug-in.
The plug-in should show that it’s ”Installed and running.” Click Done, and you’re set.
If you, the developer, can create an MXI file, create your own ZXP, and successfully sign it, your users can skip all the steps above and let the Creative Cloud desktop app handle the installation.
I’ll walk you through that process.
How to include brushes, presets, and other files in your ZXP
Back in 2018, my colleague Steve Kwak wrote an excellent article about how to include different files in a ZXP. That article, and the content of his “Package, Distribute, Install” guide on github are must-reads. Even though Steve’s articles are about CEP² (Common Extensibility Platform) development, 90% of this process now applies to Lightroom Classic as well.
With Creative Cloud desktop app 5.8 you have the option of adding an MXI file to your Lightroom plugin or ZIP, converting it to a ZXP file, and if you can successfully code sign your ZXP and upload it to the Exchange, you can save several installation steps for your end users (provided they are also on Creative Cloud desktop app 5.8).
Let’s say you want to package and distribute a template, a custom preset, and a custom brush for Lightroom Classic. Here’s how your ZIP would look prior to signing:
myLrCdownloads.zip
├- myTemplate.lrtemplate
├- myCustomPreset.lrtemplate
├- myCustomBrush.lrtemplate
└─ id.mxi
In this theoretical example, the id.mxi
file will specify where to install the Lightroom Classic template, the custom preset, and your custom brush. Here’s what the MXI file would look like:
https://gist.github.com/ErinFinnegan/a3005d71207c4fc3b157423d4a8086ea#file-sampleMKI-xml
In the example above, $developpresets
is a path token that indicates where to install the file. See the complete list of file tokens on this page.
⚠️ Please note the the name of the MXI file, which in our examples is id.mxi
needs to match the name of the ZXP file you upload to the developer portal. The id="EXTENSION-ID"
entry in your id.mxi
file must also have the same name.
Further Reading About MXI Files
- The complete list of file tokens
- The complete documentation of MXI file elements
- MXI File Explanation (note that Adobe Extension Manager was deprecated around 2017, but the notes about MXI files are still applicable).
“MXI is an XML schema that specifies various attributes of an extension.”
- How to customize your Adobe Creative Cloud Extension Package
Using Tokens to Tell Lightroom Classic Where to Install Your Files
Instead of needing to code in functionality to find the user’s Lightroom modules you can use the $modules
token in your MXI file. Thus, an entry like destination=”$modules”
will correctly put your file to the user’s application data folder:
- macOS:
/Users/your-username/Library/Application Support/Adobe/Lightroom/Modules
- Windows 10:
C:\Users\your-username\AppData\Roaming\Adobe\Lightroom\Modules
Similarly, you can use $localadjustmentpresets
to move brushes and presets to the correct folder: /Users/<username>/Library/Application\ Support/Adobe/Lightroom/Local\ Adjustment\ Presets
Below, I’ve included a complete list of Lightroom Classic tokens, which will also be included on this page.
Predefined Tokens
https://gist.github.com/ErinFinnegan/b751276e6ae0a9cb26af2c2f1341ecad#file-Predefined-tokens-md
Lightroom Classic Tokens for MXI Files
https://gist.github.com/ErinFinnegan/4ce2d81f99b4a7770910622feb9ab2d0#file-Shared-tokens-md
Sign and Upload Your ZXP
If you’ve got your ZIP file ready to go, must change the file extension to ZXP, and sign your ZXP using our signing instructions, prior to uploading it to the Exchange..
Signing a ZXP can sometimes be a little tricky. Here are my ZXP troubleshooting tips:
- Try a different timestamp server.
- Check for invisible files that might be tripping you up and breaking the signature, especially if you’re using node modules (granted, this is unlikely in the case of Lightroom).
- Try signing on a different platform, i.e. use macOS instead of Windows or vice versa.
- If you’re self-signing and everything else fails, use a certificate authority instead of self-signing.
- If you still can’t sign your code, you may be able to upload a ZIP instead.
︎
FAQ
Can I just keep uploading ZIPs instead? Yes, you may continue to upload ZIP files as you have in the past, however, Lightroom will not automatically know where to install the end user files unless you use the process above. Just as you do now, you will need to continue including detailed instructions for your end users.
You keep mentioning Lightroom Classic — when will Lightroom support this workflow? Nothing is confirmed yet, but perhaps support may be added in 2023. (This is still under consideration and not a final decision.)
Does this mean Lightroom will now support CEP¹? No, neither Lightroom nor Lightroom Classic have plans for CEP support.
Will Lightroom support UXP in the future? Neither Lightroom nor Lightroom Classic have UXP support on their roadmaps at the time of this writing.
Can I make a combination Photoshop and Lightroom plugin now? (Or something similar using apps other than Photoshop?) Yes! I think so. You should be able to read Steve’s article, follow the file structure, and include Lightroom files in your ZXP, as long as you include your desired file destinations in your MXI file.
A typical CEP¹ plugin has the following structure:
myCEPplugin.zxp
├- index.js
├- index.jsx
├- manifest.xml
├- index.html
└- CSInterface.js
In theory, you could now create a CEP plugin that installs with a Lightroom Classic plugin:
myCEPplugin.zxp
├- myCEPdir
│ ├- index.js
│ ├- index.jsx
│ ├- manifest.xml
│ ├- index.html
│ └- CSInterface.js
├- myLrCdir
│ ├- info.lua
│ ├- myScript1.lua
│ ├- myTemplate.lrtemplate
│ ├- myCustomPreset.lrtemplate
│ └- myCustomBrush.lrtemplate
└─ id.mxi
Again, please note that Lightroom and Lightroom Classic do not support CEP.
Note that if you try the structure above, and it doesn’t work as expected, please reach out to ccintrev@adobe.com.
Can I include executables, binaries, or installers in a ZXP file? Yes you can! Please make sure any DMG installers are Apple notarized. If your installers are only available for certain hardware architectures (i.e., Windows-only, or not compiled for Mac M1 processors) please be sure to note that in your submission to avoid being rejected by our review team.
What is the “secret sauce” that Exchange uses that alters my plugin? When you upload a ZXP to the Exchange, the Exchange adds a level of encryption. Your ZXP is then downloaded by a user logged in with an AdobeID. The ZXP is then associated with that specific user and cannot be installed by other AdobeIDs. This is where some users and developers run into problems: Users download the ZXP with one AdobeID and sign in with another. If your users are running into trouble, please have them email asupport@adobe.com.
Where to Get Help with this Process
- If you run into into issues building or uploading your ZXP file for Lightroom Classic, reach out to ccintrev@adobe.com.
- If your users are facing installation issues, have them reach out to asupport@adobe.com.
- If ZXP Sign Cmd fails, please file an issue in the repo here.
- For support from other developers, try posting your issue in the following forums: ◦ Lightroom Classic SDK forum ◦ Lightroom Classic Prerelease forums (NDA required) ◦ Exchange forums ◦ Creative Cloud developer forums under Marketplace
If none of the above helps, you can always reach out to me at finnegan@adobe.com.
[1] CEP is a combination of ExtendScript plus HTML and JavaScript used to make “panels” in many Creative Cloud applications, but not Lightroom or Lightroom Classic. See the complete table here.