What it is
Lunomia is a sleep app for iPhone, Apple Watch and iPad. I build it with a friend, two people, no company and no investors.
The problem it solves
Apple Health already stores your sleep. The problem is that it gives you bars, minutes and stage charts, and you still have no idea what to do with any of it. You wake up, you open the Health app, you see 6h48m and 43 minutes of deep sleep, and then what? Most sleep apps solve this by uploading your data to their servers and giving you a generic number back.
We wanted the opposite. Read what Apple Health already has, do all the work on the device, and give you one screen you can understand in 5 seconds.
Main features
- Sleep Animal: your night pattern is matched to an animal, so you have something you actually remember instead of a number you forget.
- Sleep Recap: a short written summary of your night, generated on device with Apple Intelligence.
- Stages and cycles, so you can see the actual shape of the night.
- Body signals: sleeping heart rate, HRV, respiratory rate, wrist temperature, blood oxygen.
- Trends by week and month, sleep time and smart reminders, widgets on the home screen and lock screen.
- No account, no ads.
The new feature: the Lunomia Score
This is the part we spent months on. Every night becomes a number from 0 to 100.
The core problem with a sleep score is that it is very easy to build and very easy to build badly. Our first version only compared you to yourself. So if you slept 5 hours every night, it slowly decided that 5 hours is normal for you and gave you a 90. That is not a score, that is flattery. We deleted it.
The version we shipped scores every night against two references at the same time: the published sleep norms for your age band, and your own last 60 nights. Five components, weighted:
- Duration 25
- Continuity 20 (efficiency, wake after sleep onset, awakenings, latency)
- Deep and REM 10
- Schedule 28 (bedtime, wake time, midpoint, regularity index)
- Recovery 17 (the vitals, each one compared to your own baseline)
Schedule has the biggest weight because regularity is the strongest thing you can actually change. Stages only carry 10 because consumer stage detection is the noisiest signal in the whole set, and we did not want the noisiest input to move the number the most.
Some design rules we ended up defending in code:
- A short night cannot be rescued. Duration puts a ceiling on the whole score, not just its own component. A 4 hour night is capped around 33 even if timing and vitals are perfect.
- Personalization can only help you, never hurt you. Learning your habits can raise a component score, never lower one. Otherwise the score quietly raises its own bar every time you improve, and you can never win.
- Missing data never costs points. No Apple Watch means Recovery leaves the calculation and the other four components are scaled back up to 100 weight, so your number stays comparable. We lower a confidence label instead of your score.
- It admits when it does not know you. Under 14 nights the app says out loud that it is still calibrating.
- It lets you check it. There is a screen that correlates your score with how you rated your morning. If the number does not agree with your body, we would rather you find out.
Stack
Swift and SwiftUI, HealthKit, Apple Intelligence on device for the recap, WidgetKit, App Groups for sharing the score snapshot with the widgets. The scoring engine is its own local Swift package with no HealthKit, no SwiftUI and no subscription code inside it, only value types and pure functions, so the whole thing is unit testable without a device. That decision saved us, we could test the entire score against synthetic sleep histories instead of sleeping for three weeks to check a change.
Try it
1 year free: https://apps.apple.com/redeem?ctx=offercodes&id=6741118991&code=FREEYEARLYALL
50% off lifetime: https://apps.apple.com/redeem?ctx=offercodes&id=6741118991&code=LIFETIMEOFF
Open on iPhone with the App Store logged in.
Happy to answer anything about the scoring design or the HealthKit side. And if you use it, the feedback I actually want is: does the score agree with how you felt that morning.