Validates AudioUnit v2/v3 plugins (.component bundles and .appex app extensions) on macOS using Apple's auval tool, including registration and rescan steps.
npx claudepluginhub iplug3/audio-plugin-dev-skills --plugin audio-plugin-validatorsThis skill uses the workspace's default tool permissions.
AudioUnits **must** be registered with the system for `auval` to find them — it does not accept a file path.
Validates VST3 (.vst3) and AudioUnit (.component) plugins using pluginval at configurable strictness levels. Activates on 'run pluginval', 'validate plugin', or cross-format testing requests. macOS/Windows/Linux; AudioUnit macOS-only.
Audits Claude Code plugins for manifest validity, component organization, namespace compliance, documentation, and marketplace readiness before releases or periodic checks.
Runs pytest-based automated tests validating Claude Code plugin integrity across 14 categories (config, skills, templates, workflow, etc.). Use before PRs, after changes to skills/templates, or to verify health.
Share bugs, ideas, or general feedback.
AudioUnits must be registered with the system for auval to find them — it does not accept a file path.
| Location | Scope |
|---|---|
~/Library/Audio/Plug-Ins/Components/ | Current user only |
/Library/Audio/Plug-Ins/Components/ | All users (requires admin) |
After installing or rebuilding, force a rescan: killall -9 AudioComponentRegistrar
AUv3 AudioUnits are app extensions (.appex) embedded inside a host .app bundle (e.g., MyApp.app/Contents/PlugIns/MyAU.appex). The host app must be run at least once to register the extension with the system via pluginkit.
# Check if an AUv3 is registered (match by bundle ID)
pluginkit -m -v -p <bundle-id>
# List all registered AudioUnit extensions
pluginkit -m -v -A
# Manually register an appex
pluginkit -a <path-to-appex>
# Unregister an appex
pluginkit -r <path-to-appex>
# Dump full extension info for debugging
pluginkit -e -v -i <bundle-id>
After rebuilding, re-run the host app or use pluginkit -a to re-register the updated extension.
.component in a standard Components location (see above).app at least once, or manually register with pluginkit -a <path-to-appex>aufx, aumu, etc.), four-character subtype, and manufacturer codekillall -9 AudioComponentRegistrarauval -v <type> <subtype> <manufacturer> — this works the same for both AUv2 and AUv3 once registered* * * * * * * * means all tests passed# Validate an effect (aufx)
auval -v aufx <subtype> <manufacturer>
# Validate an instrument (aumu)
auval -v aumu <subtype> <manufacturer>
# Validate a MIDI-controlled effect (aumf)
auval -v aumf <subtype> <manufacturer>
# Validate a MIDI processor (aumi)
auval -v aumi <subtype> <manufacturer>
# List all registered AudioUnits
auval -a
# List all AUs with their file locations
auval -al
# List AUs without instantiating them (faster)
auval -l
# List all effects
auval -s aufx
# List all instruments
auval -s aumu
| Type | Description | Example |
|---|---|---|
aufx | Effect | Gain, EQ, Reverb |
aumu | Music Device (Instrument) | Synth, Sampler |
aumf | Music Effect (MIDI-controlled) | Arpeggiator with audio |
aumi | MIDI Processor | MIDI filter, transposer |
aufc | Format Converter | Sample rate converter |
auou | Output | Audio output |
aupn | Panner | Surround panner |
augn | Generator | Noise generator |
# Basic open/initialize test only (fast, good for debugging)
auval -o -v aufx <subtype> <manufacturer>
# Run with stress test (multi-thread test for race conditions, default 600s)
auval -stress -v aufx <subtype> <manufacturer>
# Run stress test with custom duration (in simulated seconds)
auval -stress 120 -v aufx <subtype> <manufacturer>
# Run with real-time safety test (requires sudo, uses dtrace)
sudo auval -real-time-safety -v aufx <subtype> <manufacturer>
# Repeat validation N times (catches open/init bugs)
auval -r 5 -v aufx <subtype> <manufacturer>
# Stop on first error (useful for debugging)
auval -de -v aufx <subtype> <manufacturer>
# Stop on first warning (stricter)
auval -dw -v aufx <subtype> <manufacturer>
# Quiet mode (errors/warnings only)
auval -q -v aufx <subtype> <manufacturer>
# Quiet mode suppressing parameter/factory preset info
auval -qp -v aufx <subtype> <manufacturer>
# Wait after finish (for memory profiling with 'leaks' tool)
auval -w -v aufx <subtype> <manufacturer>
# Load AudioUnit out-of-process
auval -oop -v aufx <subtype> <manufacturer>
# Open as component (not plugin)
auval -comp -v aufx <subtype> <manufacturer>
Strict options enforce checks that would otherwise only produce warnings. Use -strict to enable all strict checks — this should be used by default for thorough validation.
# Enable all strict checks (recommended)
auval -strict -v aufx <subtype> <manufacturer>
# Individual strict options:
# Enforce AudioUnitScheduleParameter output check (always enforced since Leopard)
auval -strict_SP -v aufx <subtype> <manufacturer>
# Enforce parameter default values fall between min and max
auval -strict_DefP -v aufx <subtype> <manufacturer>
# Require conformant kAudioUnitProperty_CPULoad implementation (if in use)
auval -strict_CPUL -v aufx <subtype> <manufacturer>
# Validate all AUs of a given type from one manufacturer
auval -vt aufx <manufacturer>
# Continue on error in batch/repeat mode (don't stop at first failure)
auval -c -vt aufx <manufacturer>
# Run commands from a file (one command per line)
auval -f /path/to/commands.txt
If no options are given, auval looks for a file called auv-autorun.txt in the launch directory or /tmp/ and runs commands from it.
Component IDs can be specified as 4-char codes or 8-digit hex values. These are equivalent:
auval -v aufx bpas appl
auval -v 61756678 62706173 6170706C
The two formats can be mixed freely.
| Code | Meaning |
|---|---|
0 | OK — all tests passed |
-1 | AU failed validation |
1 | General error |
2 | Fatal error |
4 | Unauthorized (open) |
5 | Unauthorized (init) |
# Start auval with leak detection
export MallocStackLogging=1
auval -v aufx <subtype> <manufacturer> -w -q
# In another terminal, find the PID and check for leaks
ps axc | awk '{if ($5=="auvaltool") print $1}'
leaks <PID>
AudioUnit v2 and v3 plugins are identified by their type+subtype+manufacturer code. If both formats are registered with the same codes, the system will prefer one (typically AUv3), which can cause confusion during development.
Best Practice: Use different subtypes for AUv2 and AUv3 during development. Most build systems (JUCE, iPlug2, iPlug3, etc.) provide separate configuration fields for AUv2 and AUv3 subtypes.
To temporarily remove an AUv3 so the AUv2 is used instead: pluginkit -r <path-to-appex>
# Kill the registration daemon to force rescan
killall -9 AudioComponentRegistrar
# Wait a moment, then list AUs
sleep 2
auval -a
FATAL ERROR: didn't find the component
killall -9 AudioComponentRegistrarpluginkit -m -v -p <bundle-id>, and re-register with pluginkit -a <path-to-appex> if neededobjc: Class XYZ is implemented in both...