World Monitor v2.5.1
What's Changed
- release: v2.5.1 — batch FRED, parallel UCDP, partial cache TTL, bot middleware
- fix: derive cache headers from partial flag on cache hits & widen Load failed filter
- fix: use per-entry TTL for UCDP fallbackCache to expire partial results in 10m
- fix: harden API routes, batch FRED requests, and sanitize tooltip HTML
- perf: add bot protection middleware and robots.txt to reduce API abuse
- refactor: extract duplicate layerToSource mapping to LAYER_TO_SOURCE config constant
- perf: reduce Vercel costs — extend API cache TTLs and skip non-code builds
- fix: shared fetch abort isolation and USNI vessel augmentation
- fix: stabilize E2E tests and fix InvestmentsPanel event delegation
- fix: add Sentry noise filter for Android WebView bridge errors
- fix: suppress maplibre-internal TypeErrors in Sentry beforeSend
- refactor: replace innerHTML with programmatic DOM via h() hyperscript
- feat: abort in-flight fetch requests on panel destroy and page hide
- fix: update Sentry noise filters for Safari fullscreen and deck.gl null id
- perf: move inline panel styles to panels.css, loaded once via main.css (PERF-012) (#154)
- perf: split i18next, sentry, and panels into separate chunks
- fix(sidecar): deduplicate Vary header tokens with appendVary helper
- fix: use graph edges for infra cascade capacity instead of hardcoded 0.1
- Add IndexedDB-backed persistent API caching
- fix: widen SW globIgnore to exclude all ML JS chunks
- feat: integrate USNI fleet tracker and add parser tests
- Add Brotli-first API compression for sidecar and nginx
- Track missing backend feeds in data freshness
- fix: scope videoId and isLive to same videoDetails block
- fix: harden map fallback and add regression coverage
- Debounce panel content updates to reduce rerenders
- Add build-time Brotli precompression for static assets
- Fix deep-link polling retries and timeout error
- Handle per-cluster render failures in NewsPanel
- docs(runtime): document local-only API boundary
- Add Linux-safe fallback when DeckGL WebGL2 is unavailable
- fix: update Sentry noise filters for CSP regex and truncated loads
- fix(pwa): disable default navigateFallback in generated SW
- fix(pwa): prevent stale HTML precache regression
- fix(runtime): block cloud fallback for local-only api routes
- chore: update package-lock.json
- perf: add will-change hints to animated elements for GPU compositing
- perf: add CSS contain: content to .panel for layout isolation
- fix: internationalize verification checklist labels
- chore: sync package-lock.json version to 2.5.0
- fix: replace hardcoded English strings with i18n t() calls
- perf: tree-shake unused locale files from initial bundle
- feat: pre-render critical CSS skeleton in index.html for instant perceived load
- chore: sync package-lock.json with package.json version
- Fix setInterval clock leak in startHeaderClock()
- fix: implement live-stream detection in youtubeLivePlugin dev middleware
- fix: replace Polymarket prod proxy with local Vite middleware plugin
- fix: add Desktop app (Linux), LLMs settings, and live webcams to bug report template
Full Changelog: https://github.com/koala73/worldmonitor/compare/v2.5.0...v2.5.1