mirror of
https://github.com/koala73/worldmonitor.git
synced 2026-04-25 17:14:57 +02:00
release: v2.4.1 — README overhaul, sentry triage, ultra-wide layout
- Comprehensive README update: live webcams, ultra-wide layout, Linux AppImage, theme system, auto-updater, error tracking, responsive layout, virtual scrolling, 13 languages, and 8 new roadmap items - Sentry triage: WORLDMONITOR-28 noise filter broadened for smart quotes - Ultra-wide layout: CSS float L-shape for 2000px+ screens (#114) - Version bump: 2.4.0 → 2.4.1
This commit is contained in:
104
README.md
104
README.md
@@ -18,7 +18,8 @@
|
||||
<p align="center">
|
||||
<a href="https://worldmonitor.app/api/download?platform=windows-exe"><img src="https://img.shields.io/badge/Download-Windows_(.exe)-0078D4?style=for-the-badge&logo=windows&logoColor=white" alt="Download Windows"></a>
|
||||
<a href="https://worldmonitor.app/api/download?platform=macos-arm64"><img src="https://img.shields.io/badge/Download-macOS_Apple_Silicon-000000?style=for-the-badge&logo=apple&logoColor=white" alt="Download macOS ARM"></a>
|
||||
<a href="https://worldmonitor.app/api/download?platform=macos-x64"><img src="https://img.shields.io/badge/Download-macOS_Intel-555555?style=for-the-badge&logo=apple&logoColor=white" alt="Download macOS Intel"></a>
|
||||
<a href="https://worldmonitor.app/api/download?platform=macos-x64"><img src="https://img.shields.io/badge/Download-macOS_Intel-555555?style=for-the-badge&logo=apple&logoColor=white" alt="Download macOS Intel"></a>
|
||||
<a href="https://worldmonitor.app/api/download?platform=linux-appimage"><img src="https://img.shields.io/badge/Download-Linux_(.AppImage)-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download Linux"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -40,7 +41,7 @@
|
||||
| Crypto/macro signal noise | **7-signal market radar** with composite BUY/CASH verdict |
|
||||
| Expensive OSINT tools ($$$) | **100% free & open source** |
|
||||
| Static news feeds | **Real-time updates** with live video streams |
|
||||
| Web-only dashboards | **Native desktop app** (Tauri) + installable PWA with offline map support |
|
||||
| Web-only dashboards | **Native desktop app** (Tauri) for macOS, Windows, and Linux + installable PWA with offline map support |
|
||||
| Flat 2D maps | **3D WebGL globe** with deck.gl rendering and 35+ toggleable data layers |
|
||||
| Siloed financial data | **Finance variant** with 92 stock exchanges, 19 financial centers, 13 central banks, and Gulf FDI tracking |
|
||||
|
||||
@@ -62,7 +63,7 @@ All three variants run from a single codebase — switch between them with one c
|
||||
|
||||
### Localization & Regional Support
|
||||
|
||||
- **Multilingual UI** — Fully localized interface supporting **English, French, Spanish, German, Italian, Portuguese, Dutch, Swedish, Russian, Arabic, Chinese, and Japanese**.
|
||||
- **Multilingual UI** — Fully localized interface supporting **13 languages: English, French, Spanish, German, Italian, Polish, Portuguese, Dutch, Swedish, Russian, Arabic, Chinese, and Japanese**. Language bundles are lazy-loaded on demand — only the active language is fetched, keeping initial bundle size minimal.
|
||||
- **RTL Support** — Native right-to-left layout support for Arabic (`ar`) and Hebrew.
|
||||
- **Localized News Feeds** — Region-specific RSS selection based on language preference (e.g., viewing the app in French loads Le Monde, Jeune Afrique, and France24).
|
||||
- **AI Translation** — Integrated LLM translation for news headlines and summaries, enabling cross-language intelligence gathering.
|
||||
@@ -170,9 +171,10 @@ All three variants run from a single codebase — switch between them with one c
|
||||
- **8 live video streams** — Bloomberg, Sky News, Al Jazeera, Euronews, DW, France24, CNBC, Al Arabiya — with automatic live detection that scrapes YouTube channel pages every 5 minutes to find active streams
|
||||
- **Desktop embed bridge** — YouTube's IFrame API restricts playback in native webviews (error 153). The dashboard detects this and transparently routes through a cloud-hosted embed proxy with bidirectional message passing (play/pause/mute/unmute/loadVideo)
|
||||
- **Idle-aware playback** — video players pause and are removed from the DOM after 5 minutes of inactivity, resuming when the user returns. Tab visibility changes also suspend/resume streams
|
||||
- **Custom monitors** — Create keyword-based alerts for any topic, color-coded with persistent storage
|
||||
- **19 live webcams** — real-time YouTube streams from geopolitical hotspots across 4 regions (Middle East, Europe, Americas, Asia-Pacific). Grid view shows 4 strategic feeds simultaneously; single-feed view available. Region filtering (ALL/MIDEAST/EUROPE/AMERICAS/ASIA), idle-aware playback that pauses after 5 minutes, and Intersection Observer-based lazy loading
|
||||
- **Custom keyword monitors** — user-defined keyword alerts with word-boundary matching (prevents "ai" from matching "train"), automatic color-coding from a 10-color palette, and multi-keyword support (comma-separated). Monitors search across both headline titles and descriptions and show real-time match counts
|
||||
- **Entity extraction** — Auto-links countries, leaders, organizations
|
||||
- **Virtual scrolling** — news panels render only visible DOM elements, handling thousands of items without browser lag
|
||||
- **Virtual scrolling** — news panels with 15+ items use a custom virtual list renderer that only creates DOM elements for visible items plus a 3-item overscan buffer. Viewport spacers simulate full-list height. Uses `requestAnimationFrame`-batched scroll handling and `ResizeObserver` for responsive adaptation. DOM elements are pooled and recycled rather than created/destroyed
|
||||
|
||||
### Signal Aggregation & Anomaly Detection
|
||||
|
||||
@@ -189,13 +191,14 @@ All three variants run from a single codebase — switch between them with one c
|
||||
|
||||
### Desktop Application (Tauri)
|
||||
|
||||
- **Native desktop app** for macOS and Windows — packages the full dashboard with a local Node.js sidecar that runs all 60+ API handlers locally
|
||||
- **Native desktop app** for macOS, Windows, and Linux — packages the full dashboard with a local Node.js sidecar that runs all 60+ API handlers locally
|
||||
- **OS keychain integration** — API keys stored in the system credential manager (macOS Keychain, Windows Credential Manager), never in plaintext files
|
||||
- **Token-authenticated sidecar** — a unique session token prevents other local processes from accessing the sidecar on localhost. Generated per launch using randomized hashing
|
||||
- **Cloud fallback** — when a local API handler fails or is missing, requests transparently fall through to the cloud deployment (worldmonitor.app) with origin headers stripped
|
||||
- **Settings window** — dedicated configuration UI (Cmd+,) for managing 17 API keys with validation, signup links, and feature-availability indicators
|
||||
- **Verbose debug mode** — toggle traffic logging with persistent state across restarts. View the last 200 requests with timing, status codes, and error details
|
||||
- **DevTools toggle** — Cmd+Alt+I opens the embedded web inspector for debugging
|
||||
- **Auto-update checker** — polls the cloud API for new versions every 6 hours. Displays a non-intrusive update badge with direct download link and per-version dismiss. Variant-aware — a Tech Monitor desktop app links to the correct Tech Monitor release asset
|
||||
|
||||
### Progressive Web App
|
||||
|
||||
@@ -230,12 +233,16 @@ All three variants run from a single codebase — switch between them with one c
|
||||
- **Population exposure estimation** — WorldPop density data estimates civilian population within event-specific radii (50–100km) for conflicts, earthquakes, floods, and wildfires
|
||||
- **Trending keywords panel** — real-time display of surging terms across all RSS feeds with spike severity, source count, and AI-generated context summaries
|
||||
- **Download banner** — persistent notification for web users linking to native desktop installers for their detected platform
|
||||
- **Download API** — `/api/download?platform={windows-exe|windows-msi|macos-arm64|macos-x64}[&variant={full|tech|finance}]` redirects to the matching GitHub Release asset, with fallback to the releases page
|
||||
- **Download API** — `/api/download?platform={windows-exe|windows-msi|macos-arm64|macos-x64|linux-appimage}[&variant={full|tech|finance}]` redirects to the matching GitHub Release asset, with fallback to the releases page
|
||||
- **Non-tier country support** — clicking countries outside the 22 tier-1 list opens a brief with available data (news, markets, infrastructure) and a "Limited coverage" badge; country names for non-tier countries resolve via `Intl.DisplayNames`
|
||||
- **Feature toggles** — 14 runtime toggles (AI/Groq, AI/OpenRouter, FRED economic, EIA energy, internet outages, ACLED conflicts, threat intel feeds, AIS relay, OpenSky, Finnhub, NASA FIRMS) stored in `localStorage`, allowing administrators to enable/disable data sources without rebuilding
|
||||
- **AIS chokepoint detection** — the relay server monitors 8 strategic maritime chokepoints (Strait of Hormuz, Suez Canal, Malacca Strait, Bab el-Mandeb, Panama Canal, Taiwan Strait, South China Sea, Turkish Straits) and classifies transiting vessels by naval candidacy using MMSI prefixes, ship type codes, and name patterns
|
||||
- **AIS density grid** — vessel positions are aggregated into 2°×2° geographic cells over 30-minute windows, producing a heatmap of maritime traffic density that feeds into convergence detection
|
||||
- **Panel resizing** — drag handles on panel edges allow height adjustment (span-1 through span-4 grid rows), persisted to localStorage. Double-click resets to default height
|
||||
- **Ultra-wide monitor layout** — on screens 2000px+ wide, the layout automatically switches from vertical stacking to an L-shaped arrangement: the map floats left at 60% width while panels tile to the right and below it, maximizing screen real estate on ultra-wide and 4K monitors. Uses CSS `display: contents` and float-based wrapping — no JavaScript layout engine required
|
||||
- **Dark/light theme** — persistent theme toggle with 20+ semantic color variable overrides. Dark theme is the default. Theme preference is stored in localStorage, applied before first paint (no flash of wrong theme), and syncs the `<meta name="theme-color">` for native browser chrome. A `theme-changed` custom event allows panels to react to switches
|
||||
- **Panel drag-and-drop reordering** — panels can be reordered via drag-and-drop within the grid. The custom order is persisted to localStorage and restored on reload. Touch events are supported for tablet use
|
||||
- **Map pin mode** — a 📌 button pins the map in a fixed position so it remains visible while scrolling through panels. Pin state is persisted to localStorage
|
||||
|
||||
---
|
||||
|
||||
@@ -540,6 +547,53 @@ The dashboard runs a full ML pipeline in the browser via Transformers.js, with n
|
||||
|
||||
News velocity is tracked per cluster — when multiple Tier 1–2 sources converge on the same story within a short window, the cluster is flagged as a breaking alert with `sourcesPerHour` as the velocity metric.
|
||||
|
||||
### Live Webcam Surveillance Grid
|
||||
|
||||
19 YouTube live streams from geopolitical hotspots provide continuous visual situational awareness:
|
||||
|
||||
| Region | Cities |
|
||||
|--------|--------|
|
||||
| **Middle East** | Jerusalem (Western Wall), Tehran, Tel Aviv, Mecca (Grand Mosque) |
|
||||
| **Europe** | Kyiv, Odessa, Paris, St. Petersburg, London |
|
||||
| **Americas** | Washington DC, New York, Los Angeles, Miami |
|
||||
| **Asia-Pacific** | Taipei, Shanghai, Tokyo, Seoul, Sydney |
|
||||
|
||||
The webcam panel supports two viewing modes: a 4-feed grid (default strategic selection: Jerusalem, Tehran, Kyiv, Washington DC) and a single-feed expanded view. Region tabs (ALL/MIDEAST/EUROPE/AMERICAS/ASIA) filter the available feeds.
|
||||
|
||||
Resource management is aggressive — iframes are lazy-loaded via Intersection Observer (only rendered when the panel scrolls into view), paused after 5 minutes of user inactivity, and destroyed from the DOM entirely when the browser tab is hidden. On Tauri desktop, YouTube embeds route through a cloud proxy to bypass WKWebView autoplay restrictions. Each feed carries a fallback video ID in case the primary stream goes offline.
|
||||
|
||||
### Desktop Auto-Update
|
||||
|
||||
The desktop app checks for new versions by polling `worldmonitor.app/api/version` — once at startup (after a 5-second delay) and then every 6 hours. When a newer version is detected (semver comparison), a non-intrusive update badge appears with a direct link to the GitHub Release page.
|
||||
|
||||
Update prompts are dismissable per-version — dismissing v2.5.0 won't suppress v2.6.0 notifications. The updater is variant-aware: a Tech Monitor desktop build links to the Tech Monitor release asset, not the full variant.
|
||||
|
||||
The `/api/version` endpoint reads the latest GitHub Release tag and caches the result for 1 hour, so version checks don't hit the GitHub API on every request.
|
||||
|
||||
### Theme System
|
||||
|
||||
The dashboard supports dark and light themes with a toggle in the header bar. Dark is the default, matching the OSINT/command-center aesthetic.
|
||||
|
||||
Theme state is stored in localStorage and applied via a `[data-theme="light"]` attribute on the root element. Critically, the theme is applied before any components mount — an inline script in `index.html` reads the preference and sets the attribute synchronously, preventing a flash of the wrong theme on load.
|
||||
|
||||
20+ CSS custom properties are overridden in light mode to maintain contrast ratios: severity colors shift (e.g., `--semantic-high` changes from `#ff8800` to `#ea580c`), backgrounds lighten, and text inverts. Language-specific font stacks switch in `:lang()` selectors — Arabic uses Geeza Pro, Chinese uses PingFang SC.
|
||||
|
||||
A `theme-changed` CustomEvent is dispatched on toggle, allowing panels with custom rendering (charts, maps, gauges) to re-render with the new palette.
|
||||
|
||||
### Responsive Layout System
|
||||
|
||||
The dashboard adapts to four screen categories without JavaScript layout computation — all breakpoints are CSS-only:
|
||||
|
||||
| Screen Width | Layout | Details |
|
||||
|-------------|--------|---------|
|
||||
| **< 768px** | Mobile warning | Modal recommends desktop; limited panel display with touch-optimized map popups |
|
||||
| **768px–2000px** | Standard grid | Vertical stack: map on top, panels in `auto-fill` grid (`minmax(280px, 1fr)`). Panels tile in rows that adapt to available width |
|
||||
| **2000px+** | Ultra-wide L-shape | Map floats left at 60% width, 65vh height. Panels wrap to the right of the map and below it using CSS `display: contents` on the grid container with `float: left` on individual panels |
|
||||
|
||||
The ultra-wide layout is notable for its technique: `display: contents` dissolves the `.panels-grid` container so that individual panel elements become direct flow children of `.main-content`. Combined with `float: left` on the map, this creates natural L-shaped content wrapping — panels fill the space to the right of the map, and when they overflow past the map's height, they spread to full width. No JavaScript layout engine is involved.
|
||||
|
||||
Panel heights are user-adjustable via drag handles (span-1 through span-4 grid rows), with layout state persisted to localStorage. Double-clicking a drag handle resets the panel to its default height.
|
||||
|
||||
### Signal Aggregation
|
||||
|
||||
All real-time data sources feed into a central signal aggregator that builds a unified geospatial intelligence picture. Signals are clustered by country and region, with each signal carrying a severity (low/medium/high), geographic coordinates, and metadata. The aggregator:
|
||||
@@ -657,7 +711,7 @@ A single codebase produces three specialized dashboards, each with distinct feed
|
||||
| **RSS Feeds** | ~25 categories (politics, MENA, Africa, think tanks) | ~20 categories (AI, VC blogs, startups, GitHub) | ~18 categories (forex, bonds, commodities, IPOs) |
|
||||
| **Panels** | 44 (strategic posture, CII, cascade) | 31 (AI labs, unicorns, accelerators) | 30 (forex, bonds, derivatives, institutional) |
|
||||
| **Unique Map Layers** | Military bases, nuclear facilities, hotspots | Tech HQs, cloud regions, startup hubs | Stock exchanges, central banks, Gulf investments |
|
||||
| **Desktop App** | World Monitor.app / .exe | Tech Monitor.app / .exe | Finance Monitor.app / .exe |
|
||||
| **Desktop App** | World Monitor.app / .exe / .AppImage | Tech Monitor.app / .exe / .AppImage | Finance Monitor.app / .exe / .AppImage |
|
||||
|
||||
**Build-time selection** — the `VITE_VARIANT` environment variable controls which configuration is bundled. A Vite HTML plugin transforms meta tags, Open Graph data, PWA manifest, and JSON-LD structured data at build time. Each variant tree-shakes unused data files — the finance build excludes military base coordinates and APT group data, while the geopolitical build excludes stock exchange listings.
|
||||
|
||||
@@ -761,7 +815,7 @@ All Railway relay responses are gzip-compressed (zlib `gzipSync`) when the clien
|
||||
|
||||
## Desktop Application Architecture
|
||||
|
||||
The Tauri desktop app wraps the dashboard in a native window with a local Node.js sidecar that runs all API handlers without cloud dependency:
|
||||
The Tauri desktop app wraps the dashboard in a native window (macOS, Windows, Linux) with a local Node.js sidecar that runs all API handlers without cloud dependency:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
@@ -892,6 +946,25 @@ The AI summarization pipeline adds content-based deduplication: headlines are ha
|
||||
|
||||
---
|
||||
|
||||
## Error Tracking & Production Hardening
|
||||
|
||||
Sentry captures unhandled exceptions and promise rejections in production, with environment-aware routing (production on `worldmonitor.app`, preview on `*.vercel.app`, disabled on localhost and Tauri desktop).
|
||||
|
||||
The configuration includes 30+ `ignoreErrors` patterns that suppress noise from:
|
||||
|
||||
- **Third-party WebView injections** — Twitter, Facebook, and Instagram in-app browsers inject scripts that reference undefined variables (`CONFIG`, `currentInset`)
|
||||
- **Browser extensions** — Chrome/Firefox extensions that fail `importScripts` or violate CSP policies
|
||||
- **WebGL context loss** — transient GPU crashes in MapLibre/deck.gl that self-recover
|
||||
- **iOS Safari quirks** — IndexedDB connection drops on background tab kills, `NotAllowedError` from autoplay policies
|
||||
- **Network transients** — `TypeError: Failed to fetch`, `TypeError: Load failed`, `TypeError: cancelled`
|
||||
- **MapLibre internal crashes** — null-access in style layers, light, and placement that originate from the map chunk
|
||||
|
||||
A custom `beforeSend` hook provides second-stage filtering: it suppresses single-character error messages (minification artifacts), `Importing a module script failed` errors from browser extensions (identified by `chrome-extension:` or `moz-extension:` in the stack trace), and MapLibre internal null-access crashes when the stack trace originates from map chunk files.
|
||||
|
||||
Transactions are sampled at 10% to balance observability with cost. Release tracking (`worldmonitor@{version}`) enables regression detection across deployments.
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
@@ -973,7 +1046,7 @@ This runs the frontend without the API layer. Panels that require server-side pr
|
||||
| Platform | Status | Notes |
|
||||
|----------|--------|-------|
|
||||
| **Vercel** | Full support | Recommended deployment target |
|
||||
| **Linux x86_64** | Works with `vercel dev` | Full local development |
|
||||
| **Linux x86_64** | Full support | Works with `vercel dev` for local development. Desktop .AppImage available for x86_64 |
|
||||
| **macOS** | Works with `vercel dev` | Full local development |
|
||||
| **Raspberry Pi / ARM** | Partial | `vercel dev` edge runtime emulation may not work on ARM. Use Option 1 (deploy to Vercel) or Option 3 (static frontend) instead |
|
||||
| **Docker** | Planned | See [Roadmap](#roadmap) |
|
||||
@@ -1003,7 +1076,8 @@ Set `WS_RELAY_URL` (server-side, HTTPS) and `VITE_WS_RELAY_URL` (client-side, WS
|
||||
| **Market APIs** | Yahoo Finance (equities, forex, crypto), CoinGecko (stablecoins), mempool.space (BTC hashrate), alternative.me (Fear & Greed) |
|
||||
| **Threat Intel APIs** | abuse.ch (Feodo Tracker, URLhaus), AlienVault OTX, AbuseIPDB, C2IntelFeeds |
|
||||
| **Economic APIs** | FRED (Federal Reserve), EIA (Energy), Finnhub (stock quotes) |
|
||||
| **Deployment** | Vercel Edge Functions (60+ endpoints) + Railway (WebSocket relay) + Tauri (desktop) + PWA (installable) |
|
||||
| **Localization** | i18next (13 languages: en, fr, de, es, it, pl, pt, nl, sv, ru, ar, zh, ja), RTL support, lazy-loaded bundles |
|
||||
| **Deployment** | Vercel Edge Functions (60+ endpoints) + Railway (WebSocket relay) + Tauri (macOS/Windows/Linux) + PWA (installable) |
|
||||
| **Finance Data** | 92 stock exchanges, 19 financial centers, 13 central banks, 10 commodity hubs, 64 Gulf FDI investments |
|
||||
| **Data** | 150+ RSS feeds, ADS-B transponders, AIS maritime data, VIIRS satellite imagery, 8 live YouTube streams |
|
||||
|
||||
@@ -1081,6 +1155,14 @@ Desktop release details, signing hooks, variant outputs, and clean-machine valid
|
||||
- [x] AIS maritime chokepoint detection and vessel density grid
|
||||
- [x] Runtime feature toggles for 14 data sources
|
||||
- [x] Panel height resizing with persistent layout state
|
||||
- [x] Live webcam surveillance grid (19 geopolitical hotspot streams with region filtering)
|
||||
- [x] Ultra-wide monitor layout (L-shaped panel wrapping on 2000px+ screens)
|
||||
- [x] Linux desktop app (.AppImage)
|
||||
- [x] Dark/light theme toggle with persistent preference
|
||||
- [x] Desktop auto-update checker with variant-aware release linking
|
||||
- [x] Panel drag-and-drop reordering with persistent layout
|
||||
- [x] Map pin mode for fixed map positioning
|
||||
- [x] Virtual scrolling for news panels (DOM recycling, pooled elements)
|
||||
- [ ] Mobile-optimized views
|
||||
- [ ] Push notifications for critical alerts
|
||||
- [ ] Self-hosted Docker image
|
||||
|
||||
Reference in New Issue
Block a user