skills/swiftui/alarmkit/SKILL.md
AlarmKit integration for scheduling alarms and timers with custom UI, Live Activities, and snooze support. Use when implementing alarm or timer features in iOS 18+ apps.
npx skillsauth add rshankras/claude-code-apple-skills alarmkitInstall 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.
Framework for scheduling alarms and countdown timers with custom UI, Live Activities integration, and focus/silent mode override. Prevents the most common mistakes: using the wrong authorization property name, omitting the Info.plist key, and forgetting the widget extension for countdown presentations.
Use this skill when the user:
Choose the right reference file based on what the user needs:
What do you need?
|
+-- Schedule an alarm (one-time, repeating, or timer)
| --> scheduling.md
| +-- One-time alarm: Alarm.Schedule.relative + .repeats: .never
| +-- Repeating alarm: Alarm.Schedule.relative + .repeats: .weekly(weekdays)
| +-- Countdown timer: CountdownDuration (no schedule)
| +-- Authorization & Info.plist setup
| +-- Managing alarms: pause, resume, cancel
|
+-- Customize alarm UI (alert, countdown, paused screens)
| --> presentation.md
| +-- AlarmPresentation.Alert: title, stop, snooze/repeat buttons
| +-- AlarmPresentation.Countdown: title, pause button
| +-- AlarmPresentation.Paused: title, resume button
| +-- Custom buttons with AlarmButton
| +-- Tint color and metadata via AlarmAttributes
|
+-- Show alarm on Dynamic Island / Lock Screen
--> live-activities.md
+-- Widget extension with ActivityConfiguration
+-- AlarmAttributes conformance
+-- Custom AlarmMetadata protocol
| API | Minimum Version | Reference |
|-----|----------------|-----------|
| AlarmManager | iOS 18 | scheduling.md |
| Alarm / Alarm.Schedule | iOS 18 | scheduling.md |
| AlarmPresentation (.alert, .countdown, .paused) | iOS 18 | presentation.md |
| AlarmAttributes | iOS 18 | live-activities.md |
| AlarmMetadata | iOS 18 | live-activities.md |
| AlarmButton | iOS 18 | presentation.md |
| CountdownDuration | iOS 18 | scheduling.md |
| alarmUpdates async sequence | iOS 18 | scheduling.md |
| authorizationUpdates async sequence | iOS 18 | scheduling.md |
| # | Mistake | Fix | Details |
|---|---------|-----|---------|
| 1 | Using .authorizationStatus instead of .authorizationState | The property is AlarmManager.shared.authorizationState -- there is no authorizationStatus | scheduling.md |
| 2 | Forgetting NSAlarmKitUsageDescription in Info.plist | Add the key with a user-facing string before calling requestAuthorization() | scheduling.md |
| 3 | Creating countdown timer with a schedule | Timers use CountdownDuration only -- do not pass a schedule | scheduling.md |
| 4 | Missing widget extension for countdown presentations | Countdown and paused UI requires an ActivityConfiguration(for: AlarmAttributes.self) widget | live-activities.md |
| 5 | Not persisting alarm UUIDs | Store the Alarm.id (UUID) so you can pause, resume, or cancel later | scheduling.md |
| 6 | Not observing alarmUpdates for state sync | Use the alarmUpdates async sequence to keep local state in sync with the system | scheduling.md |
When reviewing AlarmKit code, verify:
NSAlarmKitUsageDescription is present with a meaningful descriptionrequestAuthorization() is called before scheduling; denial is handled gracefully.authorizationState, not .authorizationStatusalarmUpdates async sequence is used to keep UI in syncschedule(), pause(), resume(), cancel() calls handle errors| File | Content | |------|---------| | scheduling.md | Authorization, one-time/repeating/timer creation, managing alarms, observing updates | | presentation.md | Alert, countdown, paused UI customization, buttons, tint color | | live-activities.md | Widget extension, AlarmAttributes, AlarmMetadata, Dynamic Island |
development
US web checkout via the StoreKit External Purchase Link entitlement — currently 0% Apple commission (litigation ongoing), how to ship it safely, and how to architect for a commission flip so a future ruling is a config change, not a rewrite. Use when adding external purchase links, weighing web checkout vs IAP, or planning US-storefront pricing strategy.
tools
Revenue beyond the single-app price tag — own-app bundles, Family Sharing as a conversion lever, cross-developer bundles & suites, and institutional licensing via Group Purchases / Apple School & Business Manager. Use when a developer has multiple apps, a subscription worth sharing, complementary indie partners, or school/clinic/business buyers.
testing
Run a structured accessibility audit on an iOS/macOS app — automated XCUITest audits, Accessibility Inspector, manual VoiceOver/Dynamic Type passes, and App Store Accessibility Nutrition Label evaluation. Use before release, when preparing Nutrition Label declarations, or for EU Accessibility Act compliance.
tools
Stage-by-stage audit of an app's App Store growth machinery against a 54-item P0–P9 playbook — every item scored from an App Store Connect MCP call, a codebase check, or an explicit question to the user, then routed to the skill or command that fixes it. Read-only on App Store Connect. Use for a growth audit or scorecard, a pre-launch growth plan, a quarterly re-audit, or "which growth levers am I missing."