ZXP Installers

HTML Panels Tips: #10 Packaging / ZXP Installers

Davide Barranca —  — 42 Comments

While there is a more user friendly app such as Adobe Packager which is a great simple app for simple needs, I will show you how to custom build ZXP installers for:

  1. HTML Extensions
  2. Bundled Flash + HTML Extensions
  3. Hybrid Extensions (Panel + Plug-ins / Assets, etc)

using the ZXPSignCmd, the ucf.jar command line tools, and custom MXI files.

As a primer on Extension installers, you must know that:

  1. in order to deploy your products (either Panels, Scripts but also assets such as Brushes, Textures, etc) you have to build a ZXP package – to be submitted to Adobe Add-ons (the Adobe Exchange web store) or distributed in other ways.
  2. ZXP must be signed with either a Paid Certificate (see a list of supported providers) or a free, Self-Signed certificate.
  3. ZXP must be timestamped. You can avoid it if you plan to sell your own stuff directly, but for some good reasons I strongly suggest you to timestamp. A table showing various scenarios is as follows:

Signature and Timestamping

More info and resources links below, so let’s start diving.

1. Create a Certificate

First, grab the CC Extensions Signing Toolkit, that is to say the ZXPSignCmd executable file.

Myself, I will go with a free, self-signed certificate: Adobe Extension Manager will fire a couple of warning popups, but Adobe Add-ons is perfectly fine with it and won’t complain.

So: fire the Terminal (or the Win Command line), get to the directory where you’ve moved the ZXPSignCmd file (if you don’t know how to do this, just type “cd ” – mind you there’s a space – in the terminal and drag and drop the folder, then hit Enter) and create a certificate using this pattern:

An actual example with fake data can be:

Mind you, ./ at the beginning instructs the shell to look for the executable in the current directory. If everything went OK you should find a newly created selfDB.p12. That’s your self signed cert.

2. Pack and Sign an HTML Extension

HTMLLet’s assume the extension you’ve made has the ID com.example.helloworld and it’s contained within a directory named accordingly.

Gather together the Extension with the ZXPSignCmd and the selfDB.p12 in one folder, then build the ZXP using this pattern:

Which in our example (I’ve put a fake password too) translates in:

If everything’s OK you should find a newly created com.example.helloworld.zxp file. That’s your self signed, timestamped installer; submit it to the Add Ons website and/or privately and enjoy.

3. Pack and Sign HTML + Flash Extensions

Here comes the fun. I assume you have (for the same product) already coded and packed an HTML version, plus the Flash version, so you have:

  • com.example.helloworld.zxp (HTML version, packed and signed as shown above)
  • com.example.helloworld.zxp (Flash version, packed and signed with Flash Builder 4.5 as we used to do back in the Flex days)

Mind you, I use IDs for the ZXP names because in the past Adobe Exchange was a bit picky in that regard – so it’s not just hello.zxp. I don’t know whether things have changed now, try and let me know.

HTML_Flash_FoldersPlease grab the ucf.jar command line tool and arrange things in the way shown in the screenshot at right.

That is to say, put into a folder:

  1. the selfDB.p12
  2. the ucf.jar
  3. a 46x46px icon.png (to be used as the icon in Extension Manager)
  4. a new MXI folder. Inside the MXI there’s:
    • an HTML folder containing the HTML panel ZXP installer,
    • a FLASH folder containing the Flash panel ZXP installer,
    • a MXI file, which I’m going to talk about right now.

MXI file

Basically it’s an XML file containing instruction for the files deployment and lots of metadata. Please refer to this Extension Manager CC Configuration File Reference for extra info and best practices.

As follows the MXI needed to correctly deploy both Flash and HTML extensions. Mind you, PS CS6 (13.x) and current CC (14.x) are supporting Flash, while HTML is for Photoshop-next (which I assume that is going to be 15).

Couple of things to notice:

  • In the product tag, the version is actually the minimum version supported.
  • When the file-type="CSXS" there’s no need to specify the destination.

Now, fire the Terminal and:

It will ask you for the p12 password, and eventually the com.sample.helloworld.zxp file is built.

Some other notes:

  • You might need to download Java from Oracle
  • I’ve changed the timestamp url (that’s another option)
  • There’s a final dot you have to keep!

You may ask why the ucf.jar and not ZXPSignCmd: the reason is that, in order to be CS6 compatible, ucf.jar is the tool of choice.

4. Pack and Sign Hybrid Extensions

