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.
- 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.
- 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.
- 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).
- Dynamic deep-link grammar v2 — every shareable/OG card can now steer the app precisely:
?country=Xfocuses the map,?feed-country=Xfocuses and loads that country's feed,?tag=<category>filters the feed to a category,?events=criticaljumps to critical-only, and?criticalevents-country=Xcombines 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.
- 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.
Not part of warheatmap.app. Kept for the record; the v6.x numbers are its own.
- CORS fix — removed
User-Agentfrom browser fetch; addedAccess-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
localStorageTTL (24h), not on every page visit applyPrices()— unified price rendering function, eliminates duplicate DOM updatesautoRefresh()— 5-min background refresh respects daily price cache- NOW button —
forceRefresh()clears price cache, re-fetches all live data, flashes UI confirmation
- 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
- CORS fix —
Access-Control-Allow-Headers: *added to all responses + preflight /oil-liveendpoint confirmed operational
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.
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.
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.
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 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 | Events | Share |
|---|---|---|
| CRITICAL | 865 | 14.2% |
| HIGH | 3,037 | 49.8% |
| MEDIUM | 1,983 | 32.5% |
| LOW | 218 | 3.6% |
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.
| 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 |
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.
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.
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
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)
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.
/
├── 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.
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)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
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.
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.
Sovereign Lightning + on-chain via SkyGive. Your sats fund uptime, not ads.