Skip to content

Instantly share code, notes, and snippets.

@SamWindell
Last active October 7, 2025 08:42
Show Gist options
  • Select an option

  • Save SamWindell/ffe39f6147e284c0aa968449350e7d6b to your computer and use it in GitHub Desktop.

Select an option

Save SamWindell/ffe39f6147e284c0aa968449350e7d6b to your computer and use it in GitHub Desktop.
Floe macOS installation diagnostics
#!/bin/bash
echo ""
echo "Starting Floe plugin diagnostics..."
echo "This will take about a minute. Please wait..."
echo ""
# Capture all output to a variable
output=$(cat <<'EOF_DIAGNOSTICS'
=== Floe Plugin Diagnostic Script ===
Date: $(date)
macOS Version: $(sw_vers -productVersion)
Architecture: $(uname -m)
=== 1. Plugin File Locations ===
EOF_DIAGNOSTICS
)
PLUGIN_NAME="Floe"
# Build the output string
output+="
"
for format in component vst3 clap; do
for location in "/Library/Audio/Plug-Ins" "$HOME/Library/Audio/Plug-Ins"; do
case $format in
component) folder="Components" ;;
vst3) folder="VST3" ;;
clap) folder="CLAP" ;;
esac
path="$location/$folder/$PLUGIN_NAME.$format"
if [ -e "$path" ]; then
output+="✓ Found: $path
"
output+="$(ls -lhd "$path")
"
output+=" Permissions: $(ls -ld "$path" | awk '{print $1}')
"
output+=" Owner: $(ls -ld "$path" | awk '{print $3":"$4}')
"
else
output+="✗ Not found: $path
"
fi
done
output+="
"
done
output+="=== 2. Code Signature Verification ===
"
for format in component vst3 clap; do
case $format in
component) folder="Components" ;;
vst3) folder="VST3" ;;
clap) folder="CLAP" ;;
esac
for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do
path="$location/$PLUGIN_NAME.$format"
if [ -e "$path" ]; then
output+="Checking: $path
"
output+="$(codesign -dvvv "$path" 2>&1 | head -20)
"
output+="$(codesign --verify --verbose "$path" 2>&1)
"
output+="
"
fi
done
done
output+="=== 3. Binary Architecture ===
"
for format in component vst3 clap; do
case $format in
component)
folder="Components"
binary_path="Contents/MacOS/$PLUGIN_NAME"
;;
vst3)
folder="VST3"
binary_path="Contents/MacOS/$PLUGIN_NAME"
;;
clap)
folder="CLAP"
binary_path="Contents/MacOS/$PLUGIN_NAME"
;;
esac
for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do
plugin="$location/$PLUGIN_NAME.$format"
binary="$plugin/$binary_path"
if [ -e "$binary" ]; then
output+="Binary: $binary
"
output+="$(file "$binary")
"
output+="
"
fi
done
done
output+="=== 4. Component Bundle Structure ===
"
for format in component vst3 clap; do
case $format in
component) folder="Components" ;;
vst3) folder="VST3" ;;
clap) folder="CLAP" ;;
esac
for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do
plugin="$location/$PLUGIN_NAME.$format"
if [ -e "$plugin" ]; then
output+="Bundle structure for: $plugin
"
output+="$(find "$plugin" -print 2>&1 | head -50)
"
output+="
"
fi
done
done
output+="=== 5. Info.plist Validation (Component) ===
"
for location in "/Library/Audio/Plug-Ins/Components" "$HOME/Library/Audio/Plug-Ins/Components"; do
plugin="$location/$PLUGIN_NAME.component"
plist="$plugin/Contents/Info.plist"
if [ -e "$plist" ]; then
output+="Checking: $plist
"
output+="Plist validation:
"
output+="$(plutil -lint "$plist" 2>&1)
"
output+="
"
output+="Critical AU keys from Info.plist:
"
output+=" CFBundleIdentifier: $(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "$plist" 2>&1)
"
output+=" CFBundleVersion: $(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$plist" 2>&1)
"
output+=" CFBundleShortVersionString: $(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$plist" 2>&1)
"
output+=" AudioComponents:
"
output+="$(/usr/libexec/PlistBuddy -c "Print :AudioComponents" "$plist" 2>&1 | sed 's/^/ /')
"
output+="
"
pkginfo="$plugin/Contents/PkgInfo"
if [ -e "$pkginfo" ]; then
output+="✓ PkgInfo exists: $(cat "$pkginfo")
"
else
output+="⚠ PkgInfo file missing (may be required for older systems)
"
fi
output+="
"
fi
done
output+="=== 6. Gatekeeper/Quarantine Status ===
"
for format in component vst3 clap; do
case $format in
component) folder="Components" ;;
vst3) folder="VST3" ;;
clap) folder="CLAP" ;;
esac
for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do
path="$location/$PLUGIN_NAME.$format"
if [ -e "$path" ]; then
output+="Checking: $path
"
output+="$(xattr -l "$path")
"
quarantine=$(xattr -p com.apple.quarantine "$path" 2>/dev/null)
if [ -n "$quarantine" ]; then
output+="⚠ QUARANTINED: $quarantine
"
else
output+="✓ Not quarantined
"
fi
output+="
"
fi
done
done
output+="=== 7. Audio Unit Cache Status ===
"
cache_dir="$HOME/Library/Caches/AudioUnitCache"
if [ -d "$cache_dir" ]; then
output+="Cache directory exists: $cache_dir
"
output+="Files:
"
output+="$(ls -lh "$cache_dir")
"
else
output+="✓ Cache directory does not exist (clean state)
"
fi
output+="
"
output+="=== 8. System Audio Unit Cache ===
"
sys_cache="/Library/Caches/com.apple.audio.units.cache"
if [ -e "$sys_cache" ]; then
output+="System cache exists:
"
output+="$(ls -lh "$sys_cache")
"
else
output+="✓ System cache does not exist
"
fi
output+="
"
output+="=== 9. Component Manager Registration (AU only) ===
"
if [ -e "/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ] || [ -e "$HOME/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ]; then
output+="Attempting to list AU components (this uses the system's AU registry):
"
output+="$(auval -a 2>&1 | grep -i "$PLUGIN_NAME" || echo "Plugin not found in auval listing")
"
fi
output+="
"
output+="=== 10. Security & Privacy Settings ===
"
output+="Checking if any security assessments were made:
"
output+="$(spctl --assess --type execute --verbose /Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component 2>&1 || echo "Component not found or not assessed")
"
output+="
"
output+="=== 11. Package Installation Receipts ===
"
output+="Checking for installation receipts:
"
output+="$(pkgutil --pkgs | grep -i floe || echo "No Floe-related package receipts found")
"
output+="
"
for pkg in $(pkgutil --pkgs | grep -i floe); do
output+="Package: $pkg
"
output+="$(pkgutil --pkg-info "$pkg")
"
output+="Files:
"
output+="$(pkgutil --files "$pkg" | head -20)
"
output+="
"
done
output+="=== 12. Plugin Loading Test (VST3 and AU) ===
"
output+="Downloading pluginval validator...
"
# Download and extract pluginval
curl -L -s -o /tmp/pluginval.zip https://github.com/Tracktion/pluginval/releases/download/v1.0.4/pluginval_macOS.zip 2>&1
if [ $? -eq 0 ]; then
unzip -q /tmp/pluginval.zip -d /tmp/ 2>&1
chmod +x /tmp/pluginval.app/Contents/MacOS/pluginval 2>&1
output+="Testing VST3 loading:
"
if [ -e "/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" ]; then
output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" 2>&1)
"
elif [ -e "$HOME/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" ]; then
output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "$HOME/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" 2>&1)
"
else
output+="VST3 plugin not found
"
fi
output+="
"
output+="Testing AU loading:
"
if [ -e "/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ]; then
output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" 2>&1)
"
elif [ -e "$HOME/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ]; then
output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "$HOME/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" 2>&1)
"
else
output+="AU component not found
"
fi
output+="
"
# Cleanup
rm -rf /tmp/pluginval.app /tmp/pluginval.zip 2>&1
else
output+="Failed to download pluginval. Skipping loading tests.
"
fi
output+="=== Diagnostic Complete ===
"
# Copy to clipboard and show completion message
echo "$output" | pbcopy
echo ""
echo "✓ Diagnostics copied to clipboard!"
echo "Please paste the results into your message to the developer."
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment