SmallHours

Named for when it gets used.

A baby tracker in the shape of Huckleberry: sleep, feeds, nappies and growth, logged one-handed in the dark, with a predicted window for the next sleep. What makes it different is that it tells you what the prediction is inferred from, and keeps quiet when it does not know.

Self-hosted API-first Invite-only In development
Get in touch
Overview

The three in the morning constraint.

Every design decision in this app answers to one situation. It is dark, you are holding a baby, you have one hand, and you are not going to read anything. Logging a feed has to take one tap and survive being done late and slightly wrong, because at that hour it always is.

The running-timer semantics are enforced by the database rather than the interface: at most one open observation of a given type per baby. Both parents can hit start feed at the same moment and there is still one feed.

Everything derived is recomputed from the log on every write, so correcting a mis-logged entry reshapes history instead of leaving it wrong. That matters here more than it does in most software, because the raw material is a person guessing at times while half asleep.

The Window

A prediction that shows its working.

Most trackers show one number for the next sleep and quietly imply it is settled. SmallHours separates two different kinds of uncertainty and refuses to blend them.

Two uncertainties, never conflated
How well we know this baby's typical wake window narrows as evidence accumulates. Whether this baby settles in that window today does not narrow at all. The interval reflects the first. The app never claims the second.
It says when it does not know
Below five recorded transitions in a bucket there is no window at all. High confidence needs both a quantity test and an agreement test. The narrowest interval it will ever draw is ten minutes either side, because a single time would be read as a promise.
Context suppresses, it does not corrupt
Illness, teething, travel and the first days of sleep training are first-class events. They are checked before the evidence: a fortnight of clean history does not make it right to tell a parent whose baby is ill when the next nap is due.
Fourteen days, and a median
Wake windows change month to month in the first year, so averaging three months anchors the estimate to a baby who no longer exists. Windows are bucketed by ordinal rather than pooled, and centred on a median, so one four-hour car nap cannot move tomorrow.
Honesty

A dash is not a zero.

Absence is recorded. "The baby did not nap" and "nobody logged the nap" are different facts, and an app that renders both as a gap teaches you to distrust it. Daily totals carry honest coverage alongside the number.

Reads may be stale. Writes are never faked. With no connection the screen still shows you the log and says how long ago it last managed to sync. There is no background queue and no optimistic "saved", because a tracker that claims to have logged a feed it did not is worse than one that admits it could not.

The night belongs to the evening it began in. Whether a sleep counts as the night is decided by how much of the night it covers, not by when it started. A real log contained a thirteen hour thirty-nine minute sleep beginning at 18:41, which any start-time rule files as a nap.

Your data

Reachable, portable, yours.

A documented HTTP API
Every observation and every derived figure is reachable over /v1 with scoped tokens you mint and revoke yourself.
It describes itself
/v1/openapi.json is generated from the same Zod schemas that validate the requests, so the documentation cannot drift from the behaviour.
Export round-trips
/v1/export goes back in through /v1/import unchanged. Leaving is a supported operation rather than a support ticket.
Huckleberry importer
Written against a real export. It reads 1,778 rows with nothing rejected, and importing the same file twice changes nothing.
Nothing dropped in silence
Any row the importer cannot map, or converts to something implausible, is reported with its row number rather than quietly discarded.
Installable and offline
Home-screen icons, offline reads, and running timers that appear on every device signed into the account.
Status

Built, not yet deployed.

Phases one through four are done: the scaffold and data layer, the derivation engine, the app itself, and the API surface with tokens, OpenAPI, export and import. 99 tests passing. Webhooks and reminders are not built yet, and there is no deployment.

SmallHours is one of the Locke Werks house apps and the source is private. It is built to be self-hosted, with no public signup and no analytics. For access or a conversation about running it, write to archon@lockewerks.com.