### Fixed
- **Step ring missing for 2+ minutes after launch** — the health service is not always ready when the app starts, so the initial seed call often produced no data. The OS fires a `HealthEventSignificantUpdate` once data is available, but 1.0.5 had silenced all health event redraws. The ring now redraws immediately on significant updates (startup, wake-from-sleep, periodic reconciliation — a few times per day at most), so rings populate as soon as the health service is ready rather than waiting for the next minute tick.
- **Battery: redraws reduced to once per minute** — health events (heart rate, step/active/sleep ring updates) no longer trigger canvas redraws. All health data is read on the minute tick and displayed in a single draw. Previously, heart rate sensor updates could trigger a full redraw every few seconds.
- **Battery: timeline peek per-frame redraws removed** — the unobstructed area `.change` callback was firing on every animation frame (~18 times per peek transition), causing a full canvas redraw each time. Only the single `did_change` event at the end of the animation now triggers a redraw
### Fixed
- **Sleep ring understated after midnight** — the health query window was `[yesterday midnight, today midnight]`, so sleep that crossed midnight (e.g. 11 PM → 7 AM) only counted the pre-midnight portion. Window end changed to `now`, so the full overnight session is included whenever the ring updates.
- **Corner complication values clipped into the outer ring** — values like "100%" (rain) started too close to the ring boundary and bled into the colour band. Labels have moved to the inner edge of each quadrant near the horizontal midpoint; values now sit in the wider part of each corner where 4-digit text fits cleanly.
- **Bluetooth and quiet-time icons overlapping the brand mark and time** — icons were centred vertically in the middle of the watch, covering the CAERN mark and time text. Repositioned to flank the heart rate row immediately below the brand mark.
- **Quiet-time icon invisible when fill colour was non-white** — the 1-bit masked icon was rendered using the active graphics fill colour rather than white, making it invisible against the dark background after certain drawing passes. Fill colour is now explicitly set to white before the icon block.
### Removed
- **Pollen complication** — removed from the complication picker; the underlying data source was unreliable.
### Performance
- **Battery: health redraws debounced** — multiple rapid health events no longer trigger an equal number of layer redraws. Redraws are coalesced to at most one per 500 ms.
- **Battery: GPS radio wake reduced** — the phone companion now caches the last known location for 2 hours, avoiding unnecessary GPS radio wakes on each 30-minute weather poll when you haven't moved.
- **Battery: 24h clock format cached at launch** — `clock_is_24h_style()` is now read once at init rather than on every canvas redraw.
## [1.0.2] - 2026-05-20
### Fixed
- **Sleep ring understated after midnight** — the health query window was `[yesterday midnight, today midnight]`, so sleep that crossed midnight (e.g. 11 PM → 7 AM) only counted the pre-midnight portion. Window end changed to `now`, so the full overnight session is included whenever the ring updates.
### Fixed
- **Milestone haptic fired on every app start when goal was already met** — the tick handler was resetting the "fired today" flags on every launch (not just on midnight day-change), so the haptic would retrigger each time you switched back to the watchface. Fixed to only reset flags on an actual day rollover.
- **Haptic milestone setting defaulted to off for 1.0.0 upgraders** — the new `HapticMilestone` field was placed in a struct padding slot, leaving its size unchanged. Upgraders' persisted settings loaded cleanly but the field read as zero (false). Moved the field to the end of the settings struct so the size mismatch correctly triggers a defaults reset on upgrade, giving everyone the intended "on" default.
### Added
- **Haptic milestone toggle** — new "Vibrate when goal reached" toggle in the Goals section of Clay settings. Defaults to on. Disabling it still tracks whether the goal was hit; re-enabling mid-day won't re-fire for a goal already crossed.
Initial release.
### Features
- **Three concentric progress rings** — outer (steps), middle (active minutes), inner (sleep last night). Each ring fills clockwise from 12 o'clock as you move through your day. When a ring exceeds 100%, an overflow arc in a lighter tint wraps back from 12, so you can see both that you've hit your goal and by how much.
- **Self-calibrating goals** — ring goals default to 7-day rolling averages from your Pebble Health history. No setup needed; 100% always means "you matched your usual day." Override any goal with a fixed value in settings.
- **Milestone haptic** — a short-then-long pulse fires once when steps or active minutes first cross 100% for the day. The fired state persists across restarts so you won't get a double vibration after a reboot.
- **Four corner zones** — NW always shows current temperature and today's high; fill colour reflects weather condition (yellow = clear, dark grey = clouds, light grey = fog, celeste = snow, dark blue = rain/drizzle, purple = thunderstorm). The other three corners are configurable complications.
- **Complications** — NE, SW, and SE zones each show one of: UV index, AQI, precipitation chance, feels like, wind gusts, humidity, or pollen. Values are colour-coded by severity (green → yellow → orange → red, or light → dark blue for rain). Default assignment: NE = UV, SW = AQI, SE = precipitation.
- **Heart rate** — drawn heart icon plus BPM in the centre ring. Dims to `--` when no reading is available.
- **Time and date** — LECO 32 Bold for 24h, LECO 26 AM/PM for 12h, following the watch system setting. Date shown as day number + month abbreviation above the time.
- **Status indicators** — Bluetooth disconnect icon and quiet-time icon flank the CAERN brand mark between the time and heart rate displays.
- **Weather cache** — weather and complication data is written to persistent storage on every fetch and restored on launch, so values display immediately after a reboot or reinstall.
- **Weather data** — fetched every 30 minutes by the phone companion app from Open-Meteo (no API key required). Covers temperature, condition, UV index, AQI, precipitation probability, feels like, wind gusts, humidity, and pollen.
- **Clay settings** — configure via the Pebble phone app: temperature units (°C/°F), complication assignment for NE/SW/SE zones, and optional fixed goals for steps, active minutes, and sleep (leave at 0 to use rolling averages).
- **Timeline peek** — layout adapts cleanly when a timeline event peek is active.
- Pebble Time 2 (Emery) only — 200×228 colour display.
### Data sources
Weather and air quality data provided by [Open-Meteo](https://open-meteo.com/) under the [Creative Commons CC BY 4.0 licence](https://creativecommons.org/licenses/by/4.0/).