openclaw/apps/macos
Kenny Lee 58be73e179 fix(macos): allow disabling launchd job when switching to remote mode
Previously, GatewayLaunchAgentManager.set() returned early for ANY launchd change
in remote mode. This prevented the launchd job from being unloaded when switching
from local to remote mode, causing a crash-loop as the job kept trying to bind
to port 18789 (which the SSH tunnel was using).

Now only 'enable' is blocked in remote mode; 'disable' (uninstall) proceeds
normally so the job is properly unloaded.

Fixes #2354
2026-01-26 11:49:41 -08:00
..
Icon.icon feat: add prek pre-commit hooks and dependabot (#1720) 2026-01-25 10:53:23 +00:00
Sources fix(macos): allow disabling launchd job when switching to remote mode 2026-01-26 11:49:41 -08:00
Tests/ClawdbotIPCTests feat: add beta googlechat channel 2026-01-24 23:30:45 +00:00
Package.resolved macOS: bump Textual to 0.3.1 (#2033) 2026-01-25 21:02:18 -06:00
Package.swift refactor: consolidate mac debug CLI 2026-01-20 19:17:31 +00:00
README.md fix: harden macOS signing flow 2026-01-18 16:28:39 +00:00

Clawdbot macOS app (dev + signing)

Quick dev run

# from repo root
scripts/restart-mac.sh

Options:

scripts/restart-mac.sh --no-sign   # fastest dev; ad-hoc signing (TCC permissions do not stick)
scripts/restart-mac.sh --sign      # force code signing (requires cert)

Packaging flow

scripts/package-mac-app.sh

Creates dist/Clawdbot.app and signs it via scripts/codesign-mac-app.sh.

Signing behavior

Auto-selects identity (first match):

  1. Developer ID Application
  2. Apple Distribution
  3. Apple Development
  4. first available identity

If none found:

  • errors by default
  • set ALLOW_ADHOC_SIGNING=1 or SIGN_IDENTITY="-" to ad-hoc sign

Team ID audit (Sparkle mismatch guard)

After signing, we read the app bundle Team ID and compare every Mach-O inside the app. If any embedded binary has a different Team ID, signing fails.

Skip the audit:

SKIP_TEAM_ID_CHECK=1 scripts/package-mac-app.sh

Library validation workaround (dev only)

If Sparkle Team ID mismatch blocks loading (common with Apple Development certs), opt in:

DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh

This adds com.apple.security.cs.disable-library-validation to app entitlements. Use for local dev only; keep off for release builds.

Useful env flags

  • SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"
  • ALLOW_ADHOC_SIGNING=1 (ad-hoc, TCC permissions do not persist)
  • CODESIGN_TIMESTAMP=off (offline debug)
  • DISABLE_LIBRARY_VALIDATION=1 (dev-only Sparkle workaround)
  • SKIP_TEAM_ID_CHECK=1 (bypass audit)