docs/getting-started.mdx
This guide covers everything you need to set up WorldMonitor locally, from prerequisites and installation to understanding the project structure and API dependencies.
| Layer | Technology | Purpose |
|---|---|---|
| Language | TypeScript 5.x | Type safety across 60+ source files |
| Build | Vite | Fast HMR, optimized production builds |
| Map (Desktop) | deck.gl + MapLibre GL | WebGL-accelerated rendering for large datasets |
| Map (Mobile) | D3.js + TopoJSON | SVG fallback for battery efficiency |
| Concurrency | Web Workers | Off-main-thread clustering and correlation |
| AI/ML | ONNX Runtime Web | Browser-based inference for offline summarization |
| Networking | WebSocket + REST | Real-time AIS stream, HTTP for other APIs |
| Storage | IndexedDB | Snapshots, baselines (megabytes of state) |
| Preferences | LocalStorage | User settings, monitors, panel order |
| Deployment | Vercel Edge | Serverless proxies with global distribution |
The map uses a hybrid rendering strategy optimized for each platform:
Desktop (deck.gl + MapLibre GL):
Mobile (D3.js + TopoJSON):
The entire UI is hand-crafted DOM manipulation, no React, Vue, or Angular. This keeps the bundle small (~250KB gzipped) and provides fine-grained control over rendering performance.
Vite injects configuration values at build time, enabling features like automatic version syncing:
| Variable | Source | Purpose |
|---|---|---|
__APP_VERSION__ | package.json version field | Header displays current version |
This ensures the displayed version always matches the published package, no manual synchronization required.
// vite.config.ts
define: {
__APP_VERSION__: JSON.stringify(pkg.version),
}
// App.ts
const header = `World Monitor v${__APP_VERSION__}`;
WorldMonitor has three setup tracks depending on what you're doing.
Runs the Vite dashboard with no required environment variables. Optional API keys (see below) unlock extra layers and feeds.
git clone https://github.com/koala73/worldmonitor.git
cd worldmonitor
npm install
npm run dev # http://localhost:5173
Variant dashboards run from the same checkout: npm run dev:tech, dev:finance, dev:commodity, dev:happy, and dev:energy.
Needed when you touch .proto contracts or regenerate clients. Requires Go 1.21+ (for the buf CLI and sebuf protoc plugins) and Node.js 22+.
make install # buf, sebuf plugins, npm deps, proto deps, Playwright browsers
make generate # regenerate TypeScript clients, servers, and OpenAPI docs
npm run dev
Run make generate before building or pushing whenever you modify .proto files — CI's proto-check.yml fails if generated output drifts from committed files. See Adding Endpoints for the full proto workflow.
The full self-hosted stack (dashboard + Railway-style relay + Redis + seed scripts) requires Node.js 22+, Docker or Podman, and secrets with no safe defaults — RELAY_SHARED_SECRET, REDIS_PASSWORD, and REDIS_TOKEN must be set before docker compose up. See the SELF_HOSTING.md guide in the repository for the complete walkthrough.
The dashboard fetches data from various public APIs and data sources:
| Service | Data | Auth Required |
|---|---|---|
| RSS2JSON | News feed parsing | No |
| Finnhub | Stock quotes (primary) | Yes (free) |
| Yahoo Finance | Stock indices & commodities (backup) | No |
| CoinGecko | Cryptocurrency prices | No |
| USGS | Earthquake data | No |
| NASA EONET | Natural events (storms, fires, volcanoes, floods) | No |
| NWS | Weather alerts | No |
| FRED | Economic indicators (Fed data) | No |
| EIA | Oil analytics (prices, production, inventory) | Yes (free) |
| USASpending.gov | Federal government contracts & awards | No |
| Polymarket | Prediction markets | No |
| ACLED | Armed conflict & protest data | Yes (free) |
| GDELT Geo | News-derived event geolocation + tensions | No |
| GDELT Doc | Topic-based intelligence feeds (cyber, military, nuclear) | No |
| FAA NASSTATUS | Airport delay status | No |
| Cloudflare Radar | Internet outage data | Yes (free) |
| AISStream | Live vessel positions | Yes (relay) |
| OpenSky Network | Military aircraft tracking | Yes (free) |
| Wingbits | Aircraft enrichment (owner, operator) | Yes (free) |
| PizzINT | Pentagon-area activity metrics | No |
Some features require API credentials. Without them, the corresponding layer is hidden:
| Variable | Service | How to Get |
|---|---|---|
FINNHUB_API_KEY | Stock quotes (primary equity gap + symbol search) | Free registration at finnhub.io |
ALPHA_VANTAGE_API_KEY | Equity quote fallback + market seeders | Free key at alphavantage.co |
EIA_API_KEY | Oil analytics | Free registration at eia.gov/opendata |
USDA_FAS_PSD_API_KEY | Food stocks / stocks-to-use (PSD) | Free key via FAS Open Data |
VITE_WS_RELAY_URL | AIS vessel tracking | Deploy AIS relay or use hosted service |
VITE_OPENSKY_RELAY_URL | Military aircraft | Deploy relay with OpenSky credentials |
OPENSKY_CLIENT_ID | OpenSky auth (relay) | Free registration at opensky-network.org |
OPENSKY_CLIENT_SECRET | OpenSky auth (relay) | API key from OpenSky account settings |
CLOUDFLARE_API_TOKEN | Internet outages | Free Cloudflare account with Radar access |
ACLED_ACCESS_TOKEN | Protest data (server-side) | Free registration at acleddata.com |
WINGBITS_API_KEY | Aircraft enrichment | Contact Wingbits for API access |
The dashboard functions fully without these keys. Affected layers simply don't appear. Core functionality (news, markets, earthquakes, weather) requires no configuration.
src/
├── App.ts # Main application orchestrator
├── main.ts # Entry point
├── components/
│ ├── DeckGLMap.ts # WebGL map with deck.gl + MapLibre (desktop)
│ ├── Map.ts # D3.js SVG map (mobile fallback)
│ ├── MapContainer.ts # Map wrapper with platform detection
│ ├── MapPopup.ts # Contextual info popups
│ ├── SearchModal.ts # Universal search (Cmd+K)
│ ├── SignalModal.ts # Signal intelligence display with focal points
│ ├── PizzIntIndicator.ts # Pentagon Pizza Index display
│ ├── VirtualList.ts # Virtual/windowed scrolling
│ ├── InsightsPanel.ts # AI briefings + focal point display
│ ├── EconomicPanel.ts # FRED economic indicators
│ ├── GdeltIntelPanel.ts # Topic-based intelligence (cyber, military, etc.)
│ ├── LiveNewsPanel.ts # YouTube live news streams with channel switching
│ ├── NewsPanel.ts # News feed with clustering
│ ├── MarketPanel.ts # Stock/commodity display
│ ├── MonitorPanel.ts # Custom keyword monitors
│ ├── CIIPanel.ts # Country Instability Index display
│ ├── CascadePanel.ts # Infrastructure cascade analysis
│ ├── StrategicRiskPanel.ts # Strategic risk overview dashboard
│ ├── StrategicPosturePanel.ts # AI strategic posture with theater analysis
│ ├── ServiceStatusPanel.ts # External service health monitoring
│ └── ...
├── config/
│ ├── feeds.ts # 500+ RSS feeds, source tiers, regional sources
│ ├── geo.ts # 30+ hotspots, conflicts, 86 cables, waterways, spaceports, minerals
│ ├── pipelines.ts # 88 oil & gas pipelines
│ ├── ports.ts # 62 strategic ports worldwide
│ ├── bases-expanded.ts # 226 military bases
│ ├── ai-datacenters.ts # 313 AI compute clusters (Epoch AI dataset)
│ ├── airports.ts # 111 airports across 5 regions
│ ├── irradiators.ts # IAEA gamma irradiator sites
│ ├── nuclear-facilities.ts # Global nuclear infrastructure
│ ├── markets.ts # Stock symbols, sectors
│ ├── entities.ts # 66 entity definitions (companies, indices, commodities, countries)
│ └── panels.ts # Panel configs, layer defaults, mobile optimizations
├── services/
│ ├── ais.ts # WebSocket vessel tracking with density analysis
│ ├── military-vessels.ts # Naval vessel identification and tracking
│ ├── military-flights.ts # Aircraft tracking via OpenSky relay
│ ├── military-surge.ts # Surge detection with news correlation
│ ├── cached-theater-posture.ts # Theater posture API client with caching
│ ├── wingbits.ts # Aircraft enrichment (owner, operator, type)
│ ├── pizzint.ts # Pentagon Pizza Index + GDELT tensions
│ ├── protests.ts # ACLED + GDELT integration
│ ├── gdelt-intel.ts # GDELT Doc API topic intelligence
│ ├── gdacs.ts # UN GDACS disaster alerts
│ ├── eonet.ts # NASA EONET natural events + GDACS merge
│ ├── flights.ts # FAA delay parsing
│ ├── outages.ts # Cloudflare Radar integration
│ ├── rss.ts # RSS parsing with circuit breakers
│ ├── markets.ts # Finnhub, Yahoo Finance, CoinGecko
│ ├── earthquakes.ts # USGS integration
│ ├── weather.ts # NWS alerts
│ ├── fred.ts # Federal Reserve data
│ ├── oil-analytics.ts # EIA oil prices, production, inventory
│ ├── usa-spending.ts # USASpending.gov contracts & awards
│ ├── polymarket.ts # Prediction markets (filtered)
│ ├── clustering.ts # Jaccard similarity clustering
│ ├── correlation.ts # Signal detection engine
│ ├── velocity.ts # Velocity & sentiment analysis
│ ├── related-assets.ts # Infrastructure near news events
│ ├── activity-tracker.ts # New item detection & highlighting
│ ├── analysis-worker.ts # Web Worker manager
│ ├── ml-worker.ts # Browser ML inference (ONNX)
│ ├── summarization.ts # AI briefings with fallback chain
│ ├── parallel-analysis.ts # Concurrent headline analysis
│ ├── storage.ts # IndexedDB snapshots & baselines
│ ├── data-freshness.ts # Real-time data staleness tracking
│ ├── signal-aggregator.ts # Central signal collection & grouping
│ ├── focal-point-detector.ts # Intelligence synthesis layer
│ ├── entity-index.ts # Entity lookup maps (by alias, keyword, sector)
│ ├── entity-extraction.ts # News-to-entity matching for market correlation
│ ├── country-instability.ts # CII scoring algorithm
│ ├── geo-convergence.ts # Geographic convergence detection
│ ├── infrastructure-cascade.ts # Dependency graph and cascade analysis
│ └── cross-module-integration.ts # Unified alerts and strategic risk
├── workers/
│ └── analysis.worker.ts # Off-thread clustering & correlation
├── utils/
│ ├── circuit-breaker.ts # Fault tolerance pattern
│ ├── sanitize.ts # XSS prevention (escapeHtml, sanitizeUrl)
│ ├── urlState.ts # Shareable link encoding/decoding
│ └── analysis-constants.ts # Shared thresholds for worker sync
├── styles/
└── types/
api/ # Vercel Edge Functions (two kinds, see Architecture)
├── <domain>/v<N>/[rpc].ts # Generated domain gateways — aviation, market,
│ # conflict, climate, cyber, sanctions, maritime,
│ # resilience, ... (34 proto-backed domains)
├── bootstrap.js # Two-tier Redis hydration for the SPA
├── health/ # Per-key freshness + cascade status
├── mcp.ts / mcp-proxy.ts # Model Context Protocol server endpoints
├── create-checkout.ts # Stripe checkout (hand-written operational)
├── customer-portal.ts # Stripe billing portal (hand-written operational)
├── user-prefs.ts # User preference sync (hand-written operational)
└── notify.ts # Notification dispatch (hand-written operational)
server/ # Server-side handlers (bundled into Edge functions)
├── gateway.ts # createDomainGateway — per-domain Edge bundles
├── worldmonitor/<domain>/ # 34 proto-backed domain handler implementations
└── _shared/ # Redis client, source tiers, shared utilities
The flat api/*.js proxies described in older revisions have been replaced by proto-generated domain gateways. See the Architecture doc for the full request path.
This project uses data from the following sources. Please respect their terms of use.
Data provided by The OpenSky Network. If you use this data in publications, please cite:
Matthias Schafer, 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.
Original dashboard concept inspired by Reggie James (@HipCityReg), with thanks for the vision of a comprehensive situation awareness tool.
Special thanks to Yanal at Wingbits for providing API access for aircraft enrichment data, enabling military aircraft classification and ownership tracking.
Thanks to @fai9al for the inspiration and original PR that led to the Tech Monitor variant.
This project is a proof of concept demonstrating what's possible with publicly available data. While functional, there are important limitations:
Some data sources require paid accounts for full access:
The dashboard works with free tiers but may have gaps in coverage or update frequency.
The Ships layer uses terrestrial AIS receivers via AISStream.io. This creates a geographic bias:
Terrestrial receivers only detect vessels within ~50km of shore. Satellite AIS (commercial) provides true global coverage but is not included in this free implementation.
Some publishers block requests from cloud providers (Vercel, Railway, AWS):
The system degrades gracefully. Blocked sources are skipped while others continue functioning.
World Monitor is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only). Commercial use is permitted under the AGPL when you comply with its copyleft and source-availability terms. Separate commercial licensing is available as an alternative option for private-source or custom contractual terms. See the License page for full details.
Elie Habib
Built for situational awareness and open-source intelligence gathering.