Releases: koala73/worldmonitor
Releases · koala73/worldmonitor
World Monitor v2.5.9
What's Changed
- chore: bump v2.5.9 and update README for recent features (#398)
- fix: sort supply chain chokepoints by disruption score descending (#399)
- fix: sort tariff datapoints newest-first and fix cachedFetchJson test (#400)
- fix: restore Linux AppImage updater routing and fallback port reporting (#397)
- feat: add global streaming video quality setting (#365) (#396)
- fix: Linux AppImage crashes, RSS proxy 403s, and console noise (#395)
- ci: add TypeScript type-check workflow on PRs (#394)
- feat: add Ransomware.live RSS feed to cyber/security sources (#392)
- fix: restore FilterSpecification type annotation on country highlight filters (#393)
- fix: keep flat news on cluster failure and fix deckgl filter typing (#382)
- fix: supply chain panel bugs — invalid FRED series, global banner, feature gate (#391)
- fix: respect Browser Local Model toggle — skip ML worker init when disabled (#390)
- feat: dynamic sidecar port with EADDRINUSE fallback + let scoping bug (#375)
- feat: add Supply Chain Disruption Intelligence service (#387)
- fix: eliminate cache stampede across all server handlers (#389)
- fix: trade policy panel visual overhaul and false unavailable banner (#385)
- fix: economic panel showing wrong values and unresponsive tabs (#384)
- fix: correct trade policy panel data display issues (#383)
- fix: add diagnostic logging to WTO API fetch for silent failures (#376)
- fix: use cachedFetchJson for WTO endpoints + add 10-min refresh schedule (#373)
- fix: WTO API indicator codes, disable giving panel, update README (#371)
- Add WTO trade policy intelligence service with tariffs, flows, and barriers (#364)
- Add BIS central bank data integration (policy rates, exchange rates, credit) (#363)
- fix: filter deck.gl Uint8Array WebGL pick noise in Sentry (#362)
- fix: improve API key signup link discoverability in settings (#361)
- fix: RSS proxy allowlist + add 9 new positive news feeds (#360)
- chore: bump version to 2.5.8 and align README with recent features (#359)
- feat: add trade route & chokepoint visualization layer (#358)
- fix: add redirect target domains to RSS proxy allowlist (#357)
- chore: remove .claudedocs + tighten Sentry noise filters (#356)
- feat: country commands + command palette UX improvements (#355)
- fix: guard data-loader against post-destroy work (#353)
- perf: reduce OpenSky API calls from 4 to 2 via merged query regions (#352)
- fix: desktop updater toast notification + XSS hardening (#351)
- feat: add command palette to Cmd+K search modal (#350)
- fix: narrow markdown lint scope to product docs only (#349)
- security: harden IPC, gate DevTools, isolate external windows, exempt /api/version (#348)
- feat: HappyMonitor — positive news dashboard (happy.worldmonitor.app) (#229)
- fix: suppress notification sound when alerts disabled + bump v2.5.7 (#346)
- perf: defer YouTube/map init and stagger data loads to reduce blocking time (#287) (#345)
- Security hardening: SSRF protection, auth gating, and token generation (#343)
- feat: universal country detection — CII scoring for all countries (#344)
- fix: prevent entity conflation in pane summarization (#341)
- fix: prevent entity conflation in pane summarization (#339)
- fix: add Mexico to COUNTRY_BOUNDS and COUNTRY_ALIASES for brief news/geo matching (#338)
- fix: add Mexico to CII scoring (TIER1, keywords, ports, mappings) (#337)
- fix: make OpenSky cache TTLs env-configurable, bump positive to 60s (#333)
- fix: serialize OpenSky requests with global 429 cooldown (#332)
- fix: replace RSSHub feeds with native/Google News alternatives (#331)
- fix: OpenSky auth resilience — retry, IPv4, no negative cache on auth fail (#329)
- Harden Railway relay auth, caching, and proxy routing (#320)
- feat: add Mexico as CII hotspot for cartel/security monitoring (#327)
- feat: add Mexico and LatAm security feeds for instability coverage (#325)
- fix: add CARTO and OpenStreetMap attribution to map (#323)
- feat: add category pills and search filter to Panels tab (#322)
- feat: consolidate settings into unified tabbed modal with variant-aware source regions (#319)
- chore: remove unused WORLDPOP_API_KEY from .env.example (#318)
- feat: add Island Times (Palau) RSS feed for Asia Pacific coverage (#317)
- Add AI Flow settings popup for web-only AI provider control (#314)
- fix: add Sentry noise filters and extend deck.gl crash suppression (#316)
- fix: add drag cleanup handlers and suppress click after drag-drop (#315)
- fix: replace HTML5 drag API with mouse events for WKWebView compatibility (#313)
- feat: add Bild RSS feed scoped to German locale (#312)
- fix: open channel settings as inline modal instead of separate window (#311)
- fix: add missing country brief i18n keys and export PDF option (#308)
- fix: add Greek flag mapping to language selector (#307)
- fix: add Greek flag mapping to language selector (#305)
- fix: add missing country brief i18n keys and export PDF option (#306)
- Build/runtime hardening and dependency security updates (#286)
- fix: harden embed postMessage origin check and add channel validation (#302)
- fix: increase live channels window size to fit channel grid (#301)
- test: add Playwright e2e tests for flushStaleRefreshes (#280)
- fix: sync YouTube live panel mute state with native player controls (#285)
- fix: strip Ollama reasoning tokens and plain-text thinking from summaries (#299)
- fix: open external links in system browser on Tauri desktop (#297)
- fix: add User-Agent and Cloudflare 403 detection to all secret validation probes (#296)
- feat(live): optional channels with tab-based region browse UI (#295)
- fix: infra cost optimizations round 2 — polling, TTLs, ACLED dedup (#275)
- fix: enforce military bbox filtering and add behavioral cache tests (#284)
- fix: infrastructure cost optimizations across caching, polling, and batching (#283)
- feat(live): custom channel management with review fixes (#282)
- fix: circuit breaker persistent cache with safety fixes (#281)
- fix: immediately refresh stale services when tab regains focus (#277)
- chore: bump version to 2.5.6 with changelog (#272)
- feat: add Nigeria feeds and Greek locale feeds (#271)
- fix: add negative caching + cascade-resistant dedup to RSS proxy (#270)
- Add Brasil Paralelo source (#260)
- Fix GLib symbol mismatch when running as AppImage on newer distros (#263)
- Optimize AIS relay: backpressure queue, spatial indexing, response caching (#266)
- fix: allow http:// origin from tauri.localhost for Windows CORS (#262)
- feat: add Greek (Ελληνικά) locale (#256)
- fix: whitelist social preview bots + restrict SW routes to same-origin (#251)
- fix: restrict SW route patterns to same-origin only (#247)
Full Changelog: v2.5.5...v2.5.9
World Monitor v2.5.7
What's Changed
- chore: bump version to 2.5.7 with changelog
- fix: suppress notification sound when popup alerts are disabled
- perf: defer YouTube/map init and stagger data loads to reduce blocking time (#287) (#345)
- Security hardening: SSRF protection, auth gating, and token generation (#343)
- feat: universal country detection — CII scoring for all countries (#344)
- fix: prevent entity conflation in pane summarization (#341)
- fix: prevent entity conflation in pane summarization (#339)
- fix: add Mexico to COUNTRY_BOUNDS and COUNTRY_ALIASES for brief news/geo matching (#338)
- fix: add Mexico to CII scoring (TIER1, keywords, ports, mappings) (#337)
- fix: make OpenSky cache TTLs env-configurable, bump positive to 60s (#333)
- fix: serialize OpenSky requests with global 429 cooldown (#332)
- fix: replace RSSHub feeds with native/Google News alternatives (#331)
- fix: OpenSky auth resilience — retry, IPv4, no negative cache on auth fail (#329)
- Harden Railway relay auth, caching, and proxy routing (#320)
- feat: add Mexico as CII hotspot for cartel/security monitoring (#327)
- feat: add Mexico and LatAm security feeds for instability coverage (#325)
- fix: add CARTO and OpenStreetMap attribution to map (#323)
- feat: add category pills and search filter to Panels tab (#322)
- feat: consolidate settings into unified tabbed modal with variant-aware source regions (#319)
- chore: remove unused WORLDPOP_API_KEY from .env.example (#318)
- feat: add Island Times (Palau) RSS feed for Asia Pacific coverage (#317)
- Add AI Flow settings popup for web-only AI provider control (#314)
- fix: add Sentry noise filters and extend deck.gl crash suppression (#316)
- fix: add drag cleanup handlers and suppress click after drag-drop (#315)
- fix: replace HTML5 drag API with mouse events for WKWebView compatibility (#313)
- feat: add Bild RSS feed scoped to German locale (#312)
- fix: open channel settings as inline modal instead of separate window (#311)
- fix: add missing country brief i18n keys and export PDF option (#308)
- fix: add Greek flag mapping to language selector (#307)
- fix: add Greek flag mapping to language selector (#305)
- fix: add missing country brief i18n keys and export PDF option (#306)
- Build/runtime hardening and dependency security updates (#286)
- fix: harden embed postMessage origin check and add channel validation (#302)
- fix: increase live channels window size to fit channel grid (#301)
- test: add Playwright e2e tests for flushStaleRefreshes (#280)
- fix: sync YouTube live panel mute state with native player controls (#285)
- fix: strip Ollama reasoning tokens and plain-text thinking from summaries (#299)
- fix: open external links in system browser on Tauri desktop (#297)
- fix: add User-Agent and Cloudflare 403 detection to all secret validation probes (#296)
- feat(live): optional channels with tab-based region browse UI (#295)
- fix: infra cost optimizations round 2 — polling, TTLs, ACLED dedup (#275)
- fix: enforce military bbox filtering and add behavioral cache tests (#284)
- fix: infrastructure cost optimizations across caching, polling, and batching (#283)
- feat(live): custom channel management with review fixes (#282)
- fix: circuit breaker persistent cache with safety fixes (#281)
- fix: immediately refresh stale services when tab regains focus (#277)
- chore: bump version to 2.5.6 with changelog (#272)
- feat: add Nigeria feeds and Greek locale feeds (#271)
- fix: add negative caching + cascade-resistant dedup to RSS proxy (#270)
- Add Brasil Paralelo source (#260)
- Fix GLib symbol mismatch when running as AppImage on newer distros (#263)
- Optimize AIS relay: backpressure queue, spatial indexing, response caching (#266)
- fix: allow http:// origin from tauri.localhost for Windows CORS (#262)
- feat: add Greek (Ελληνικά) locale (#256)
- fix: whitelist social preview bots + restrict SW routes to same-origin (#251)
- fix: restrict SW route patterns to same-origin only (#247)
Full Changelog: v2.5.5...v2.5.7
World Monitor v2.5.6
What's Changed
- chore: bump version to 2.5.6 with changelog
- feat: add Nigeria feeds and Greek locale feeds (#271)
- fix: add negative caching + cascade-resistant dedup to RSS proxy (#270)
- Add Brasil Paralelo source (#260)
- Fix GLib symbol mismatch when running as AppImage on newer distros (#263)
- Optimize AIS relay: backpressure queue, spatial indexing, response caching (#266)
- fix: allow http:// origin from tauri.localhost for Windows CORS (#262)
- feat: add Greek (Ελληνικά) locale (#256)
- fix: whitelist social preview bots + restrict SW routes to same-origin (#251)
- fix: restrict SW route patterns to same-origin only (#247)
Full Changelog: v2.5.5...v2.5.6
World Monitor v2.5.5
What's Changed
- fix: sentry triage + SW POST method for PostHog ingest (#246)
- fix: correct Vietnam flag country code in language selector (#245)
- fix: layer help, SW ingest routing, toggle colors, v2.5.5 (#244)
- Fix Linux rendering issues and improve monospace font fallbacks (#243)
- fix: reduce dedup coordinate rounding from 0.5° to 0.1° (~10km) (#235)
- feat: Upstash Redis shared caching + cache key contamination fixes (#232)
- Format Rust code and fix Windows focus handling (#242)
- Update .env.example (#228)
- docs: add community guidelines (contributing, code of conduct, security) (#226)
- fix: shorten vercel.json ignoreCommand to fit 256-char limit
- Fix Vercel build failure when previous deploy SHA is missing (#225)
- fix: add missing showRetrying method to Panel base class (#224)
- chore: bump version to 2.5.4
- chore: add TODO for Yahoo Finance cloud relay fallback
- fix(market): harden Yahoo Finance resilience and UCDP retry logic
- fix(analytics): proxy PostHog through own domain to bypass ad blockers
- chore: add docs/internal/ to .gitignore
- fix(settings): skip API key re-verification when no keys were changed
- fix(ucdp): add negative cache, version cache, and stale-on-error fallback
- fix(i18n): add cable health evidence key to all locales
- Add cable health scoring via sebuf InfrastructureService (#220)
- fix(api): sanitize og-story level input (#219)
- fix(csp): allow PostHog scripts from us-assets.i.posthog.com
- fix: restore API-key gate and block fallback on config import failure (#218)
- Fix deployment build: make WORLDMONITOR_API_KEY optional (#217)
- Add PostHog analytics with privacy-first design (#216)
- fix: registration via direct Convex call + compact WM tab layout
- fix: World Monitor tab first, registration proxy, empty key guard
- feat: redesign settings World Monitor tab + sidecar RSS proxy + v2.5.3
- feat: API key gating for desktop cloud fallback + registration (#215)
- perf(rss-proxy): increase CDN cache TTL to reduce origin invocations
- feat(feeds): add native-language feeds for th, vi, tr, pl, ru locales and Australian coverage
- fix: remove dead /api/opensky fallback route (closes #212)
- fix(crypto): serve stale prices on CoinGecko failure instead of $0
- fix(feeds): replace dead RSS endpoints with Google News fallbacks
- feat(crypto): add XRP (Ripple) to crypto panel
- fix(relay): add in-flight request dedup for OpenSky and RSS endpoints
- feat(i18n): add Thai and Vietnamese localization
- security: escape user-facing strings in innerHTML template literals
- fix: harden OpenSky auth flow and proxy fallback
- fix: sentry triage — noise filters and formatOilValue NaN guard
- fix(sidecar): preserve request body on cloud fallback (#209)
- fix(sidecar): preserve Request body semantics in ipv4 shim (#205)
- perf: faster panel loading — instant flat render, higher concurrency (#206)
- docs: expand README with proto-first API, cable health, OG images, and production hardening
Full Changelog: v2.5.2...v2.5.5
World Monitor v2.5.2
What's Changed
- release: v2.5.2 — quota guard, map race fixes, Vercel build skip fix
- fix: prevent Vercel build skip when previous SHA is empty
- Proto-first API rebuild: sebuf contracts, handlers, gateway, and generated docs (#106)
- fix: sentry triage — quota guard, video ID validation, map race conditions
Full Changelog: v2.5.1...v2.5.2
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: v2.5.0...v2.5.1
World Monitor v2.5.0
What's Changed
- fix: sync Cargo.toml version to 2.5.0 (was missed in release commit)
- release: v2.5.0 — Ollama/LM Studio local LLM support, settings tabs, keychain vault
- feat: add Koeberg nuclear power plant (South Africa) to facilities map
- feat: add 5 defense/intel RSS feeds (Military Times, Task & Purpose, USNI News, Oryx OSINT, UK MOD)
- fix(map): clear PathLayer cache on toggle-off to prevent stale WebGL buffers
- fix: resolve markdown lint errors in docs
- fix(sentry): null guard getProjection crash and add 6 noise filters
- docs: add Ollama/local LLM coverage to community promotion guide
- feat: split settings into LLMs and API Keys tabs, fix keychain vault and Ollama UX
- fix: show URL and model inputs as plaintext instead of masked password dots
- fix: harden OpenAI-compatible endpoint flow for Ollama/LM Studio
- fix: resolve TS build errors and add missing Ollama keys to Rust keyring
- refactor: unify summarization providers behind common interfaces
- test: add Ollama provider tests across endpoint, sidecar, and chain layers
- feat: add Ollama (OpenAI-compatible) local LLM summarization support
- feat(i18n): localize remaining hardcoded English in 6 panel components
- feat(i18n): add theater name translations and webcam region localizations
- Fix ultrawide map height mismatch and re-enable map resize
- fix(sentry): filter Safari "Importing a module script failed" noise
- Fix wide-screen panel layout gaps and drag reorder behavior
- fix: restore update link fallback and PWA nav precache
- feat(i18n): add Turkish language support (14th language)
- feat: add llms.txt and llms-full.txt for LLM discoverability
- fix: exclude HTML from Workbox precache glob
- fix(sentry): triage 3 issues — 2 noise filters, 1 beforeSend fix
- chore: fix spacing issues and formatting
Full Changelog: v2.4.1...v2.5.0
World Monitor v2.4.1
What's Changed
- release: v2.4.1 — README overhaul, sentry triage, ultra-wide layout
- fix(sentry): broaden ignoreErrors regex for smart-quote apostrophe variants
- feat: ultra-wide layout — panels wrap around map on 2000px+ screens
- feat: harden desktop updater flow
- fix(tauri): suppress native WKWebView context menu for custom right-click menus
- chore: enforce desktop version sync
- chore: switch license to AGPL-3.0, externalize Sentry DSN
- fix(css): replace undefined --bg-panel
Full Changelog: v2.4.0...v2.4.1
World Monitor v2.3.9
What's Changed
- docs: add v2.3.9 changelog
- chore: bump version to 2.3.9
- fix: community widget idempotency guard + suppress missing i18n help keys
- feat(feeds): add NHK World and Nikkei Asia RSS feeds for Japan coverage
- feat(feeds): add NHK World and Nikkei Asia RSS feeds for Japan coverage
- fix(i18n): remove dead English fallback literals in StoryModal
- fix(i18n): remove dead English fallback literals in CountryIntelModal
- feat(i18n): add Japanese locale (1132 keys)
- fix(i18n): replace remaining hardcoded English in source and locales
- fix(i18n): normalize regional language codes in RTL detection
- fix(i18n): fix 5 P1/P2 bugs — timeAgo count, community widget, Linux AppImage, locale gaps, lang normalization
- feat(i18n): eliminate ~95 hardcoded English strings and remove dead UTC clock
- fix(css): restore intel-findings context menu styles removed in afccb1c
- fix(community): point discussion link to main discussions page
- style(community): vibrant green accent for discussion pill widget
- feat(i18n): add Arabic (RTL) and Chinese Simplified locales
- fix(css): remove broken @import for missing lang-switcher and rtl-overrides
- fix(trending): proper-noun heuristic handles headline-start and lowercase terms
- feat: add community discussion floating pill widget
- feat: add floating pill community discussion widget
- fix(trending): add proper-noun heuristic fallback when ML unavailable
- fix(trending): add proper-noun heuristic fallback when ML unavailable
- feat(i18n): add Russian locale and fix key parity across all 10 languages
- fix(i18n): localize remaining map/tooltips/popups and close locale gaps
- fix(i18n): localize remaining UI literals and expand locale coverage
- fix(trending): add missing English stopwords to suppressed terms
- fix(trending): add missing English stopwords to suppressed terms
- fix(i18n): close key coverage gaps and localize merged UI strings
- fix(css): define --panel-bg and --panel-border theme variables
- fix: resolve findings toggle state and badge listener lifecycle
- feat: add toggle to disable Intelligence Findings badge
- i18n: restructure and translate popups section across all locales
- fix(i18n): Propagate common keys to all 9 locale files & fix CountryBriefPage
- fix(i18n): Translate remaining title attributes and panel-empty strings
- fix(i18n): Final deep scan - translate panel-empty, export, and disabled sources strings
- fix(i18n): Replace all showLoading/showError hardcoded strings across 19 panels
- fix(i18n): Replace all remaining hardcoded strings in PizzInt, Playback, Monitor, DeckGLMap
- fix(i18n): Replace remaining hardcoded strings with t() calls in 12 components
- feat(i18n): Implement full internationalization support for 9 languages and add Linux AppImage config
Full Changelog: v2.3.8...v2.3.9
World Monitor v2.3.8
What's Changed
- feat: add finance/trading variant with market-focused dashboard
- feat(finance): integrate GCC investments into finance variant
- feat: add Gulf FDI investment database and panel component
- fix: wire timeline filtering across map and news panels
- fix(banner): hide desktop download prompt on mobile devices
- fix(desktop): batch keychain reads to reduce macOS password prompts
- feat: auto-detect OS in download banner, show only relevant platform
- fix(map): prevent popups from overflowing below viewport edge
- fix: disable map repetition & use English-only vector labels
- feat: add BBC Persian, Iran International, Fars News, MIIT & MOFCOM feeds
- fix: replace 7 more dead/blocked tech RSS feeds with Google News fallbacks
- fix: guard invalid RSS dates and replace dead/blocked feed URLs
- test: add coverage for finance/trending/reload and stabilize map harness
- fix: persist country highlight across theme switches
- fix: rehydrate country layers after setStyle theme switch
- docs: add finance variant, Gulf FDI, tri-variant architecture to README
- chore: add finance variant to GitHub issue templates
- fix(cors): add finance.worldmonitor.app to Railway proxy allowlist
- fix: resolve P2 reload guard and harness assertion drift
- feat(header): move UTC clock from map overlay to centered header bar
- fix(trending): suppress month names and strip source attributions from titles
- chore(release): finalize 2.3.8 changelog and version
- fix(trending): suppress noisy finance/generic terms from keyword spikes
- Harden full and tech variants against feed/API pressure
- Fix finance variant runtime resiliency and API pressure
- fix(panels): standardize error messages with specific causes
- chore(ai): switch OpenRouter model to auto-routed free tier
- fix: add finance types to PopupData union and auto-create variant panels
- fix: dynamically enumerate FEEDS categories in loadNews()
Full Changelog: v2.3.7...v2.3.8