Introduction
Real, user-visible alarms for React Native and Expo — AlarmKit on iOS, an equivalent on Android.
iOS 26 shipped AlarmKit: an alarm that rings on the lock screen, through silent mode and Focus, whether or not your app is running. Android ships no such framework.
react-native-alarm-scheduler gives you AlarmKit on iOS and builds the equivalent on Android out of
AlarmManager.setAlarmClock, a foreground service that keeps ringing through Doze and a killed app,
and a full-screen lock-screen ring UI — behind one typed API.
Notification libraries schedule a notification and hope the device is awake to show it. This schedules an actual alarm.
import AlarmScheduler from 'react-native-alarm-scheduler';
await AlarmScheduler.scheduleAlarmAsync({
hour: 7,
minute: 30,
title: 'Morning alarm',
weekdays: [1, 2, 3, 4, 5],
});Features
- App-owned native alarms on Android and iOS from one typed API.
- Ring until your app says stop — with
openAppOnly, onlycompleteNativeAlarmAsync()ends it. - Stays audible on Android — loops on the alarm stream, ignoring the ringer and Do Not Disturb, and re-raises the volume whenever anything lowers it.
- Full-screen lock-screen ringing UI backed by a foreground service, so a killed app still rings.
- Survives reboots, app updates, and clock or timezone changes.
- Cold-launch handoff records written natively before any JS runs, so your app always knows why it opened.
- User-selected alarm sounds from runtime picker URIs, with a different local file per alarm.
- Silent alarms that preserve native presentation and optional vibration without playing audio.
- System Clock integration on Android via
ACTION_SET_ALARMandACTION_SHOW_ALARMS. - Expo config plugin for permissions and
NSAlarmKitUsageDescription. - Fully typed, with explicit unavailable behavior where the OS cannot schedule alarms.
Platform support
| Capability | Android | iOS |
|---|---|---|
| Schedule, list and cancel app-owned alarms | ✅ | ✅ |
| Permissions and settings surfaces | ✅ | ✅ |
| Custom alarm sound | ✅ | ✅ physical device; system default in Simulator |
| Silent alarm | ✅ | ✅ physical device; rejected in Simulator |
Ring until the app says stop (openAppOnly) | ✅ | ⚠️ |
| Cold-launch handoff, action records, backup alarms | ✅ | ✅ |
| Survive reboot | ✅ | ✅ |
| Create an alarm in the system Clock app | ✅ | ❌ |
| Open the system alarm app | ✅ | ❌ |
Android lets the app own the ringing surface, so openAppOnly removes the stop control outright. On
iOS the surface belongs to AlarmKit, which may still expose a system stop affordance the package
cannot remove; stopIntentBehavior: 'rescheduleImmediate' re-arms behind it.
On web, scheduleAlarmAsync and setSystemAlarmAsync throw; every other method resolves to an
explicit unavailable or no-op result, so a universal app still compiles and runs.
Requirements
- An Expo or bare React Native app with native prebuild support. This module uses native code, so it does not work in Expo Go.
- Android API 24+.
- iOS 15.1+ for compatibility; iOS 26 SDK and runtime for actual AlarmKit scheduling.