AlarmCascade
Android alarm app that schedules a staggered batch of alarms in one action, anchored on the time you have to be up and generated backward from it. Native Kotlin alarm engine.
Private RepositoryLive Demo
AlarmCascadeScreens coming soon
About the Project
One alarm gets dismissed by a version of you that isn't awake enough to be trusted with the decision, so people stack five of them by hand — and then re-edit all five every time the schedule shifts.
AlarmCascade makes the stack the primitive. You set the target wake time, choose how many nudges and how far apart, and the whole cascade is scheduled in a single action. Move the target and the entire staircase moves with it.
Core Features:
- Backward generation from the target time, with forward anchoring and cross-midnight handling
- Hold-to-arm control: a deliberate press schedules the whole batch, hard to trigger by accident
- Live preview of exactly what will ring and when, before anything is armed
- Active-cascade screen listing what's armed, with whole-batch cancel
- Material You dynamic color pulled from the device's own palette
Technical Architecture:
- Expo SDK 56 / React Native 0.85 / React 19 / TypeScript, new architecture, Hermes
- Local Kotlin Expo module owning alarm delivery end to end: exact scheduling via AlarmManager's alarm-clock API, a foreground ring service with looping audio and vibration, and a hand-rolled full-screen ring activity that shows over the lockscreen and turns the screen on
- Boot re-arm through a native preferences mirror, so alarms restore after a reboot without needing the JS runtime to start
- Native Jetpack Compose hold-to-arm view rendered inside the React Native tree, fully prop-driven so its feel is tunable from JS without a rebuild
- Cascade generation is pure TypeScript with no React Native dependencies, validated against a table of runtime cases
- Theming reads the device's real Material 3 roles natively, mapped through a semantic surface layer with two-role blends for tones between named roles
Engineering Highlights:
- Validated the full alarm path on-device against the cases that actually matter: ring over lockscreen, stop, snooze, whole-batch cancel, reboot re-arm, and firing through battery-saver doze
- Kept a platform-agnostic alarm interface between the JS service layer and the native module, so a second platform's engine can drop in without touching the app above it
- Made the ring service restart-safe after the system kills and recreates it mid-alarm
- Chose plain Android views over Compose for the ring screen specifically to de-risk the lockscreen path
Tech Stack
ExpoReact NativeTypeScriptKotlinJetpack ComposeAlarmManagerMaterial YouReanimated