apple-targets
Build, configure, and debug native Apple extension and target types (widgets, App Clips, share extensions, watchOS apps, Safari extensions, notification extensions, VPN/network extensions, and 40+ more) in an Expo app using the @bacons/apple-targets config plugin. Use when a user wants to add home screen presence, share sheets, custom keyboards, Siri/App Intents, push notification handling, AutoFill/passkeys, Screen Time controls, or any other Apple app extension to a React Native / Expo project.
How do I install this agent skill?
npx skills add https://github.com/evanbacon/expo-apple-targets --skill apple-targetsIs this agent skill safe to install?
- Gen Agent Trust Hubpass
This skill provides comprehensive documentation and implementation guides for building over 40 types of Apple app extensions and targets (such as widgets, App Clips, VPN providers, and Siri intents) in Expo and React Native projects. It includes production-ready Swift and JavaScript code examples based on Apple's official frameworks and best practices. No security vulnerabilities or malicious patterns were identified.
- Socketpass
No alerts
- Snykpass
Risk: LOW · No issues
What does this agent skill do?
Apple Extension Target Skills Reference
This directory contains comprehensive skill documents for all supported Apple extension and target types. Each skill document provides everything an AI agent needs to understand, implement, and troubleshoot a specific Apple extension type, including:
- Apple documentation links and WWDC session references
- Runtime behavior and lifecycle explanation
- Real-world use cases and implementation patterns
- Production-ready Swift code examples
- Platform availability and version requirements
- Common gotchas and debugging tips
Installing This Skill
Install this skill into your coding agent (Claude Code, Cursor, Codex, etc.) with npx skills:
npx skills add EvanBacon/expo-apple-targets/tree/main/skills/apple-targets
The CLI auto-detects which agents you have installed and copies SKILL.md (plus the supporting reference docs in this directory) into the agent's skills directory (e.g. .claude/skills/ or .agents/skills/). Once installed, the agent loads this guidance automatically whenever you ask it to build an Apple extension or target.
How to Use These Skills
For AI Agents:
-
When a user asks about a specific extension type (e.g., "How do I build a widget?" or "I need to add a share extension"), read the corresponding skill document to get complete implementation guidance.
-
When planning a feature that might require an extension (e.g., "Add home screen presence" → read
widget.md), consult the skill document to understand requirements and constraints. -
When debugging extension issues, refer to the "Gotchas" section of the relevant skill document — these capture common pitfalls from Apple Developer Forums and real-world experience.
-
When uncertain which extension type fits a use case, scan the "Use Cases" sections across related skills to find the best match.
Structure of Each Skill Document:
Every skill document follows the template defined in _template.md:
- Frontmatter: Title, one-line description, minimum OS version
- Apple Documentation: Official reference links
- WWDC History: Session links showing evolution of the feature
- What It Does: Step-by-step runtime behavior
- Use Cases: Real-world scenarios organized by industry/app type
- Key Classes: Table of essential framework types
- Implementation: Production-ready Swift code with inline comments
- Using with @bacons/apple-targets: Setup instructions for this plugin
- Platform Availability: OS version matrix
- Gotchas: Common mistakes, memory limits, and silent failure modes
Skills by Category
User Interface Extensions
| Skill | Extension Type | When to Read |
|---|---|---|
| widget.md | widget | User wants home screen widgets, Lock Screen widgets, Live Activities, StandBy mode UI, or Control Center controls (iOS 18+). Timeline-based SwiftUI views. |
| clip.md | clip | User wants instant-launch mini-apps triggered by NFC, QR codes, App Clip Codes, Safari banners, or Messages links. Not an extension—a size-constrained application target. |
| share.md | share | User wants their app in the system share sheet to receive URLs, images, text, or files from other apps. |
| action.md | action | User wants context menu actions in Safari, Photos, or Files that transform content and optionally return modified data. |
| keyboard.md | keyboard | User wants a custom system keyboard with specialized input (emoji pickers, GIF search, language-specific layouts, calculators). |
| photo-editing.md | photo-editing | User wants to add filters, adjustments, or effects to photos/videos directly in the Photos app editing UI. |
| quicklook-preview.md | quicklook-preview | User wants rich previews of custom file types in Quick Look with interactive controls and multiple pages. |
| quicklook-thumbnail.md | quicklook-thumbnail | User wants to generate thumbnail images for custom file types shown in Finder, Files app, and Spotlight. |
Notifications
| Skill | Extension Type | When to Read |
|---|---|---|
| notification-service.md | notification-service | User wants to download images, decrypt payloads, or modify push notification content before display. Runs in background with 30-second time limit. |
| notification-content.md | notification-content | User wants custom SwiftUI/UIKit UI for expanded push notifications with interactive controls and rich media. |
Siri & Intents
| Skill | Extension Type | When to Read |
|---|---|---|
| intent.md | intent | User wants Siri voice commands for built-in domains (messaging, payments, workouts, media playback, ride booking). Uses legacy SiriKit framework. |
| intent-ui.md | intent-ui | User wants custom UI in the Siri interface when confirming or handling intents. Companion to the intent extension. |
| app-intent.md | app-intent | User wants modern App Intents (iOS 16+) for Shortcuts, Spotlight, Siri, Focus Filters, and Control Center widgets. Replaces custom .intentdefinition files. |
Networking & VPN
| Skill | Extension Type | When to Read |
|---|---|---|
| network-packet-tunnel.md | network-packet-tunnel | User wants to build a VPN client that tunnels all device traffic through a custom protocol. Classic and modern Personal VPN. |
| network-app-proxy.md | network-app-proxy | User wants app-level network filtering (per-app VPN) where specific apps route traffic through a custom proxy. Requires MDM or supervised devices. |
| network-dns-proxy.md | network-dns-proxy | User wants to intercept and respond to DNS queries system-wide, enabling DNS filtering, logging, or custom resolution. |
| network-filter-data.md | network-filter-data | User wants deep packet inspection for content filtering (parental controls, enterprise security). Requires special Apple entitlement. |
File Management
| Skill | Extension Type | When to Read |
|---|---|---|
| file-provider.md | file-provider | User wants to expose cloud storage or remote file systems in the Files app with on-demand download, search, and sync. |
| file-provider-ui.md | file-provider-ui | User wants custom UI for file actions (sharing, permissions) in the document picker. Companion to File Provider extension. |
Communication & Telephony
| Skill | Extension Type | When to Read |
|---|---|---|
| message-filter.md | message-filter | User wants to filter incoming SMS/MMS messages to classify spam, transactions, or promotions into separate tabs. |
| call-directory.md | call-directory | User wants to block phone numbers or provide caller ID labels for incoming calls. Updates a system-managed SQLite database. |
| unwanted-communication.md | unwanted-communication | User wants a UI for users to report unwanted calls, messages, or FaceTime attempts to a reporting service. Requires special entitlement. |
Content & Media
| Skill | Extension Type | When to Read |
|---|---|---|
| broadcast-upload.md | broadcast-upload | User wants to stream ReplayKit screen recordings to a live streaming service (Twitch, YouTube Live). Receives video/audio buffers in real time. |
| broadcast-setup-ui.md | broadcast-setup-ui | User wants custom UI for configuring a live broadcast (selecting stream key, privacy settings). Companion to broadcast upload extension. |
| safari.md | safari | User wants Safari Web Extensions (Manifest V3) with content scripts, background pages, and native messaging to the containing app. |
| content-blocker.md | content-blocker | User wants rule-based ad blocking, tracker blocking, or content hiding in Safari using JSON declarative rules. No JavaScript execution. |
Education & Screen Time
| Skill | Extension Type | When to Read |
|---|---|---|
| classkit-context.md | classkit-context | User wants to report student progress in educational apps to Apple's Schoolwork app via ClassKit framework. |
| device-activity-monitor.md | device-activity-monitor | User wants to monitor app/website usage and trigger actions when Screen Time limits are reached. Parental control and focus apps. |
| shield-action.md | shield-action | User wants custom UI when a user attempts to bypass a Screen Time shield (blocked app/website). Handle or deny the request. |
| shield-config.md | shield-config | User wants custom shield UI (blocking screen) shown when apps or websites are restricted by Screen Time rules. |
Authentication & Security
| Skill | Extension Type | When to Read |
|---|---|---|
| authentication-services.md | authentication-services | User wants AutoFill for passwords and passkeys in Safari and apps. Modern replacement for credentials-provider. Supports passkey creation/assertion (WebAuthn). |
| credentials-provider.md | credentials-provider | User wants legacy password AutoFill (iOS 12+). For new projects, use authentication-services instead, which supports both passwords and passkeys. |
| smart-card.md | smart-card | User wants to authenticate with smart cards or hardware tokens (YubiKey, PIV cards) via the CryptoTokenKit framework. Enterprise use. |
| account-auth.md | account-auth | User wants to modify authentication requests for Kerberos or other enterprise single sign-on (SSO) protocols. Requires special entitlement. |
Location & Background Services
| Skill | Extension Type | When to Read |
|---|---|---|
| location-push.md | location-push | User wants silent push notifications that wake the app for high-accuracy location updates. Used for fleet tracking, delivery apps, and location-based alerts. |
| bg-download.md | bg-download | User wants on-demand resources or large asset downloads managed by the system's background asset downloader. Used for games and media apps. |
Smart Home & Matter
| Skill | Extension Type | When to Read |
|---|---|---|
| matter.md | matter | User wants to add Matter smart home device support for device commissioning via Home app. Requires MFi enrollment and Matter certification. |
Printing
| Skill | Extension Type | When to Read |
|---|---|---|
| print-service.md | print-service | User wants to discover and print to network printers without AirPrint, or provide custom print rendering for specialized printers. |
Search & Indexing
| Skill | Extension Type | When to Read |
|---|---|---|
| spotlight.md | spotlight | User wants to index app content in Spotlight, provide rich search results, and handle taps from Spotlight search. Uses Core Spotlight and NSUserActivity. |
| spotlight-delegate.md | spotlight-delegate | User wants a background extension for large-scale Spotlight indexing that runs periodically on a system-managed schedule. macOS only (not iOS). |
Collaboration & Conferencing
| Skill | Extension Type | When to Read |
|---|---|---|
| virtual-conference.md | virtual-conference | User wants to integrate a video conferencing app with the system call UI and CallKit, enabling Handoff, picture-in-picture, and system call controls. |
Apple Watch
| Skill | Extension Type | When to Read |
|---|---|---|
| watch.md | watch | User wants a standalone watchOS app with complications, workout sessions, HealthKit integration, and Watch Connectivity for iPhone sync. Not an extension—a full application target. |
Target Types vs. Extensions
Application Targets (not extensions):
- App Clip (
clip) — uses product typecom.apple.product-type.application.on-demand-install-capable - watchOS App (
watch) — uses product typecom.apple.product-type.application
These are full applications with their own Info.plist, app icons, and lifecycle. They do not use NSExtensionPointIdentifier.
All other types are app extensions that use product type com.apple.product-type.app-extension and declare an extension point identifier in their Info.plist.
Quick Reference: Common Use Cases
| User Says... | Read This Skill |
|---|---|
| "Add a home screen widget" | widget.md |
| "Add a share extension" | share.md |
| "Build an instant app / App Clip" | clip.md |
| "Integrate with Siri" | intent.md or app-intent.md |
| "Modify push notifications" | notification-service.md |
| "Custom notification UI" | notification-content.md |
| "Build a VPN app" | network-packet-tunnel.md |
| "Password manager AutoFill" | authentication-services.md |
| "Block spam calls" | call-directory.md |
| "Filter SMS spam" | message-filter.md |
| "Add to Files app" | file-provider.md |
| "Custom keyboard" | keyboard.md |
| "Photo filter extension" | photo-editing.md |
| "Safari ad blocker" | content-blocker.md |
| "Safari extension" | safari.md |
| "Live streaming / screen recording" | broadcast-upload.md |
| "watchOS app" | watch.md |
| "Screen Time parental controls" | device-activity-monitor.md |
| "Smart home / Matter" | matter.md |
| "Print to network printer" | print-service.md |
| "Spotlight search integration" | spotlight.md |
Creating a New Extension with @bacons/apple-targets
Every skill document includes a "Using with @bacons/apple-targets" section with the three-step setup:
# 1. Run the CLI to scaffold the extension
bunx create-target <type>
# 2. Ensure the plugin is in app.json
{
"expo": {
"plugins": [["@bacons/apple-targets"]]
}
}
# 3. Generate the native project
npx expo prebuild --clean
The <type> parameter corresponds to the extension type slug shown in each skill document's title (e.g., widget, share, clip, notification-service).
When to Run Prebuild
Because target source files live outside the /ios directory and are linked into the Xcode project (not copied), Swift code changes are automatically synchronized. You don't need to re-run prebuild when editing code.
-
Run
prebuild --cleanwhen:- Initial setup after creating a new target
- Changing
expo-target.config.js(icon, colors, entitlements, bundle ID, frameworks) - Changing
app.jsonplugin configuration - Adding or removing targets
- Xcode project corruption or mysterious build failures
-
Run
prebuild(without--clean) when:- You need to regenerate the project but want to preserve manual Xcode modifications
- Updating the plugin version with minor project changes
-
No prebuild needed for:
- Editing Swift code in
targets/<name>/directories — files are linked, changes appear immediately in Xcode - Adding/modifying Swift files within an existing target
- Most day-to-day development work on target implementations
- Editing Swift code in
This architecture allows you to iterate on extension code without constantly regenerating the entire Xcode project, speeding up development and preserving manual project customizations.
Entitlements & Capabilities Guides
The entitlements/ directory contains guides for iOS entitlements and capabilities that apply across multiple extension types:
| Guide | When to Read |
|---|---|
| entitlements/app-groups.md | User needs to share data between the main app and extensions (widgets, share, notifications, App Clips). Covers naming conventions, UserDefaults suite, shared containers, Keychain access groups, and automatic EAS provisioning. |
Common questions answered by entitlements guides:
- "How do I share data between my app and widget?" → Read
app-groups.md - "My extension can't access UserDefaults from the main app" → Read
app-groups.md - "How does EAS handle App Groups code signing?" → Read
app-groups.md
Template for New Skills
If you need to write a new skill document, use _template.md as the starting point. It defines the required frontmatter, section structure, code example format, and quality checklist.
Additional Resources
- CLAUDE.md (project root): Development setup, build instructions, and architecture notes for the
@bacons/apple-targetsplugin itself - Apple Developer Documentation: Every skill links to official Apple docs and WWDC sessions
- Expo Documentation: https://docs.expo.dev/config-plugins/introduction/
- Continuous Native Generation: https://docs.expo.dev/workflow/continuous-native-generation/
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/evanbacon/expo-apple-targets/apple-targets">View apple-targets on skillZs</a>