Skip to content

Releases: koala73/worldmonitor

World Monitor v2.5.9

26 Feb 06:34
f757f6f

Choose a tag to compare

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

25 Feb 00:15

Choose a tag to compare

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

23 Feb 18:58

Choose a tag to compare

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

23 Feb 08:34
e797587

Choose a tag to compare

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

20 Feb 23:52

Choose a tag to compare

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

20 Feb 11:12

Choose a tag to compare

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

19 Feb 21:27

Choose a tag to compare

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

19 Feb 04:37

Choose a tag to compare

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

18 Feb 04:31

Choose a tag to compare

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

17 Feb 16:21

Choose a tag to compare

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