← the app · the guide

Development notebook

I am building NaniNani — an app that shows a child's sleep pressure as a rising tide — for my two children, and writing down what it teaches me — the science I lean on, the rules I hold the app to, and the places where both of them run out. Including the results that make my own model look bad. New entries appear as the work produces them.

2026-08-24

My scoreboard was counting one nap thirty-two times

I have written here before about the ledger: three reproducible algorithms bet on every upcoming nap and bedtime, once a quarter of an hour, and every bet is settled against what actually happened. I was proud of it. This week I looked at the scoreboard it feeds and found it had been quietly lying to me for as long as it has existed — not about any single forecast, but about which algorithm was any good.

2026-08-24

I was dimming the light I had just made

I set out to make NaniNani's home screen beautiful and instead spent the afternoon reading my own shader, where I found sixty lines of code building a lit horizon out of the sleep-pressure curve, and then, four lines from the end, three multiplications that threw away nearly half of it.

2026-08-24

A pane should answer one question

I spent this morning fixing how NaniNani scores its own forecasts, and then spent the afternoon discovering that the page I had been reading those scores on was badly built — for a reason I had defended out loud a few hours earlier.

2026-08-23

Why sleep apps go quiet before two months

Napper is used for close to half the newborns in Norway. It tracks sleep from birth — and it withholds its schedule until around two months. Most of its competitors do the same thing, at roughly the same line.

2026-08-23

Maria's first data: the borrowed curve runs 35 minutes hot

Maria's sleep journal went into the app today — 19 days of minute-precision logs, from two months old to two months and eighteen days.

2026-08-23

Eight rules I hold this app to

This app exists to lower a tired parent's stress, not to become one more thing they get graded on. That reads like a slogan right up to the moment you have to decide whether a screen shows a countdown — and then it has to be a rule. These are the eight I hold. They extend the founding rule — a gauge, never a deadline — into something a code review can fail against, because good intentions in copy never hold a line for long.

2026-08-23

A second opinion you have to ask for isn't one

NaniNani has kept a strict ledger of its own forecasts for weeks: three reproducible algorithms bet on every upcoming nap and bedtime, automatically, every quarter of an hour, and every bet is settled against what actually happened and scored. Meanwhile the two models with arguably the most interesting things to say — Claude Opus and Codex — only spoke when I pressed a button, and what they said went into a memory cache that a server restart erased. I had built a courtroom for my own code and a chat window for everyone else.

2026-08-23

A garden next to the ledger

I caught myself calling this notebook the place where users would come to understand the app, and today I admitted those are two different rooms. A dated journal cannot do that job — not because it's badly written, but because of what a journal is.

2026-08-23

A dial is a deadline in a costume

Today I deleted two of the app's three faces. The watch-style dial and the tachometer are gone; the tide — the shader where the waterline is the child's actual sleep pressure — is now the only view. And in the same breath, I retired the word that named this project: the founding rule, written on day one as a gauge, never a deadline, now reads a tide, never a deadline.

2026-08-19

What 671 days of sleep logs taught me

The engine inside this app was fitted and validated on 671 days of one child's real sleep — 2,181 sessions, month 1 to month 22.

2026-08-19

A gauge, never a deadline

I built this app around one rule, written before it had a name: it has to lower a tired parent's stress, and it must never say the child has to sleep at 14:20. Not only because that would be unkind. Because it would be a lie with a clock on it.