Inspiration

Fajr is the first of the five daily Muslim prayers. It is prayed at dawn, before sunrise, which in Europe means anywhere between 3:30 AM in June and 6:30 AM in December. Around two billion people are supposed to get up for it every single day. Most of us miss it far more often than we admit.

I missed it for six months. Not for lack of wanting to: I set three alarms every night. At 5:02 I turned off the first. At 5:07 the second. At 5:12 the third, with no memory of any of them. Then the guilt at 7:30.

Then I read the sleep research. In the first minutes after waking, a state called sleep inertia makes your judgment measurably worse than after a full night without sleep, and it takes 15 to 30 minutes to lift (Wertz et al., JAMA, 2006). Every alarm I had ever snoozed was switched off by a brain that was not there yet.

Islamic tradition describes the same thing in a 1,400-year-old saying of the Prophet: during sleep, the devil ties three knots on you and whispers at each one, "the night is long, keep sleeping." The knots come undone by remembering God, washing, and praying. Not one of them comes undone lying down.

So the problem was never willpower. The decision was being handed to the one version of me least able to make it. The fix is to take the decision away.

What it does

Bedless Fajr rings at your exact Fajr time and does not stop until you prove you are out of bed.

It knows when Fajr is. The time depends on the sun's angle below the horizon at your location, so it moves every day and differs between London, Jakarta and Toronto. The app computes it daily from your coordinates, with the nine calculation conventions used by different Muslim communities, and a sensible default for people who do not know theirs. No location permission? Pick your city from a list.

It actually rings. Most prayer apps deliver the call to prayer as a notification, which the silent switch mutes and Sleep Focus hides. Bedless Fajr schedules a real system alarm through AlarmKit, Apple's new framework in iOS 26, the same mechanism as the Clock app. It rings through the silent switch, through every Focus mode, and it survives a reboot. Then the app plays the full adhan, the traditional call to prayer, because Apple caps an alarm sound at 30 seconds.

There is no snooze and no dismiss. Instead there is a mission, picked at random so you cannot prepare for it: your prayer mat unrolled on the floor, your toothbrush in your hand, a full glass of water. You get up, walk to it, photograph it. A vision model checks the photo against the mission in about three seconds and tells you, in plain words, what it saw. A photo of your ceiling taken from under the blanket does not pass, and you find that out at 5 AM, which is the entire point.

It does not punish you for your network. If the check fails twice, no signal, bad light, our server having a bad day, the alarm stops anyway. That morning is simply marked "unverified", and it stays that way.

It keeps two numbers, not one. Days, and days verified. Anyone can build a streak by tapping "done". Only one of those two numbers is hard to fake, and only one of them changes behaviour.

Excused days, for women. Muslim women do not pray during their period. One tap and the alarm stays off for the days they choose, with their streak preserved rather than broken, and one tap to come back. This was my mother's first question when I showed her the app, and it shipped the same night.

Night prayer. An optional earlier alarm, up to 3 hours before Fajr, for the voluntary night prayer called Tahajjud, with the same mission.

Very little is collected. No account, no sign-in, no tracking. Anonymous usage analytics (PostHog, hosted in the EU) show which screens people reach, nothing tied to a name. Your location computes a prayer time and is never stored. The photo is resized, checked, and discarded. Your streak lives on your phone.

How we built it

Twelve days, from zero. I am not a developer. I run other businesses and had never written an app.

The app is React Native on Expo SDK 57 in TypeScript, with a Swift bridge into AlarmKit for the system alarm. Photo verification runs in a Firebase Cloud Function that calls a vision model, guarded by App Check and a daily quota, and returns a short verdict the app shows to the user verbatim so nothing is a black box. Prayer times come from the Aladhan API. Monetization is RevenueCat: a yearly plan at $34.99 after a 7-day free trial, and a weekly plan at $4.99.

Everything around the app was automated, because one person cannot click through it twice. The App Store listing, metadata, pricing and screenshots are pushed by a Python client of the App Store Connect API. The store screenshots come from a script that drives a simulator through a capture mode built into the app, in eight languages with translated captions: 98 images from one command. The website, its legal pages and its SEO guides are generated from one source document.

Challenges we ran into

AlarmKit is brand new. It shipped with iOS 26 and almost nothing had been written about it. Getting an alarm that genuinely survives silent mode, Focus and a reboot, then hands over to the app for the full adhan, took several rounds on a real device. A screenshot never proves an alarm works.

The reviewer problem. The mission only exists inside the Fajr window. An Apple reviewer opening the app at 2 PM in California sees "too late" and can never reach the camera, which reads as an incomplete app. The review notes had to walk the reviewer through a documented path to the whole flow.

Being a brand-new developer account. The first submission came back under guideline 2.1: Apple wanted a screen recording on a physical iPhone and seven written answers about data, regions and purchases. That cost days.

Making an AI verdict feel fair at 5 AM. A rejected photo when someone is genuinely standing at their mat is the fastest way to lose a user forever. So the app says what it saw, and a repeated failure lets you through with the day marked unverified instead of punishing you for a bad connection.

Accomplishments that we're proud of

Shipping to the App Store in twelve days with no prior development experience.

Fourteen localized App Store listings in nine languages, English, French, Arabic, Indonesian, Malay, Turkish, German, Spanish and Hindi, with 98 localized screenshots, produced by one person in one night because the pipeline was automated instead of manual.

The Excused feature. One conversation with my mother showed that half the potential users would have their streak broken by something entirely outside their control, and one night fixed it.

And the honest streak. Shipping a counter people can tap would have been easier. Shipping two numbers, one of which is uncomfortable, was the right call.

What we learned

The hard part of an app is not the code. AI made the code reachable for someone who had never written any. What it does not make reachable is knowing which problem is worth solving, what a store listing has to say in nine languages, and how to get anyone to look at it.

Behaviour-change products fail on the details nobody plans for: what happens when the network is down, what happens during a woman's period, what happens to someone who genuinely cannot get up one morning. Get those wrong and the product is a punishment, not a help.

And a 2006 sleep study and a 1,400-year-old saying describe the same phenomenon. Both deserve to be taken seriously.

What's next for Bedless Fajr

Android, with the same photo verification.

More missions, and a way for a mosque, a family or a group of friends to hold a shared streak, which is what turns a personal tool into a community one.

And measurement. The app now has anonymous usage analytics (PostHog, hosted in the EU) on top of crash reporting, with no account and no tracking. I can finally see where people give up. Fixing those steps is the next real problem.

Built With

Share this project:

Updates

Submission history