- manifest.webmanifest + apple/maskable PNG icons; relative paths so the
app works both at dev root and under /weather
- plain-JS service worker (sw.js) with notificationclick/push handlers and
an SW-mediated showNotification() path for native Android notifications
- src/lib/pwa.js bootstraps registration and routes alerts to the SW
- Every alert kind (storm/precip/heat/cold/uv/wind) is now a per-type
preference toggle in Settings; removed the old alertThresholds.thunderstorm
boolean in favor of notificationTypes.storm
- Store dedups native notifications per forecast day and fires best-effort
native notifications for newly-appeared alerts
- inline-assets keeps manifest/sw/icons in dist; deploy.yml uploads + verifies
all PWA files via WebDAV
- New Settings > Data source toggle (Open-Meteo global / NWS US); NWS
falls back to Open-Meteo when unavailable or outside its coverage.
- src/lib/api/nws.js: /points -> forecast/hourly/grid normalizer producing
the app's shared shape, with realistic air highs (NWS reports 104 for the
day Open-Meteo over-forecasts at 116); heat-index/feels-like falls back to
air temp since NWS returns apparentTemperature as null here.
- NWS requires a User-Agent contact; email is a build-time Vite env
(VITE_NWS_EMAIL), read from gitignored .env.local, never committed.
- Details view now shows which provider served the data.
- Fixes the identical UTC date-parse shift for NWS naive local times.
- Tests (8) + recorded live fixtures for Rogers County, OK.