home / skills / rshankras / claude-code-apple-skills / alarmkit

alarmkit skill

/skills/swiftui/alarmkit

This skill helps you implement AlarmKit alarms and timers in iOS 18+ apps with custom UI, Live Activities, and snooze support.

npx playbooks add skill rshankras/claude-code-apple-skills --skill alarmkit

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
5.0 KB
---
name: alarmkit
description: 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.
allowed-tools: [Read, Glob, Grep]
---

# 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 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 |

## 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:

- [ ] **Info.plist** -- `NSAlarmKitUsageDescription` is present with a meaningful description
- [ ] **Authorization** -- `requestAuthorization()` is called before scheduling; denial is handled gracefully
- [ ] **Correct property** -- uses `.authorizationState`, not `.authorizationStatus`
- [ ] **Alarm ID persistence** -- alarm UUIDs are stored (e.g., UserDefaults, SwiftData) for later management
- [ ] **State observation** -- `alarmUpdates` async sequence is used to keep UI in sync
- [ ] **Widget extension** -- exists if countdown or paused presentations are used
- [ ] **Error handling** -- `schedule()`, `pause()`, `resume()`, `cancel()` calls handle errors
- [ ] **System limits** -- code accounts for the system limit on number of active alarms
- [ ] **Real device testing** -- alarms are tested on physical devices, not just Simulator

## Reference Files

| File | Content |
|------|---------|
| [scheduling.md](scheduling.md) | Authorization, one-time/repeating/timer creation, managing alarms, observing updates |
| [presentation.md](presentation.md) | Alert, countdown, paused UI customization, buttons, tint color |
| [live-activities.md](live-activities.md) | Widget extension, AlarmAttributes, AlarmMetadata, Dynamic Island |

Overview

This skill integrates AlarmKit for scheduling alarms and countdown timers with custom UI, Live Activities, and snooze support. It helps implement reliable alarm/timer behavior on iOS 18+, avoiding common integration mistakes. Use it to add system-aware alarms that can override Focus/silent mode and surface on the Dynamic Island or Lock Screen.

How this skill works

It wires AlarmManager, Alarm, and AlarmPresentation APIs to schedule one-time, repeating, or countdown alarms, handle authorization, and persist alarm IDs. The skill ensures the correct Info.plist key (NSAlarmKitUsageDescription) is present, observes alarmUpdates for state sync, and configures a widget extension with AlarmAttributes for Live Activities. It also exposes UI customization points (alert, countdown, paused) and button behaviors (stop, snooze, pause, resume).

When to use it

  • Adding or reviewing alarm or timer features in an iOS 18+ app
  • Scheduling one-time, repeating, or countdown timers
  • Showing alarm state on Dynamic Island or Lock Screen via Live Activities
  • Implementing snooze, stop, pause, or resume controls on alarms
  • Handling authorization, Info.plist setup, and Focus/silent-mode override

Best practices

  • Include NSAlarmKitUsageDescription in Info.plist before requesting authorization
  • Use AlarmManager.shared.authorizationState (not authorizationStatus) and handle denied states gracefully
  • Persist Alarm.id (UUID) so alarms can be paused, resumed, or canceled later
  • Observe the alarmUpdates async sequence to keep app UI in sync with system state
  • Provide a widget extension with ActivityConfiguration(for: AlarmAttributes.self) for countdown/paused presentations
  • Handle errors from schedule(), pause(), resume(), and cancel() and account for system limits on active alarms

Example use cases

  • Schedule a daily wake-up alarm with repeats and a snooze button on the alert UI
  • Create a cooking countdown timer that shows remaining time on the Lock Screen via Live Activities
  • Pause and resume a long timer from a widget or in-app UI while persisting the alarm UUID
  • Override Focus/silent mode for critical alarms while still respecting user settings and authorization
  • Add custom alarm buttons and metadata to show contextual actions in the alarm alert

FAQ

What Info.plist key is required?

Add NSAlarmKitUsageDescription with a user-facing string before calling requestAuthorization().

How do I show timers on the Dynamic Island?

Provide a widget extension with ActivityConfiguration(for: AlarmAttributes.self) and supply AlarmAttributes/AlarmMetadata for Live Activities.