Skip to content
Development
Skill

/guide-macos-spm-packaging

Scaffold, build, and package SwiftPM-based macOS apps without an Xcode project. Use when you need a from-scratch macOS app layout, SwiftPM targets/resources, a custom .app bundle assembly script, or signing/notarization/appcast steps outside Xcode.

From plugin
apple-skills
35229 skills

Claude Code

$ npx -y skills add Prisma-Labs-Dev/apple-skills --skill guide-macos-spm-packaging --agent claude-code

SKILL.md

guide-macos-spm-packaging.SKILL.md
name: guide-macos-spm-packaging
description: Scaffold, build, and package SwiftPM-based macOS apps without an Xcode project. Use when you need a from-scratch macOS app layout, SwiftPM targets/resources, a custom .app bundle assembly script, or signing/notarization/appcast steps outside Xcode.
type: guide
origin: https://github.com/Dimillian/Skills
license: MIT

> **Guide Skill** — This is an expert workflow/pattern guide, not API reference documentation. > Originally from [Dimillian/Skills](https://github.com/Dimillian/Skills) by Thomas Ricouard. MIT License.

macOS SwiftPM App Packaging (No Xcode)

Overview

Bootstrap a complete SwiftPM macOS app folder, then build, package, and run it without Xcode. Use `assets/templates/bootstrap/` for the starter layout and `references/packaging.md` + `references/release.md` for packaging and release details.

Two-Step Workflow

1) Bootstrap the project folder

  • Copy `assets/templates/bootstrap/` into a new repo.
  • Rename `MyApp` in `Package.swift`, `Sources/MyApp/`, and `version.env`.
  • Customize `APP_NAME`, `BUNDLE_ID`, and versions.

2) Build, package, and run the bootstrapped app

  • Copy scripts from `assets/templates/` into your repo (for example, `Scripts/`).
  • Build/tests: `swift build` and `swift test`.
  • Package: `Scripts/package_app.sh`.
  • Run: `Scripts/compile_and_run.sh` (preferred) or `Scripts/launch.sh`.
  • Release (optional): `Scripts/sign-and-notarize.sh` and `Scripts/make_appcast.sh`.
  • Tag + GitHub release (optional): create a git tag, upload the zip/appcast to the GitHub release, and publish.

Minimum End-to-End Example

Shortest path from bootstrap to a running app:

# 1. Copy and rename the skeleton
cp -R assets/templates/bootstrap/ ~/Projects/MyApp
cd ~/Projects/MyApp
sed -i '' 's/MyApp/HelloApp/g' Package.swift version.env

# 2. Copy scripts
cp assets/templates/package_app.sh Scripts/
cp assets/templates/compile_and_run.sh Scripts/
chmod +x Scripts/*.sh

# 3. Build and launch
swift build
Scripts/compile_and_run.sh

Validation Checkpoints

Run these after key steps to catch failures early before proceeding to the next stage.

**After packaging (`Scripts/package_app.sh`):**

# Confirm .app bundle structure is intact
ls -R build/HelloApp.app/Contents

# Check that the binary is present and executable
file build/HelloApp.app/Contents/MacOS/HelloApp

**After signing (`Scripts/sign-and-notarize.sh` or ad-hoc dev signing):**

# Inspect signature and entitlements
codesign -dv --verbose=4 build/HelloApp.app

# Verify the bundle passes Gatekeeper checks locally
spctl --assess --type execute --verbose build/HelloApp.app

**After notarization and stapling:**

# Confirm the staple ticket is attached
stapler validate build/HelloApp.app

# Re-run Gatekeeper to confirm notarization is recognised
spctl --assess --type execute --verbose build/HelloApp.app

Common Notarization Failures

| Symptom | Likely Cause | Recovery | |---|---|---| | `The software asset has already been uploaded` | Duplicate submission for same version | Bump `BUILD_NUMBER` in `version.env` and repackage. | | `Package Invalid: Invalid Code Signing Entitlements` | Entitlements in `.entitlements` file don't match provisioning | Audit entitlements against Apple's allowed set; remove unsupported keys. | | `The executable does not have the hardened runtime enabled` | Missing `--options runtime` flag in `codesign` invocation | Edit `sign-and-notarize.sh` to add `--options runtime` to all `codesign` calls. | | Notarization hangs / no status email | `xcrun notarytool` network or credential issue | Run `xcrun notarytool history` to check status; re-export App Store Connect API key if expired. | | `stapler validate` fails after successful notarization | Ticket not yet propagated | Wait ~60 s, then re-run `xcrun stapler staple`. |

Templates

  • `assets/templates/package_app.sh`: Build binaries, create the .app bundle, copy resources, sign.
  • `assets/templates/compile_and_run.sh`: Dev loop to kill running app, package, launch.
  • `assets/templates/build_icon.sh`: Generate .icns from an Icon Composer file (requires Xcode install).
  • `assets/templates/sign-and-notarize.sh`: Notarize, staple, and zip a release build.
  • `assets/templates/make_appcast.sh`: Generate Sparkle appcast entries for updates.
  • `assets/templates/setup_dev_signing.sh`: Create a stable dev code-signing identity.
  • `assets/templates/launch.sh`: Simple launcher for a packaged .app.
  • `assets/templates/version.env`: Example version file consumed by packaging scripts.
  • `assets/templates/bootstrap/`: Minimal SwiftPM macOS app skeleton (Package.swift, Sources/, version.env).

Notes

  • Keep entitlements and signing configuration explicit; edit the template scripts instead of reimplementing.
  • Remove Sparkle steps if you do not use Sparkle for updates.
  • Sparkle relies on the bundle build number (`CFBundleVersion`), so `BUILD_NUMBER` in `version.env` must increase for each update.
  • For menu bar apps, set `MENU_BAR_APP=1` when packaging to emit `LSUIElement` in Info.plist.
Read more
@prisma-labs-dev
Ships withapple-skills

Apple development skills for Claude Code, Codex, and other coding agents — current iOS 26+ APIs, SwiftUI, UIKit, Liquid Glass, Human Interface Guidelines, and practical workflow guides.

Stars on GitHub

Momentum

stars in total
352
Star history of Prisma-Labs-Dev/apple-skills on GitHub, a chart by star-history.com

Other skills on apple-skills.

apple-aso

apple-aso

Optimize Apple App Store metadata in store.config.json for ASO (App Store Optimization). Use when working with store.config.json,…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about guide-macos-spm-packaging.

Which coding agents can use guide-macos-spm-packaging?
guide-macos-spm-packaging installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.