What is a "Hair Plugin"?
It turns out that you can trick VAM into loading plugins when a hair is put on. These plugins don't go into the default Atom plugin UIs and are generally their own separate thing.
Hair Plugins are very similar to Clothing Plugins and I recommend going through that guide as well if you haven't worked with them before
hub.virtamate.com
1. Add an MVRPluginManager to the list of components
Locate the .vaj file for your hair. It will contain a json file with "components" and "storables". Under components, add an item of type MVRPluginManager
2. Add the ClothingPluginManager
Next, add an entry to 'storables' with your plugin list. The ID must be "CustomScalp" (even if you use a different scalp).
If the hair does not use a custom scalp, you will get an error when putting it on (it'll still work). See "Known Issues" below.
The only required item under the plugins list is the latest version of the ClothingPluginManager. This will quiet VAM's various complaints about being forced to load plugins this way.
3. Add Plugins / Save Defaults
Open the hair UI. You should see a Plugins tab under the customization UI. Use this to add and configure additional plugins.
The ClothingPluginManager UI also has buttons to save and load presets. By default it will save a default.clothingplugins file, which will be loaded with the hair.
4. Releasing Hair
Unlike with Clothing, nothing special needs to be done here. Package up the var file as normal.
5. Known Issues
PreRestore error on default scalps
If the hair does not use a custom scalp, you will get the following error when putting the hair on for the first time:
Unfortunately I can't find a way to fix this without changing VAM or maybe adding a session plugin. For those curious, it's because the CustomScalp is the binaryStorableBucket for hair and where all vaj file components (including the MVRPluginManager we're adding) go by default. If you're using a built-in scalp, the CustomScalp object is not active when the MVRPluginManager gets initialized, and as such doesn't wake up and run its Init(). This causes the initial plugin list to be null, hence the exception on PreRestore.
It turns out that you can trick VAM into loading plugins when a hair is put on. These plugins don't go into the default Atom plugin UIs and are generally their own separate thing.
Hair Plugins are very similar to Clothing Plugins and I recommend going through that guide as well if you haven't worked with them before

Clothing Plugins - Guides -
What is a "Clothing Plugin"? It turns out that you can trick VAM into loading plugins when an item of clothing is loaded. These plugins don't go into the default Atom plugin UIs and are generally their own separate thing. What can I do with a...

1. Add an MVRPluginManager to the list of components
Locate the .vaj file for your hair. It will contain a json file with "components" and "storables". Under components, add an item of type MVRPluginManager
2. Add the ClothingPluginManager
Next, add an entry to 'storables' with your plugin list. The ID must be "CustomScalp" (even if you use a different scalp).
If the hair does not use a custom scalp, you will get an error when putting it on (it'll still work). See "Known Issues" below.
The only required item under the plugins list is the latest version of the ClothingPluginManager. This will quiet VAM's various complaints about being forced to load plugins this way.
3. Add Plugins / Save Defaults
Open the hair UI. You should see a Plugins tab under the customization UI. Use this to add and configure additional plugins.
The ClothingPluginManager UI also has buttons to save and load presets. By default it will save a default.clothingplugins file, which will be loaded with the hair.
4. Releasing Hair
Unlike with Clothing, nothing special needs to be done here. Package up the var file as normal.
5. Known Issues
PreRestore error on default scalps
If the hair does not use a custom scalp, you will get the following error when putting the hair on for the first time:
Everything should still work, but is annoying. The only workaround for now is to use a custom scalp.
Unfortunately I can't find a way to fix this without changing VAM or maybe adding a session plugin. For those curious, it's because the CustomScalp is the binaryStorableBucket for hair and where all vaj file components (including the MVRPluginManager we're adding) go by default. If you're using a built-in scalp, the CustomScalp object is not active when the MVRPluginManager gets initialized, and as such doesn't wake up and run its Init(). This causes the initial plugin list to be null, hence the exception on PreRestore.