/tipkit-generator
Generate TipKit infrastructure with inline/popover tips, rules, display frequency, and testing utilities. Use when adding contextual tips or feature discovery to an iOS/macOS app.
$ npx -y skills add rshankras/claude-code-apple-skills --skill tipkit-generator --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
/tipkit-generator
Context preview
The summary Claude sees to decide when to auto-load this skill.
Generate TipKit infrastructure with inline/popover tips, rules, display frequency, and testing utilities. Use when adding contextual tips or feature discovery to an iOS/macOS app.
SKILL.md
tipkit-generator.SKILL.mdname: tipkit-generator
description: Generate TipKit infrastructure with inline/popover tips, rules, display frequency, and testing utilities. Use when adding contextual tips or feature discovery to an iOS/macOS app.
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
TipKit Generator
Generate a complete TipKit setup for contextual tips and feature discovery, including tip definitions, rules, display frequency, inline and popover presentation, and testing utilities.
When This Skill Activates
Use this skill when the user:
- Asks to "add tips" or "add TipKit"
- Mentions "contextual tips" or "feature discovery"
- Wants "popover tips" or "inline tips"
- Asks about "coach marks" or "user education"
- Mentions "onboarding hints" or "tip prompts"
- Wants to "highlight new features" or "guide users"
Pre-Generation Checks
1. Project Context Detection
- [ ] Check deployment target (TipKit requires iOS 17+ / macOS 14+)
- [ ] Identify if SwiftUI or UIKit project
- [ ] Find App entry point location for Tips.configure()
- [ ] Check for existing TipKit implementations
2. Conflict Detection
Search for existing TipKit usage:
Glob: **/*Tip*.swift
Grep: "import TipKit" or "Tips.configure"
If found, ask user:
- Extend existing tip infrastructure?
- Replace existing tips?
Configuration Questions
Ask user via AskUserQuestion:
1. **What features need tips?**
- List the features or UI elements that should have tips
- Example: "search bar, filter button, swipe-to-delete gesture"
2. **Tip presentation style?** (per tip or general preference)
- Inline (TipView embedded in layout)
- Popover (attached to a control)
- Both
3. **Rule types needed?**
- Parameter-based (show after user meets condition, e.g., has viewed a screen 3 times)
- Event-based (show after user performs an action N times)
- Both
4. **Display frequency?**
- Immediate (tips show as soon as eligible)
- Hourly
- Daily
- Weekly
- Monthly
5. **Tip ordering?**
- Independent (tips show whenever eligible)
- Ordered (use TipGroup to show tips in sequence)
Generation Process
Step 1: Read Templates
Read the templates file for code patterns:
Read("skills/generators/tipkit-generator/templates.md")Step 2: Create Core Files
Generate these files based on configuration: 1. `Tips/` directory with one file per tip (e.g., `SearchTip.swift`, `FilterTip.swift`) 2. `Tips/TipEvents.swift` - Centralized event definitions 3. `Tips/TipsConfiguration.swift` - Tips.configure() setup and testing utilities
Step 3: Determine File Location
Check project structure:
- If `Sources/` exists -> `Sources/Tips/`
- If `App/` exists -> `App/Tips/`
- Otherwise -> `Tips/`
Step 4: Integrate Tips
- Add `Tips.configure()` call in App entry point
- Add `TipView` or `.popoverTip()` at the appropriate view locations
- Wire up event donation at action sites
- Wire up tip invalidation where appropriate
Output Format
After generation, provide:
Files Created
Sources/Tips/
├── SearchTip.swift # Tip with rules and options
├── FilterTip.swift # Another tip definition
├── TipEvents.swift # Centralized event definitions
└── TipsConfiguration.swift # Tips.configure() + testing helpers
Integration Steps
**App Entry Point (Required):**
import TipKit
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.task {
try? Tips.configure([
.displayFrequency(.daily),
.datastoreLocation(.applicationDefault)
])
}
}
}
}**Inline Tip:**
import TipKit
struct SearchView: View {
let searchTip = SearchTip()
var body: some View {
VStack {
TipView(searchTip)
SearchBar()
}
}
}**Popover Tip:**
import TipKit
struct ToolbarView: View {
let filterTip = FilterTip()
var body: some View {
Button("Filter", systemImage: "line.3.horizontal.decrease.circle") {
// action
}
.popoverTip(filterTip)
}
}**Event Donation (at action site):**
Button("Search") {
performSearch()
SearchTip.searchPerformed.donate()
}**Tip Invalidation (when tip is no longer relevant):**
func onFeatureUsed() {
// User discovered the feature, invalidate the tip
searchTip.invalidate(reason: .actionPerformed)
}Testing Instructions
1. **Reset DataStore between runs:**
// Add to a debug menu or call in preview
try? Tips.resetDatastore()
2. **Show all tips for testing:**
// Ignores rules and frequency -- shows everything
Tips.showAllTipsForTesting()
3. **Show specific tips for testing:**
Tips.showTipsForTesting([SearchTip.self])
4. **Test scenarios:**
- Launch app fresh -- eligible tips should appear per display frequency
- Perform actions that donate events -- event-based tips should appear when thresholds met
- Tap tip close button -- tip should not reappear
- Invalidate tip programmatically -- tip should dismiss and not reappear
Common Gotchas
1. **Forgetting Tips.configure()** -- Tips will never appear if you do not call `Tips.configure()` before any tip is displayed. This must happen early, typically in the App `body` or `.task`.
2. **Rules not evaluating** -- Parameter-based rules require you to set the parameter value explicitly. If you define `@Parameter static var hasSeenFeature = false` but never set it to `true`, the rule never passes.
3. **DataStore conflicts in tests** -- If you run unit tests and the app simultaneously, they may share the same DataStore. Use `.datastoreLocation(.url(...))` to isolate them.
4. **Disp
Read more
name: tipkit-generator description: Generate TipKit infrastructure with inline/popover tips, rules, display frequency, and testing utilities. Use when adding contextual tips or feature discovery to an iOS/macOS app. 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
TipKit Generator
Generate a complete TipKit setup for contextual tips and feature discovery, including tip definitions, rules, display frequency, inline and popover presentation, and testing utilities.
When This Skill Activates
Use this skill when the user:
- Asks to "add tips" or "add TipKit"
- Mentions "contextual tips" or "feature discovery"
- Wants "popover tips" or "inline tips"
- Asks about "coach marks" or "user education"
- Mentions "onboarding hints" or "tip prompts"
- Wants to "highlight new features" or "guide users"
Pre-Generation Checks
1. Project Context Detection
- [ ] Check deployment target (TipKit requires iOS 17+ / macOS 14+)
- [ ] Identify if SwiftUI or UIKit project
- [ ] Find App entry point location for Tips.configure()
- [ ] Check for existing TipKit implementations
2. Conflict Detection
Search for existing TipKit usage:
Glob: **/*Tip*.swift Grep: "import TipKit" or "Tips.configure"
If found, ask user:
- Extend existing tip infrastructure?
- Replace existing tips?
Configuration Questions
Ask user via AskUserQuestion:
1. **What features need tips?**
- List the features or UI elements that should have tips
- Example: "search bar, filter button, swipe-to-delete gesture"
2. **Tip presentation style?** (per tip or general preference)
- Inline (TipView embedded in layout)
- Popover (attached to a control)
- Both
3. **Rule types needed?**
- Parameter-based (show after user meets condition, e.g., has viewed a screen 3 times)
- Event-based (show after user performs an action N times)
- Both
4. **Display frequency?**
- Immediate (tips show as soon as eligible)
- Hourly
- Daily
- Weekly
- Monthly
5. **Tip ordering?**
- Independent (tips show whenever eligible)
- Ordered (use TipGroup to show tips in sequence)
Generation Process
Step 1: Read Templates
Read the templates file for code patterns:
Read("skills/generators/tipkit-generator/templates.md")Step 2: Create Core Files
Generate these files based on configuration: 1. `Tips/` directory with one file per tip (e.g., `SearchTip.swift`, `FilterTip.swift`) 2. `Tips/TipEvents.swift` - Centralized event definitions 3. `Tips/TipsConfiguration.swift` - Tips.configure() setup and testing utilities
Step 3: Determine File Location
Check project structure:
- If `Sources/` exists -> `Sources/Tips/`
- If `App/` exists -> `App/Tips/`
- Otherwise -> `Tips/`
Step 4: Integrate Tips
- Add `Tips.configure()` call in App entry point
- Add `TipView` or `.popoverTip()` at the appropriate view locations
- Wire up event donation at action sites
- Wire up tip invalidation where appropriate
Output Format
After generation, provide:
Files Created
Sources/Tips/ ├── SearchTip.swift # Tip with rules and options ├── FilterTip.swift # Another tip definition ├── TipEvents.swift # Centralized event definitions └── TipsConfiguration.swift # Tips.configure() + testing helpers
Integration Steps
**App Entry Point (Required):**
import TipKit
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.task {
try? Tips.configure([
.displayFrequency(.daily),
.datastoreLocation(.applicationDefault)
])
}
}
}
}**Inline Tip:**
import TipKit
struct SearchView: View {
let searchTip = SearchTip()
var body: some View {
VStack {
TipView(searchTip)
SearchBar()
}
}
}**Popover Tip:**
import TipKit
struct ToolbarView: View {
let filterTip = FilterTip()
var body: some View {
Button("Filter", systemImage: "line.3.horizontal.decrease.circle") {
// action
}
.popoverTip(filterTip)
}
}**Event Donation (at action site):**
Button("Search") {
performSearch()
SearchTip.searchPerformed.donate()
}**Tip Invalidation (when tip is no longer relevant):**
func onFeatureUsed() {
// User discovered the feature, invalidate the tip
searchTip.invalidate(reason: .actionPerformed)
}Testing Instructions
1. **Reset DataStore between runs:**
// Add to a debug menu or call in preview try? Tips.resetDatastore()
2. **Show all tips for testing:**
// Ignores rules and frequency -- shows everything Tips.showAllTipsForTesting()
3. **Show specific tips for testing:**
Tips.showTipsForTesting([SearchTip.self])
4. **Test scenarios:**
- Launch app fresh -- eligible tips should appear per display frequency
- Perform actions that donate events -- event-based tips should appear when thresholds met
- Tap tip close button -- tip should not reappear
- Invalidate tip programmatically -- tip should dismiss and not reappear
Common Gotchas
1. **Forgetting Tips.configure()** -- Tips will never appear if you do not call `Tips.configure()` before any tip is displayed. This must happen early, typically in the App `body` or `.task`.
2. **Rules not evaluating** -- Parameter-based rules require you to set the parameter value explicitly. If you define `@Parameter static var hasSeenFeature = false` but never set it to `true`, the rule never passes.
3. **DataStore conflicts in tests** -- If you run unit tests and the app simultaneously, they may share the same DataStore. Use `.datastoreLocation(.url(...))` to isolate them.
4. **Disp
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

