Outcome
A sleep app that explains why you slept the way you did, not just how long. Modus pairs two sensors, Air (bedside, measuring room temperature, humidity, noise and light) and Ring (wearable, measuring heart rate, HRV and sleep stages), into one app built around a single hero number: a Sleep Score that combines body and room into one picture. Where most trackers stop at body data, Modus connects the room to the outcome, surfacing moments like “you woke three times after the room passed 22°C”.
Challenge
Sleep trackers measure the body and stop there. They tell you that you slept badly, but not what to change. The room you sleep in, its temperature, noise and light, shapes sleep as much as your body does, yet it sits in a blind spot across the whole category.The design problem was turning two very different data streams into one honest, readable story. Body data and room data have different units, different rhythms and different meaning. Dumped side by side they become noise. The app had to merge them into a single score the user trusts at a glance, then let anyone who wants the detail drill into what drove it, without the home screen ever feeling like a dashboard.
Approach
- One number, two sources. Made the Sleep Score the hero, with a breakdown that splits it into Body and Room so the combined score stays simple but never feels like a black box.
- Room tied to outcome. Instead of showing room metrics as standalone readings, connected them to sleep events on a timeline, so a spike in temperature or noise reads as a cause, not a stat.
- Calm by default, deep on demand. Kept the home screen to the score and tonight’s state, with trends and detail one layer down, so the daily glance stays calm.
- Tonight as the one evening action. Pulled wind-down, sleep goal and room prep into a single focused action, separate from the data-reading flows, so the night routine is one clear move.
- Ecosystem framing. Designed brand, two devices and app as one coherent system, so the product reads as considered product thinking, not a single screen
%20(1).webp)








