ivory

Simple MIDI keyboard monitor with advanced chord detection.
Log | Files | Refs | README | LICENSE

commit fbce2dc624dee04b1840a0bd18158ad87d51b7be
parent fc9f21d9e4a5cffb7a3ae7c8b566c8feb1158543
Author: ganten7 <ganten7@users.noreply.github.com>
Date:   Sat, 13 Dec 2025 23:57:35 -0600

Add macOS app bundle verification and troubleshooting steps

Diffstat:
M.github/workflows/release.yml | 58+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
MINSTALLATION_NOTES.md | 23+++++++++++++++++++++++
2 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml @@ -197,9 +197,65 @@ jobs: # Move the .app bundle to current directory if [ -d "dist/Ivory.app" ]; then mv dist/Ivory.app . + + # Verify .app bundle structure + echo "Verifying .app bundle structure..." + if [ ! -d "Ivory.app/Contents/MacOS" ]; then + echo "ERROR: Contents/MacOS directory missing!" + exit 1 + fi + + # Find the executable + EXECUTABLE=$(find Ivory.app/Contents/MacOS -type f -perm +111 | head -1) + if [ -z "$EXECUTABLE" ]; then + echo "ERROR: No executable found in Ivory.app/Contents/MacOS" + ls -la Ivory.app/Contents/MacOS/ || true + exit 1 + fi + + echo "Found executable: $EXECUTABLE" + + # Ensure executable has correct permissions + chmod +x "$EXECUTABLE" || true + + # Verify Info.plist exists + if [ ! -f "Ivory.app/Contents/Info.plist" ]; then + echo "WARNING: Info.plist missing, creating one..." + cat > Ivory.app/Contents/Info.plist << EOF +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleExecutable</key> + <string>$(basename "$EXECUTABLE")</string> + <key>CFBundleIdentifier</key> + <string>com.github.ganten7.ivory</string> + <key>CFBundleName</key> + <string>Ivory</string> + <key>CFBundleVersion</key> + <string>1.0.0</string> + <key>CFBundleShortVersionString</key> + <string>1.0.0</string> + <key>LSMinimumSystemVersion</key> + <string>10.13</string> + <key>NSHighResolutionCapable</key> + <true/> +</dict> +</plist> +EOF + fi + # Remove quarantine attribute (helps with Gatekeeper) xattr -cr Ivory.app || true - echo "✓ Ivory.app created successfully" + + # Test that we can at least see the executable + if [ -x "$EXECUTABLE" ]; then + echo "✓ Executable is executable and found at: $EXECUTABLE" + echo "✓ Ivory.app structure verified" + else + echo "ERROR: Executable is not executable!" + exit 1 + fi else echo "Error: Ivory.app not found in dist/" echo "Contents of dist/:" diff --git a/INSTALLATION_NOTES.md b/INSTALLATION_NOTES.md @@ -24,6 +24,29 @@ If you encounter a "JavaScript error" or "Node.js error" when running `ivory.exe 4. **First launch**: Right-click `Ivory.app` → "Open" (to bypass Gatekeeper) 5. When prompted, click **"Open"** again +### Troubleshooting: App Won't Launch + +If the app doesn't launch after bypassing Gatekeeper, try running it from Terminal to see error messages: + +```bash +# Navigate to Applications +cd /Applications + +# Try to run the app directly +./Ivory.app/Contents/MacOS/Ivory + +# Or if that doesn't work, find the executable name: +ls -la Ivory.app/Contents/MacOS/ + +# Then run it directly (replace "Ivory" with actual executable name if different) +./Ivory.app/Contents/MacOS/[executable-name] +``` + +**Common issues:** +- **Missing Python**: The app should be standalone, but if you see Python errors, you may need Python 3.6+ installed +- **Missing libraries**: Check Terminal output for missing .dylib files +- **Permission issues**: Run `chmod +x /Applications/Ivory.app/Contents/MacOS/*` + ### Installation (DMG - Alternative) 1. **Download** `Ivory.dmg` from the releases page