Skip to content

About

Live World War 3 tracker — 6,900+ verified conflict events on one interactive OSINT heatmap, each with a named conflict, severity tier and cited source. Category filters, per-theatre drill-downs, a naval Strait Tracker, and Bluesky auto-posting. Free, edge-native on Cloudflare.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

79 Commits

Folders and files

Repository files navigation

WarHeatMap - live global conflict intelligence platform at warheatmap.app, MIT licence. Live status measured by HTTP request on 2026-08-27.

WarHeatMap

Live Global Conflict Intelligence Platform


Live App OSINT Network License: MIT




Changelog

Full build history, from the first production deploy on 2026-03-05: CHANGELOG.md. It is built from the app's own deploy record. warheatmap.app has never carried a version number. The v6.x numbers belong to StraitTracker, a separate Cloudflare mini app that is now retired, and are listed under its own heading below.

From 2026-09-28 on, every change to the app or this repo gets a dated entry here.

warheatmap.app updates since August 13

  • 2026-10-03 to 2026-10-04 Duplicate events merged at ingest and in a one-time backfill; canonical event pages at /e/<id> with structured data and a visible source line; a sitemap index; the feed shows critical and high severity; every emoji replaced with an SVG icon.
  • 2026-09-28 Talk page (#warheatmap on EFnet, VoxTerrae download); Ukraine tracker and September briefing; intelligent event clustering; Gaza card fixes; news analysis moved server-side.
  • 2026-09-07 Share-card images rendered inside the app with a local pure-JS stack.
  • 2026-08-27 to 2026-08-31 Server-rendered event pages, canonical classification, richer social previews, streaming event load and feed virtualisation. Push notifications launched 08-29 and switched off 08-30.
  • 2026-08-15 to 2026-08-23 Pagination, real-time filtering overhaul, redesigned interface, share pipeline rebuilt with short links and dynamic cards.

Repository updates since August 13

  • 2026-10-04: How It Is Built rewritten from a read of the live edge services: the app on Base44, and the Cloudflare edge layer, sources registry, MCP data service, OSINT desk pipeline, Lightning tips and watchdog around it.
  • 2026-10-04: README reconciled to the live app. Stack, features, architecture, repo structure and data sources rewritten from the live site, the repository tree and the sources registry; the Cloudflare-era stack description, a dead Bluesky link and file paths that no longer exist were removed.
  • 2026-10-04: Coverage re-measured, and the live map follows deduplication. Coverage now counts all 6,103 verified live events rather than a 260-page sample. The live card, 7-day map and mini map skip merged and unverified events and link to the canonical event pages.
  • 2026-09-28: Live Right Now. A status card and a world map of the last 7 days, rebuilt about every 30 minutes from the public warheatmap.app feed, plus an interactive mini map on GitHub Pages (live/, .github/workflows/live.yml).
  • 2026-09-20: Coverage, Measured. Event count re-measured from the live sitemap (6,983 indexed event pages), with a coverage chart, event-type and severity shares, and a sourcing breakdown. Replaced the stale "4,000+".
  • 2026-08-27 to 2026-09-20: README cleanup. Emoji and twenty third-party badges removed, a self-hosted header added, one donation path, the secret inventory and retired StraitTracker promises removed, the Discord line removed.

StraitTracker repo syncs, not previously logged

  • 2026-06-14: strait-news-worker v3.2 synced from the live source (sanitized).
  • 2026-06-05: mobile Strait Tracker worker added (bottom-sheet UI, touch map, live feed).

August 13, 2026: deep-link grammar v2 (warheatmap.app)

  • Dynamic deep-link grammar v2 — every shareable/OG card can now steer the app precisely: ?country=X focuses the map, ?feed-country=X focuses and loads that country's feed, ?tag=<category> filters the feed to a category, ?events=critical jumps to critical-only, and ?criticalevents-country=X combines both. Powers click-backs from the OSINT auto-post threads.
  • OSINT auto-posting desks — WarDesk (daily conflict brief), SpyDesk (surveillance), and WarChest (markets-at-war) compose OG-card threads to Bluesky and deep-link back into the exact map view for each story.
  • Category tag bar — filter the live map/feed by event type (AIRSTRIKE, GROUND, NAVAL, MISSILE, EXPLOSION, TERRORISM, CYBER, NUCLEAR, DIPLOMACY, SANCTIONS, INFRA, and more) plus STATS and FEED tabs.
  • Scale — now plotting 4,000+ verified events across every active theatre.

July 18, 2026: SEO and crawlability (warheatmap.app)

  • AI/SEO crawlability: served-side answer block, FAQ + JSON-LD schema (WebSite, Organization, FAQPage) injected at the origin so AI crawlers and search engines can ground on real content instead of an empty SPA shell.
  • Bot-prerender pattern: crawlers receive fully-rendered, structured HTML while human visitors keep the live SPA experience.
  • Search Console loop: automated weekly performance reporting to track ranking lift after SEO deploys.

StraitTracker (retired Cloudflare mini app, archived)

Not part of warheatmap.app. Kept for the record; the v6.x numbers are its own.

StraitTracker v6.1 — May 9, 2026

  • CORS fix — removed User-Agent from browser fetch; added Access-Control-Allow-Headers: * to strait-news-worker
  • Fixed updateWarDay / forceRefresh / refreshPrices — functions were called at boot but never defined (caused full UI freeze)
  • Daily price cache — Brent/WTI/BTC now ingested once per day via localStorage TTL (24h), not on every page visit
  • applyPrices() — unified price rendering function, eliminates duplicate DOM updates
  • autoRefresh() — 5-min background refresh respects daily price cache
  • NOW button — forceRefresh() clears price cache, re-fetches all live data, flashes UI confirmation

StraitTracker v6.0 — May 7, 2026

  • Full SVG map rebuild — no external Leaflet dependency (WARP-safe)
  • Live intel brief panel — auto-populates from strait-news-worker
  • IRGCN asset positions + US Navy carrier group overlays
  • Mine field / exclusion zone layers
  • War Day counter (since Feb 27, 2026)
  • Threat level badge — pulls from intel API status object

strait-news-worker v3.1 — May 9, 2026

  • CORS fix — Access-Control-Allow-Headers: * added to all responses + preflight
  • /oil-live endpoint confirmed operational

Live Right Now

WarHeatMap live status, rebuilt about every 30 minutes from the public warheatmap.app feed: events in the last 24 hours and 7 days, countries covered, severity mix, and the five newest events with their sources.

The last 7 days of WarHeatMap events plotted on a world map and coloured by severity: critical, high, medium, low.

These two images rebuild themselves about every 30 minutes from the public WarHeatMap feed. Click either one for the mini map: filter by severity and event type, open any event and its source. It reads the feed live in your browser, with no login and no tracking.

Built by live/build_live.py and .github/workflows/live.yml. No secret is involved: the feed is public, and the pages are deployed as a Pages artifact, so the refreshes add nothing to this repo's history.


What Is WarHeatMap?

WarHeatMap is a free, public live conflict intelligence platform. It gathers conflict events from vetted outlets, plots them on an interactive world map with a page for every event, and posts live intelligence to Bluesky. The app runs on Base44, with Cloudflare in front of it.

Built for researchers, journalists, activists, and anyone tracking global instability in real time — without paywalls, login walls, or corporate bias.


Coverage, Measured

Every figure in this section was measured from the live site on 2026-10-04 at 13:55 ET, and these are totals, not a sample. Every one of the 6,103 verified, live events in the public event feed was read and counted. Events the site has merged as duplicates, and events it has not verified, are excluded.

WarHeatMap coverage measured 2026-10-04: all 6,103 verified live events, 18 event types, 192 named conflicts, 169 countries. Largest event types: airstrike 18.3%, ground battle 15.3%, diplomacy 13.9%, protest 7.9%, other 7.5%, missile 7.4%. Severity: HIGH 49.8%, MEDIUM 32.5%, CRITICAL 14.2%, LOW 3.6%.

6,103   verified, live events, each with its own server-rendered page   (event feed, 2026-10-04 13:55 ET)
6,099   of them listed in the sitemap at the same reading
    8   static pages
   18   distinct event types
  192   named conflicts
  169   countries
  574   events that absorbed at least one merged duplicate report

The live card above is rebuilt about every 30 minutes; the figures here are a dated reading of a number that moves.

Event types

Event type Events Share Event type Events Share
Airstrike 1,115 18.3% Terrorism 170 2.8%
Ground battle 931 15.3% Sanctions 133 2.2%
Diplomacy 849 13.9% Explosion 130 2.1%
Protest 484 7.9% Border crossing 94 1.5%
Other 455 7.5% Assassination 81 1.3%
Missile 452 7.4% Migration 68 1.1%
Naval 437 7.2% Cyber 35 0.6%
Infrastructure 318 5.2% Nuclear 26 0.4%
Humanitarian 318 5.2% Coup 7 0.1%

Severity distribution

Severity Events Share
CRITICAL 865 14.2%
HIGH 3,037 49.8%
MEDIUM 1,983 32.5%
LOW 218 3.6%

Sourcing is the differentiator

Every verified event names its source. The most cited are Al Jazeera (259 events), Anadolu Agency (237), The Guardian (230), Sudan Tribune (169), The Hindu (149), Reuters (136) and Associated Press (131). No single outlet exceeds 4.2% of events. That distribution is what separates an event record from an aggregator reprinting one wire. Across all events, 1,677 distinct source names are recorded; spelling variants and combined credits count separately there, so the number of distinct outlets is lower.

1,711 events carry a casualty count and 1,217 carry a displacement figure, because an event without a number attached is just a claim.

Coverage runs continuously from late February 2026 to the present day.


Features

Feature Description
Live conflict map MapLibre GL map on desktop and a Leaflet map on mobile, with a severity heat layer and event clustering
Severity tiers Every event is rated critical, high, medium or low. The feed shows critical and high; a ?severity= deep link shows the rest
One page per event Every event has its own server-rendered page at warheatmap.app/e/<id>, with its cited sources
Duplicate merging Reports of the same event from several outlets are merged into one event that keeps every citation
Intel feed Home and per-country feeds built only from vetted outlets in a published sources registry
Naval layer Naval incidents plotted on their own map layer
Ukraine tracker Frontline event feed with casualty and displacement figures and ISW-informed daily summaries
Category filters Filter the map and feed by event type: airstrike, naval, missile, cyber, nuclear, diplomacy, sanctions and more
Bluesky WarHeatMap posts events with their source as @warheatmap.bsky.social; the OSINT desks post research threads as @indica.osintnet.uk
Talk The WarHeatMap community meets in #warheatmap on EFnet

Conflicts Tracked

The most-tracked named conflicts, by verified live events (measured 2026-10-04 13:55 ET, the same reading as Coverage, Measured above):

Conflict Events
Russia-Ukraine War 1,628
US-Iran Conflict, including the Strait of Hormuz 1,116
Sudanese Civil War 620
Israel-Hamas War 502
Israel-Hezbollah Conflict 329
Myanmar Civil War 255
M23 Rebellion 175
Red Sea Crisis 174
Haiti Gang Conflict 166

Plus 183 more named conflicts.


How It Is Built

WarHeatMap has two layers: the app on Base44, and a set of edge services on Cloudflare around it.

The app (Base44). warheatmap.app was built on Base44 and is hosted there, and has been since 2026-03-05. The map, the event database, the public Event API, the AI analysis of incoming news, duplicate merging and the share images for each event all run on Base44. The app's source is platform-managed and is not in this repository.

The edge (Cloudflare). These services are related to the app and run alongside it:

Service What it does
Edge layer Sits in front of warheatmap.app and passes visitors through to the app unchanged. For crawlers it answers event pages with real HTTP status (200 for a live event, 301 for a merged duplicate, 404 for an unknown id), serves the server-rendered article and the home page answer block, and sends www to the apex. If it fails, requests fall through to the app.
Sources registry and news research Holds the public, fail-closed allowlist of outlets and gathers headlines region by region. The app ingests only headlines that pass it.
Agent data service (MCP) A Model Context Protocol server over the app's Event and Source data, so our AI agents can read the event corpus, conflict and source stats and run SEO audits. Tool discovery is open; reading and curating events requires owner authorization.
OSINT desk pipeline Research desks compose threads, a fact-check gate checks every thread's claims before publication, a scheduler publishes them, and a posting engine adds images and posts to Bluesky as @indica.osintnet.uk. The desks' post cards are rendered here too.
Lightning tips The Lightning address behind Support the Mission, resolving to our own node, so no third party touches the sats.
Watchdog An hourly health check that alerts by Telegram.

StraitTracker, an earlier Cloudflare mini app, is retired and archived here.

Tech Stack

App (Base44):     React · MapLibre GL (desktop) · Leaflet (mobile map and naval layer)
                  Event entities · public Event API · backend functions for ingest, analysis and share images
Event pages:      One per event at /e/<id> · sitemap index by month
Edge (Cloudflare): Workers for the edge layer, sources registry, MCP data service, OSINT desks,
                  Lightning tips and watchdog
                  Workers AI · D1 · KV · R2 where a service keeps state
Social:           AT Protocol → Bluesky
This repo:        GitHub Actions + GitHub Pages for the live card, 7-day map and mini map

Architecture

                    Visitors and crawlers
                             ↓
   Edge layer (Cloudflare)   crawler answers for /e/<id> and home · www → apex · fails open
                             ↓
   warheatmap.app (Base44)   React · MapLibre GL / Leaflet · Event entities
        ↑                    ↓                         ↓
   vetted headlines     /e/<id> pages          public Event API ──→ this repo: live card,
        │               + sitemap index                             7-day map, mini map
   Sources registry and                                             (about every 30 minutes)
   news research (Cloudflare)

   OSINT desks ──→ fact-check gate ──→ scheduler ──→ posting engine ──→ Bluesky   (Cloudflare)

SEO & Crawlability

The map is a client-rendered app, but search engines and AI crawlers get readable HTML from the edge layer. The home page carries an accessible H1, an FAQ, the latest verified events and JSON-LD (WebSite, Organization, FAQPage, ItemList and more). Every event has its own server-rendered page with a canonical URL and its cited source, merged duplicates redirect to the surviving event, unknown ids return a real 404, and the sitemap index lists every page with one child per month.

Repo Structure

/
├── live/                         # Live card, 7-day map and mini map (built by GitHub Actions)
│   ├── build_live.py
│   ├── index.html
│   └── land.json
├── docs/history/                 # The app's full production deploy record, synced daily
├── assets/                       # Header and coverage chart
├── workers/                      # Cloudflare worker copies (see below)
├── .github/workflows/live.yml    # Rebuilds the live pages about every 30 minutes
├── CHANGELOG.md
├── LICENSE                       # MIT
└── README.md

The workers/ folder holds source copies, not the running services. One is an earlier version of the edge layer, no longer in front of the site. The strait-* files are the retired StraitTracker, and the facemap-* and facerec-tracker.js files belong to FaceHeatMap, a separate archived project.


Run It Yourself

The map app runs on Base44, and its source is not in this repository, so it cannot be deployed from here. What you can run is the live build, which reads the public event feed and writes the card, the map and the mini map:

git clone https://github.com/indicaindependent/warheatmap
cd warheatmap
python3 live/build_live.py      # writes _site/ (Python 3, standard library only)

Data Sources

Every headline is checked against a published sources registry before it becomes an event. It is a strict allowlist: approved outlets are kept, banned outlets are dropped, and unknown outlets are dropped too. On 2026-10-04 it listed 164 approved outlets (9 wire agencies and 155 regional) and 94 banned. The most cited include:

  • Wire agencies: Reuters, Associated Press, AFP
  • Regional and international outlets: Al Jazeera, Anadolu Agency, The Guardian, Sudan Tribune, The Hindu, The Kyiv Independent
  • UN and humanitarian agencies: UN News, OCHA, UNHCR, IOM, for displacement events
  • ISW (Institute for the Study of War): Ukraine assessments

Contributing

PRs welcome. If you spot a conflict zone we're missing or a broken data feed — open an issue.


Built by Indica Independent Media · VPDLNY · Staten Island, NYC

The world is on fire. Someone has to map it.

Follow on Bluesky


Support the Mission

This is free, ad-free, independent infrastructure — no VC, no gov funding, no strings. If it served you, a tip keeps it alive and funds the next tool.

Donate via SkyGive Lightning

Sovereign Lightning + on-chain via SkyGive. Your sats fund uptime, not ads.

About

Live World War 3 tracker — 6,900+ verified conflict events on one interactive OSINT heatmap, each with a named conflict, severity tier and cited source. Category filters, per-theatre drill-downs, a naval Strait Tracker, and Bluesky auto-posting. Free, edge-native on Cloudflare.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages