// the find
EvanBacon/expo-apple-targets
Config Plugin to setup Apple targets
An Expo Config Plugin that generates and manages Apple extension targets (widgets, App Clips, Safari extensions, watch apps, and ~40 more) outside the ephemeral `/ios` directory. It's built for the Continuous Native Generation workflow where `ios/` is gitignored and rebuilt on every prebuild. If you're an Expo developer who needs to ship a widget or App Clip without bailing out of managed workflow, this is the only real option.
The `targets/` directory living outside `ios/` is the right call — your Swift code survives `expo prebuild --clean` and stays in git without fighting Xcode's project file. The config-driven entitlements generation (`entitlements` object in `expo-target.config.js`) means you can template App Group identifiers from your bundle ID at prebuild time rather than wiring them up by hand in Xcode. The kitchen-sink demo app with 20+ target types gives you working Swift starters for obscure extension types you'd otherwise spend hours hunting down in Apple docs. The agent skill integration (`.claude/skills/`) is a genuinely useful addition — shipping per-target documentation that loads into Claude Code or Cursor means less context-switching to Apple docs when writing the Swift side.
The underlying Xcode parser (`@bacons/xcode`) is described by the author as 'mostly typed, very untested, and possibly full of bugs' — that's the load-bearing piece of the whole thing, and it's not a confidence-inspiring characterization. App Clip codesigning is explicitly not fully automated, which is the hardest part of shipping an App Clip; the docs acknowledge this and basically say 'good luck.' ESM and TypeScript are not supported in target config files, which is an annoying inconsistency in an Expo ecosystem that otherwise encourages TypeScript everywhere. The CocoaPods minimum (1.16.2 / Ruby 3.2.0) and Xcode 16 / macOS 15 requirements will block anyone on older CI images or machines without a clear upgrade path documented.