Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add SwiftfulThinking/SwiftfulStarterProject --skill creating-paywallgit clone --depth 1 https://github.com/SwiftfulThinking/SwiftfulStarterProjectWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/swiftfulthinking/swiftfulstarterproject/creating-paywall)<a href="https://agentmods.dev/skills/swiftfulthinking/swiftfulstarterproject/creating-paywall"><img src="https://agentmods.dev/badge/skills/swiftfulthinking/swiftfulstarterproject/creating-paywall.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00091 | $0.01959 |
| Opus 5 | $0.00046 | $0.00979 |
| Sonnet 5 | $0.00018 | $0.00392 |
| Haiku 4.5 | $0.00009 | $0.00196 |
Grade A, and why
creating-paywall scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 261 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Creating Paywall
Add a new paywall variant view and wire it into the paywall AB test.
Architecture
The paywall system has two layers:
- Paywall screen (VIPER) —
Core/Paywall/— already exists, handles products loading, purchase logic, analytics, routing - Paywall variant views —
Core/Paywall/Paywalls/— pure UI components that receive data via closures
PaywallView.swift switches on the AB test to render the active variant. New paywalls are added as variant views, not new screens.
Steps
- Determine the variant name (PascalCase, e.g.,
MinimalPaywall,FeatureListPaywall) - Determine the variant type (custom, storeKit, or revenueCat)
- Create the variant view file in
Core/Paywall/Paywalls/ - Add a case to
PaywallTestOptionenum - Wire the variant into
PaywallView.swiftswitch statement - Add preview(s) for the new variant
Variant Types
| Type | When | Products | UI Owner |
|---|---|---|---|
| Custom (most common) | Full control over layout and design | Loaded via presenter, passed as [AnyProduct] |
You build it |
| StoreKit | Apple's native SubscriptionStoreView |
Loaded by StoreKit from product IDs | Apple's UI |
| RevenueCat | RevenueCat's remote paywall UI | Managed by RevenueCat dashboard | RevenueCat SDK |
Custom Paywall Template
Custom paywalls are the most common type. They receive products and closures from PaywallView:
import SwiftUI
struct {VariantName}PaywallView: View {
var products: [AnyProduct] = []
var onBackButtonPressed: () -> Void = { }
var onRestorePurchasePressed: () -> Void = { }
var onPurchaseProductPressed: (AnyProduct) -> Void = { _ in }
var body: some View {
ZStack {
// Background
Color.blue.ignoresSafeArea()
VStack(spacing: 0) {
// Header / marketing content
// ...
// Product list
ForEach(products) { product in
// product.title, product.priceStringWithDuration, product.subtitle
}
// CTA button (if single product) or tap on product row
// REQUIRED: Restore purchase link
Text("Restore Purchase")
.underline()
.asButton {
onRestorePurchasePressed()
}
// REQUIRED: Legal links
HStack {
Link("Privacy Policy", destination: URL(string: Constants.privacyPolicyURL)!)
Text("|")
Link("Terms of Service", destination: URL(string: Constants.termsOfServiceURL)!)
}
.font(.caption2)
.foregroundStyle(.secondary)
}
}
.overlay(
Image(systemName: "xmark.circle.fill")
.font(.title)
.padding(8)
.tappableBackground()
.asButton {
onBackButtonPressed()
}
.padding(16),
alignment: .topLeading
)
}
}
#Preview {
{VariantName}PaywallView(products: AnyProduct.mocks)
}
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 261 lines · 91 tokens per session scan A ca65ca32a85e
creating-paywall is a skill published in the GitHub repository SwiftfulThinking/SwiftfulStarterProject (74 stars, last pushed 5mo ago), licensed MIT. It adds 91 tokens to every session and 1,959 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-04.
Other skills, from other repositories
play-billing-library-version-upgrade
Use this skill when upgrading or migrating an Android project from any legacy Google Play Billing Library (PBL) version to the latest stable version of PBL.
asc-revenuecat-catalog-sync
Reconcile App Store Connect subscriptions and in-app purchases with RevenueCat products, entitlements, offerings, and packages using asc and RevenueCat MCP. Use when setting up or syncing subscription catalogs across ASC and RevenueCat.
axiom-implement-iap
Use when the user wants to add in-app purchases, implement StoreKit 2, or set up subscriptions.
google-play
Google Play Developer API (Android Publisher) integration with managed OAuth. Manage apps, subscriptions, in-app purchases, and reviews. Use this skill when users want to interact with Google Play Console programmatically. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
subscription-lifecycle
Generates StoreKit 2 subscription lifecycle management — grace periods, billing retry, offer codes, win-back offers, upgrade/downgrade paths, and subscription status monitoring. Use when user needs post-purchase subscription state handling beyond the initial paywall.
subscription-offers
Generates StoreKit 2 code for all subscription offer types — introductory, promotional, offer codes, and win-back. Includes eligibility checks, offer presentation, and the preferredSubscriptionOffer modifier. Use when adding subscription offers, free trials, or promotional pricing.