🌸Spring 2026 Pebble App Contest — View the entries!

Changelog

Version 1.0.02026-08-07T18:08:40.219

### Added

- **Compass-driven sun/moon glow** — a radial glow bleeds in from whichever edge of the screen currently faces the sun (or, at night, the moon), computed from the body's compass azimuth relative to the watch's live heading.
- **Six glow modes driven by solar altitude** — Noon, Golden, Horizon, Twilight, Moon, and Dark, each with its own colour palette (18 shells) and brightness curve, selected purely from how high the sun is above the horizon rather than clock time.
- **Simplified Meeus solar and lunar position calculation** (phone-side, in pkjs) — computes azimuth/altitude for both the sun and moon, plus moon phase and illumination fraction, from GPS coordinates and the current time.
- **Hourly GPS/position refresh** with on-watch persistence — solar, lunar, and location data survive a reboot or reinstall and display immediately, even before the first refresh lands.
- **Time and date display** — Bitham 42 Bold time, Gothic 24 Bold date, both white with a black outline so they stay legible over every glow colour.
- **CAERN brand mark**, matching the subtle Gothic 9 treatment used across other Caern watchfaces.
- **Status cluster** — compass calibration dot (grey/orange/green) and battery bar, grouped together at the bottom of the screen.

### Battery

- **Compass gated on wrist orientation** — a cheap always-on 10Hz accelerometer-only check detects whether the watch is roughly flat (i.e. being looked at); the compass, which pulls a continuous magnetometer poll plus its own internal accelerometer fusion, is only subscribed while that's true.
- **Adaptive compass heading filter** — starts tight (2°) to avoid missing the calibration-status transition, then widens to 6° once calibrated, cutting redraw-triggering events for the rest of normal wear.
- **Glow renders as rings, not discs** — each of the 18 colour bands paints only the thin ring it actually contributes to the final image via `graphics_fill_radial`, instead of a full disc that the next, smaller band would mostly paint over anyway.

### Fixed

*(bugs found and corrected during development, before this first release)*

- **Compass heading was inverted** — the SDK's raw `CompassHeadingData.true_heading` increases counter-clockwise from north, but the code was using it directly as a standard clockwise heading. The error was a mirror image around the north/south axis: correct when facing due north or south, maximally wrong (glow on the opposite side of the screen) when facing east or west.
- **Compass calibration status could get stuck** — the heading-change filter also gates whether the app hears about a calibration status change at all, since status rides the same event as heading. Too large a filter could silently drop the transition to "calibrated" for as long as heading held steady, leaving the status dot stuck grey indefinitely.
- **Brightness ramp toward solar noon suppressed the richer Golden/Horizon palettes** — shell count was being truncated by overall intensity for all daylight modes, but Golden and Horizon only ever fire at lower solar altitude, which always computed a lower intensity — so those modes could never reach their own high-index "peak" colours. Fixed by only letting intensity truncate shell count for Dark/Moon; daylight modes always render their full palette, and "brighter near noon" comes from the glow radius curve instead.
- **Visible seams between glow rings** after switching from disc fills to ring fills — a small rounding mismatch between each ring's inner edge and the next shell's outer edge left hairline gaps showing background colour through. Fixed with a small deliberate overlap between adjacent rings.