Rust VST3 and CLAP plugin framework and plugins - because everything is better when you do it yourself
Rust
2,998
2,249 commits
updated Sep 3, 2026
NOTE: NIH-plug the plugin framework is currently in maintenance mode. If you are interested in the framework rather than the plugin, please check out this community fork instead.
NIH-plug is an API-agnostic audio plugin framework written in Rust, as well as a small collection of plugins. The idea is to have a stateful yet simple plugin API that gets rid of as much unnecessary ceremony wherever possible, while also keeping the amount of magic to minimum and making it easy to experiment with different approaches to things. See the current features section for more information on the project's current status.
Check out the documentation, or use the cookiecutter template to quickly get started with NIH-plug.
Check each plugin's readme file for more details on what the plugin actually does. You can download the latest development binaries for Linux, Windows and macOS from the Latest builds page. You may need to disable Gatekeeper on macOS to be able to use the plugins.
Scroll down for more information on the underlying plugin framework.
nih_export_<api>!(Foo) macro to your plugin's
library.nih_export_standalone(Foo) from
your main() function. Standalones come with a CLI for configuration and full
JACK audio, MIDI, and transport support.FloatParam, IntParam,
BoolParam, and EnumParam<T> fields to your parameter struct, assign
stable IDs to them with the #[id = "foobar"], and a #[derive(Params)]
does all of the boring work for you.Enum trait with the EnumParam<T> parameter
type for parameters that allow the user to choose between multiple discrete
options. That way you can use regular Rust pattern matching when working
with these values without having to do any conversions yourself.Params object and annotating them with #[persist = "key"].Params objects using
the #[nested(group = "...")]attribute.#[nested] attribute also enables you to use multiple copies of the
same parameter, either as regular object fields or through arrays.Params
trait to enable compile time generated parameters and other bespoke
functionality.Plugin::SAMPLE_ACCURATE_AUTOMATION constant to
true.cargo xtask bundle <package> <build_arguments> command that automatically
detects which plugin targets your plugin exposes and creates the correct
plugin bundles for your target operating system and architecture, with
cross-compilation support. The cargo subcommand can easily be added to your
own project
as an alias or globally
as a regular cargo subcommand.Plugin trait's documentation for an incomplete list
of the functionality that has currently not yet been implemented.NIH-plug works with the latest stable Rust compiler.
After installing Rust, you can compile any of the plugins
in the plugins directory in the following way, replacing gain with the name
of the plugin:
cargo xtask bundle gain --release
NIH-plug can currently export VST3 and
CLAP plugins. Exporting a specific plugin
format for a plugin is as simple as calling the nih_export_<format>!(Foo);
macro. The cargo xtask bundle command will detect which plugin formats your
plugin supports and create the appropriate bundles accordingly, even when cross
compiling.
The best way to get an idea for what the API looks like is to look at the examples.
gain is a simple smoothed gain plugin that shows off a couple other parts of the API, like support for storing arbitrary serializable state.
gain-gui is the same plugin as gain, but with a GUI to control the parameter and a digital peak meter. Comes in three exciting flavors: egui, iced, and VIZIA.
There are also examples for making custom GUIs with OpenGL, wgpu, and softbuffer.
midi_inverter takes note/MIDI events and flips around the note, channel, expression, pressure, and CC values. This example demonstrates how to receive and output those events.
poly_mod_synth is a simple polyphonic synthesizer with support for polyphonic modulation in supported CLAP hosts. This demonstrates how polyphonic modulation can be used in NIH-plug.
sine is a simple test tone generator plugin with frequency smoothing that can also make use of MIDI input instead of generating a static signal based on the plugin's parameters.
stft shows off some of NIH-plug's other optional
higher level helper features, such as an adapter to process audio with a
short-term Fourier transform using the overlap-add method, all using the
compositional Buffer interfaces.
sysex is a simple example of how to send and receive SysEx messages by defining custom message types.
The framework, its libraries, and the example plugins in plugins/examples/ are
all licensed under the ISC license. However,
the VST3 bindings used by
nih_export_vst3!() are licensed under the GPLv3 license. This means that
unless you replace these bindings with your own bindings made from scratch, any
VST3 plugins built with NIH-plug need to be able to comply with the terms of the
GPLv3 license.
The other plugins in the plugins/ directory may be licensed under the GPLv3
license. Check the plugin's Cargo.toml file for more information.
(top 24 of 61)
501 followers · starred Apr 2025
197 followers · starred Sep 2025
160 followers · starred Aug 2025
354 followers · starred Mar 2022
Rust VST3 and CLAP plugin framework and plugins - because everything is better when you do it yourself
Rust
2,998
2,249 commits
updated Sep 3, 2026
NOTE: NIH-plug the plugin framework is currently in maintenance mode. If you are interested in the framework rather than the plugin, please check out this community fork instead.
NIH-plug is an API-agnostic audio plugin framework written in Rust, as well as a small collection of plugins. The idea is to have a stateful yet simple plugin API that gets rid of as much unnecessary ceremony wherever possible, while also keeping the amount of magic to minimum and making it easy to experiment with different approaches to things. See the current features section for more information on the project's current status.
Check out the documentation, or use the cookiecutter template to quickly get started with NIH-plug.
Check each plugin's readme file for more details on what the plugin actually does. You can download the latest development binaries for Linux, Windows and macOS from the Latest builds page. You may need to disable Gatekeeper on macOS to be able to use the plugins.
Scroll down for more information on the underlying plugin framework.
nih_export_<api>!(Foo) macro to your plugin's
library.nih_export_standalone(Foo) from
your main() function. Standalones come with a CLI for configuration and full
JACK audio, MIDI, and transport support.FloatParam, IntParam,
BoolParam, and EnumParam<T> fields to your parameter struct, assign
stable IDs to them with the #[id = "foobar"], and a #[derive(Params)]
does all of the boring work for you.Enum trait with the EnumParam<T> parameter
type for parameters that allow the user to choose between multiple discrete
options. That way you can use regular Rust pattern matching when working
with these values without having to do any conversions yourself.Params object and annotating them with #[persist = "key"].Params objects using
the #[nested(group = "...")]attribute.#[nested] attribute also enables you to use multiple copies of the
same parameter, either as regular object fields or through arrays.Params
trait to enable compile time generated parameters and other bespoke
functionality.Plugin::SAMPLE_ACCURATE_AUTOMATION constant to
true.cargo xtask bundle <package> <build_arguments> command that automatically
detects which plugin targets your plugin exposes and creates the correct
plugin bundles for your target operating system and architecture, with
cross-compilation support. The cargo subcommand can easily be added to your
own project
as an alias or globally
as a regular cargo subcommand.Plugin trait's documentation for an incomplete list
of the functionality that has currently not yet been implemented.NIH-plug works with the latest stable Rust compiler.
After installing Rust, you can compile any of the plugins
in the plugins directory in the following way, replacing gain with the name
of the plugin:
cargo xtask bundle gain --release
NIH-plug can currently export VST3 and
CLAP plugins. Exporting a specific plugin
format for a plugin is as simple as calling the nih_export_<format>!(Foo);
macro. The cargo xtask bundle command will detect which plugin formats your
plugin supports and create the appropriate bundles accordingly, even when cross
compiling.
The best way to get an idea for what the API looks like is to look at the examples.
gain is a simple smoothed gain plugin that shows off a couple other parts of the API, like support for storing arbitrary serializable state.
gain-gui is the same plugin as gain, but with a GUI to control the parameter and a digital peak meter. Comes in three exciting flavors: egui, iced, and VIZIA.
There are also examples for making custom GUIs with OpenGL, wgpu, and softbuffer.
midi_inverter takes note/MIDI events and flips around the note, channel, expression, pressure, and CC values. This example demonstrates how to receive and output those events.
poly_mod_synth is a simple polyphonic synthesizer with support for polyphonic modulation in supported CLAP hosts. This demonstrates how polyphonic modulation can be used in NIH-plug.
sine is a simple test tone generator plugin with frequency smoothing that can also make use of MIDI input instead of generating a static signal based on the plugin's parameters.
stft shows off some of NIH-plug's other optional
higher level helper features, such as an adapter to process audio with a
short-term Fourier transform using the overlap-add method, all using the
compositional Buffer interfaces.
sysex is a simple example of how to send and receive SysEx messages by defining custom message types.
The framework, its libraries, and the example plugins in plugins/examples/ are
all licensed under the ISC license. However,
the VST3 bindings used by
nih_export_vst3!() are licensed under the GPLv3 license. This means that
unless you replace these bindings with your own bindings made from scratch, any
VST3 plugins built with NIH-plug need to be able to comply with the terms of the
GPLv3 license.
The other plugins in the plugins/ directory may be licensed under the GPLv3
license. Check the plugin's Cargo.toml file for more information.
(top 24 of 61)
501 followers · starred Apr 2025
197 followers · starred Sep 2025
160 followers · starred Aug 2025
354 followers · starred Mar 2022