Hybrid MXIHybrid extensions let you install extra content, which can be platform (Mac/Win) and/or version (CS6/CC) and/or bit version (32/64bit) targeted: either Plugins, PDFs, etc.

In fact the Flash+HTML extension above qualifies as an Hybrid extension too.

In this example I will bundle a lot of extra content – keep in mind that all the paths are relative to the MXI file location.

For the completeness sake, I will then use the ZXPSignCmd since we will pretend that this one is a CC only Extension.

Then you have to fire the Terminal and as usual:

That should hopefully create a ZXP, deploying:

  1. The HTML Panel
  2. General assets (in my case a PDF and an HTML file) in a User’s Home subfolder
  3. C/C++ Plugins (targeting Mac/Win versions, 32 and 64 bits)
  4. JSX Scripts in the Photoshop CC/Presets/Scripts custom named subfolder

Please refer to this page for a description of General and Product Specific Path Tokens.


This brief guide is far from being exhaustive – I’ve only described things that I know first hand. For a better understanding of the topic, please refer to the following official documentation:

Print Friendly, PDF & Email

42 responses to HTML Panels Tips: #10 Packaging / ZXP Installers

  1. Thank you very much Davide for all your extensions posts 🙂

  2. Thank you Davide – I can now package my photoshop cc extensions.

    I am having some issues with the mxi fie:
    1. I have place the mxi file outside my extensions folder. The extension is created (zxp), but when I go to the extension manager there is no description, no author.
    2. How do I make the name in the Extension manger be the actual name of the extension (ProductX) instead of com.sample.xxx?

    Thank you – Sam

  3. Never mind Davide – I figured it out.

    Just need to read slower and pay more attention.

    Thanks again for this great resource.


  4. David,
    Any changes regarding creation panels for Indesign? I’ve created dummy extension targeted to Indesign (via Brackets extension), but its invisible in Window/Extension, while the same one but targeted to Photoshop is visible in the app. Any ideas?

  5. Hi Davide,
    I have a question on this:

    I want to have a folder within the DOCS/, but when I tried it the folder was removed and the files in the the DOCS/ folder where in a list.
    Would I change this ” file-type=”ordinary”” to something else?

    Thanks again for a great resource – Sam

  6. Every time I try to package my HTML & Flash extensions together using the method described above, I am unable to install the ZXP. When opened with Extension Manager, it says “The extension embedded in the ‘XXXX’ extension is not valid. The ‘XXXX’ extension will not be installed.

    However, if I try opening either of the HTML or Flash extensions by themselves (instead of in the “hybrid” package), they both install fine. Any suggestions as to what may be causing the problem?

    • I’ve had the same problem myself – there’s something wrong in the MXI (try to open it in Sublime Text or something similar with syntax highlighting on) I don’t remember what exact error I did make.

  7. Thanks Davide – actually now it works. Go figure.

    Thanks – Sam

  8. Shawn Flanagan July 15, 2014 at 6:03 PM

    I think I figured out the problem I was having. When I was packaging my Flash (CS6/CC) version of the panel, I was using the UCF command line tool with an MXI. This meant that my HTML+Flash hybrid ZXP file technically had two MXI files in it, which I believe was causing the errors in Extension Manager when trying to install the extension.

    However, now that I have overcome that hurdle and have started packaging my Flash version with just a Manifest.xml file (using Configurator instead of Flash Builder), I keep receiving the following error in Extension Manager: “Failed to update database. The extension will not be installed”. Researching the problem, it appears that the issue is fairly common right now in the current version of Extension Manager, so I’m not sure how to fix it yet.

  9. Hi Davide

    Me again. Trying to package up the extension you helped me with and all of a sudden I am getting: “./ZXPSignCmd: No such file or directory”.

    Input: ./ZXPSignCmd -sign com.smilepix.sezi com.smilepix.sezi.zxp cert.p12 password -tsa https://timestamp.geotrust.com/tsa

    The only thing that has changed since last week is the upgrade of the Mac OS to 10.9.4 (previous version 10.9.3). Everything else is the same.

    I was wondering if you are on a Mac and have upgraded to 10.9.4. If so could you test this to see if you get the same error?

    Thanks – Sam

    • Howdy Sam, the “no such file or directory” usually means that you’re in the wrong folder (it happens all the time with me too).
      Digit pwd plus return, it will output the Present Working Directory (the path of the folder you’re in): is the correct one?
      If it is, type ls -G, you should see ZXPSignCmd among other items, in red. If you’ve too many things in the folder, try ls | grep ZXPSignCmd (it will list the ZXPSignCmd only).
      If it’s there but keeps not work, try downloading it again, they’ve uploaded a new version a few weeks ago.

  10. Silly me – I forgot the cd before the directory.

  11. Rémi Doolaeghe July 23, 2014 at 8:49 AM

    Could you explain what is the difference between using ucf.jar and ZXPSignCmd? I’m not sure I understand well the difference between them.
    In my experience, I think I have noticed using ucf.jar for CC and CC 2014 hybrid extension packaging did not fit well. The symbolic links (on a mac) packaged within native plugins are replaced by the destination file of the link once the zxp installed, making the plugin invalid. Could you confirm this?

    • Salut Rémi,
      I’ve been told by Adobe engineers that, in order to support CS6+CC+CC2014 in a single installer, the hybrid package must be built with ucf.jar (I suppose the culprit is Extension Manager CS6 who has problems “understanding” packages made with ZXPSignCmd). Yet, as you’ve seen, ucf.jar might not handle symlinks properly – it’s a long time issue (can’t say if/when they will ever fix it). I know the EB team has released very recently a new ZXPSignCmd who should be better on the job; frankly, I would suggest to distribute separate installers (one for CS6, one for CC/CC2014) but if you’re in need to have a single ZXP, that’s the only way. Which as you see might not be viable in some circumstances.
      Hope this helps clarifying!

      • Rémi Doolaeghe July 25, 2014 at 2:48 PM

        Yes, it clarified the situation. 🙂
        With your contribution, I have been able to start discussing with Adobe to looks for a solution (this won’t be immediate, as vacation will delay the discussion!).
        I had noticed in the past all the issues those symlinks in native plugins could bring. We had no choice of hacking some parts of our build to preserve these fragile links. But we could not do miracle within the Extension Builder…
        Maybe we will have to have two separate ZXP. This is a possible solution, even if we would prefer to have a single one. I’ll keep searching a solution. Maybe I will be able to bring some update to this article in coming weeks… so see you soon!

        • Rémi Doolaeghe July 28, 2014 at 9:39 AM

          Hi Davide,
          You were right about compatibility of UCF and ZXPSignCmd. UCF is for version up to CS6, and ZXPSignCmd for CC and later.
          The solution told me by Fraser Gregor, engineer at Adobe which has been involved in ZXPSignCmd development, is having a ZXP for CS6 and earlier, another ZXP for CC and later, and then a wrapper ZXP which contains these two ZXPs. This is the proposed solution for having an universal ZXP.

          • Hi Rémi, absolutely!
            To sum up, one has to use

            1. ucf.jar to pack a CS6 ZXP
            2. ZXPSignCmd to pack a CC ZXP
            3. ucf.jar (and a MXI) to pack a hybrid ZXP wrapping those two ZXPs

            This proved to work – provided that ucf.jar doesn’t mess with symlinks, at least.

  12. Hi Davide – After seeing the thread above, I may have a partial solution to something that has just cropped up in Windows 7.
    I used the “Pack and Sign Hybrid Extensions” successfully to package two extensions and a folder for Photoshop CC 2014. I recently made some changes to the hostscript.zxp file and repackaged it using the same method as above. I used Extension Manage CC Windows to install the extensions from the package. Extensions Manager shows they are installed, but in Photoshop CC 2014 (Windows 7), Extensions is grayed out. The same ZXP package installs fine on a Mac.
    When I install the two extensions separately in Windows using “Pack and Sign an HTML Extension”, they both install fine.
    Nothing that I know of has changed in Windows since the successful installation of the ZXP package two weeks ago.
    I don’t have a clue, Do You?

    Thank You – Sam

    PS – I posted this question on Adobe Extension Forum (gave you a plug) https://forums.adobe.com/thread/1544798

  13. Follow up. I tried to package using ucf.jar and though it packaged everything into a .zxp, when I tried to install I get this: The extension “xxxx” does not cantina a valid signature. The extension will not be installed.
    This is what I used:
    java -jar ucf.jar -package -storetype PKCS12 -keystore ./xxxcert.p12 -tsa http://timestamp.entrust.net/TSS/JavaHttpTS xxxx.zxp -C “./MXI/” .

    I am trying to see if I can get my Photoshop CC 2014 Windows 7 to install.
    Using the ZXPSignCmd works for Macs, but not now for Windows 7 (As I said it worked two weeks ago),

  14. Anyone know how to include a custom End User License Agreement and Description in the ZXP package? Can this be done with the command line tool? Thanks!

  15. Hi Davide,

    I am trying to have some actions installed along with an extension and they are not installing in Photoshop. I am using Terminal with the ZXPSignCmd. I am wondering if I have the “destination” and/or “file-type” wrong. This is what I have:

    Thanks in advance for your help – Sam

  16. ZXPSignCmd gave me the following error while trying to sign my extension:
    Error – Could not locate file. Process failed.

    After searching what caused the problem it turned out that the .bin folder inside the node_modules folder contained a file ‘mkdir’ which seemed to be a reference to a node library that was not installed. After deleting that file the signing succeeded.

    Thought I’d mention this for future reference.

  17. I have successfully created zxp for my html extension but when I put it in “C:\Users\dbe1\AppData\Roaming\Adobe\CEP\extensions” folder and start illustrator, I cannot see my extenions under window-> extensions.

    Anyone faced similar problem?

  18. Pretty helpful stuff.
    For packaging on Windows, I highly recommend making a .bat file 😀 Less time spent in the cmd

    Super easy to make as well.
    1. Wherever your ZXPSignCmd is right click and make a new txt file but name it something like ZXPSigner.bat (I also keep my .p12 in the same folder for easy packaging)
    2. Right click your new file and go edit
    3. Fill in the same data you would for your cmd and from then on you will only have to double click to package 🙂

    ZXPSignCmd -sign FolderOfYourExt WhateverYouWant.zxp YourSigningP12.p12 Password

    Is what I use for the stuff inside (step 3)

    Maybe it helps someone 🙂

  19. Hello Davide, great post … can you advise me on what is the best way to package a extension for push install to multiple computers. It needs to support cc2015 which only has the command line for installing extensions. How is it possible to install a zxp extension remotely by an admin?

  20. Forgive me for asking what I hope isn’t an obvious question – I’ve created an extension for CS6 in Configurator 4, which now seems unable to export a ZXP due to the timestamp authority closing. I’ve figured out how to create a ZXP using ZXPSignCmd, and can sign it, but I’m unsure of what files I need to gather, and where, to create a working extension, using the files created in and by Configurator 4.
    The panel I’ve made simply contains an HTML widget, for which I have multiple html/css/js + jsx files. I’ll be distributing the extension to my work colleagues but will not need it to pass any stringent tests to go on Exchange – as long as it installs via Extension Manager I’ll be happy.
    Any help would be massively appreciated!

  21. Hi,

    What is the manifest file tag,
    familyname or name for Aftereffects?


  22. Richa Srivastava September 8, 2017 at 7:08 AM

    Hey! Unable to find ucf.jar at the mentioned link. Adobe website shows a 404 error!
    Any other locations to download it from?

  23. To anyone who might still be having issues with this, I’d like to mention that timestamping failed 100% for me even with the new URLs with this same error message:
    “Error – cannot contact the chosen TSA. Please make sure the URL is valid and that you are connected to the internet.”

    That is, until IT created a firewall rule to allow me to connect to one of them. I succeeded with the following line (note the lack of absolute paths, http:\\ and trailing slash)

    ZXPSignCmd.exe -sign com.default.name name.zxp test.p12 testpassword -tsa timestamp.digicert.com

    Thanks for everything, Davide! 🙂

  24. Thank you so much Davide! You are the Barman of our times!

  25. FYI that latest Java JDK v11 will fail when trying to create ZXP files. It throw errors (such as “java.lang.NoClassDefFoundError: com/rsa/certj/CertJException” or Exception in thread “main” java.lang.reflect.InvocationTargetException) when running java -jar ucf.jar…

    The older and still available JDK v8 works fine: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  26. Hi David,

    We have used these steps to create our first extension back in 2014, for Premiere pro.
    Good to see this thread is still active.

    Now we have a problem with making a Hybrid After effects panel.
    What should we give as the product name for After effects hybrid panels in the mxi file?

    We tried like this, but on install it will give -160 error (There is a file operation error when installing this add-on).

    Any possible solution for this?

    Thanks and Regards,
    Anoop NR

Trackbacks and Pingbacks:

  1. HTML Panel Tips #17: CC2015 Survival Guide | Photoshop, etc. - June 16, 2015

    […] CEP panels need to be signed/timestamped – I personally do this via ZXPSignCmd commandline tool, you’ll find all the excruciating details here). […]

Leave a Reply

Text formatting is available via select .

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">