react-native-alarm-scheduler

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, only completeNativeAlarmAsync() 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_ALARM and ACTION_SHOW_ALARMS.
  • Expo config plugin for permissions and NSAlarmKitUsageDescription.
  • Fully typed, with explicit unavailable behavior where the OS cannot schedule alarms.

Platform support

CapabilityAndroidiOS
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.

Next steps