🌸Spring 2026 Pebble App Contest View the entries!

Changelog

Version 1.6.02026-06-03T02:25:50.679

Anchored awake HR baseline
Replaces the rolling average with a baseline that is anchored to your actual awake resting HR, and only updates when you're demonstrably awake and active at a resting pace.

The problem with rolling average: During a gradual nap onset, HR drifts down slowly — and the rolling average chases it down step by step. The threshold was never crossed because the average and the current HR moved together.

The fix: The baseline only updates in the resting-awake VMC zone (50 ≤ VMC < 400)

Version 1.5.02026-06-02T02:10:21.263

Motion detection now uses HealthMinuteData.vmc instead of raw accel_service_peek().

Previously: the worker called accel_service_peek() on every HR event, computed √(x²+y²+z²) by hand, and compared against an EMA baseline. This had two problems:

accel_service_peek() requires the accelerometer to be active — extra battery
A single instantaneous sample is noisy and unreliable as a stillness measure
Now: the worker reads HealthMinuteData.vmc (Vector Magnitude Count) via health_service_get_minute_history(). VMC is:

Pre-computed by the OS health subsystem — zero extra sensor power
A per-minute aggregate of all accelerometer movement — much more stable than a single sample
The same signal used by Pebble Health itself for activity tracking
The stillness threshold (VMC_STILL_THRESH = 100) maps to the documented VMC ranges: 0–100 = very still, 100–500 = light movement, 500+ = active.

Version 1.4.02026-06-02T02:09:42.609

Tune NapBuster to your own body
Debug telemetry
The GUARDING screen now shows a live readout of what the detection algorithm sees:
HR:68 avg:74 d:142 x1

HR — current heart rate BPM
avg — your rolling average over the last ~40–80 min
d — accelerometer deviation (lower = stiller)
x1 — consecutive trigger streak (fires alarm at x2+)
Use this to understand why it's triggering (or not), then adjust the sensitivity setting accordingly.

Detection sensitivity setting
New setting in the settings screen: Detection

Level	HR drop required	Best for
Sensitive	8% below average	Light sleepers, hard to trigger
Balanced	13% below average	Default — works for most people
Conservative	20% below average	Frequent false positives

Version 1.3.02026-06-02T02:08:54.812

Alarm screen button labels
The alarm screen now shows labelled hints next to each button on the right edge — no more guessing which button does what at 2pm when you've just been woken up.

▲ UP = snooze 10 min
● SELECT = dismiss
▼ DOWN = snooze 30 min
Instant detection at guard window open
Previously the Tier 1 HR buffer was reset when the guard window opened, meaning NapBuster needed 3+ HR readings inside the window before it could evaluate a drop — potentially a 30–50 min blind spot at window start.

Now the HR buffer stays warm all the time (on Pebble Time 2 / Pebble 2). When the window opens, the existing baseline carries in and detection can fire on the very first reading if conditions are met.

Version 1.2.02026-05-25T23:22:22.131

Battery optimisation: Tier 1 analysis now piggybacks on OS HR events.

Previously the worker ran a 5-minute timer that always peeked HR. Now:

If your watch fires a HealthEventHeartRateUpdate, Tier 1 analysis runs at that moment for free (OS was already waking the CPU for the sample)
The 5-min timer checks whether a HR event arrived recently — if yes, it skips; if no (slow/disabled background sampling), it peeks HR itself as a fallback
Net result: on the default 10-min HR sampling setting, the timer almost never does any work. Behaviour is identical, battery usage is lower.

Version 1.1.02026-05-25T23:21:52.914

Two-tier sleep detection: HR+accel early warning (~10-15 min) on Pebble Time 2 and Pebble 2, with HealthService sleep event fallback on all platforms.

Version 1.0.02026-05-24T05:25:33.656

Stop accidentally falling asleep when you don't mean to.

NapBuster runs silently in the background and triggers a vibration alarm if your Pebble detects sleep during your configured guard window.

Features
🟢 Background sleep monitoring — works even when the app is closed
⏰ Configurable guard window — set the hours you want protected (default 11am–11pm)
📅 Day picker — choose which days to guard (any combination)
💤 Smart snooze — snooze the alarm for 15/30/60 minutes via Wakeup API
📳 Vibration strength — Gentle, Medium, or Strong pulse patterns
🎭 4 visual states — GUARDING / OFF-HOURS / SNOOZED / DISABLED with ASCII faces
🔋 Battery-conscious — HealthService only active during guard window