Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save ChrisHardie/b65455b05064cbed4e8ae2e381a8f22b to your computer and use it in GitHub Desktop.

Select an option

Save ChrisHardie/b65455b05064cbed4e8ae2e381a8f22b to your computer and use it in GitHub Desktop.
Fix Photoshop 2025 droplets not running on macOS Tahoe
#!/usr/bin/env bash
set -euo pipefail
APP="${1:-}"
if [[ -z "$APP" ]]; then
echo "Usage: fix-droplet.sh \"/path/to/Droplet.app\""
exit 1
fi
if [[ ! -d "$APP" ]]; then
echo "Error: Not a directory (expected .app bundle): $APP"
exit 1
fi
BUNDLE_ID=$(defaults read "$APP/Contents/Info" CFBundleIdentifier 2>/dev/null || true)
if [[ -z "$BUNDLE_ID" ]]; then
echo "Error: Could not read CFBundleIdentifier from Info.plist"
exit 1
fi
echo "Fixing Photoshop droplet: $APP"
echo "Bundle ID: $BUNDLE_ID"
echo "--------------------------------"
# 1. Remove quarantine and extended attributes
echo "[1/4] Removing extended attributes..."
xattr -dr com.apple.quarantine "$APP" || true
xattr -cr "$APP" || true
find "$APP/Contents" -name ".DS_Store" -delete 2>/dev/null || true
# 2. Fix corrupted NSAppleEventsUsageDescription in Info.plist
# A blank or single-space value causes Gatekeeper to reject the bundle
# and prevents TCC from prompting for Apple Events permission
echo "[2/4] Fixing NSAppleEventsUsageDescription in Info.plist..."
sudo plutil -replace NSAppleEventsUsageDescription \
-string "This droplet needs to send Apple Events to Adobe Photoshop to run actions." \
"$APP/Contents/Info.plist"
# 3. Re-sign to cover Droplet.8BDR which Adobe's original signature excludes
# Without this Gatekeeper rejects the bundle as damaged
echo "[3/4] Re-signing bundle..."
codesign --force --deep --sign - "$APP"
# 4. Grant Apple Events permission in TCC database
# macOS will not prompt for permission on an ad-hoc signed bundle,
# so we insert the entry directly
echo "[4/4] Granting Apple Events permission in TCC database..."
TCC_DB="$HOME/Library/Application Support/com.apple.TCC/TCC.db"
TIMESTAMP=$(date +%s)
sqlite3 "$TCC_DB" "INSERT OR REPLACE INTO access VALUES(
'kTCCServiceAppleEvents',
'$BUNDLE_ID',
0, 2, 4, 1,
NULL, NULL, 0,
'com.adobe.Photoshop',
NULL, 0,
$TIMESTAMP,
NULL, NULL, 'UNUSED', 0
);"
echo "--------------------------------"
echo "Done. Verifying TCC entry..."
sqlite3 "$TCC_DB" "SELECT service, client, auth_value FROM access WHERE client='$BUNDLE_ID' AND service='kTCCServiceAppleEvents';"
echo ""
echo "Make sure Photoshop is running before dropping a file onto the droplet."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment