Skip to content

Releases: liviro/boob-o-clock

v0.5.0 — Day Mode

24 Apr 00:56

Choose a tag to compare

What's new

Day mode — nap and day-feed tracking

  • New day subgraph: Awake, Feeding, Napping, Diaper change — tracked with the same event-sourced model as the night
  • Chain-advance: Start day closes the night, Start night closes the day (single event at the boundary — no "end night" dead-end)
  • Nap location metadata (crib / stroller / on me / car) on every start_sleep
  • Server picks the right action set per state — client never branches on day vs night

Cycles replace nights as the history primitive

  • A cycle is a (day, night) pair — one card per 24h midnight-to-midnight window on the History page
  • 24h timeline bar: state-colored segments showing the full rhythm of the day; previous night's sleep tail prepends across the midnight boundary
  • Live sleep/wake duration pills — teal for naps, red for awake windows; the in-progress segment blinks
  • Per-cycle stats: nap count, total nap time, day feed count/duration, wake windows, last wake window before bedtime
  • Moving averages for day and night are computed independently (a cycle with only a night half averages across nights alone)

Architecture

  • Unified sessions table (kind: day | night) replaces the old nights table; all events reference session_id
  • Single-transaction legacy migration with atomic rollback: the DB either fully migrates or stays bit-identical to before
  • New fidelity test seeds 20 realistic nights + 1 open and asserts byte-for-byte preservation of IDs, seq, timestamps, metadata JSON, and Ferber fields across the migration
  • SQLite partial UNIQUE on sessions((1)) WHERE ended_at IS NULL — indexing a constant so "at most one open session" actually bites (NULLs-are-distinct gotcha)
  • Chain-aware undo: undoing a chain-advance reopens the prior session atomically

Other UI improvements

  • History page: cycle cards with tinted day/night sections
  • Midnight-anchored timeline bars (was: 7am-anchored — harder to read)
  • Trend chart disambiguators so day-feed and night-feed charts are no longer ambiguously titled
  • Real bedtime chart moved up one slot with its own moving-average line

State machine: 17 states, 53 transitions

v0.4.0 — Ferber Mode

21 Apr 23:13

Choose a tag to compare

What's new

Ferber mode — graduated-interval sleep training

  • Opt-in per night at Start Night: toggle Ferber mode and pick the night number (1-7); "night 8+" clamps to night 7 intervals
  • New Learning state: countdown to the next check-in with live mood (quiet / fussy / crying) and Settled / Give Up actions
  • New Check In state: mood-change or return-to-learning, server tracks check-in count and time-to-settle
  • Graduated interval table lives server-side (reports.IntervalFor); the client is a pure subtracter of two timestamps
  • Mood metadata is validated at the domain layer on every Ferber entry (put_down_awake_ferber, baby_stirred_ferber, mood_change)
  • "Start night" form remembers your last Ferber night and suggests night N+1 for tonight

Ferber stats and charts

  • Per-night Ferber panel on Night Detail: sessions, check-ins, avg time-to-settle, cry / fuss / quiet time
  • Three new trend charts (cry time, check-ins, time-to-settle) surface only once you have Ferber data
  • Sage-green markers highlight Ferber nights on every non-Ferber trend chart so you can see both axes at a glance

Architecture

  • Dedicated POST /api/session/start for starting a night (only action that creates a row, only action taking typed config)
  • Session response carries nested ferber?.current? with server-computed checkInAvailableAt — presence encodes state ("Ferber night" / "in session" / "Learning specifically")
  • Unified NightHourChart replaces the feed-scatter and bedtime charts with one primitive; consolidated ~100 LOC
  • Single-interval useNow hook shared across components (was: per-component timers drifting against each other)

Other UI improvements

  • Sentence-case button labels everywhere
  • Tracker states got per-state layout polish (awake, feeding, resettling, checking-in)
  • ESLint with react-hooks/exhaustive-deps as an error

State machine: 13 states, 41 transitions

v0.3.0 — Self-Soothe

06 Apr 17:13

Choose a tag to compare

What's new

Auto-refresh stale sessions

  • UI automatically re-fetches session data when returning to the app after 15+ minutes idle, preventing stale state when multiple devices are in use

Self-soothing state

  • New state: baby can self-soothe from sleeping in crib (baby stirred) or from awake (put down awake)
  • Exits to sleeping in crib (settled), awake (baby woke), or poop
  • Counts as sleep time and doesn't break sleep blocks
  • Removed "Transfer to Crib" from awake state (replaced by "Put Down Awake"; transfer still available from sleeping on me)

Feed times tracking

  • Night summaries now show the clock time of each night feed
  • Golden "Feeds at" pills in both summary and detail views
  • New scatter chart in trends view showing feed times over nights (early night at top, late night at bottom)

UI improvements

  • Deterministic button ordering across server restarts
  • Timeline legend includes self-soothing state
  • Generic pill-group CSS naming for reusable pill components

State machine: 11 states, 33 transitions

v0.2.0 — Sleep Blocks

03 Apr 14:42
0873886

Choose a tag to compare

See the shape of your night at a glance.

Sleep block pills

  • Each night card now shows all sleep block durations in chronological order, not just the longest
  • Longest block highlighted in green; in-progress nights show the current block pulsing
  • Fixed timeline computation so stats are accurate for nights still in progress

Bug fixes

  • Fixed ghost clicks swallowing breast picker and modal buttons (shared guard hook for all modals)
  • Feed count now excludes the initial bedtime feed — only post-sleep feeds are counted

Polish

  • History UI: duration spacing, timeline legend, feed colors, timeline bar rounded corners
  • Docker Compose support for simpler deployment

Developer experience

  • Seed script (go run ./cmd/seed) generates 8 nights of plausible test data

v0.1.0 — First Night

30 Mar 20:44

Choose a tag to compare

First usable release. Battle-tested for exactly one night.

Tracking

  • 10-state sleep/feed state machine with context-aware action buttons
  • Left/right breast tracking with suggested side and visual flip animation
  • Undo support for fat-finger corrections at 3am
  • Long-press for backdated timestamps

Reports

  • Per-night summary: total sleep, feed time, wake count, longest sleep block
  • Color-coded timeline bar
  • Full event log with timestamps
  • Trend charts with 3-night moving averages
  • CSV export

Infrastructure

  • Single Go binary with embedded frontend (no separate web server needed)
  • SQLite with WAL mode, graceful shutdown, Docker healthcheck
  • Installable as PWA on iOS and Android