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.