Releases: liviro/boob-o-clock
Releases · liviro/boob-o-clock
v0.5.0 — Day Mode
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
sessionstable (kind: day | night) replaces the oldnightstable; all events referencesession_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
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/startfor starting a night (only action that creates a row, only action taking typed config) - Session response carries nested
ferber?.current?with server-computedcheckInAvailableAt— presence encodes state ("Ferber night" / "in session" / "Learning specifically") - Unified
NightHourChartreplaces the feed-scatter and bedtime charts with one primitive; consolidated~100 LOC - Single-interval
useNowhook 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-depsas an error
State machine: 13 states, 41 transitions
v0.3.0 — Self-Soothe
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
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
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