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:
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