name: OpenClaw options: bundleIdPrefix: ai.openclawfoundation deploymentTarget: iOS: "18.0" xcodeVersion: "26.0" settings: base: SWIFT_VERSION: "6.0" ENABLE_APP_INTENTS_METADATA_GENERATION: NO packages: OpenClawKit: path: ../shared/OpenClawKit Swabble: path: ../swabble WebRTC: url: https://github.com/stasel/WebRTC.git exactVersion: 147.0.0 schemes: OpenClaw: shared: true build: targets: OpenClaw: all test: targets: - OpenClawTests - OpenClawLogicTests OpenClawLogicTests: shared: true build: targets: OpenClawLogicTests: all test: targets: - OpenClawLogicTests OpenClawUITests: shared: true build: targets: OpenClawUITests: all test: targets: - OpenClawUITests OpenClawWatchApp: shared: true build: targets: OpenClawWatchApp: all targets: OpenClaw: type: application platform: iOS configFiles: Debug: Signing.xcconfig Release: Signing.xcconfig sources: - path: Sources - path: Resources/Licenses type: folder buildPhase: resources - path: Sources/Fonts buildPhase: resources - path: Resources/Localizable.xcstrings buildPhase: resources dependencies: - target: OpenClawShareExtension embed: true - target: OpenClawActivityWidget embed: true # A companion watch application belongs in the standard Watch bundle location. # PlugIns is for extension products and breaks paired watch installation. - target: OpenClawWatchApp - package: OpenClawKit - package: OpenClawKit product: OpenClawChatUI - package: OpenClawKit product: OpenClawProtocol - package: Swabble product: SwabbleKit - package: WebRTC - sdk: AppIntents.framework - sdk: HealthKit.framework preBuildScripts: - name: SwiftFormat (lint) basedOnDependencyAnalysis: false inputFileLists: - $(SRCROOT)/SwiftSources.input.xcfilelist script: | set -euo pipefail export PATH="$PATH:/opt/homebrew/bin:/usr/local/bin" "$SRCROOT/../../scripts/check-swift-tools.sh" swiftformat swiftformat --lint --config "$SRCROOT/../../config/swiftformat" \ --unexclude "$SRCROOT/Sources,$SRCROOT/ShareExtension,$SRCROOT/ActivityWidget,$SRCROOT/WatchApp,$SRCROOT/../shared/OpenClawKit/Sources/OpenClawChatUI,$SRCROOT/../shared/OpenClawKit/Sources/OpenClawKit,$SRCROOT/../shared/OpenClawKit/Sources/OpenClawNativeState,$SRCROOT/../shared/OpenClawKit/Sources/OpenClawProtocol,$SRCROOT/../swabble/Sources/SwabbleKit" \ --filelist "$SRCROOT/SwiftSources.input.xcfilelist" - name: SwiftLint basedOnDependencyAnalysis: false inputFileLists: - $(SRCROOT)/SwiftSources.input.xcfilelist script: | set -euo pipefail export PATH="$PATH:/opt/homebrew/bin:/usr/local/bin" "$SRCROOT/../../scripts/check-swift-tools.sh" swiftlint swiftlint lint --strict --config "$SRCROOT/.swiftlint.yml" --use-script-input-file-lists postBuildScripts: - name: Stage Canvas A2UI resources basedOnDependencyAnalysis: false script: | set -euo pipefail export PATH="$PATH:/opt/homebrew/bin:/usr/local/bin" repo_root="$(cd "$SRCROOT/../.." && pwd -P)" resource_product="$BUILT_PRODUCTS_DIR/OpenClawKit_OpenClawKit.bundle" resource_bundle="$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/OpenClawKit_OpenClawKit.bundle" test -d "$resource_product" test -d "$resource_bundle" node "$repo_root/scripts/sync-native-a2ui.mjs" \ --write \ --output "$resource_product/CanvasA2UI" rm -rf "$resource_bundle/CanvasA2UI" cp -R "$resource_product/CanvasA2UI" "$resource_bundle/CanvasA2UI" settings: base: ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_ENTITLEMENTS: "$(OPENCLAW_CODE_SIGN_ENTITLEMENTS)" CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" OPENCLAW_ACTIVE_APP_GROUP_ID: "$(OPENCLAW_APP_GROUP_ID)" OPENCLAW_URL_SCHEME: openclaw PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_APP_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "$(OPENCLAW_APP_PROFILE)" TARGETED_DEVICE_FAMILY: "1,2" SWIFT_VERSION: "6.0" SWIFT_STRICT_CONCURRENCY: complete SUPPORTS_LIVE_ACTIVITIES: YES ENABLE_APPINTENTS_METADATA: NO ENABLE_APP_INTENTS_METADATA_GENERATION: NO configs: Debug: ASSETCATALOG_COMPILER_APPICON_NAME: AppIconDebug CODE_SIGN_STYLE: Automatic OPENCLAW_ACTIVE_APP_GROUP_ID: "$(OPENCLAW_DEBUG_APP_GROUP_ID)" OPENCLAW_CODE_SIGN_ENTITLEMENTS: Sources/OpenClaw.entitlements OPENCLAW_APNS_ENTITLEMENT_ENVIRONMENT: development OPENCLAW_URL_SCHEME: openclaw-debug PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_APP_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "" OPENCLAW_PUSH_MODE: localSandbox OPENCLAW_PUSH_RELAY_BASE_URL: "" Release: OPENCLAW_CODE_SIGN_ENTITLEMENTS: Sources/OpenClaw.entitlements OPENCLAW_APNS_ENTITLEMENT_ENVIRONMENT: production OPENCLAW_PUSH_MODE: localProduction OPENCLAW_PUSH_RELAY_BASE_URL: "" info: path: Sources/Info.plist properties: CFBundleDisplayName: OpenClaw CFBundleIconName: "$(ASSETCATALOG_COMPILER_APPICON_NAME)" CFBundleURLTypes: - CFBundleURLName: ai.openclawfoundation.app CFBundleURLSchemes: - "$(OPENCLAW_URL_SCHEME)" CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" OpenClawCanonicalVersion: "$(OPENCLAW_IOS_VERSION)" OpenClawGitCommit: "$(OPENCLAW_GIT_COMMIT)" OpenClawBuildTimestamp: "$(OPENCLAW_BUILD_TIMESTAMP)" OpenClawAppGroupIdentifier: "$(OPENCLAW_ACTIVE_APP_GROUP_ID)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)" UILaunchScreen: {} UIApplicationSceneManifest: UIApplicationSupportsMultipleScenes: false UIBackgroundModes: - audio - location - remote-notification BGTaskSchedulerPermittedIdentifiers: - "$(PRODUCT_BUNDLE_IDENTIFIER).bgrefresh" NSLocalNetworkUsageDescription: OpenClaw discovers and connects to your OpenClaw gateway on the local network. NSAppTransportSecurity: NSAllowsArbitraryLoadsInWebContent: true NSAllowsLocalNetworking: true NSBonjourServices: - _openclaw-gw._tcp NSCameraUsageDescription: OpenClaw uses the camera when you scan a Gateway setup QR code or ask your paired Gateway or assistant to capture a photo or short video from this iPhone, for example to connect to your Gateway or show your assistant a document, device screen, or workspace. NSCalendarsUsageDescription: OpenClaw uses your calendars to show events and scheduling context when you enable calendar access. NSCalendarsFullAccessUsageDescription: OpenClaw uses your calendars to show events and scheduling context when you enable calendar access. NSCalendarsWriteOnlyAccessUsageDescription: OpenClaw uses your calendars to add events when you enable calendar access. NSContactsUsageDescription: OpenClaw uses your contacts so you can search and reference people while using the assistant. NSLocationWhenInUseUsageDescription: OpenClaw uses your location when you allow location sharing. NSLocationAlwaysAndWhenInUseUsageDescription: OpenClaw can share your location in the background when you enable Always. NSMicrophoneUsageDescription: OpenClaw uses the microphone for realtime chat, voice wake, push-to-talk, and voice notes. NSMotionUsageDescription: OpenClaw may use motion data to support device-aware interactions and automations. NSHealthShareUsageDescription: OpenClaw reads your steps, sleep, resting heart rate, and workouts from the Apple Health app to create summaries you request and send them through your Gateway to your configured AI provider. NSHealthUpdateUsageDescription: OpenClaw does not write to the Apple Health app. It uses read-only data to create summaries you request and send them through your Gateway to your configured AI provider. NSPhotoLibraryUsageDescription: OpenClaw lets your assistant read photos you allow and lets you choose photos to share. PHPhotoLibraryPreventAutomaticLimitedAccessAlert: true NSRemindersFullAccessUsageDescription: OpenClaw uses your reminders to list, add, and complete tasks when you enable reminders access. NSSpeechRecognitionUsageDescription: OpenClaw uses on-device speech recognition for talk mode and voice wake. NSSupportsLiveActivities: true ITSAppUsesNonExemptEncryption: false UIAppFonts: - RedHatDisplay[wght].ttf - Inter[opsz,wght].ttf - Inter-Italic[opsz,wght].ttf - JetBrainsMono-Regular.ttf - JetBrainsMono-Medium.ttf - JetBrainsMono-SemiBold.ttf OpenClawPushMode: "$(OPENCLAW_PUSH_MODE)" OpenClawPushRelayBaseURL: "$(OPENCLAW_PUSH_RELAY_BASE_URL)" UISupportedInterfaceOrientations: - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight OpenClawShareExtension: type: app-extension platform: iOS configFiles: Debug: Signing.xcconfig Release: Signing.xcconfig sources: - path: ShareExtension - path: Resources/Localizable.xcstrings buildPhase: resources dependencies: - package: OpenClawKit - sdk: AppIntents.framework settings: base: CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_ENTITLEMENTS: ShareExtension/OpenClawShareExtension.entitlements CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" ENABLE_APPINTENTS_METADATA: NO ENABLE_APP_INTENTS_METADATA_GENERATION: NO OPENCLAW_ACTIVE_APP_GROUP_ID: "$(OPENCLAW_APP_GROUP_ID)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_SHARE_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "$(OPENCLAW_SHARE_PROFILE)" TARGETED_DEVICE_FAMILY: "1,2" SWIFT_VERSION: "6.0" SWIFT_STRICT_CONCURRENCY: complete configs: Debug: CODE_SIGN_STYLE: Automatic OPENCLAW_ACTIVE_APP_GROUP_ID: "$(OPENCLAW_DEBUG_APP_GROUP_ID)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_SHARE_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "" info: path: ShareExtension/Info.plist properties: CFBundleDisplayName: OpenClaw Share CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" OpenClawAppGroupIdentifier: "$(OPENCLAW_ACTIVE_APP_GROUP_ID)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)" NSExtension: NSExtensionPointIdentifier: com.apple.share-services NSExtensionPrincipalClass: "$(PRODUCT_MODULE_NAME).ShareViewController" NSExtensionAttributes: NSExtensionActivationRule: NSExtensionActivationSupportsText: true NSExtensionActivationSupportsWebURLWithMaxCount: 1 NSExtensionActivationSupportsImageWithMaxCount: 10 NSExtensionActivationSupportsMovieWithMaxCount: 1 OpenClawActivityWidget: type: app-extension platform: iOS configFiles: Debug: Signing.xcconfig Release: Signing.xcconfig sources: - path: ActivityWidget - path: Sources/LiveActivity/OpenClawActivityAttributes.swift # Shared continuous avatar waveform; dependency-free for widget isolation. - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/TalkWaveformView.swift group: Shared - path: Sources/Fonts buildPhase: resources - path: Resources/Localizable.xcstrings buildPhase: resources dependencies: - sdk: WidgetKit.framework - sdk: ActivityKit.framework settings: base: CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_ACTIVITY_WIDGET_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "$(OPENCLAW_ACTIVITY_WIDGET_PROFILE)" TARGETED_DEVICE_FAMILY: "1,2" SWIFT_VERSION: "6.0" SWIFT_STRICT_CONCURRENCY: complete SUPPORTS_LIVE_ACTIVITIES: YES configs: Debug: CODE_SIGN_STYLE: Automatic PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_ACTIVITY_WIDGET_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "" info: path: ActivityWidget/Info.plist properties: CFBundleDisplayName: OpenClaw Activity CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)" NSSupportsLiveActivities: true UIAppFonts: - RedHatDisplay[wght].ttf - Inter[opsz,wght].ttf - Inter-Italic[opsz,wght].ttf - JetBrainsMono-Regular.ttf - JetBrainsMono-Medium.ttf - JetBrainsMono-SemiBold.ttf NSExtension: NSExtensionPointIdentifier: com.apple.widgetkit-extension OpenClawWatchApp: type: application platform: watchOS deploymentTarget: "11.0" sources: - path: WatchApp excludes: - Info.plist - path: Sources/Services/WatchSessionActivationGate.swift group: Sources/Services - path: Sources/Services/ExactOpaqueIdentifier.swift group: Sources/Services # Universal talk waveform, compiled directly to keep the watch styling local. - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/TalkWaveformView.swift group: Shared # Universal mascot, compiled directly to keep the watch styling local. - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotView.swift group: Shared - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotAnimator.swift group: Shared - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotCanvas+Accessories.swift group: Shared - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/ChatTypography.swift group: Shared - path: Sources/Fonts buildPhase: resources - path: Resources/Localizable.xcstrings buildPhase: resources dependencies: - package: OpenClawKit product: OpenClawKit - sdk: AppIntents.framework - sdk: AVFAudio.framework - sdk: WatchConnectivity.framework - sdk: UserNotifications.framework configFiles: Debug: Config/Signing.xcconfig Release: Config/Signing.xcconfig attributes: DevelopmentTeam: "$(OPENCLAW_DEVELOPMENT_TEAM)" ProvisioningStyle: "$(OPENCLAW_CODE_SIGN_STYLE)" settings: base: ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" ENABLE_APPINTENTS_METADATA: NO ENABLE_APP_INTENTS_METADATA_GENERATION: NO OPENCLAW_COMPANION_APP_BUNDLE_ID: "$(OPENCLAW_APP_BUNDLE_ID)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_WATCH_APP_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "$(OPENCLAW_WATCH_APP_PROFILE)" SWIFT_STRICT_CONCURRENCY: complete SWIFT_VERSION: "6.0" configs: Debug: ASSETCATALOG_COMPILER_APPICON_NAME: AppIconDebug CODE_SIGN_STYLE: Automatic OPENCLAW_COMPANION_APP_BUNDLE_ID: "$(OPENCLAW_DEBUG_APP_BUNDLE_ID)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_WATCH_APP_BUNDLE_ID)" PROVISIONING_PROFILE_SPECIFIER: "" info: path: WatchApp/Info.plist properties: CFBundleDisplayName: OpenClaw CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)" WKCompanionAppBundleIdentifier: "$(OPENCLAW_COMPANION_APP_BUNDLE_ID)" WKApplication: true WKPrefersNetworkUponForeground: true NSLocalNetworkUsageDescription: OpenClaw connects this Apple Watch directly to your Gateway on trusted local networks. UIAppFonts: - RedHatDisplay[wght].ttf - Inter[opsz,wght].ttf - Inter-Italic[opsz,wght].ttf - JetBrainsMono-Regular.ttf - JetBrainsMono-Medium.ttf - JetBrainsMono-SemiBold.ttf OpenClawTests: type: bundle.unit-test platform: iOS configFiles: Debug: Signing.xcconfig Release: Signing.xcconfig sources: - path: Tests excludes: - Logic - path: WatchApp/Sources/WatchDeferredPayloadOrdering.swift group: WatchApp/Sources dependencies: - target: OpenClaw - package: Swabble product: SwabbleKit - sdk: AppIntents.framework settings: base: CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_APP_BUNDLE_ID).tests" ENABLE_APP_INTENTS_METADATA_GENERATION: NO SWIFT_VERSION: "6.0" SWIFT_STRICT_CONCURRENCY: complete TEST_HOST: "$(BUILT_PRODUCTS_DIR)/OpenClaw.app/OpenClaw" BUNDLE_LOADER: "$(TEST_HOST)" configs: Debug: PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_APP_BUNDLE_ID).tests" info: path: Tests/Info.plist properties: CFBundleDisplayName: "$(PRODUCT_NAME)" CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)" OpenClawLogicTests: type: bundle.unit-test platform: iOS configFiles: Debug: Signing.xcconfig Release: Signing.xcconfig sources: - path: Tests/Logic - path: ShareExtension/ShareDraftComposer.swift group: ShareExtension - path: ShareExtension/ShareContentExtractor.swift group: ShareExtension - path: ShareExtension/ShareComposeState.swift group: ShareExtension - path: ShareExtension/ShareAttachmentSummary.swift group: ShareExtension - path: WatchApp/Sources/WatchVoiceTurnTracker.swift group: WatchApp/Sources - path: WatchApp/Sources/WatchInboxMessages.swift group: WatchApp/Sources - path: WatchApp/Sources/WatchMascot.swift group: WatchApp/Sources - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotView.swift group: Shared - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotAnimator.swift group: Shared - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/OpenClawMascotCanvas+Accessories.swift group: Shared - path: ../shared/OpenClawKit/Sources/OpenClawChatUI/ChatTypography.swift group: Shared - path: Sources/Services/ExactOpaqueIdentifier.swift group: Sources/Services dependencies: - package: OpenClawKit settings: base: CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_APP_BUNDLE_ID).logic-tests" ENABLE_APP_INTENTS_METADATA_GENERATION: NO SWIFT_EMIT_CONST_VALUE_PROTOCOLS: "" SWIFT_VERSION: "6.0" SWIFT_STRICT_CONCURRENCY: complete configs: Debug: PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_APP_BUNDLE_ID).logic-tests" info: path: Tests/Info.plist properties: CFBundleDisplayName: "$(PRODUCT_NAME)" CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)" OpenClawUITests: type: bundle.ui-testing platform: iOS configFiles: Debug: Signing.xcconfig Release: Signing.xcconfig sources: - path: UITests dependencies: - target: OpenClaw settings: base: CODE_SIGN_IDENTITY: "$(OPENCLAW_CODE_SIGN_IDENTITY)" CODE_SIGN_STYLE: "$(OPENCLAW_CODE_SIGN_STYLE)" DEVELOPMENT_TEAM: "$(OPENCLAW_DEVELOPMENT_TEAM)" PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_APP_BUNDLE_ID).ui-tests" SDKROOT: iphoneos SUPPORTED_PLATFORMS: "iphonesimulator iphoneos" SUPPORTS_MACCATALYST: NO SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: NO TEST_TARGET_NAME: OpenClaw SWIFT_VERSION: "5.0" configs: Debug: PRODUCT_BUNDLE_IDENTIFIER: "$(OPENCLAW_DEBUG_APP_BUNDLE_ID).ui-tests" info: path: UITests/Info.plist properties: CFBundleDisplayName: OpenClawUITests CFBundleShortVersionString: "$(OPENCLAW_MARKETING_VERSION)" CFBundleVersion: "$(OPENCLAW_BUILD_VERSION)"