skills/generators/paywall-generator/SKILL.md
Generates StoreKit 2 subscription paywall with modern SwiftUI views. Use when user wants to add subscriptions, paywall, or in-app purchases.
npx skillsauth add rshankras/claude-code-apple-skills paywall-generatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a complete StoreKit 2 subscription paywall with modern SwiftUI views, subscription status tracking, and proper purchase handling.
Use this skill when the user:
Search for existing StoreKit:
Glob: **/*Store*.swift, **/*Purchase*.swift, **/*Subscription*.swift
Grep: "import StoreKit" or "Product.products"
If found, ask user:
Latest StoreKit Updates (iOS 18.4+):
SubscriptionOfferView - New SwiftUI view for merchandising subscriptionssubscriptionStatusTask modifier for tracking subscription stateTransaction.currentEntitlements(for:) - New API for entitlementsRenewalInfo enhancements for expiration reasonsAsk user via AskUserQuestion:
Subscription tiers? (multi-select)
Features needed?
UI style?
Generate these files:
StoreKitManager.swift - Product loading and purchasingSubscriptionStatus.swift - Status trackingPaywallView.swift - Full paywall UISubscriptionButton.swift - Individual plan buttonProducts.swift - Product ID constantsCheck project structure:
Sources/ exists → Sources/Store/App/ exists → App/Store/Store/com.yourapp.subscription.monthlycom.yourapp.subscription.yearlycom.yourapp.subscription.lifetimeCreate Products.storekit for local testing:
After generation, provide:
Sources/Store/
├── StoreKitManager.swift # Product loading & purchasing
├── SubscriptionStatus.swift # Status enum & tracking
├── Products.swift # Product ID constants
└── Views/
├── PaywallView.swift # Full paywall screen
├── SubscriptionButton.swift # Plan selection button
└── SubscriptionOfferCard.swift # New iOS 18.4+ view
App Entry Point:
@main
struct MyApp: App {
@State private var subscriptionStatus: SubscriptionStatus = .unknown
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.subscriptionStatus, subscriptionStatus)
.subscriptionStatusTask(for: "your.group.id") { statuses in
subscriptionStatus = SubscriptionStatus.from(statuses)
}
}
}
}
Show Paywall:
struct ContentView: View {
@State private var showPaywall = false
@Environment(\.subscriptionStatus) var status
var body: some View {
VStack {
if status != .subscribed {
Button("Upgrade to Pro") {
showPaywall = true
}
}
}
.sheet(isPresented: $showPaywall) {
PaywallView()
}
}
}
New iOS 18.4+ SubscriptionOfferView:
// Simple merchandising view
SubscriptionOfferView(productID: "com.app.subscription.monthly")
.prefersPromotionalIcon(true)
.subscriptionOfferViewDetailAction {
showPaywall = true
}
Create StoreKit Configuration:
Edit Scheme:
Test Purchases:
Test Scenarios:
development
Build, install, and launch an iOS app on a physical iPhone or iPad entirely from the command line (no Xcode GUI), using xcodebuild + devicectl. Use when the user wants to run, test, or screenshot their app on a real device without opening Xcode.
development
Comprehensive iOS development guidance including Swift best practices, SwiftUI patterns, UI/UX review against HIG, and app planning. Use for iOS code review, best practices, accessibility audits, or planning new iOS apps.
development
Build, install, launch, and screenshot an iOS app in the Simulator to verify a change visually. Use when the user wants to run the app, see a change live, screenshot the running app, or confirm a UI fix actually works (not just that it compiles).
development
Audits skills in this repo for consistency, API drift, and structural gaps. Produces a prioritized report grouped by severity (Critical/High/Medium/Low). Use when asked to "audit skills", "check the skill repo for drift", or when planning bulk skill cleanup. Read-only — does not apply fixes.