Angler edition: solunar bite forecast + live tides/weather/water + catch log#32
Merged
Conversation
New sixth compile-time product (-DFEATURE_ANGLER): a desk fishing companion whose
hero is an on-device SOLUNAR "best bite times" forecast computed from the shared
sun/moon ephemeris -- no network, works offline and worldwide.
- Shared astronomy core moved src/space/Astro.{h,cpp} -> src/astro/ (namespace
space::astro unchanged); compiled only in the Space + Angler builds and dropped
from every other env's build_src_filter, always paired with -<angler/> since
Angler links astro. Space + radar re-verified building after the move.
- Solunar core (src/angler/Solunar.*): majors = moon transit, +2h; minors =
moonrise/set, +1h (start-at-event, matching the published table validated
against); day rating from moon phase + a sunrise/sunset "green window" bump.
On-hardware self-check vs NYC 2026-06-01 matches to the minute (majors 01:33 &
13:58, minors 05:53 & 22:04, sun 05:27/20:21 EDT, 98% moon -> Excellent).
- Hybrid shell (auto-rotate + swipe + tap detail): Bite / Moon / Sun / Clock +
Splash, user-toggleable via the ang-screens checkbox grid. The Bite hero is a
24h ring with period arcs, sunrise/sunset markers, a now-hand, day rating, and
tap-to-inspect period / day-summary cards; Moon draws a live phase disk.
- ntfy + optional speaker-chime alerts when a major feeding window opens
(edge-seeded at boot so the backlog never fires). Reuses the shared ntfy-topic.
- Wiring: [env:blipscope-angler-s3-146] (FW_OTA_PREFIX="angler-"), main.cpp
manager + sweep gates, ConfigurationWebServer #elif branch (teal theme;
location/tz/screens/alerts; no BYO key -- fully on-device in Stage 1), CI matrix
row angler-s3-146, CLAUDE.md section.
Stage 2 will layer the keyless live-data feeds on top (NOAA CO-OPS tides + water
temp, Open-Meteo weather + barometer trend, NDBC buoys) plus a catch log.
Verified on the S3 1.46": builds (flash 22.6%, RAM 18.2%), boots clean (QMI8658
IMU + I2S speaker ready), OTA channel angler-s3-146, solunar self-check passes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The sixth compile-time product (
-DFEATURE_ANGLER) — a desk fishing companion built from the same boards + shared infra as the radar/EAM/Space/Seismic/Birding editions. Ships in two stages (both in this PR).Stage 1 — on-device solunar bite forecast (no network)
Hero feature: a solunar "best bite times" forecast computed entirely from the shared sun/moon ephemeris — works offline and worldwide.
src/space/Astro.{h,cpp}→src/astro/(namespace unchanged), compiled only in Space + Angler; every other env drops it (paired with-<angler/>). Space + radar re-verified building.src/angler/Solunar.*): majors = moon transit (+2h), minors = moonrise/set (+1h), start-at-event; day rating from moon phase + a sunrise/sunset "green window" bump. Validated on hardware vs NYC 2026-06-01 to the minute (majors 01:33 & 13:58, minors 05:53 & 22:04, sun 05:27/20:21 EDT, 98% moon → Excellent).main.cpp).Stage 2 — keyless live feeds (all no-key, no-backend)
AnglerFeedClient— one core-0 worker over four endpoints (mirrors SpaceFeedClient: depth-1 queues, per-feed interval + backoff, last-good retained): NOAA CO-OPS predictions (hi/lo) + water temperature (US; only with a station set), Open-Meteo forecast (wind/temp/pressure + 24h pressure history), Open-Meteo Marine (waves + sea-surface temp, worldwide). US-first, Open-Meteo worldwide fallback.AnglerLogbook, own NVS): tap to log a catch, tagged whether a solunar window was active → a "% during bite windows" hit-rate, plus best day + fishing-day streak.Keyless mandate
No baked keys, no backend anywhere. NOAA CO-OPS + Open-Meteo are keyless; tides degrade to Open-Meteo / a clean "no station" state outside the US.
Verification
angler-s3-146, no WDT. Live weather feed lands (53°F, wind 10 mph N, 1013.6 hPa, 24h history → Barometer/Wind populate); marine + tides correctly skip inland/no-station; solunar self-check still exact.{"error"}, handled as a valid empty result).Wiring
[env:blipscope-angler-s3-146](FW_OTA_PREFIX="angler-");main.cppmanager + sweep gates;ConfigurationWebServer#elif defined(FEATURE_ANGLER)branch (teal theme); CI matrix rowangler-s3-146; CLAUDE.md section.Stage 3 (optional, later): NDBC buoy real observations, the tide 6-minute curve, further units polish.
🤖 Generated with Claude Code