Some of My VST3 Bundles Stopped Working

This is weird. I have 13 plugins using VST3 bundles since that change was introduced. They all have had no problem in the bundle format.

I am in the process of recompiling with Visual Studio 2026. Now, some of the plugin bundles function as expected, but some don’t! The ones that don’t are loaded into the DAW, but the editor will not open.

If I use the raw .vst3 file directly without the bundle everything works normally. I have gone back and forth through my settings to no avail. I cannot find a difference between the ones that work as a bundle and the ones that don’t.

Has anyone else experienced this? Any clues?

Windows 11, JUCE 8.0.10 (develop)

  • Which host(s) are you using for testing? Are the bundles broken in all the hosts you’ve tried?
  • Given that the plain plugin binaries still work when moved out of the bundle, my best guess is that the problem is related to the moduleinfo.json. If you still have copies of the plugins in bundle format from an older working build, are there differences in the moduleinfo.json between the old and new plugins?

I have tried in my own DAW (JUCE/TracktionEngine), and in Waveform, with identical results. I have examined the json files, and can’t spot any diference, other than the obvious numbers, plugin name, etc.

I am at a loss.

Have you tried clearing any cached plugin lists and rescanning the new bundles? Maybe some identifying property of the plugin (internal UIDs) has changed and now conflicts with stored plugin metadata cached by the host. It’s conceivable that Waveform is treating the un-bundled plugins as ‘new’, because the path to the plugin binary itself is different.

You could also try checking the old+new plugins in Steinberg’s VST3PluginTestHost, which is part of the VST3SDK distribution: https://www.steinberg.net/vst3sdk

The test host includes an ‘info’ window that shows information about the plugin. I recommend comparing the info for the working and broken plugins to see if there are any differences.

I’ve discovered that the AudioPluginDemo works just fine as a bundle with everything consistent. So I am now going through my code in comparison to see what the difference might be.

I’ll report back once I’ve uncovered what the issue is.

I scrapped the original Projucer project and created a new one. I copied the source files into the new project. Then, after compiling, the plugin ran and opened without issue.

I will know for sure after I do the same on a few more plugins. But, this seems to be a fix.

Its puzzling because I always compile a new Projucer each time I download the JUCE develop files. And you would think the new Projucer would map the existing “.jucer” file to any new requirements. And perhaps it does. But, right now, it is at least a possibility that some detail was missed in the translation.

Anyway, its a good idea at all times to start over fresh when getting strange results.

Thank you for your help!

I’ve created new Projucer projects for two more plugins. All are working as expected after the transplant into a new project. So, the new project method is the one to use for this particular fix. At least, it works for me.

Are you able to compare the working .jucer file against the old one? Are there any significant differences?

I will include both the previous and new jucer files for on of the problematic plugins. Hopefully, you can see something significant. First is the previous version.

<?xml version="1.0" encoding="UTF-8"?>

<JUCERPROJECT name="SpecTrend" projectType="audioplug" companyName="Direct Approach"
              companyCopyright="2018-2024 Direct Approach" companyWebsite="https://www.directap.com"
              companyEmail="info@directap.com" reportAppUsage="0" displaySplashScreen="1"
              bundleIdentifier="com.directapproach.spectrend" buildAU="0" buildVST3="1"
              buildAAX="0" pluginName="SpecTrend" pluginDesc="SpecTrend" pluginManufacturer="Direct Approach"
              pluginManufacturerCode="DiAp" pluginCode="SpTr" aaxIdentifier="com.directapproach.SpecTrend"
              pluginAAXCategory="0" version="2.1.5" pluginAUExportPrefix="SecTrendAU"
              pluginFormats="buildVST3" buildVST="0" buildAUv3="0" buildRTAS="0"
              buildStandalone="0" enableIAA="0" pluginVSTCategory="kPlugCategEffect"
              pluginVST3Category="Analyzer" id="HjHUdd" pluginAUMainType="'augn'"
              jucerFormatVersion="1" defines="JUCE_MODAL_LOOPS_PERMITTED = 1;&#10;"
              cppLanguageStandard="20">
  <MAINGROUP id="M21AxG" name="SpecTrend">
    <GROUP id="{88FD148D-E3BF-BC13-1A52-5E9B584E057E}" name="Source">
      <FILE id="FMUJyi" name="WeightingButtons.h" compile="0" resource="0"
            file="Source/WeightingButtons.h"/>
      <FILE id="zKJYTC" name="HorizontalSlider.h" compile="0" resource="0"
            file="Source/HorizontalSlider.h"/>
      <FILE id="yoz36w" name="Spectrogram.h" compile="0" resource="0" file="Source/Spectrogram.h"/>
      <FILE id="lNmVEB" name="PluginProcessor.cpp" compile="1" resource="0"
            file="Source/PluginProcessor.cpp"/>
      <FILE id="N5ORPK" name="PluginProcessor.h" compile="0" resource="0"
            file="Source/PluginProcessor.h"/>
      <FILE id="yMmcUT" name="PluginEditor.cpp" compile="1" resource="0"
            file="Source/PluginEditor.cpp"/>
      <FILE id="oQDStk" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
    </GROUP>
  </MAINGROUP>
  <EXPORTFORMATS>
    <VS2022 targetFolder="Builds/VisualStudio2022" aaxFolder="..\..\SDKs\aax-sdk-2-4-1">
      <CONFIGURATIONS>
        <CONFIGURATION isDebug="0" name="Release" optimisation="4"/>
      </CONFIGURATIONS>
      <MODULEPATHS>
        <MODULEPATH id="juce_audio_basics" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_audio_devices" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_audio_formats" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_audio_plugin_client" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_audio_processors" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_core" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_cryptography" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_data_structures" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_dsp" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_events" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_graphics" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_gui_basics" path="C:\SDKs\JUCE\modules"/>
        <MODULEPATH id="juce_gui_extra" path="C:\SDKs\JUCE\modules"/>
      </MODULEPATHS>
    </VS2022>
  </EXPORTFORMATS>
  <MODULES>
    <MODULE id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_devices" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_formats" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_plugin_client" showAllCode="1" useLocalCopy="0"
            useGlobalPath="1"/>
    <MODULE id="juce_audio_processors" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_core" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_cryptography" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_data_structures" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_dsp" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_events" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_graphics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_gui_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_gui_extra" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
  </MODULES>
  <JUCEOPTIONS JUCE_VST3_CAN_REPLACE_VST2="1"/>
  <LIVE_SETTINGS>
    <WINDOWS/>
  </LIVE_SETTINGS>
