{
  "title": "OpenClaw macOS release (Sparkle)",
  "content": "This app now ships Sparkle auto-updates. Release builds must be Developer ID–signed, zipped, and published with a signed appcast entry.\n\n* Developer ID Application cert installed (example: `Developer ID Application: <Developer Name> (<TEAMID>)`).\n* Sparkle private key path set in the environment as `SPARKLE_PRIVATE_KEY_FILE` (path to your Sparkle ed25519 private key; public key baked into Info.plist). If it is missing, check `~/.profile`.\n* Notary credentials (keychain profile or API key) for `xcrun notarytool` if you want Gatekeeper-safe DMG/zip distribution.\n  * We use a Keychain profile named `openclaw-notary`, created from App Store Connect API key env vars in your shell profile:\n    * `APP_STORE_CONNECT_API_KEY_P8`, `APP_STORE_CONNECT_KEY_ID`, `APP_STORE_CONNECT_ISSUER_ID`\n    * `echo \"$APP_STORE_CONNECT_API_KEY_P8\" | sed 's/\\\\n/\\n/g' > /tmp/openclaw-notary.p8`\n    * `xcrun notarytool store-credentials \"openclaw-notary\" --key /tmp/openclaw-notary.p8 --key-id \"$APP_STORE_CONNECT_KEY_ID\" --issuer \"$APP_STORE_CONNECT_ISSUER_ID\"`\n* `pnpm` deps installed (`pnpm install --config.node-linker=hoisted`).\n* Sparkle tools are fetched automatically via SwiftPM at `apps/macos/.build/artifacts/sparkle/Sparkle/bin/` (`sign_update`, `generate_appcast`, etc.).\n\n* `APP_BUILD` maps to `CFBundleVersion`/`sparkle:version`; keep it numeric + monotonic (no `-beta`), or Sparkle compares it as equal.\n* Defaults to the current architecture (`$(uname -m)`). For release/universal builds, set `BUILD_ARCHS=\"arm64 x86_64\"` (or `BUILD_ARCHS=all`).\n* Use `scripts/package-mac-dist.sh` for release artifacts (zip + DMG + notarization). Use `scripts/package-mac-app.sh` for local/dev packaging.",
  "code_samples": [],
  "headings": [
    {
      "level": "h2",
      "text": "Prereqs",
      "id": "prereqs"
    },
    {
      "level": "h2",
      "text": "Build & package",
      "id": "build-&-package"
    }
  ],
  "url": "llms-txt#openclaw-macos-release-(sparkle)",
  "links": []
}