Design case study · Sleep Map
A habit withsomethingto keep.
A sleep app where a kept night claims a real place on a real map, and a bad night never takes anything back.
1person: product, interaction, visual design and code
- real places
- 24,062
- regions
- 487
- App Store builds
- 30
- languages
- 9
Keep the night, and in the morning a real place on a real map warms to gold and becomes yours.
Miss it, and nothing you hold is taken back.
01The problem
A score starts over. A map keeps.
The sleep apps I tried graded the night and handed back a number. A bad night only ever subtracted, and nothing carried over to the next.
The bet: give a good night something to keep.
A nightly sleep score illustration
29-56 overnight
Starts over every morning. One bad night is the whole headline.
Sleep Map Taiwan, from Taipei
13+0, nothing lost
Only ever grows. A bad night means the next place waits.
02A night, start to finish
One night, start to finish.






01 · Tonight
Set the hours you mean to keep.
A bedtime and a wake time. That window is the whole goal.
02 · Good night
One tap starts the night.
The first tap, not the last. More on that below.
03 · The story
Something true about tonight’s place.
A short bedtime story drawn from sources on Wikipedia.
04 · Phone down
Then nothing at all.
The night is already counting.
05 · Woke up
Wake inside your window.
The morning draws the night on a clock.
06 · Claimed
A real place becomes yours.
It warms to gold beside your ground, for good.
02The claim
The morning a place becomes yours.
- Night saved.The place you reached for, outlined and waiting.
- It warms to gold.The morning throws a small party.
- Then it takes its place.Right beside the ground you already hold.
18places held
03The one rule
A bad night never takes anything back.
It outranks every feature. I split rhythm from ownership: a streak describes continuity, so it can honestly drop to zero. Ground records what you earned, so nothing takes it away. Try it.
Last night was missed. Neili is still waiting, and all 23 places stay gold.
“Try again tonight. Nothing you’ve claimed is lost.”
04One tap to sleep
The night started on the third tap.
The first bedtime took three taps, and the night only started recording at the last. Who reads a bedtime story at bedtime? Someone falling asleep.
Since 1.1.1 the first tap starts the night, and the story carries a counting banner with an undo.
05The morning
A miss that says what happened.
My first miss screen was the success screen with a small ember line, and players couldn’t tell the night had failed. Now a miss mirrors a claim: the place, and the reason in plain words.
In 1.12 the card draws the night on a clock. Drive it.
Night saved
Neili
Estimated sleep
7h 40m
Minus 15 min to fall asleep and 5 min to wake up
Tonight’s goal: asleep by 11:00 PM, up by 7:00 AM
- Asleep by11:00 PM + 30 min = 11:30 PM
- Window opens7:00 AM − 2h − 30 min = 4:30 AM
- Window closes7:00 AM + 30 min = 7:30 AM
06Words that don’t wear out
The same night, the same words.
One fixed line, read every morning, wears through in about a week. So recurring lines come from pools of 16 to 25 short variants, picked by a stable hash of the night.
Each line is tested: 14 words at most, never “fail”, “should” or “lost”. Day sleepers read “sleep” for every “night”.
New time zone
The first night after a long trip never counts against you.
FNV-1a(“jetlag-3F2A9C1E…”)= 2273f2c8ab…mod 18 = 411 words ≤ 14
07The map won
I built a globe first. The map won.
The globe was lovely, and it couldn’t do Tonight’s one job: show tonight’s place. Its texture is now excluded from release builds, and a check on the shipped bundle keeps it out.

First build · a SceneKit globeThe earth at night. It couldn’t zoom in far enough.
Tonight’s canvas · a flat Mercator mapThe globe became a debug screen.
The one jobClose enough to see tonight’s place.
1.12 · A crisper map
Real coastlines, same world.
Only the drawing is clipped to land. The cells, their IDs and everyone’s ground are untouched, and tapping the sea beside an island still selects it.

09Sleeping together, apart
A Circle shares ground, never a miss.
Circles are optional groups kept on each member’s iCloud. A miss publishes nothing: it is silence. Even the streak flame shows only where there is one, because an empty flame would announce the night you missed.
Met: your ground touches theirs

- A display name
- A profile photo, if you add one
- Your colour
- The places you’ve claimed
- Sleep times
- Health data
- Missed nights
10Made for travel
The time change takes the blame.
Before 1.12, a one-hour trip west could reset a streak on a good night. Now every night keeps the zone it began in, and a big jump buys one night of grace.
The first night after the jump is judged, but it can never be a miss.

11Nine languages
Good night, nine ways.
- Good night
- 晚安
- Buenas noches
- Boa noite
- Bonne nuit
- Gute Nacht
- おやすみなさい
- Спокойной ночи
- Buonanotte
About 990 interface strings in eight translations, and a test fails if any key is missing anywhere. Place stories read in five languages, and Taiwan’s in Traditional Chinese.
12What I’d measure next
Honest about what I know.
Sleep Map has no analytics or advertising SDKs, so there is no retention curve here and no claim about anyone’s sleep. With consented measurement, I’d ask these first.
- 01
Do people grasp ground versus streak before their first miss?
- 02
Does a half-built place bring them back, or read as a reproach?
- 03
How often is a night a grace night, and does a traveller’s streak survive the trip?
- 04
Does a Circle bring people back, or only make the good nights more visible?
Sleep well tonight.
In the morning a little more of the world is yours, and none of it goes anywhere.