</JUCERPROJECT>

Next, the new version.

<?xml version="1.0" encoding="UTF-8"?>

<JUCERPROJECT id="nuMkEu" name="SpecTrend" projectType="audioplug" useAppConfig="0"
              addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1" companyName="DIRECT APPROACH"
              companyCopyright="(c) 2025 Direct Approach" companyWebsite="www.directap.com"
              companyEmail="info@directap.com" pluginFormats="buildVST3" pluginVST3Category="Analyzer"
              cppLanguageStandard="20">
  <MAINGROUP id="SoQarr" name="SpecTrend">
    <GROUP id="{64A65375-543E-8CF4-BFB2-93487D86B046}" name="Source">
      <FILE id="hTpsJM" name="PluginProcessor.cpp" compile="1" resource="0"
            file="Source/PluginProcessor.cpp"/>
      <FILE id="w2yheB" name="PluginProcessor.h" compile="0" resource="0"
            file="Source/PluginProcessor.h"/>
      <FILE id="e4LEHG" name="PluginEditor.cpp" compile="1" resource="0"
            file="Source/PluginEditor.cpp"/>
      <FILE id="NlSDwT" name="PluginEditor.h" compile="0" resource="0" file="Source/PluginEditor.h"/>
    </GROUP>
  </MAINGROUP>
  <MODULES>
    <MODULE id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_devices" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_formats" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_plugin_client" showAllCode="1" useLocalCopy="0"
            useGlobalPath="1"/>
    <MODULE id="juce_audio_processors" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_audio_processors_headless" showAllCode="1" useLocalCopy="0"
            useGlobalPath="1"/>
    <MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_core" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_data_structures" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_dsp" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_events" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_graphics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_gui_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
    <MODULE id="juce_gui_extra" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
  </MODULES>
  <JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_VST3_CAN_REPLACE_VST2="0"/>
  <EXPORTFORMATS>
    <VS2026 targetFolder="Builds/VisualStudio2026">
      <CONFIGURATIONS>
        <CONFIGURATION isDebug="0" name="Release" targetName="SpecTrend" warningsAreErrors="1"/>
      </CONFIGURATIONS>
      <MODULEPATHS>
        <MODULEPATH id="juce_audio_basics" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_audio_devices" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_audio_formats" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_audio_plugin_client" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_audio_processors" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_audio_processors_headless" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_audio_utils" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_core" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_data_structures" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_events" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_graphics" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_gui_basics" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_gui_extra" path="../../SDKs/JUCE/modules"/>
        <MODULEPATH id="juce_dsp" path="../../SDKs/JUCE/modules"/>
      </MODULEPATHS>
    </VS2026>
  </EXPORTFORMATS>
</JUCERPROJECT>

Creating new jucer files is solving my issue, and hopefully may help others.

Let me know if you need more information?

It looks like the preprocessor definition JUCE_VST3_CAN_REPLACE_VST2 is 1 in the old file, and 0 in the new one. This flag affects the unique identifer of the plugin, so this is almost certainly the cause of the different behaviour. So, now we need to work out how this got changed, and make sure that things continue to work properly when this flag is restored to its original value.

Please could you clarify what you mean by “new” and “previous” in your post, since it sounds like there are at least three different project versions (sorry, I was vague when I asked to see the project files)

  1. The original project (working)
  2. That project file loaded in Projucer 8.0.10 and resaved (broken)
  3. A new project file created from scratch in Projucer 8.0.10, copying over settings from the original files (working again)

I’m assuming that “previous” refers to option 1, but it’s unclear whether the “new” file corresponds to option 2 or 3.

“Previous” is number 2. “New” is number 3.

There have been a couple of plugins that work unmodified. But I am pretty sure I’ve recompiled them in the past few months. All the “broken” ones were last compiled, I believe, in February.

I build my plugins only for my own use now. All I need is VST3. Backwards compatibility is not required.

When I bump another one and it is “broken”, I’ll first try setting JUCE_VST3_CAN_REPLACE_VST2 = 0. I will let you know how it goes.

Or, …you know what? I bet you are correct. The plugins that are not “broken” probably never had JUCE_VST3_CAN_REPLACE_VST2 = 1 in the first place. I will report back if that is the case.