AlarmKit
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.
When This Skill Activates
Use this skill when the user:
- Asks to add, fix, or review alarm or timer functionality
- Mentions AlarmKit, AlarmManager, or AlarmPresentation
- Wants to schedule one-time, repeating, or countdown alarms
- Asks about snooze, stop, or repeat buttons on alarm alerts
- Wants alarms to appear on Dynamic Island or Lock Screen (Live Activities)
- Mentions overriding Focus or silent mode for alarms
- Asks about AlarmAttributes or AlarmMetadata
Decision Tree
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 Availability
| API |
Minimum Version |
Reference |
AlarmManager |
iOS 26 |
scheduling.md |
Alarm / Alarm.Schedule |
iOS 26 |
scheduling.md |
AlarmPresentation (.alert, .countdown, .paused) |
iOS 26 |
presentation.md |
AlarmAttributes |
iOS 26 |
live-activities.md |
AlarmMetadata |
iOS 26 |
live-activities.md |
AlarmButton |
iOS 26 |
presentation.md |
CountdownDuration |
iOS 26 |
scheduling.md |
alarmUpdates async sequence |
iOS 26 |
scheduling.md |
authorizationUpdates async sequence |
iOS 26 |
scheduling.md |
Top Mistakes -- Quick Reference
| # |
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 |
Review Checklist
When reviewing AlarmKit code, verify:
Reference Files
| 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 |
1---
2name: alarmkit
3description: AlarmKit integration for scheduling alarms and timers with custom UI, Live Activities, and snooze support. Use when implementing alarm or timer features in iOS 26+ apps.
4allowed-tools: [Read, Glob, Grep]
5last_verified: 2026-07-16
6review_by: 2027-06-22
7os_version: iOS 27 / macOS 27
8---
9
10# AlarmKit
11
12Framework 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.
13
14## When This Skill Activates
15
16Use this skill when the user:
17- Asks to add, fix, or review **alarm** or **timer** functionality
18- Mentions **AlarmKit**, **AlarmManager**, or **AlarmPresentation**
19- Wants to schedule **one-time**, **repeating**, or **countdown** alarms
20- Asks about **snooze**, **stop**, or **repeat** buttons on alarm alerts
21- Wants alarms to appear on **Dynamic Island** or **Lock Screen** (Live Activities)
22- Mentions overriding **Focus** or **silent mode** for alarms
23- Asks about **AlarmAttributes** or **AlarmMetadata**
24
25## Decision Tree
26
27Choose the right reference file based on what the user needs:
28
29```
30What do you need?
31|
32+-- Schedule an alarm (one-time, repeating, or timer)
33| --> scheduling.md
34| +-- One-time alarm: Alarm.Schedule.relative + .repeats: .never
35| +-- Repeating alarm: Alarm.Schedule.relative + .repeats: .weekly(weekdays)
36| +-- Countdown timer: CountdownDuration (no schedule)
37| +-- Authorization & Info.plist setup
38| +-- Managing alarms: pause, resume, cancel
39|
40+-- Customize alarm UI (alert, countdown, paused screens)
41| --> presentation.md
42| +-- AlarmPresentation.Alert: title, stop, snooze/repeat buttons
43| +-- AlarmPresentation.Countdown: title, pause button
44| +-- AlarmPresentation.Paused: title, resume button
45| +-- Custom buttons with AlarmButton
46| +-- Tint color and metadata via AlarmAttributes
47|
48+-- Show alarm on Dynamic Island / Lock Screen
49 --> live-activities.md
50 +-- Widget extension with ActivityConfiguration
51 +-- AlarmAttributes conformance
52 +-- Custom AlarmMetadata protocol
53```
54
55## API Availability
56
57| API | Minimum Version | Reference |
58|-----|----------------|-----------|
59| `AlarmManager` | iOS 26 | scheduling.md |
60| `Alarm` / `Alarm.Schedule` | iOS 26 | scheduling.md |
61| `AlarmPresentation` (.alert, .countdown, .paused) | iOS 26 | presentation.md |
62| `AlarmAttributes` | iOS 26 | live-activities.md |
63| `AlarmMetadata` | iOS 26 | live-activities.md |
64| `AlarmButton` | iOS 26 | presentation.md |
65| `CountdownDuration` | iOS 26 | scheduling.md |
66| `alarmUpdates` async sequence | iOS 26 | scheduling.md |
67| `authorizationUpdates` async sequence | iOS 26 | scheduling.md |
68
69## Top Mistakes -- Quick Reference
70
71| # | Mistake | Fix | Details |
72|---|---------|-----|---------|
73| 1 | Using `.authorizationStatus` instead of `.authorizationState` | The property is `AlarmManager.shared.authorizationState` -- there is no `authorizationStatus` | scheduling.md |
74| 2 | Forgetting `NSAlarmKitUsageDescription` in Info.plist | Add the key with a user-facing string before calling `requestAuthorization()` | scheduling.md |
75| 3 | Creating countdown timer with a schedule | Timers use `CountdownDuration` only -- do not pass a schedule | scheduling.md |
76| 4 | Missing widget extension for countdown presentations | Countdown and paused UI requires an `ActivityConfiguration(for: AlarmAttributes.self)` widget | live-activities.md |
77| 5 | Not persisting alarm UUIDs | Store the `Alarm.id` (UUID) so you can pause, resume, or cancel later | scheduling.md |
78| 6 | Not observing `alarmUpdates` for state sync | Use the `alarmUpdates` async sequence to keep local state in sync with the system | scheduling.md |
79
80## Review Checklist
81
82When reviewing AlarmKit code, verify:
83
84- [ ] **Info.plist** -- `NSAlarmKitUsageDescription` is present with a meaningful description
85- [ ] **Authorization** -- `requestAuthorization()` is called before scheduling; denial is handled gracefully
86- [ ] **Correct property** -- uses `.authorizationState`, not `.authorizationStatus`
87- [ ] **Alarm ID persistence** -- alarm UUIDs are stored (e.g., UserDefaults, SwiftData) for later management
88- [ ] **State observation** -- `alarmUpdates` async sequence is used to keep UI in sync
89- [ ] **Widget extension** -- exists if countdown or paused presentations are used
90- [ ] **Error handling** -- `schedule()`, `pause()`, `resume()`, `cancel()` calls handle errors
91- [ ] **System limits** -- code accounts for the system limit on number of active alarms
92- [ ] **Real device testing** -- alarms are tested on physical devices, not just Simulator
93
94## Reference Files
95
96| File | Content |
97|------|---------|
98| [scheduling.md](scheduling.md) | Authorization, one-time/repeating/timer creation, managing alarms, observing updates |
99| [presentation.md](presentation.md) | Alert, countdown, paused UI customization, buttons, tint color |
100| [live-activities.md](live-activities.md) | Widget extension, AlarmAttributes, AlarmMetadata, Dynamic Island |