docs: update documentation, release packaging, and validation report

This commit is contained in:
Elie Habib
2026-02-16 23:33:06 +04:00
parent c94ec0b4ad
commit c31dfbb70e
3 changed files with 148 additions and 13 deletions

View File

@@ -7,7 +7,7 @@ AI-powered real-time global intelligence dashboard aggregating news, markets, ge
![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=flat&logo=typescript&logoColor=white)
![Vite](https://img.shields.io/badge/Vite-646CFF?style=flat&logo=vite&logoColor=white)
![D3.js](https://img.shields.io/badge/D3.js-F9A03C?style=flat&logo=d3.js&logoColor=white)
![Version](https://img.shields.io/badge/version-2.3.6-blue)
![Version](https://img.shields.io/badge/version-2.1.4-blue)
![World Monitor Dashboard](../new-world-monitor.png)
@@ -29,6 +29,7 @@ A compact **variant switcher** in the header allows seamless navigation between
The primary variant focuses on geopolitical intelligence, military tracking, and infrastructure security monitoring.
### Key Capabilities
- **Conflict Monitoring** - Active war zones, hotspots, and crisis areas with real-time escalation tracking
- **Military Intelligence** - 220+ military bases, flight tracking, naval vessel monitoring, surge detection
- **Infrastructure Security** - Undersea cables, pipelines, datacenters, internet outages
@@ -37,17 +38,19 @@ The primary variant focuses on geopolitical intelligence, military tracking, and
- **AI-Powered Analysis** - Focal point detection, country instability scoring, infrastructure cascade analysis
### Intelligence Panels
| Panel | Purpose |
|-------|---------|
| **AI Insights** | LLM-synthesized world brief with focal point detection |
| **AI Strategic Posture** | Theater-level military force aggregation with strike capability assessment |
| **Country Instability Index** | Real-time stability scores for 22 monitored countries |
| **Country Instability Index** | Real-time stability scores for 20 monitored countries |
| **Strategic Risk Overview** | Composite risk score combining all intelligence modules |
| **Infrastructure Cascade** | Dependency analysis for cables, pipelines, and chokepoints |
| **Live Intelligence** | GDELT-powered topic feeds (Military, Cyber, Nuclear, Sanctions) |
### News Coverage
100+ curated sources across geopolitics, defense, energy, think tanks, and regional news (Middle East, Africa, Latin America, Asia-Pacific).
80+ curated sources across geopolitics, defense, energy, think tanks, and regional news (Middle East, Africa, Latin America, Asia-Pacific).
---
@@ -56,6 +59,7 @@ The primary variant focuses on geopolitical intelligence, military tracking, and
The tech variant ([tech.worldmonitor.app](https://tech.worldmonitor.app)) provides specialized layers for technology sector monitoring.
### Tech Ecosystem Layers
| Layer | Description |
|-------|-------------|
| **Tech HQs** | Headquarters of major tech companies (Big Tech, unicorns, public companies) |
@@ -65,6 +69,7 @@ The tech variant ([tech.worldmonitor.app](https://tech.worldmonitor.app)) provid
| **Tech Events** | Upcoming conferences and tech events with countdown timers |
### Tech Infrastructure Layers
| Layer | Description |
|-------|-------------|
| **AI Datacenters** | 111 major AI compute clusters (≥10,000 GPUs) |
@@ -72,6 +77,7 @@ The tech variant ([tech.worldmonitor.app](https://tech.worldmonitor.app)) provid
| **Internet Outages** | Network disruptions affecting tech operations |
### Tech News Categories
- **Startups & VC** - Funding rounds, acquisitions, startup news
- **Cybersecurity** - Security vulnerabilities, breaches, threat intelligence
- **Cloud & Infrastructure** - AWS, Azure, GCP announcements, outages
@@ -99,6 +105,7 @@ The tech variant ([tech.worldmonitor.app](https://tech.worldmonitor.app)) provid
## Features
### Interactive Global Map
- **Zoom & Pan** - Smooth navigation with mouse/trackpad gestures
- **Regional Focus** - 8 preset views for rapid navigation (Global, Americas, Europe, MENA, Asia, Latin America, Africa, Oceania)
- **Layer System** - Toggle visibility of 20+ data layers organized by category
@@ -111,12 +118,14 @@ The tech variant ([tech.worldmonitor.app](https://tech.worldmonitor.app)) provid
Dense regions with many data points use intelligent clustering to prevent visual clutter:
**How It Works**
- Markers within a pixel radius (adaptive to zoom level) merge into cluster badges
- Cluster badges show the count of grouped items
- Clicking a cluster opens a popup listing all grouped items
- Zooming in reduces cluster radius, eventually showing individual markers
**Grouping Logic**
- **Protests**: Cluster within same country only (riots sorted first, high severity prioritized)
- **Tech HQs**: Cluster within same city (Big Tech sorted before unicorns before public companies)
- **Tech Events**: Cluster within same location (sorted by date, soonest first)
@@ -156,7 +165,7 @@ Layers are organized into logical groups for efficient monitoring:
**Transport**
| Layer | Description |
|-------|-------------|
| **Ships (AIS)** | Live vessel tracking via AIS with chokepoint monitoring and 83 strategic ports* |
| **Ships (AIS)** | Live vessel tracking via AIS with chokepoint monitoring and 61 strategic ports* |
| **Delays** | FAA airport delay status and ground stops |
*\*AIS data via [AISStream.io](https://aisstream.io) uses terrestrial receivers with stronger coverage in European/Atlantic waters. Middle East, Asia, and open ocean coverage is limited. Satellite AIS providers (Spire, Kpler) offer global coverage but require commercial licenses.*
@@ -182,7 +191,7 @@ Beyond raw data feeds, the dashboard provides synthesized intelligence panels:
|-------|---------|
| **AI Strategic Posture** | Theater-level military aggregation with strike capability analysis |
| **Strategic Risk Overview** | Composite risk score combining all intelligence modules |
| **Country Instability Index** | Real-time stability scores for 22 monitored countries |
| **Country Instability Index** | Real-time stability scores for 20 monitored countries |
| **Infrastructure Cascade** | Dependency analysis for cables, pipelines, and chokepoints |
| **Live Intelligence** | GDELT-powered topic feeds (Military, Cyber, Nuclear, Sanctions) |
| **Intel Feed** | Curated defense and security news sources |
@@ -192,6 +201,7 @@ These panels transform raw signals into actionable intelligence by applying scor
### News Aggregation
Multi-source RSS aggregation across categories:
- **World / Geopolitical** - BBC, Reuters, AP, Guardian, NPR, Politico, The Diplomat
- **Middle East / MENA** - Al Jazeera, BBC ME, Guardian ME, Al Arabiya, Times of Israel
- **Africa** - BBC Africa, News24, Google News aggregation (regional & Sahel coverage)
@@ -213,6 +223,7 @@ Multi-source RSS aggregation across categories:
The **📡 SOURCES** button in the header opens a global source management modal, enabling fine-grained control over which news sources appear in the dashboard.
**Capabilities:**
- **Search**: Filter the source list by name to quickly find specific outlets
- **Individual Toggle**: Click any source to enable/disable it
- **Bulk Actions**: "Select All" and "Select None" for quick adjustments
@@ -220,12 +231,14 @@ The **📡 SOURCES** button in the header opens a global source management modal
- **Persistence**: Settings are saved to localStorage and persist across sessions
**Use Cases:**
- **Noise Reduction**: Disable high-volume aggregators (Google News) to focus on primary sources
- **Regional Focus**: Enable only sources relevant to a specific geographic area
- **Source Quality**: Disable sources with poor signal-to-noise ratio
- **Bias Management**: Balance coverage by enabling/disabling sources with known editorial perspectives
**Technical Details:**
- Disabled sources are filtered at fetch time (not display time), reducing bandwidth and API calls
- Affects all news panels simultaneously—disable BBC once, it's gone everywhere
- Panels with all sources disabled show "All sources disabled" message
@@ -256,11 +269,11 @@ Embedded YouTube live streams from major news networks with channel switching:
| **Euronews** | European perspective |
| **DW News** | German international broadcaster |
| **France 24** | French global news |
| **CNBC** | Business & financial markets |
| **Al Arabiya** | Middle East news (Arabic perspective) |
| **Al Jazeera** | Middle East & international news |
**Core Features:**
- **Channel Switcher** - One-click switching between networks
- **Live Indicator** - Blinking dot shows stream status, click to pause/play
- **Mute Toggle** - Audio control (muted by default)
@@ -291,6 +304,7 @@ To conserve resources, the panel implements automatic idle pausing:
This prevents background tabs from consuming bandwidth while preserving user preference for manually-paused streams.
### Market Data
- **Stocks** - Major indices and tech stocks via Finnhub (Yahoo Finance backup)
- **Commodities** - Oil, gold, natural gas, copper, VIX
- **Crypto** - Bitcoin, Ethereum, Solana via CoinGecko
@@ -300,11 +314,14 @@ This prevents background tabs from consuming bandwidth while preserving user pre
- **Government Spending** - USASpending.gov: Recent federal contracts and awards
### Prediction Markets
- Polymarket integration for event probability tracking
- Correlation analysis with news events
### Search (⌘K)
Universal search across all data sources:
- News articles
- Geographic hotspots and conflicts
- Infrastructure (pipelines, cables, datacenters)
@@ -312,6 +329,7 @@ Universal search across all data sources:
- Markets and predictions
### Data Export
- CSV and JSON export of current dashboard state
- Historical playback from snapshots
@@ -331,6 +349,7 @@ The header displays an **Intelligence Findings** badge that consolidates two typ
| **Unified Alerts** | Module-generated alerts | CII spikes, geographic convergence, infrastructure cascades |
**Interaction**: Clicking the badge—or clicking an individual alert—opens a detail modal showing:
- Full alert description and context
- Component breakdown (for composite alerts)
- Affected countries or regions
@@ -379,6 +398,7 @@ The system detects 12 distinct signal types across news, markets, military, and
### How It Works
The correlation engine maintains rolling snapshots of:
- News topic frequency (by keyword extraction)
- Market price changes
- Prediction market probabilities
@@ -567,6 +587,7 @@ The dashboard visually flags sources with known state affiliations or propaganda
**Display Locations**
Propaganda risk badges appear in:
- **Cluster primary source**: Badge next to the main source name
- **Top sources list**: Small badge next to each flagged source
- **Cluster view**: Visible when expanding multi-source clusters
@@ -635,6 +656,7 @@ When a market symbol moves significantly, the system searches news clusters for
4. **Result** - "Market Move Explained" or "Silent Divergence" signal
This enables signals like:
- **Explained**: "AVGO +5.2% — Broadcom mentioned in 3 news clusters (AI chip demand)"
- **Silent**: "AVGO +5.2% — No correlated news after entity search"
@@ -678,6 +700,7 @@ similarity(A, B) = |A ∩ B| / |A B|
```
**Tokenization**:
- Headlines are lowercased and split on word boundaries
- Stop words removed: "the", "a", "an", "in", "on", "at", "to", "for", "of", "and", "or"
- Short tokens (<3 characters) filtered out
@@ -692,6 +715,7 @@ Rather than O(n²) pairwise comparison, the algorithm uses an inverted index:
4. This reduces comparisons from ~10,000 to ~500 for typical news loads
**Clustering Rules**:
- Articles with similarity ≥ 0.5 are grouped into clusters
- Clusters are sorted by source tier, then recency
- The most authoritative source becomes the "primary" headline
@@ -751,6 +775,7 @@ The entity index pre-builds five lookup maps for O(1) access:
- Example: AVGO move also searches for NVDA, INTC, AMD news
**Performance**:
- Index builds once on first access (cached singleton)
- Alias map has ~300 entries for 100+ entities
- Keyword map has ~400 entries
@@ -765,6 +790,7 @@ The system maintains rolling baselines for news volume per topic:
- **Z-score** = (current - mean) / stddev
Deviation levels:
- **Spike**: Z > 2.5 (statistically rare increase)
- **Elevated**: Z > 1.5
- **Normal**: -2 < Z < 1.5
@@ -831,6 +857,7 @@ final_score = (static_baseline × 0.30 + dynamic_score × 0.70) × proximity_boo
**Trend Detection**
The system maintains 48-point history (24 hours at 30-minute intervals) per hotspot:
- **Linear regression** calculates slope of recent scores
- **Rising**: Slope > +0.1 points per interval
- **Falling**: Slope < -0.1 points per interval
@@ -839,6 +866,7 @@ The system maintains 48-point history (24 hours at 30-minute intervals) per hots
**Signal Generation**
Escalation signals (`hotspot_escalation`) are emitted when:
1. Final score exceeds threshold (typically 60)
2. At least 2 hours since last signal for this hotspot (cooldown)
3. Trend is rising or score is critical (>80)
@@ -911,16 +939,16 @@ Pin state persists across sessions via localStorage.
## Country Instability Index (CII)
The dashboard maintains a **real-time instability score** for 22 strategically significant countries. Rather than relying on static risk ratings, the CII dynamically reflects current conditions based on multiple input streams.
The dashboard maintains a **real-time instability score** for 20 strategically significant countries. Rather than relying on static risk ratings, the CII dynamically reflects current conditions based on multiple input streams.
### Monitored Countries (Tier 1)
| Region | Countries |
|--------|-----------|
| **Americas** | United States, Brazil, Venezuela |
| **Americas** | United States, Venezuela |
| **Europe** | Germany, France, United Kingdom, Poland |
| **Eastern Europe** | Russia, Ukraine |
| **Middle East** | Iran, Israel, Saudi Arabia, Turkey, Syria, Yemen, UAE |
| **Middle East** | Iran, Israel, Saudi Arabia, Turkey, Syria, Yemen |
| **Asia-Pacific** | China, Taiwan, North Korea, India, Pakistan, Myanmar |
### Three Component Scores
@@ -999,6 +1027,7 @@ The floor applies *after* the standard calculation—if the computed score excee
### Trend Detection
The CII tracks 24-hour changes to identify trajectory:
- **Rising**: Score increased by ≥5 points (escalating situation)
- **Stable**: Change within ±5 points (steady state)
- **Falling**: Score decreased by ≥5 points (de-escalation)
@@ -1014,15 +1043,18 @@ Beyond the base component scores, several contextual factors can boost a country
| **Focal Point** | 8 | AI focal point detection on country | Multi-source convergence indicator |
**Hotspot Boost Calculation**:
- Hotspot activity (0-100) scaled by 1.5× then capped at 10
- Zero boost for countries with no associated hotspot activity
**News Urgency Boost Tiers**:
- Information ≥70: +5 points
- Information ≥50: +3 points
- Information <50: +0 points
**Focal Point Boost Tiers**:
- Critical urgency: +8 points
- Elevated urgency: +4 points
- Normal urgency: +0 points
@@ -1040,6 +1072,7 @@ On dashboard startup, the CII system enters **Learning Mode**—a 15-minute cali
**Note**: Server-side pre-computation now provides immediate scores to new users—Learning Mode primarily affects client-side dynamic adjustments and alert generation rather than initial score display.
**Why 15 minutes?** Real-world testing showed that CII scores stabilize after approximately 10-20 minutes of data collection. The 15-minute window provides sufficient time for:
- Multiple refresh cycles across all data sources
- Trend detection to establish direction (rising/stable/falling)
- Cross-source correlation to normalize bias
@@ -1074,6 +1107,7 @@ This ensures users understand that early scores are provisional while preventing
### Keyword Attribution
Countries are matched to data via keyword lists:
- **Russia**: `russia`, `moscow`, `kremlin`, `putin`
- **China**: `china`, `beijing`, `xi jinping`, `prc`
- **Taiwan**: `taiwan`, `taipei`
@@ -1118,12 +1152,14 @@ convergence_score = min(100, type_score + count_boost)
### Example Scenarios
**Taiwan Strait Buildup**
- Cell: `25°N, 121°E`
- Events: Military flights (3), Naval vessels (2), Protests (1)
- Score: 75 + 12 = 87 (Critical)
- Signal: "Geographic Convergence (3 types) - military flights, naval vessels, protests"
**Middle East Flashpoint**
- Cell: `32°N, 35°E`
- Events: Military flights (5), Protests (8), Earthquake (1)
- Score: 75 + 25 = 100 (Critical)
@@ -1170,6 +1206,7 @@ When a user selects an infrastructure asset for analysis, a **breadth-first casc
### Redundancy Modeling
The system accounts for alternative routes:
- Cables with high redundancy show reduced impact
- Countries with multiple cable landings show lower vulnerability
- Alternative routes are displayed with capacity percentages
@@ -1235,6 +1272,7 @@ The system parses NGA (National Geospatial-Intelligence Agency) maritime warning
### Repair Ship Tracking
When a cableship is mentioned in warnings, the system extracts:
- **Vessel name**: CS Reliance, Cable Innovator, etc.
- **Status**: "En route" or "On station"
- **Location**: Current working area
@@ -1245,6 +1283,7 @@ This enables monitoring of ongoing repair operations before official carrier ann
### Why This Matters
Undersea cables carry 95% of intercontinental data traffic. A cable cut can:
- Cause regional internet outages
- Disrupt financial transactions
- Impact military communications
@@ -1309,6 +1348,7 @@ Priority: Critical
### Trend Detection
The system tracks the composite score over time:
- First measurement establishes baseline (shows "Stable")
- Subsequent changes of ±5 points trigger trend changes
- This prevents false "escalating" signals on initialization
@@ -1353,6 +1393,7 @@ The indicator also displays geopolitical tension scores from GDELT (Global Datab
| Russia ↔ Ukraine | Active conflict zone |
Each pair shows:
- **Current tension score** (GDELT's normalized metric)
- **7-day trend** (rising, falling, stable)
- **Percentage change** from previous period
@@ -1396,6 +1437,7 @@ Up to 3 assets per type are displayed, sorted by proximity.
### Example Context
A news cluster about "pipeline explosion in Germany" would show:
- **Pipelines**: Nord Stream (23km), Yamal-Europe (156km)
- **Cables**: TAT-14 landing (89km)
- **Bases**: Ramstein (234km)
@@ -1485,6 +1527,7 @@ The system monitors eight critical maritime chokepoints where disruptions could
### Density Analysis
Vessel positions are aggregated into a 2° grid to calculate traffic density. Each cell tracks:
- Current vessel count
- Historical baseline (30-minute rolling window)
- Change percentage from baseline
@@ -1494,6 +1537,7 @@ Density changes of ±30% trigger alerts, indicating potential congestion, divers
### Dark Ship Detection
The system monitors for AIS gaps—vessels that stop transmitting their position. An AIS gap exceeding 60 minutes in monitored regions may indicate:
- Sanctions evasion (ship-to-ship transfers)
- Illegal fishing
- Military activity
@@ -1531,11 +1575,13 @@ Browser → Railway Relay → External APIs
| `/health` | Status check | None |
**Environment Variables** (Railway):
- `AISSTREAM_API_KEY` - AIS data access
- `OPENSKY_CLIENT_ID` - OAuth2 client ID
- `OPENSKY_CLIENT_SECRET` - OAuth2 client secret
**Why Railway?**
- Residential IP ranges (not blocked like cloud providers)
- WebSocket support for persistent connections
- Global edge deployment for low latency
@@ -1563,7 +1609,7 @@ Vessels are identified as military through multiple methods:
| 232-235 | UK | Royal Navy |
| 226-228 | France | Marine Nationale |
**Known Vessel Database**: A curated database of 25+ named vessels enables positive identification when AIS transmits vessel names:
**Known Vessel Database**: A curated database of 50+ named vessels enables positive identification when AIS transmits vessel names:
| Category | Tracked Vessels |
|----------|-----------------|
@@ -1615,22 +1661,26 @@ Vessels within 50km of these bases are flagged, enabling detection of unusual ac
Military aircraft are tracked via the OpenSky Network using ADS-B data. OpenSky blocks unauthenticated requests from cloud provider IPs (Vercel, Railway, AWS), so aircraft tracking requires a relay server with credentials.
**Authentication**:
- Register for a free account at [opensky-network.org](https://opensky-network.org)
- Create an API client in account settings to get `OPENSKY_CLIENT_ID` and `OPENSKY_CLIENT_SECRET`
- The relay uses **OAuth2 client credentials flow** to obtain Bearer tokens
- Tokens are cached (30-minute expiry) and automatically refreshed
**Identification Methods**:
- **Callsign matching**: Known military callsign patterns (RCH, REACH, DUKE, etc.)
- **ICAO hex ranges**: Military aircraft use assigned hex code blocks by country
- **Altitude/speed profiles**: Unusual flight characteristics
**Tracked Metrics**:
- Position history (20-point trails over 5-minute windows)
- Altitude and ground speed
- Heading and track
**Activity Detection**:
- Formations (multiple military aircraft in proximity)
- Unusual patterns (holding, reconnaissance orbits)
- Chokepoint transits
@@ -1674,6 +1724,7 @@ Aircraft are categorized by callsign pattern matching:
**Baseline Calculation**
The system maintains rolling 48-hour activity baselines per theater:
- Minimum 6 data samples required for reliable baseline
- Default baselines when data insufficient: 3 transport, 2 fighter, 1 reconnaissance
- Activity below 50% of baseline indicates stand-down
@@ -1722,6 +1773,7 @@ The system tracks 18 strategically significant geographic areas:
**Detection Logic**
For each sensitive region, the system:
1. Identifies all military aircraft within the region boundary
2. Groups aircraft by operating nation
3. Excludes "home region" operators (e.g., Russian VKS in Baltic excluded from alert)
@@ -1772,17 +1824,21 @@ When an aircraft is detected via OpenSky ADS-B, the system queries Wingbits for:
The enrichment service analyzes owner and operator fields against curated keyword lists:
**Confirmed Military** (owner/operator match):
- Government: "United States Air Force", "Department of Defense", "Royal Air Force"
- International: "NATO", "Ministry of Defence", "Bundeswehr"
**Likely Military** (operator ICAO codes):
- `AIO` (Air Mobility Command), `RRR` (Royal Air Force), `GAF` (German Air Force)
- `RCH` (REACH flights), `CNV` (Convoy flights), `DOD` (Department of Defense)
**Possible Military** (defense contractors):
- Northrop Grumman, Lockheed Martin, General Atomics, Raytheon, Boeing Defense, L3Harris
**Aircraft Type Matching**:
- Transport: C-17, C-130, C-5, KC-135, KC-46
- Reconnaissance: RC-135, U-2, RQ-4, E-3, E-8
- Combat: F-15, F-16, F-22, F-35, B-52, B-2
@@ -1835,6 +1891,7 @@ The Spaceports layer displays global launch facilities for monitoring space-rela
### Why This Matters
Space launches are geopolitically significant:
- **Military implications**: Many launches are dual-use (civilian/military)
- **Technology competition**: Launch cadence indicates space program advancement
- **Supply chain**: Satellite services affect communications, GPS, reconnaissance
@@ -1868,6 +1925,7 @@ The Minerals layer displays strategic mineral extraction sites essential for mod
### Supply Chain Risks
Critical minerals are geopolitically concentrated:
- **Cobalt**: 70% from DRC, significant artisanal mining concerns
- **Rare Earths**: 60% from China, processing nearly monopolized
- **Lithium**: Expanding production but demand outpacing supply
@@ -1896,6 +1954,7 @@ Cyber operations often correlate with geopolitical tensions. When news reports r
### Visual Indicators
APT markers appear as warning triangles (⚠) with distinct styling. Clicking a marker shows:
- **Official designation** and common aliases
- **State sponsor** and intelligence agency
- **Primary targeting sectors**
@@ -1909,6 +1968,7 @@ The Protests layer aggregates civil unrest data from two independent sources, pr
### ACLED (Armed Conflict Location & Event Data)
Academic-grade conflict data with human-verified events:
- **Coverage**: Global, 30-day rolling window
- **Event types**: Protests, riots, strikes, demonstrations
- **Metadata**: Actors involved, fatalities, detailed notes
@@ -1917,6 +1977,7 @@ Academic-grade conflict data with human-verified events:
### GDELT (Global Database of Events, Language, and Tone)
Real-time news-derived event data:
- **Coverage**: Global, 7-day rolling window
- **Event types**: Geocoded protest mentions from news
- **Volume**: Reports per location (signal strength)
@@ -1925,6 +1986,7 @@ Real-time news-derived event data:
### Multi-Source Corroboration
Events from both sources are deduplicated using a 0.5° spatial grid and date matching. When both ACLED and GDELT report events in the same area:
- Confidence is elevated to "high"
- ACLED data takes precedence (higher accuracy)
- Source list shows corroboration
@@ -1978,6 +2040,7 @@ The Flights layer tracks airport delays and ground stops at major US airports us
### Monitored Airports
The 30 largest US airports are tracked:
- Major hubs: JFK, LAX, ORD, ATL, DFW, DEN, SFO
- International gateways with high traffic volume
- Airports frequently affected by weather or congestion
@@ -2000,6 +2063,7 @@ sanitizeUrl(url) // Allows only http/https protocols
```
This applies to:
- News headlines and sources (RSS feeds)
- Search results and highlights
- Monitor keywords (user input)
@@ -2045,6 +2109,7 @@ Normal → Failure #1 → Failure #2 → OPEN (cooldown)
```
**Behavior during cooldown:**
- New requests return cached data (if available)
- UI shows "temporarily unavailable" status
- No API calls are made (prevents hammering)
@@ -2069,6 +2134,7 @@ RSS feeds use per-feed circuit breakers—one failing feed doesn't affect others
### Graceful Degradation
When a service enters cooldown:
1. Cached data continues to display (stale but available)
2. Status panel shows service health
3. Automatic recovery when cooldown expires
@@ -2106,6 +2172,7 @@ The status panel lists all data feeds with their current state:
### Per-Feed Information
Each feed entry shows:
- **Source name** - The data provider
- **Last update** - Time since last successful fetch
- **Next refresh** - Countdown to next scheduled fetch
@@ -2114,6 +2181,7 @@ Each feed entry shows:
### Why This Matters
External APIs are unreliable. The status panel helps you understand:
- **Data freshness** - Is the news feed current or stale?
- **Coverage gaps** - Which sources are currently unavailable?
- **Recovery timeline** - When will failed sources retry?
@@ -2152,6 +2220,7 @@ Each data source has calibrated freshness expectations:
### Visual Indicators
The status panel displays freshness for each source:
- **Colored dot** indicates freshness level
- **Time since update** shows exact staleness
- **Next refresh countdown** shows when data will update
@@ -2159,6 +2228,7 @@ The status panel displays freshness for each source:
### Why This Matters
Understanding data freshness is critical for decision-making:
- A "fresh" earthquake feed means recent events are displayed
- A "stale" news feed means you may be missing breaking stories
- A "critical" AIS stream means vessel positions are unreliable
@@ -2211,11 +2281,13 @@ API calls are expensive. The system only fetches data for **enabled layers**, re
### Layer-Aware Loading
When a layer is toggled OFF:
- No API calls for that data source
- No refresh interval scheduled
- WebSocket connections closed (for AIS)
When a layer is toggled ON:
- Data is fetched immediately
- Refresh interval begins
- Loading indicator shown on toggle button
@@ -2223,6 +2295,7 @@ When a layer is toggled ON:
### Unconfigured Services
Some data sources require API keys (AIS relay, Cloudflare Radar). If credentials are not configured:
- The layer toggle is hidden entirely
- No failed requests pollute the console
- Users see only functional layers
@@ -2246,6 +2319,7 @@ CPU-intensive operations run in a dedicated Web Worker to avoid blocking the mai
| DOM rendering | O(n) | ❌ Main thread |
The worker manager implements:
- **Lazy initialization**: Worker spawns on first use
- **10-second ready timeout**: Rejects if worker fails to initialize
- **30-second request timeout**: Prevents hanging on stuck operations
@@ -2256,11 +2330,13 @@ The worker manager implements:
Large lists (100+ news items) use virtualized rendering:
**Fixed-Height Mode** (VirtualList):
- Only renders items visible in viewport + 3-item overscan buffer
- Element pooling—reuses DOM nodes rather than creating new ones
- Invisible spacers maintain scroll position without rendering all items
**Variable-Height Mode** (WindowedList):
- Chunk-based rendering (10 items per chunk)
- Renders chunks on-scroll with 1-chunk buffer
- CSS containment for performance isolation
@@ -2270,6 +2346,7 @@ This reduces DOM node count from thousands to ~30, dramatically improving scroll
### Request Deduplication
Identical requests within a short window are deduplicated:
- Market quotes batch multiple symbols into single API call
- Concurrent layer toggles don't spawn duplicate fetches
- `Promise.allSettled` ensures one failing request doesn't block others
@@ -2277,6 +2354,7 @@ Identical requests within a short window are deduplicated:
### Efficient Data Updates
When refreshing data:
- **Incremental updates**: Only changed items trigger re-renders
- **Stale-while-revalidate**: Old data displays while fetch completes
- **Delta compression**: Baselines store 7-day/30-day deltas, not raw history
@@ -2290,6 +2368,7 @@ The Prediction Markets panel focuses on **geopolitically relevant** markets, fil
### Inclusion Keywords
Markets matching these topics are displayed:
- **Conflicts**: war, military, invasion, ceasefire, NATO, nuclear
- **Countries**: Russia, Ukraine, China, Taiwan, Iran, Israel, Gaza
- **Leaders**: Putin, Zelensky, Trump, Biden, Xi Jinping, Netanyahu
@@ -2299,6 +2378,7 @@ Markets matching these topics are displayed:
### Exclusion Keywords
Markets matching these are filtered out:
- **Sports**: NBA, NFL, FIFA, World Cup, championships, playoffs
- **Entertainment**: Oscars, movies, celebrities, TikTok, streaming
@@ -2392,6 +2472,7 @@ The mobile experience focuses on the most essential intelligence layers:
| **Weather** | Severe weather warnings |
Layers disabled by default on mobile (but available on desktop):
- Military bases, nuclear facilities, spaceports, minerals
- Undersea cables, pipelines, datacenters
- AIS vessels, military flights
@@ -2548,6 +2629,7 @@ User requests summary
### Lazy Loading
Models are loaded on-demand to minimize initial page load:
- Models download only when first needed
- Progress indicator shows download status
- Once cached, models load instantly from IndexedDB
@@ -2555,6 +2637,7 @@ Models are loaded on-demand to minimize initial page load:
### Worker Isolation
All ML inference runs in a dedicated Web Worker:
- Main thread remains responsive during inference
- 30-second timeout prevents hanging
- Automatic cleanup on errors
@@ -2654,15 +2737,18 @@ FOCAL POINTS (entities across news + signals):
Not all news is equally important. Headlines are scored to identify the most significant stories for the briefing:
**Score Boosters** (high weight):
- Military keywords: war, invasion, airstrike, missile, deployment, mobilization
- Violence indicators: killed, casualties, clashes, massacre, crackdown
- Civil unrest: protest, uprising, coup, riot, martial law
**Geopolitical Multipliers**:
- Flashpoint regions: Iran, Russia, China, Taiwan, Ukraine, North Korea, Gaza
- Critical actors: NATO, Pentagon, Kremlin, Hezbollah, Hamas, Wagner
**Score Reducers** (demoted):
- Business context: CEO, earnings, stock, revenue, startup, data center
- Entertainment: celebrity, movie, streaming
@@ -2697,6 +2783,7 @@ The Focal Point Detector is the intelligence synthesis layer that correlates new
### The Problem It Solves
Without synthesis, intelligence streams operate in silos:
- News feeds show 80+ sources with thousands of headlines
- Map layers display military flights, protests, outages independently
- No automated way to see that IRAN appears in news AND has military activity AND an internet outage
@@ -2755,6 +2842,7 @@ Focal points display icons indicating which signal types are active:
### Example Output
A focal point for IRAN might show:
- **Display**: "Iran [CRITICAL] ✈️📢🌐"
- **News**: 12 mentions, velocity 0.5/hour
- **Signals**: 5 military flights, 3 protests, 1 outage
@@ -2764,6 +2852,7 @@ A focal point for IRAN might show:
### Integration with CII
Focal point urgency levels feed into the Country Instability Index:
- **Critical** focal point → CII score boost for that country
- Ensures countries with multi-source convergence are properly flagged
- Prevents "silent" instability when news alone wouldn't trigger alerts
@@ -2810,6 +2899,7 @@ Near-real-time natural event detection from satellite observation:
### Multi-Source Deduplication
When both GDACS and EONET report the same event:
1. Events within 100km and 48 hours are considered duplicates
2. GDACS severity takes precedence (human-verified)
3. EONET geometry provides more precise coordinates
@@ -2818,6 +2908,7 @@ When both GDACS and EONET report the same event:
### Filtering Logic
To prevent map clutter, natural events are filtered:
- **Wildfires**: Only events < 48 hours old (older fires are either contained or well-known)
- **Earthquakes**: M4.5+ globally, lower threshold for populated areas
- **Storms**: Only named storms or those with warnings
@@ -2929,6 +3020,7 @@ Nine geographic theaters are monitored continuously, each with custom thresholds
Beyond raw counts, the system assesses whether forces in a theater constitute an **offensive strike package**—the combination of assets required for sustained combat operations.
**Strike-Capable Criteria**:
- Aerial refueling tankers (KC-135, KC-10, A330 MRTT)
- Airborne command and control (E-3 AWACS, E-7 Wedgetail)
- Combat aircraft (fighters, strike aircraft)
@@ -3084,6 +3176,7 @@ The Service Status panel tracks the operational health of external services that
### Why This Matters
External service outages can affect:
- AI summarization (Groq, OpenRouter outages)
- Deployment pipelines (Vercel, GitHub outages)
- API availability (Cloudflare, AWS outages)
@@ -3155,12 +3248,14 @@ Historical filtering is client-side—all data is fetched but filtered for displ
The map uses a hybrid rendering strategy optimized for each platform:
**Desktop (deck.gl + MapLibre GL)**:
- WebGL-accelerated layers handle thousands of markers smoothly
- MapLibre GL provides base map tiles (OpenStreetMap)
- GeoJSON, Scatterplot, Path, and Icon layers for different data types
- GPU-based clustering and picking for responsive interaction
**Mobile (D3.js + TopoJSON)**:
- SVG rendering for battery efficiency
- Reduced marker count and simplified layers
- Touch-optimized interaction with larger hit targets
@@ -3295,7 +3390,7 @@ src/
│ ├── feeds.ts # 70+ RSS feeds, source tiers, regional sources
│ ├── geo.ts # 30+ hotspots, conflicts, 55 cables, waterways, spaceports, minerals
│ ├── pipelines.ts # 88 oil & gas pipelines
│ ├── ports.ts # 83 strategic ports worldwide
│ ├── ports.ts # 61 strategic ports worldwide
│ ├── bases-expanded.ts # 220+ military bases
│ ├── ai-datacenters.ts # 313 AI clusters (filtered to 111)
│ ├── airports.ts # 30 monitored US airports
@@ -3376,12 +3471,14 @@ api/ # Vercel Edge serverless proxies
## Usage
### Keyboard Shortcuts
- `⌘K` / `Ctrl+K` - Open search
- `↑↓` - Navigate search results
- `Enter` - Select result
- `Esc` - Close modals
### Map Controls
- **Scroll** - Zoom in/out
- **Drag** - Pan the map
- **Click markers** - Show detailed popup with full context
@@ -3404,12 +3501,14 @@ Infrastructure markers (nuclear facilities, economic centers, ports) display wit
This design prioritizes geographic awareness over label density—users can quickly scan for markers and then interact for context.
### Panel Management
- **Drag panels** - Reorder layout
- **Settings (⚙)** - Toggle panel visibility
### Shareable Links
The current view state is encoded in the URL, enabling:
- **Bookmarking**: Save specific views for quick access
- **Sharing**: Send colleagues a link to your exact map position and layer configuration
- **Deep linking**: Link directly to a specific region or feature
@@ -3430,9 +3529,11 @@ Values are validated and clamped to prevent invalid states.
## Data Sources
### News Feeds
Aggregates **70+ RSS feeds** from major news outlets, government sources, and specialty publications with source-tier prioritization. Categories include world news, MENA, Africa, Latin America, Asia-Pacific, energy, technology, AI/ML, finance, government releases, defense/intel, think tanks, and international crisis organizations.
### Geospatial Data
- **Hotspots**: 30+ global intelligence hotspots with keyword correlation (including Sahel, Haiti, Horn of Africa)
- **Conflicts**: 10+ active conflict zones with involved parties
- **Military Bases**: 220+ installations from US, NATO, Russia, China, and allies
@@ -3441,9 +3542,10 @@ Aggregates **70+ RSS feeds** from major news outlets, government sources, and sp
- **Nuclear**: 100+ power plants, weapons labs, enrichment facilities
- **AI Infrastructure**: 111 major compute clusters (≥10k GPUs)
- **Strategic Waterways**: 8 critical chokepoints
- **Ports**: 83 strategic ports (container, oil/LNG, naval, chokepoint)
- **Ports**: 61 strategic ports (container, oil/LNG, naval, chokepoint)
### Live APIs
- **USGS**: Earthquake feed (M4.5+ global)
- **NASA EONET**: Natural events (storms, wildfires, volcanoes, floods)
- **NWS**: Severe weather alerts (US)
@@ -3461,30 +3563,36 @@ Aggregates **70+ RSS feeds** from major news outlets, government sources, and sp
This project uses data from the following sources. Please respect their terms of use.
### Aircraft Tracking
Data provided by [The OpenSky Network](https://opensky-network.org). If you use this data in publications, please cite:
> Matthias Schäfer, Martin Strohmeier, Vincent Lenders, Ivan Martinovic and Matthias Wilhelm. "Bringing Up OpenSky: A Large-scale ADS-B Sensor Network for Research". In *Proceedings of the 13th IEEE/ACM International Symposium on Information Processing in Sensor Networks (IPSN)*, pages 83-94, April 2014.
### Conflict & Protest Data
- **ACLED**: Armed Conflict Location & Event Data. Source: [ACLED](https://acleddata.com). Data must be attributed per their [Attribution Policy](https://acleddata.com/attributionpolicy/).
- **GDELT**: Global Database of Events, Language, and Tone. Source: [The GDELT Project](https://www.gdeltproject.org/).
### Financial Data
- **Stock Quotes**: Powered by [Finnhub](https://finnhub.io/) (primary), with [Yahoo Finance](https://finance.yahoo.com/) as backup for indices and commodities
- **Cryptocurrency**: Powered by [CoinGecko API](https://www.coingecko.com/en/api)
- **Economic Indicators**: Data from [FRED](https://fred.stlouisfed.org/), Federal Reserve Bank of St. Louis
### Geophysical Data
- **Earthquakes**: [U.S. Geological Survey](https://earthquake.usgs.gov/), ANSS Comprehensive Catalog
- **Natural Events**: [NASA EONET](https://eonet.gsfc.nasa.gov/) - Earth Observatory Natural Event Tracker (storms, wildfires, volcanoes, floods)
- **Weather Alerts**: [National Weather Service](https://www.weather.gov/) - Open data, free to use
### Infrastructure & Transport
- **Airport Delays**: [FAA Air Traffic Control System Command Center](https://www.fly.faa.gov/)
- **Vessel Tracking**: [AISstream](https://aisstream.io/) real-time AIS data
- **Internet Outages**: [Cloudflare Radar](https://radar.cloudflare.com/) (CC BY-NC 4.0)
### Other Sources
- **Prediction Markets**: [Polymarket](https://polymarket.com/)
## Acknowledgments
@@ -3504,6 +3612,7 @@ This project is a **proof of concept** demonstrating what's possible with public
### Data Completeness
Some data sources require paid accounts for full access:
- **ACLED**: Free tier has API restrictions; Research tier required for programmatic access
- **OpenSky Network**: Rate-limited; commercial tiers offer higher quotas
- **Satellite AIS**: Global coverage requires commercial providers (Spire, Kpler, etc.)
@@ -3513,6 +3622,7 @@ The dashboard works with free tiers but may have gaps in coverage or update freq
### AIS Coverage Bias
The Ships layer uses terrestrial AIS receivers via [AISStream.io](https://aisstream.io). This creates a **geographic bias**:
- **Strong coverage**: European waters, Atlantic, major ports
- **Weak coverage**: Middle East, open ocean, remote regions
@@ -3521,6 +3631,7 @@ Terrestrial receivers only detect vessels within ~50km of shore. Satellite AIS (
### Blocked Data Sources
Some publishers block requests from cloud providers (Vercel, Railway, AWS):
- RSS feeds from certain outlets may fail with 403 errors
- This is a common anti-bot measure, not a bug in the dashboard
- Affected feeds are automatically disabled via circuit breakers
@@ -3570,15 +3681,18 @@ See [ROADMAP.md](ROADMAP.md) for detailed planning. Recent intelligence enhancem
### Planned
**High Priority:**
- **Temporal Anomaly Detection** - Flag activity unusual for time of day/week/year (e.g., "military flights 3x normal for Tuesday")
- **Trade Route Risk Scoring** - Real-time supply chain vulnerability for major shipping routes (Asia→Europe, Middle East→Europe, etc.)
**Medium Priority:**
- **Historical Playback** - Review past dashboard states with timeline scrubbing
- **Election Calendar Integration** - Auto-boost sensitivity 30 days before major elections
- **Choropleth CII Map Layer** - Country-colored overlay showing instability scores
**Future Enhancements:**
- **Alert Webhooks** - Push critical alerts to Slack, Discord, email
- **Custom Country Watchlists** - User-defined Tier-2 country monitoring
- **Additional Data Sources** - World Bank, IMF, OFAC sanctions, UNHCR refugee data, FAO food security
@@ -3676,17 +3790,20 @@ Different data types refresh at different intervals based on volatility and API
The system implements defense-in-depth for external service failures:
**Circuit Breakers**
- Each external service has an independent circuit breaker
- After 3 consecutive failures, the circuit opens for 60 seconds
- Partial failures don't cascade to other services
- Status panel shows exact failure states
**Graceful Degradation**
- Stale cached data displays during outages (with timestamp warning)
- Failed services are automatically retried on next cycle
- Critical data (news, markets) has backup sources
**User Feedback**
- Real-time status indicators in the header
- Specific error messages in the status panel
- No silent failures—every data source state is visible
@@ -3696,16 +3813,19 @@ The system implements defense-in-depth for external service failures:
The project uses Vite for optimal production builds:
**Code Splitting**
- Web Worker code is bundled separately
- Config files (tech-geo.ts, pipelines.ts) are tree-shaken
- Lazy-loaded panels reduce initial bundle size
**Variant Builds**
- `npm run build` - Standard geopolitical dashboard
- `npm run build:tech` - Tech sector variant with different defaults
- Both share the same codebase, configured via environment variables
**Asset Optimization**
- TopoJSON geography data is pre-compressed
- Static config data is inlined at build time
- CSS is minified and autoprefixed
@@ -3713,16 +3833,19 @@ The project uses Vite for optimal production builds:
### Security Considerations
**Client-Side Security**
- All user input is sanitized via `escapeHtml()` before rendering
- URLs are validated via `sanitizeUrl()` before href assignment
- No `innerHTML` with user-controllable content
**API Security**
- Sensitive API keys are stored server-side only
- Proxy functions validate and sanitize parameters
- Geographic coordinates are clamped to valid ranges
**Privacy**
- No user accounts or cloud storage
- All preferences stored in localStorage
- No telemetry beyond basic Vercel analytics (page views only)
@@ -3759,27 +3882,32 @@ Contributions are welcome! Whether you're fixing bugs, adding features, improvin
This project follows specific patterns to maintain consistency:
**TypeScript**
- Strict type checking enabled—avoid `any` where possible
- Use interfaces for data structures, types for unions
- Prefer `const` over `let`, never use `var`
**Architecture**
- Services (`src/services/`) handle data fetching and business logic
- Components (`src/components/`) handle UI rendering
- Config (`src/config/`) contains static data and constants
- Utils (`src/utils/`) contain shared helper functions
**Security**
- Always use `escapeHtml()` when rendering user-controlled or external data
- Use `sanitizeUrl()` for any URLs from external sources
- Validate and clamp parameters in API proxy endpoints
**Performance**
- Expensive computations should run in the Web Worker
- Use virtual scrolling for lists with 50+ items
- Implement circuit breakers for external API calls
**No Comments Policy**
- Code should be self-documenting through clear naming
- Only add comments for non-obvious algorithms or workarounds
- Never commit commented-out code
@@ -3826,26 +3954,31 @@ This project follows specific patterns to maintain consistency:
### Types of Contributions
**🐛 Bug Fixes**
- Found something broken? Fix it and submit a PR
- Include steps to reproduce in the PR description
**✨ New Features**
- New data layers (with public API sources)
- UI/UX improvements
- Performance optimizations
- New signal detection algorithms
**📊 Data Sources**
- Additional RSS feeds for news aggregation
- New geospatial datasets (bases, infrastructure, etc.)
- Alternative APIs for existing data
**📝 Documentation**
- Clarify existing documentation
- Add examples and use cases
- Fix typos and improve readability
**🔒 Security**
- Report vulnerabilities via GitHub Issues (non-critical) or email (critical)
- XSS prevention improvements
- Input validation enhancements

View File

@@ -77,7 +77,6 @@ Bundler targets are pinned in both Tauri configs and enforced by packaging scrip
- macOS: `app,dmg`
- Windows: `nsis,msi`
## Rust dependency modes (online vs restricted network)
From `src-tauri/`, the project supports two packaging paths:

View File

@@ -1,6 +1,7 @@
# Tauri Validation Report
## Scope
Validated desktop build readiness for the World Monitor Tauri app by checking frontend compilation, TypeScript integrity, and Tauri/Rust build execution.
## Preflight checks before desktop validation
@@ -25,6 +26,7 @@ If any of these checks fail, treat downstream desktop build failures as environm
5. `cargo check` (from `src-tauri/`) — failed because the environment blocks downloading crates from `https://index.crates.io` (`403 CONNECT tunnel failed`).
## Assessment
- The web app portion compiles successfully.
- Full Tauri desktop validation in this run is blocked by an **external environment outage/restriction** (registry access denied with HTTP 403).
- No code/runtime defects were observed in project sources during this validation pass.
@@ -42,6 +44,7 @@ Use these labels in future reports so outcomes are actionable:
- Action: provision offline artifacts/mirror config first, enable offline override (`config.local.toml` or CLI `--config`), then rerun.
## Next action to validate desktop end-to-end
Choose one supported path:
- Online path: