This project ships as a standalone macOS app bundle plus distributable archives.
Current artifact outputs:
dist/LocalhostWatcher.appdist/LocalhostWatcher-1.0.dmgdist/LocalhostWatcher-1.0.zip
Debug build:
swift buildDebug app bundle and launch:
./run-menubar.shRelease binary:
swift build -c releaseThe reliable release flow is:
- Build the release binary with
swift build -c release - Assemble a clean
.appbundle from.build/arm64-apple-macosx/release - Copy the app icon and SwiftPM resource bundle into
Contents/Resources - Sign the
.appwithDeveloper ID Application - Create a distributable
.dmg - Sign the
.dmg - Submit the
.dmgfor notarization - Staple the notarization ticket to the
.dmg - Optionally zip and notarize the standalone
.app
Use the local Developer ID Application certificate, not an Apple Development or Apple Distribution identity.
Expected identity format:
Developer ID Application: <Name> (<Team ID>)
- Notarize release builds, not debug builds.
- Debug builds may include attributes that Apple rejects for notarization.
- If notarization fails, fetch the detailed notarization log with
xcrun notarytool log <submission-id>.
Inspect app signature:
codesign -dv --verbose=4 dist/LocalhostWatcher.appVerify app signature:
codesign --verify --deep --strict --verbose=2 dist/LocalhostWatcher.appValidate a stapled disk image:
xcrun stapler validate dist/LocalhostWatcher-1.0.dmgInspect disk image metadata:
hdiutil imageinfo dist/LocalhostWatcher-1.0.dmgThis app depends on the SwiftPM-generated runtime resource directory:
LocalhostWatcher_LocalhostWatcher.bundle
If that resource bundle is missing from Contents/Resources, the packaged app may launch incorrectly or fail to find its app icon resource at runtime.
The best end-user artifact is the notarized .dmg.
Use the .zip if you need to distribute the standalone app bundle outside the disk image flow.