Local-first · PWA · Self-hosted · MIT

Hearth

A free, private baby tracker. No ads, no lock-in, no forced account.

Track sleep, feeds, diapers, medicine, play, and bath time. Everything stays on your device: install it as a PWA and it works offline.

Day / night · same log

Hearth's hero card in daylight, showing an awake timer and nap window prediction
Day awake timer · nap window
Hearth's hero card at night, showing an awake timer and nap window prediction
Night offline log

The hero card tracks awake time and predicts the next nap window. Logging a bottle takes two taps.

A day, logged

Ten things Hearth records, the way they actually land across a day. Two taps each, one shared log.

SleepWoke after 11h 04m down, when and how it went
NursingLeft side, 18 min
BottleFormula, 120 ml
DiaperWet and dirty, two taps
PlayTummy time counts as awake time too
PumpingRight side, 140 ml
MedicineVitamin D, next dose reminder set
BathOne tap when it's done
SharingCaregiver added, same log stays live
SweetSpotNext nap window, predicted from real sleep data

A window instead of a single number, because sleep isn't that precise.

Babies build sleep pressure while they're awake, the same mechanism that makes adults drag by 9pm. Miss the window and they won't settle. Push past it and you get overtired: cortisol spikes, and the next nap gets worse instead of better. Wake windows also stretch fast as they grow. A newborn taps out in under an hour; an 18-month-old can go five. SweetSpot blends the population average for your baby's age with your baby's own naps from the last few days, weighting recent naps more heavily, and gives you a window instead of a single number, because sleep isn't that precise.

No ads.
No lock-in.
No forced account.

It runs on hardware you control. Signing in with Google or Apple is optional, for backup and cross-device sync. Skip it, and nothing leaves your network.

# Tailscale auth key: https://login.tailscale.com/admin/settings/keys
$ git clone https://github.com/jeremysball/hearth.git
$ cd hearth
$ cp .env.example .env
# fill in TS_AUTHKEY, CERT_FILE, and KEY_FILE
$ sudo docker compose up -d

Runs behind Tailscale: only devices on your tailnet can reach it. No exposed ports, no reverse proxy to configure.