/app-extensions
Generates app extension infrastructure for Share Extensions, Action Extensions, Keyboard Extensions, and Safari Web Extensions with data sharing via App Groups. Use when user wants to add a share extension, action extension, keyboard extension, Safari web extension, or any app
$ npx -y skills add rshankras/claude-code-apple-skills --skill app-extensions --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/app-extensions
Context preview
The summary Claude sees to decide when to auto-load this skill.
Generates app extension infrastructure for Share Extensions, Action Extensions, Keyboard Extensions, and Safari Web Extensions with data sharing via App Groups. Use when user wants to add a share extension, action extension, keyboard extension, Safari web extension, or any app
SKILL.md
app-extensions.SKILL.mdname: app-extensions
description: Generates app extension infrastructure for Share Extensions, Action Extensions, Keyboard Extensions, and Safari Web Extensions with data sharing via App Groups. Use when user wants to add a share extension, action extension, keyboard extension, Safari web extension, or any app extension type.
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
last_verified: 2026-07-16
review_by: 2027-06-22
os_version: iOS 27 / macOS 27
App Extensions Generator
Generate production app extension infrastructure -- Share Extensions for receiving content from other apps, Action Extensions for manipulating content in-place, Keyboard Extensions for custom input, and Safari Web Extensions for browser integration. Includes App Group data sharing between the host app and extensions.
When This Skill Activates
Use this skill when the user:
- Asks to "add a share extension" or "share sheet extension"
- Wants to "receive content from other apps" or "accept shared content"
- Mentions "action extension" or "content manipulation extension"
- Wants to "add a custom keyboard" or "keyboard extension"
- Asks about "Safari extension" or "Safari web extension"
- Mentions "app extension" or "extension target" generically
- Wants to "share data between app and extension" or "App Groups"
Pre-Generation Checks
1. Project Context Detection
- [ ] Check deployment target (iOS 16+ / macOS 13+)
- [ ] Check Swift version (requires Swift 5.9+)
- [ ] Identify project structure (find .xcodeproj or Package.swift)
- [ ] Identify source file locations
2. Existing Extension Detection
Search for existing extension targets:
Glob: **/*Extension*/*.swift, **/*Extension*/Info.plist
Grep: "NSExtensionPointIdentifier" or "NSExtensionPrincipalClass"
If existing extensions found:
- Ask if user wants to add another or modify existing
- Identify existing App Groups configuration
3. App Groups Detection
Check for existing App Groups setup:
Glob: **/*.entitlements
Grep: "com.apple.security.application-groups"
If App Groups exist, reuse the existing group identifier.
Configuration Questions
Ask user via AskUserQuestion:
1. **What type of extension?**
- Share Extension (accept content from other apps, display share UI)
- Action Extension (manipulate content in-place -- transform text, edit images)
- Keyboard Extension (custom input keyboard with KeyboardViewController)
- Safari Web Extension (inject JavaScript/CSS into web pages)
2. **What content types does it handle?**
- Text (plain text, rich text)
- URLs (web links, deep links)
- Images (photos, screenshots)
- Files (documents, PDFs, archives)
- All (any content type)
3. **Does the extension need to share data with the main app?**
- Yes -- needs App Groups (shared UserDefaults, shared file container, shared Keychain)
- No -- extension is self-contained
Generation Process
Step 1: Read Templates
Read `templates.md` for production Swift code.
Step 2: Create Extension Files
Based on extension type selected:
**Share Extension:** 1. `ShareViewController.swift` -- Main share extension view controller with content handling 2. `Info.plist` -- Extension configuration with activation rules
**Action Extension:** 3. `ActionViewController.swift` -- Action extension with content manipulation 4. `Info.plist` -- Extension configuration
**Keyboard Extension:** 5. `KeyboardViewController.swift` -- Custom keyboard with UIInputViewController 6. `Info.plist` -- Keyboard extension configuration
**Safari Web Extension:** 7. `SafariWebExtensionHandler.swift` -- Native message handler 8. `manifest.json` -- Web extension manifest 9. `content.js` -- Content script template
Step 3: Create Shared Infrastructure
If data sharing selected: 10. `SharedDataManager.swift` -- App Group data sharing helper
Step 4: Determine File Location
Extensions are separate targets:
- Share Extension -> `ShareExtension/`
- Action Extension -> `ActionExtension/`
- Keyboard Extension -> `KeyboardExtension/`
- Safari Web Extension -> `SafariWebExtension/`
- Shared code -> `Shared/` or within main app target
Output Format
After generation, provide:
Files Created
**Share Extension:**
ShareExtension/
├── ShareViewController.swift # Main share extension view controller
└── Info.plist # Extension activation rules & config
**Action Extension:**
ActionExtension/
├── ActionViewController.swift # Content manipulation controller
└── Info.plist # Extension activation rules & config
**Keyboard Extension:**
KeyboardExtension/
├── KeyboardViewController.swift # UIInputViewController subclass
└── Info.plist # Keyboard extension config
**Safari Web Extension:**
SafariWebExtension/
├── SafariWebExtensionHandler.swift # Native message handler
└── Resources/
├── manifest.json # Web extension manifest
├── content.js # Content script
└── popup.html # Popup UI (optional)**Shared (if data sharing enabled):**
Shared/
└── SharedDataManager.swift # App Group data sharing
Integration Steps
**1. Add Extension Target in Xcode:**
- File > New > Target
- Select the extension type (Share, Action, Keyboard, Safari Web)
- Configure bundle identifier: `com.yourapp.ShareExtension`
- Xcode creates the target with boilerplate -- replace with generated code
**2. Configure App Groups (if data sharing):**
- Select main app target > Signing & Capabilities > Add "App Groups"
- Add group: `group.com.yourapp.shared`
- Select extension target > Signing & Capabilities > Add "App Groups"
- Add the same group identifier
**3. Share code between targets:**
- Add shared files to both the app and extension targets
- Or create a shared framework target
Extension Content Handling
**Accept shared URLs:**
if provider.hasItemConformingToTypeIdentifier(
Read more
name: app-extensions description: Generates app extension infrastructure for Share Extensions, Action Extensions, Keyboard Extensions, and Safari Web Extensions with data sharing via App Groups. Use when user wants to add a share extension, action extension, keyboard extension, Safari web extension, or any app extension type. allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion] last_verified: 2026-07-16 review_by: 2027-06-22 os_version: iOS 27 / macOS 27
App Extensions Generator
Generate production app extension infrastructure -- Share Extensions for receiving content from other apps, Action Extensions for manipulating content in-place, Keyboard Extensions for custom input, and Safari Web Extensions for browser integration. Includes App Group data sharing between the host app and extensions.
When This Skill Activates
Use this skill when the user:
- Asks to "add a share extension" or "share sheet extension"
- Wants to "receive content from other apps" or "accept shared content"
- Mentions "action extension" or "content manipulation extension"
- Wants to "add a custom keyboard" or "keyboard extension"
- Asks about "Safari extension" or "Safari web extension"
- Mentions "app extension" or "extension target" generically
- Wants to "share data between app and extension" or "App Groups"
Pre-Generation Checks
1. Project Context Detection
- [ ] Check deployment target (iOS 16+ / macOS 13+)
- [ ] Check Swift version (requires Swift 5.9+)
- [ ] Identify project structure (find .xcodeproj or Package.swift)
- [ ] Identify source file locations
2. Existing Extension Detection
Search for existing extension targets:
Glob: **/*Extension*/*.swift, **/*Extension*/Info.plist Grep: "NSExtensionPointIdentifier" or "NSExtensionPrincipalClass"
If existing extensions found:
- Ask if user wants to add another or modify existing
- Identify existing App Groups configuration
3. App Groups Detection
Check for existing App Groups setup:
Glob: **/*.entitlements Grep: "com.apple.security.application-groups"
If App Groups exist, reuse the existing group identifier.
Configuration Questions
Ask user via AskUserQuestion:
1. **What type of extension?**
- Share Extension (accept content from other apps, display share UI)
- Action Extension (manipulate content in-place -- transform text, edit images)
- Keyboard Extension (custom input keyboard with KeyboardViewController)
- Safari Web Extension (inject JavaScript/CSS into web pages)
2. **What content types does it handle?**
- Text (plain text, rich text)
- URLs (web links, deep links)
- Images (photos, screenshots)
- Files (documents, PDFs, archives)
- All (any content type)
3. **Does the extension need to share data with the main app?**
- Yes -- needs App Groups (shared UserDefaults, shared file container, shared Keychain)
- No -- extension is self-contained
Generation Process
Step 1: Read Templates
Read `templates.md` for production Swift code.
Step 2: Create Extension Files
Based on extension type selected:
**Share Extension:** 1. `ShareViewController.swift` -- Main share extension view controller with content handling 2. `Info.plist` -- Extension configuration with activation rules
**Action Extension:** 3. `ActionViewController.swift` -- Action extension with content manipulation 4. `Info.plist` -- Extension configuration
**Keyboard Extension:** 5. `KeyboardViewController.swift` -- Custom keyboard with UIInputViewController 6. `Info.plist` -- Keyboard extension configuration
**Safari Web Extension:** 7. `SafariWebExtensionHandler.swift` -- Native message handler 8. `manifest.json` -- Web extension manifest 9. `content.js` -- Content script template
Step 3: Create Shared Infrastructure
If data sharing selected: 10. `SharedDataManager.swift` -- App Group data sharing helper
Step 4: Determine File Location
Extensions are separate targets:
- Share Extension -> `ShareExtension/`
- Action Extension -> `ActionExtension/`
- Keyboard Extension -> `KeyboardExtension/`
- Safari Web Extension -> `SafariWebExtension/`
- Shared code -> `Shared/` or within main app target
Output Format
After generation, provide:
Files Created
**Share Extension:**
ShareExtension/ ├── ShareViewController.swift # Main share extension view controller └── Info.plist # Extension activation rules & config
**Action Extension:**
ActionExtension/ ├── ActionViewController.swift # Content manipulation controller └── Info.plist # Extension activation rules & config
**Keyboard Extension:**
KeyboardExtension/ ├── KeyboardViewController.swift # UIInputViewController subclass └── Info.plist # Keyboard extension config
**Safari Web Extension:**
SafariWebExtension/
├── SafariWebExtensionHandler.swift # Native message handler
└── Resources/
├── manifest.json # Web extension manifest
├── content.js # Content script
└── popup.html # Popup UI (optional)**Shared (if data sharing enabled):**
Shared/ └── SharedDataManager.swift # App Group data sharing
Integration Steps
**1. Add Extension Target in Xcode:**
- File > New > Target
- Select the extension type (Share, Action, Keyboard, Safari Web)
- Configure bundle identifier: `com.yourapp.ShareExtension`
- Xcode creates the target with boilerplate -- replace with generated code
**2. Configure App Groups (if data sharing):**
- Select main app target > Signing & Capabilities > Add "App Groups"
- Add group: `group.com.yourapp.shared`
- Select extension target > Signing & Capabilities > Add "App Groups"
- Add the same group identifier
**3. Share code between targets:**
- Add shared files to both the app and extension targets
- Or create a shared framework target
Extension Content Handling
**Accept shared URLs:**
if provider.hasItemConformingToTypeIdentifier(
A collection of Claude Code skills for iOS, macOS, watchOS, visionOS, and Apple platform development. These skills help you plan and build apps, maintain code quality, ensure HIG compliance, and guide you from idea to App Store.
Repo: rshankras/claude-code-apple-skills
Other skills on rshankras-apple-skills.
- /app-store
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user needs help with App Store presence, ASO, marketing, or customer communication.
Open skill - /ad-attribution
Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under crowd anonymity, and end-to-end postback testing. Use when running paid acquisition beyond Apple Ads, measuring
Open skill - /app-description-writer
Generate compelling App Store descriptions that convert browsers into users. Use when writing initial descriptions, improving existing copy, or drafting promotional text and What's New for a major update.
Open skill - /apple-search-ads
Apple Search Ads campaign strategy for indie developers — paid acquisition, keyword bidding, budget planning, and ROAS optimization. Use when user asks about running ads, paid user acquisition, or Apple Search Ads campaigns.
Open skill - /iap-finalizer
Take a one-time in-app purchase from MISSING_METADATA to READY_TO_SUBMIT in App Store Connect — set its price schedule and localized display name/description (and optional review screenshot) via the ASC REST API. Use at Phase 6 (Pre-Release), after the IAP is built in-app (Phase
Open skill - /keyword-optimizer
Optimize app title, subtitle, and keywords for maximum App Store discoverability. Use when launching a new app, improving search rankings, entering new markets/languages, or safely optimizing ASO for an app with existing traffic.
Open skill

