mirror of
https://github.com/koala73/worldmonitor.git
synced 2026-04-25 17:14:57 +02:00
docs: update documentation, release packaging, and validation report
This commit is contained in:
@@ -7,7 +7,7 @@ AI-powered real-time global intelligence dashboard aggregating news, markets, ge
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user