Inspiration
Most people do not have a sleep problem. They have a schedule problem. Their body wants one bedtime and wake time, and their job, school or family wants another. Sleep researchers call the gap social jet lag, and it affects the majority of working adults. The result is the same every morning: the alarm rings, the snooze button wins, and the first half hour of the day is lost to the phone.
Alarm apps treat this as a willpower problem. We do not. Willpower research has not held up, and habit formation takes about two months, not three weeks. So SnoozeWar is built as an enforcement app: it makes the schedule happen, from both ends of the day, and lets the data do the talking.
What it does
Bedtime. You set a bedtime. SnoozeWar reminds you, then blocks the apps that keep you up (Instagram, YouTube, whatever you choose) until your alarm goes off. It keeps working when the app is swiped away or the phone reboots.
Wake-up. The alarm rings at full volume and cannot be silenced by picking up the phone. To stop it you complete a mission: shake, tap, solve math, type a passage, retype an echo, match tiles, take a photo of a place you chose the night before (verified on-device), or walk a number of steps. One snooze is allowed, because the research says one snooze is fine. Four or five are not.
Proof. The Track tab records what actually happened: when you slept and woke, how much screen time you had, which apps ate your evening, and a daily consistency score built from seven facts (woke on time, kept bedtime, slept enough, no phone in the sleep window, alarm rang, bedtime set, checked in). A full-year heatmap shows the pattern. The streak counts days you showed up.
The Dare Engine. Every screen speaks in one voice. It is cocky and it teases you, but it never shames you. It reads your last night and your last morning and decides what to say. Nothing in the app is a generic motivational quote.
How we built it
Solo developer. Expo and React Native on top of a custom Kotlin enforcement layer on Android: a foreground alarm service that owns sound and vibration, an accessibility service that draws the bedtime blocker over other apps, receivers for boot, shutdown and volume keys, and a re-sleep watchdog that uses the phone's own motion and sleep signals.
The photo mission runs entirely on the phone: a perceptual hash plus a MobileNet embedding compare the morning photo with the reference photo, with a freshness check so an old photo cannot be reused.
Monetization runs on RevenueCat. The rule is one sentence: measure for free, interpret and enforce for money. Every raw number about you is free and stays free: unlimited alarms, seven of the nine missions, last night's sleep, wake and screen-time history, streaks. Premium is what acts on you or interprets you: the walk and speak-or-type missions, resisting escape from the ring screen, app blocking while you sleep, sleep debt and the seven-night trend. There is no trial and no countdown. The first 1,000 members get a founding discount on their first billing cycle, and the percentage shown on the card is computed from the live store prices, so the app can never promise a number the store does not charge.
Analytics are Firebase and PostHog, with sleep data kept on the device. Time zones are handled for all 176 countries the app ships in, with generated tests that run the same code in six zones.
Challenges
- Making an alarm ring when the app is dead. Android manufacturers kill background apps aggressively. The bedtime blocker and the alarm had to move into the alarm-clock class of system alarms and rehydrate themselves after the app is killed or the phone reboots.
- Detecting a pickup without detecting our own vibration. Any acceleration threshold trips on the siren's vibration. The fix was to measure the gravity angle of a lift instead of acceleration.
- Passing Google Play review for an accessibility service. A blocker that covers other apps needs a declaration, a video and an in-app disclosure, and the scope has to match exactly what the app does.
- Phone sign-in in every country. The first version had 26 countries hard-coded. It now validates numbers for every country with the same library the carriers use, and every error path offers Google sign-in so nobody is locked out.
- Cold start and size. A first frame that waited on the network became a first frame from local state. The download went from 40 MB to 37 MB without touching anything the user sees.
What we learned
Consistency of wake time matters more than sleep duration. One snooze is harmless. Loss hurts about twice as much as gain, so a score drop is shown more clearly than a score gain. And a feature that needs the app to be open is not enforcement.
Traction so far
Public on Google Play since 4 August 2026 in 176 countries.
What's next
Chronotype-aware scheduling as an opt-in layer, a Morning Mode that keeps chosen apps blocked for the first 30 minutes after the alarm, and iOS with AlarmKit.
Built With
- android
- crashlytics
- expo.io
- firebase
- firestore
- health-connect
- hermes
- jest
- kotlin
- libphonenumber
- mmkv
- mobilenet
- posthog
- react-native
- react-native-reanimated
- react-native-skia
- react-native-vision-camera
- revenuecat
- sentry
- tensorflow-lite
- typescript
- zustand


Log in or sign up for Devpost to join the conversation.