apple-platform-targets · git:20260904.bf7ba69 · 2026-09-04 · sha256 a9c6fe7969a0c9ec
apple-platform-targets git:20260904.bf7ba69A
Immutable. This exact content is served forever at /api/v1/blob/a9c6fe7969a0c9ec.
--- name: apple-platform-targets description: Default minimum deployment targets for Apple-platform Swift Apps and how to deviate up or down. Default is iOS 18 / macOS 15 with Xcode 16+ (first toolchain to formally support Swift 6 language mode). Invoke when starting a new Apple-platform project, writing Package.swift `platforms:` list, deciding whether to adopt Liquid Glass / latest-OS-only APIs, or when asked "what should the minimum iOS / macOS version be?". --- # Apple Platform Deployment Targets ## When to invoke - Starting a new iOS / macOS App and setting the minimum deployment version. - Writing the `platforms:` block in `Package.swift`. - Deciding whether to adopt latest-OS-only APIs (Liquid Glass `.glassEffect()`, new Observation, new SwiftData behaviour, etc.). - User asks about minimum iOS / macOS version or whether to support the previous major version. ## Kickoff order This skill is the entry point for a new Apple-platform project — decide these defaults in this order, each via its own skill: 1. **Platform** (this skill) — minimum deployment target. 2. `swiftpm-modularization` — package / module shape. 3. `swift6-concurrency` — language mode and concurrency checking. 4. `swift-testing-baseline` — test framework and snapshot strategy. 5. `oslog-logger-defaults`, `telemetry-facade-pattern`, `apple-three-piece-analytics` — logging, telemetry facade, and analytics stack. 6. `mise-tool-management` — CLI tool version manager. 7. `xcode-cloud-single-track-ci` — CI pipeline. ## Default decisions - **iOS 18 / macOS 15** as the default minimum. - Toolchain: **Xcode 16+** (the first version with formal Swift 6 language mode support). - Do not auto-bump with each Xcode major — bumping requires an explicit decision recorded in `foundations.md`. - Keep `Package.swift` `platforms:` **aligned** with the App target deployment target; no skew. ## Rationale - iOS 18 / macOS 15 aligns with the Swift 6 toolchain, unlocking Observation / SwiftData improvements and async sequence enhancements. - Locking out auto-bumps prevents blindly chasing each Xcode major and losing users who haven't upgraded. - For solo / small projects the user base is small, so the compatibility tax is low compared to the stability benefit. ## Deviation considerations ### Bump up to iOS 26 / macOS 26 (or newer) - **Trigger**: adopting Liquid Glass (`.glassEffect()` is iOS 26+) or other latest-OS-only APIs. - **Conditions**: the project has no backward-compat baggage (brand new App, no existing user base); or it's a personal / showcase project willing to cut off older versions. - **Cost**: lose users on older OS; TestFlight beta testers must upgrade. - **How to record**: explicitly note "deviating from apple-platform-targets default" in `foundations.md` with a reason. ### Drop down to iOS 17- / macOS 14- - **Trigger**: the App needs a large pool of older-device users (education, enterprise intranet, low-end markets). - **Cost**: lose full Observation behaviour, SwiftData fixes, parts of Swift 6 mode checking. - **Advice**: explicitly record which APIs are off-limits and which behaviours need polyfills. ## Verification checklist when locking targets - `Package.swift` `platforms:` matches every App target's `IPHONEOS_DEPLOYMENT_TARGET` / `MACOSX_DEPLOYMENT_TARGET`. - Xcode version is locked via `.mise.toml` or the project README. - CI (e.g. Xcode Cloud) Xcode version matches the local lock. ## Related skills - `swift6-concurrency`: Xcode 16+ / Swift 6 mode is coupled to this skill's version choice. - `xcode-cloud-single-track-ci`: CI Xcode version lock. - `mise-tool-management`: local Xcode-select / toolchain version management.