VST3 Development Experience
2025-10-26
Due to the recent MIT-fication of the VST3 SDK and the fact that Steinberg and PreSonus seem to be working towards Wayland support in VSTGUI, I decided it was time to take the infamous API for a test ride.
This post will mostly follow the official Steinberg VST3 guide and is not meant as a replacement, but as more of a learning/documentation for myself and others.
Setup
Clone the SDK:
$ git clone --recursive https://github.com/steinbergmedia/vst3sdk.git
Install the deps on Arch:
# pacman -S cmake ninja qtcreator
(On CachyOS gcc, gcc-libs, libxcb, fontconfig, cairo, gtkmm3, sqlite and keysyms seem to already be installed. Since, Arch does not have separate library packages, the naming is different from Debian packages.)
cd inside the SDK, make the build directory and build the examples:
$ cd vst3sdk
$ mkdir build
$ cd build
$ cmake ../
$ make
Missing cstdint header
So first off, the cstdint header is missing from one of the files. This is a common problem with old C++-projects where the header got implicitly included in the past.
Somebody already fixed it in the upstream vstgui, so all that has to be done is to update the submodule:
In the vstsdk root run:
$ git submodule update --remote vstgui4
Building using QtCreator
From the root directory launch QtCreator:
$ qtcreator ../
Did not work; had to instead go to Projects-tab and click configure project.
After building (running/configuring cmake?) the example plugins are linked to ~/.vst3:
$ ls -lgG ~/.vst3 | tail -n +2 | sed "s@$HOME@\~@g" | awk '{print $6, $7, $8}'
adelay.vst3 -> ~/src/vst3sdk/build/VST3/Debug/adelay.vst3
again-sample-accurate.vst3 -> ~/src/vst3sdk/build/VST3/Debug/again-sample-accurate.vst3
again-simple.vst3 -> ~/src/vst3sdk/build/VST3/Debug/again-simple.vst3
again.vst3 -> ~/src/vst3sdk/build/VST3/Debug/again.vst3
channel-context.vst3 -> ~/src/vst3sdk/build/VST3/Debug/channel-context.vst3
host-checker.vst3 -> ~/src/vst3sdk/build/VST3/Debug/host-checker.vst3
legacy-midicc-out.vst3 -> ~/src/vst3sdk/build/VST3/Debug/legacy-midicc-out.vst3
mda-vst3.vst3 -> ~/src/vst3sdk/build/VST3/Debug/mda-vst3.vst3
multiple-program-changes.vst3 -> ~/src/vst3sdk/build/VST3/Debug/multiple-program-changes.vst3
note-expression-synth.vst3 -> ~/src/vst3sdk/build/VST3/Debug/note-expression-synth.vst3
note-expression-text.vst3 -> ~/src/vst3sdk/build/VST3/Debug/note-expression-text.vst3
panner.vst3 -> ~/src/vst3sdk/build/VST3/Debug/panner.vst3
pitch-names.vst3 -> ~/src/vst3sdk/build/VST3/Debug/pitch-names.vst3
prefetchable.vst3 -> ~/src/vst3sdk/build/VST3/Debug/prefetchable.vst3
program-change.vst3 -> ~/src/vst3sdk/build/VST3/Debug/program-change.vst3
remap-paramid.vst3 -> ~/src/vst3sdk/build/VST3/Debug/remap-paramid.vst3
sync-delay.vst3 -> ~/src/vst3sdk/build/VST3/Debug/sync-delay.vst3
utf16-name.vst3 -> ~/src/vst3sdk/build/VST3/Debug/utf16-name.vst3
The plugins can be loaded in a VST3-capable host:

Crashes if you detach the window and then close it (double click, close the plugin window).
Creating a plug-in using the Project Generator App
Clone the project generator to where-ever you store repos:
$ git clone https://github.com/steinbergmedia/vst3projectgenerator.git
cd in to the vst3projectgenerator/script-directory:
$ cd vst3projectgenerator/script
Generate a new project:
cmake -P GenerateVST3Plugin.cmake
Then, the project can be opened and configured in QtCreator:
$ qtcreator output/My\ Plugin/
Do note that the generated CMakeLists.txt will have the vst3sdk_SOURCE_DIR hardcoded.
Although, this can be configured using a flag when the cmake script is invoked.
Maybe something more appropriate for me:
$ cmake \
-DSMTG_VENDOR_NAME_CLI="rllk" \
-DSMTG_VENDOR_HOMEPAGE_CLI="https://kallinen.xyz" \
-DSMTG_VENDOR_EMAIL_CLI="valtteri@kallinen.xyz" \
-DSMTG_PLUGIN_NAME_CLI="SVF" \
-DSMTG_PREFIX_FOR_FILENAMES_CLI="Svf_" \
-DSMTG_PLUGIN_IDENTIFIER_CLI="xyz.kallinen.vst3.svf" \
-DSMTG_CMAKE_PROJECT_NAME_CLI="Svf" \
-DSMTG_VENDOR_NAMESPACE_CLI="Rllk" \
-DSMTG_PLUGIN_CLASS_NAME_CLI="CSvf" \
-DSMTG_PLUGIN_CATEGORY_CLI="Filter" \
-DSMTG_PLUGIN_BUNDLE_NAME_CLI="rllksvf" \
-DSMTG_VST3_SDK_SOURCE_DIR_CLI='$ENV{HOME}/src/vst3sdk' \
-DSMTG_GENERATOR_OUTPUT_DIRECTORY_CLI="~/src/rllksvf" \
-DSMTG_ENABLE_VSTGUI_SUPPORT_CLI=ON \
-P GenerateVST3Plugin.cmake
Test that it configures and builds:
$ qtcreator ~/src/rllksvf/SVF
Code the plugin
Basically, just follow https://steinbergmedia.github.io/vst3_dev_portal/pages/Tutorials/Code+your+first+plug-in.html.
There is no plugids.h, so the parameters probably go in <yourplug>_cids.h instead.
WYSIWYG interface editor
Seems to work OOTB, seems to also crash a lot. For example, crashes if I insert a knob and try to move/scale it.
I can get a knob connected to the parameter:
- right click → sync tags
- right click knob → insert knob
- control-tag set to Gain

The knob works if I exit the editor.
That is it
Did not have time to look at this any further. I might check later if the SDK will mature a bit. Right now the tutorial and documentation is a bit scattered around and does not feel polished. Although, it is relatively easy to get a project building and going from scratch.
Would I recommend VST3 as it is? On Linux, probably not yet. Otherwise, maybe.