Skip to content
Development
Skill

/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

From plugin
rshankras-apple-skills
848181 skills

Claude Code

$ npx -y skills add rshankras/claude-code-apple-skills --skill app-extensions --agent claude-code

SKILL.md

app-extensions.SKILL.md
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(
Read more
@rshankras
Ships withrshankras-apple-skills

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.

Stars on GitHub

Momentum

stars in total
848
Star history of rshankras/claude-code-apple-skills on GitHub, a chart by star-history.com

Other skills on rshankras-apple-skills.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about app-extensions.

Which coding agents can use app-extensions?
app-extensions installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.