Watchboard
April 28, 2026 · View on GitHub
Watchboard
Multi-Topic Intelligence Dashboard Platform
Track conflicts, science breakthroughs, political histories, and more — with AI-powered hourly updates, interactive maps, and 3D globes.
Features
- 60+ active trackers across conflicts, disasters, political histories, science, and culture
- Config-driven architecture — each tracker is a
tracker.json+ data directory; no code changes needed - AI nightly updates — Claude Code with web search refreshes eligible trackers automatically at 6 AM UTC
- Hourly breaking news scan — 24+ RSS feeds from Reuters, Al Jazeera, France24, SCMP, and more; AI triage classifies events and updates trackers in real time
- Interactive 2D maps — Leaflet with strike arcs, overlay layers (no-fly zones, GPS jamming, earthquakes), live flights, and day/night terminator
- 3D globe visualization — CesiumJS with missile animations, satellite tracking, cinematic event mode, and live ship AIS data
- Full-text search — Pagefind indexes all 190+ pages at build time; zero runtime overhead
- Source tier system — every data point classified Tier 1–4 (official → unverified); contested claims explicitly flagged
- One-command tracker creation — GitHub Actions
init-tracker.ymlgenerates a fully populated tracker in ~25 minutes via Claude Code - Embeddable widgets — each tracker has a
/embed/{slug}/page (~4 KB, theme-aware) for third-party embedding - Public JSON API — static REST API with CORS, no auth required; powers third-party integrations
- MCP server — Model Context Protocol integration for AI agents
- Push notifications — subscribe to specific trackers for breaking news and daily digest browser notifications
Active Trackers
Featured
| Icon | Tracker | Topic | Region | Live |
|---|---|---|---|---|
| ⚔️ | Iran Conflict | 2026 Iran-US/Israel conflict — Operation Epic Fury / Roaring Lion | Middle East | Dashboard |
| 🇺🇦 | Ukraine War | Russia's full-scale invasion — frontlines, casualties, diplomacy | Eastern Europe | Dashboard |
| 🕊️ | Gaza War | Israel-Gaza war — ground ops, humanitarian crisis, ICJ proceedings | Israel/Gaza | Dashboard |
| 🕊️ | Israel-Palestine | The full arc from 1948 founding to present | Middle East | Dashboard |
| 🗽 | September 11 | 2001 attacks, War on Terror, 9/11 Commission | USA | Dashboard |
| 🧬 | CRISPR Gene Therapy | Gene editing breakthroughs — from Cas9 to clinical trials | Global | Dashboard |
| 🌿 | Reforestation | Global tree-planting initiatives, deforestation reversal, carbon sinks | Global | Dashboard |
| ⚡ | Fusion Energy | ITER, NIF breakthrough, commercial fusion startups, net energy gain | Global | Dashboard |
All 95+ trackers
| Icon | Tracker | Topic | Region | Link |
|---|---|---|---|---|
| 🏔️ | Afghanistan-Pakistan War | US invasion, Taliban insurgency, ISIS-K, TTP attacks | Afghanistan/Pakistan | Dashboard |
| 🤖 | AI for Good | Beneficial AI applications in healthcare, climate, accessibility | Global | Dashboard |
| 🌹 | AMLO Presidency | Fourth Transformation, Tren Maya, AIFA, constitutional reforms (2018–2024) | Mexico | Dashboard |
| 🌙 | Artemis II Mission | Crewed lunar flyby, SLS, Orion capsule, journey to the Moon | USA/Global | Dashboard |
| 🕯️ | Ayotzinapa | Forced disappearance of 43 students in Iguala, Guerrero (2014) | Mexico | Dashboard |
| 🐰 | Bad Bunny | SoundCloud to reggaeton star, YHLQMDLG, Un Verano Sin Ti, world tours | Puerto Rico/Global | Dashboard |
| 🔋 | Battery Revolution | Solid-state, sodium-ion, grid storage, EV battery breakthroughs | Global | Dashboard |
| 🎤 | BTS | K-pop global rise, UN speeches, military service, ARMY fandom | South Korea/Global | Dashboard |
| ⚔️ | Felipe Calderón Presidency | War on drugs, military vs cartels, Mérida Initiative (2006–2012) | Mexico | Dashboard |
| 🎗️ | Cancer Breakthroughs | CAR-T, mRNA vaccines for cancer, early detection, immunotherapy | Global | Dashboard |
| ☢️ | Chernobyl Disaster | 1986 nuclear disaster — reactor explosion, liquidators, fallout | Ukraine/USSR | Dashboard |
| 🇨🇱 | Chile: Allende to Pinochet | Socialist government, CIA intervention, 1973 coup, Operation Condor | Chile | Dashboard |
| 🤖 | China Tech Revolution | Made in China 2025, AI race, Huawei, TikTok, DeepSeek, US decoupling | China/Global | Dashboard |
| 🌍 | Climate Solutions | Carbon capture, renewable energy, climate policy, adaptation | Global | Dashboard |
| 🦠 | COVID-19 Pandemic | Wuhan origin, lockdowns, vaccines, variant waves, WHO response | Global | Dashboard |
| 🧬 | CRISPR Gene Therapy | Gene editing from Cas9 to clinical trials, sickle cell cure | Global | Dashboard |
| 🇨🇺 | Cuba Crises | Revolution, Bay of Pigs, Missile Crisis, embargo, 2021 protests | Cuba/Caribbean | Dashboard |
| 🔫 | Culiacanazo | October 2019 Culiacán Crisis and January 2023 Chapo Jr. capture | Sinaloa, Mexico | Dashboard |
| 📱 | Digital Inclusion | Internet access, digital literacy, tech for underserved communities | Global | Dashboard |
| ⛵ | European Conquest of the Americas | Columbus, conquistadors, Aztec/Inca fall, colonization, Columbian Exchange | Americas | Dashboard |
| 🦊 | Vicente Fox Presidency | Mexico's first opposition president, democratic transition (2000–2006) | Mexico | Dashboard |
| ☢️ | Fukushima Daiichi | 2011 nuclear disaster — tsunami, meltdowns, TEPCO, decommission | Japan | Dashboard |
| ⚡ | Fusion Energy | ITER, NIF, commercial fusion, net energy gain pursuit | Global | Dashboard |
| 🕊️ | Gaza War | Ground operations, ceasefire talks, humanitarian crisis, displacement | Israel/Gaza | Dashboard |
| 📉 | Global Recession Risk | Tariff escalation, bond stress, China slowdown, central bank policy | Global | Dashboard |
| 🇭🇹 | Haiti Collapse | Moïse assassination, gang control, transitional council, UN intervention | Haiti/Caribbean | Dashboard |
| 🛂 | ICE History | ICE creation post-9/11, family separations, mass deportation campaign | USA/Mexico | Dashboard |
| 🇮🇳 | India-Pakistan Conflict | Partition, Kashmir dispute, four wars, nuclear tests, Kargil, Mumbai | South Asia | Dashboard |
| ⚔️ | Iran Conflict | 2026 Iran-US/Israel conflict — Operation Epic Fury | Middle East | Dashboard |
| 🕊️ | Israel-Palestine Conflict | 1948 to present — wars, Oslo Accords, intifadas, settlements | Middle East | Dashboard |
| 🎯 | El Mencho / CJNG | February 2026 killing of El Mencho, CJNG territorial control | Mexico | Dashboard |
| 🗺️ | Mexico-US Wars | Texas Revolution, Alamo, Mexican-American War, Treaty of Guadalupe Hidalgo | Mexico/USA | Dashboard |
| 💉 | mRNA Revolution | mRNA vaccines beyond COVID, cancer vaccines, rare diseases | Global | Dashboard |
| ✈️ | MH17 Shootdown | 2014 downing of Malaysia Airlines Flight 17 over eastern Ukraine | Eastern Ukraine | Dashboard |
| 🇲🇽 | Mexican Political History | PRI hegemony, democratic transition, PRI/PAN/PRD/Morena evolution | Mexico | Dashboard |
| 🇲🇲 | Myanmar Civil War | Post-coup civil war following February 2021 military takeover | Myanmar/SE Asia | Dashboard |
| 🛡️ | NATO-US Tensions | Burden-sharing disputes, Article 5 questions, European autonomy | Europe/N. America | Dashboard |
| 🌊 | Ocean Cleanup | Plastic removal, coral restoration, marine conservation | Global | Dashboard |
| 🔴 | October 7th Attack | Hamas-led assault on Israel — kibbutz raids, hostages, IDF response | Israel/Gaza | Dashboard |
| 🕊️ | Peace Processes | Active peace negotiations, ceasefires, conflict resolution | Global | Dashboard |
| 🏛️ | Enrique Peña Nieto Presidency | Structural reforms, Ayotzinapa crisis, Casa Blanca scandal (2012–2018) | Mexico | Dashboard |
| ⚛️ | Quantum Theory | Planck, Einstein, Bohr, Heisenberg, Copenhagen, Bell theorem, quantum computing | Global | Dashboard |
| 🌿 | Reforestation | Tree-planting initiatives, deforestation reversal, carbon sinks | Global | Dashboard |
| 🌍 | Sahel Insurgency | JNIM/ISGS expansion, military coups, Wagner Group, French withdrawal | Sahel/North Africa | Dashboard |
| 🗽 | September 11 Attacks | 2001 al-Qaeda attacks, War on Terror, 9/11 Commission | USA | Dashboard |
| 🔬 | Claudia Sheinbaum Presidency | First female president of Mexico, judicial reform, US-Mexico relations | Mexico | Dashboard |
| 💊 | Sinaloa Cartel Fragmentation | Mayo Zambada capture, Chapitos vs Mayos faction war, fentanyl (2024–) | Mexico/Sinaloa | Dashboard |
| 🦁 | Somalia Conflict | Al-Shabaab insurgency, AMISOM, US drone strikes, state fragility | Somalia/Horn of Africa | Dashboard |
| 🌊 | SE Asia Escalation | South China Sea militarization, AUKUS, Philippines-China clashes | SE Asia/Pacific | Dashboard |
| 🚀 | SpaceX History | Falcon 1, Falcon 9 reusability, Dragon, Starlink, Starship, Mars | USA/Global | Dashboard |
| 🦎 | Species Recovery | Endangered species comebacks, rewilding, conservation successes | Global | Dashboard |
| ⚔️ | Sudan Civil War | SAF vs RSF, Khartoum battle, Darfur ethnic violence, displacement | Sudan/East Africa | Dashboard |
| 🗺️ | Taiwan Strait Tensions | PLA exercises, TSMC, US arms sales, Taiwan Strait incidents | Taiwan/East Asia | Dashboard |
| 🕯️ | Tlatelolco Massacre | October 2, 1968 massacre at Plaza de las Tres Culturas, Mexico City | Mexico City | Dashboard |
| 🦅 | Trump Presidencies | 45th and 47th president — immigration, trade wars, Jan 6, tariffs | USA/Global | Dashboard |
| 🇺🇦 | Ukraine War | Russia's full-scale invasion — frontlines, casualties, diplomacy | Eastern Europe | Dashboard |
| 🌎 | US Interventions in Latin America | CIA coups, Operation Condor, Panama, Guatemala 1954, Nicaragua Contras | Latin America | Dashboard |
| ⚽ | FIFA World Cup 2026 | First 48-team tournament, tri-host USA/Mexico/Canada, venues, schedule | USA/Mexico/Canada | Dashboard |
| 🪖 | World War I | The Great War 1914–1918 — Somme, Verdun, Gallipoli, Versailles | Europe/Global | Dashboard |
| ⚔️ | World War II | WWII 1939–1945 — Holocaust, Stalingrad, Normandy, atomic bombs | Europe/Pacific | Dashboard |
Distribution & Integrations
Watchboard data is available through multiple channels beyond the web dashboard:
Public JSON API
Free, no authentication required. Static JSON files served from CDN with full CORS support.
| Endpoint | Description |
|---|---|
/api/v1/trackers.json | All tracker metadata |
/api/v1/trackers/{slug}.json | Full data for a single tracker |
/api/v1/breaking.json | Current breaking news events |
/api/v1/kpis/{slug}.json | Key performance indicators for a tracker |
/api/v1/events/{slug}.json | Event timeline for a tracker |
/api/v1/search-index.json | Full-text search index |
MCP Server
Model Context Protocol server for AI agents (Claude, ChatGPT, Cursor, etc.). Provides 7 tools and 3 resources for querying tracker data programmatically.
git clone https://github.com/ArtemioPadilla/watchboard.git
cd watchboard/mcp
npm install
npm start
Telegram
Automated breaking news channel with real-time updates from the hourly pipeline. Join @watchboard_dev.
Bluesky
Automated social posting — breaking news, daily digests, and analysis threads. Follow @watchboard.bsky.social.
Newsletter
Weekly digest summarizing the most significant events across all active trackers. Subscribe at watchboard.dev/newsletter.
Quick Start
git clone https://github.com/ArtemioPadilla/watchboard.git
cd watchboard
npm install
npm run dev
Open http://localhost:4321/watchboard/.
npm run build # Type-check + build static site to dist/
npm run preview # Preview production build locally
How It Works
Tracker Structure
Each tracker is a self-contained directory under trackers/:
trackers/{slug}/
tracker.json # Config: name, sections, map bounds, AI prompts, categories
data/
meta.json # Title, day count, last updated
kpis.json # Key performance indicators strip
timeline.json # Historical eras + crisis timeline
map-points.json # Geographic points of interest
map-lines.json # Strike arcs, supply routes, frontlines
casualties.json # Casualty table with tier/contested flags
political.json # Political figures grid
... # Other section-specific data files
events/ # Daily partitioned event files (YYYY-MM-DD.json)
At build time, src/lib/tracker-registry.ts auto-discovers all non-draft trackers and src/pages/[tracker]/index.astro generates a page for each one via getStaticPaths().
One-Command Tracker Creation (~25 min)
- Go to Actions > Initialize New Tracker
- Enter:
slug, topic description, start date, geographic region - Claude Code generates
tracker.json+ empty data files, validates schema, builds - Auto-triggers Seed Tracker Data to backfill historical data with deep web research
- Result: a fully populated, deployed tracker
Source Tier System
Every data point carries a source classification:
| Tier | Label | Examples |
|---|---|---|
| 1 | Primary / Official | Government statements, UN, IAEA, official bodies |
| 2 | Major Outlet | Reuters, AP, BBC, CNN, Al Jazeera |
| 3 | Institutional | CSIS, HRW, Oxford Economics, think tanks |
| 4 | Unverified | Social media, unattributed claims |
Contested figures are explicitly flagged with 'yes', 'evolving', 'heavily', or 'partial'.
Tech Stack
| Layer | Technology | Purpose |
|---|---|---|
| Framework | Astro 5 | Static site generation + TypeScript |
| UI | React 19 | Interactive islands (map, timeline, globe) |
| 3D Globe | CesiumJS + Resium | Missile animations, satellites, cinematic mode |
| 2D Map | Leaflet | Strike arcs, overlays, live flights, AIS ships |
| Validation | Zod 3 | Runtime schema validation for all data files |
| Search | Pagefind | Build-time full-text index, zero runtime JS |
| AI | Claude Code (Max OAuth) | Nightly data updates via web search |
| CI/CD | GitHub Actions | Build + deploy + nightly data refresh |
| Hosting | GitHub Pages | Static deployment at watchboard.dev/ |
Daily Intelligence Brief Video
A 30-second vertical (1080×1920) video summarising the top breaking trackers ships every day to Telegram + Bluesky. Built with Remotion — code-driven video, hot-reload editor, programmatic rendering.
make video-prep # Pull latest news + bundle thumbnails for the Studio preview
make video # Open Remotion Studio (timeline editor, like After Effects but code-driven)
make video-render # Render today's MP4 → video/output/
The Studio at http://localhost:3000 exposes every typography, position, color, and animation value as live-editable sliders/colour pickers via the right-hand "Props" panel. Tunable trees:
slideStyle— TrackerSlide elements (image card, headline, KPI block, source row)introStyle— opening logo + subtitle + date animationoutroStyle— watchboard.dev card + stats line + fade-out
Edits in the panel are transient (preview only). To persist, copy the values to DEFAULT_*_STYLE constants in video/src/data/slide-style.ts — both Studio and the production renderer read from there.
Daily brief archive: /videos lists every shipped video with its trackers, headlines, KPIs, and source tiers.
For static layout iteration without the Studio, open tools/video-editor.html — a vanilla-JS mockup of the TrackerSlide layout with the same control panel.
Nightly AI Updates
Data is automatically refreshed at 6 AM UTC via GitHub Actions. Each tracker has a configurable updateIntervalDays — active conflicts update daily; historical cases update every 30–180 days. The workflow resolves which trackers are due, then uses Claude Code with web search to update each one.
| Workflow | Trigger | Purpose |
|---|---|---|
| Nightly Data Update | Daily 6 AM UTC + manual | Updates eligible trackers (interval-gated) via Claude Code web search |
| Initialize New Tracker | Manual dispatch | Generates tracker.json + empty data files from a topic description |
| Seed Tracker Data | Manual (or chained from init) | Deep historical backfill — populates all sections with research data |
| Deploy | Push to main | Builds Astro site and deploys to GitHub Pages |
All data workflows use claude-code-action with a Claude Max subscription OAuth token (CLAUDE_CODE_OAUTH_TOKEN) — no per-token API costs.
Breaking News Pipeline (two-tier)
Two scheduled scans cover breaking news end-to-end:
Light scan (every 15 min, no LLM cost): polls a curated set of high-signal wires (Reuters, BBC, AP top-stories, GDELT) plus public real-time sources (Bluesky firehose for select OSINT/news accounts, Telegram public channels). Scores each candidate against active trackers via deterministic keyword matching (src/lib/keyword-match.ts). Score ≥ 0.85 → posts to Telegram and queues to public/_hourly/pending-candidates.json so the next heavy scan promotes it to AI triage and writes the tracker event. Score 0.5–0.85 → queue only. Score < 0.5 → discards to the audit log. Telegram is the realtime alert channel; only the heavy scan writes tracker JSON.
Heavy scan (every 6 h, Claude Sonnet triage): polls the wider RSS list (24+ sources) plus per-tracker dynamic feeds (src/lib/tracker-feeds.ts — adding a Mexican tracker auto-pulls Animal Político / La Jornada / El Universal / Aristegui; an Indian tracker auto-pulls The Hindu / Indian Express / Times of India; etc.) plus the same realtime sources. Reads pending-candidates.json from light scans and merges. Sonnet classifies each: update / new_tracker_suggestion / discard. Every decision is appended to public/_hourly/triage-log.json.
Audit page (/breaking-news-audit/): public dashboard showing every triage decision in the last 14 days with filters by decision / scan type / score. Use this to spot rejected candidates that should have been accepted and tune thresholds.
| Step | Light scan | Heavy scan |
|---|---|---|
| Poll | curated wires + Bluesky + Telegram | full RSS (24+) + per-tracker dynamic feeds + Bluesky + Telegram + pending-candidates.json |
| Score / triage | keyword-match (deterministic, no LLM) | Claude Sonnet triage |
| Above threshold | Telegram post + queue to pending (≥ 0.85) | tracker update workflow |
| Below threshold | queue 0.5–0.85, discard < 0.5 | discard |
| Audit | append to triage-log.json | append to triage-log.json (+ 14-day prune) |
| Cadence | 15 min | 6 h |
Setup
- Fork this repo
- Go to Settings > Pages — set source to GitHub Actions
- Go to Settings > Secrets > Actions — add
CLAUDE_CODE_OAUTH_TOKEN- Generate via
claude setup-tokenwith a Claude Max subscription
- Generate via
- Push to
main— the site deploys automatically; nightly updates start the next day
Local updates (direct API)
# Update all trackers
ANTHROPIC_API_KEY=sk-ant-... npm run update-data
# Update a specific tracker
TRACKER_SLUG=iran-conflict ANTHROPIC_API_KEY=sk-ant-... npm run update-data
Project Structure
watchboard/
├── trackers/ # One directory per tracker
│ ├── iran-conflict/
│ │ ├── tracker.json # Config: sections, map, AI prompts
│ │ └── data/ # JSON data + events/ partitions
│ └── ... # 60+ more trackers
├── src/
│ ├── pages/
│ │ ├── index.astro # Home: tracker card index
│ │ ├── search.astro # Pagefind full-text search
│ │ ├── rss.xml.ts # Global RSS feed
│ │ ├── embed/[tracker].astro # Embeddable widget pages
│ │ └── [tracker]/ # Dynamic routes per tracker
│ │ ├── index.astro # Dashboard
│ │ ├── globe.astro # 3D globe (if enabled)
│ │ ├── about.astro # About page
│ │ └── rss.xml.ts # Per-tracker RSS feed
│ ├── layouts/BaseLayout.astro # HTML shell, SEO, fonts
│ ├── components/
│ │ ├── static/ # Server-rendered (zero client JS)
│ │ │ ├── Header.astro
│ │ │ ├── Hero.astro
│ │ │ ├── KpiStrip.astro
│ │ │ ├── CasualtyTable.astro
│ │ │ ├── PoliticalGrid.astro
│ │ │ └── ...
│ │ └── islands/ # Client-hydrated React components
│ │ ├── IntelMap.tsx # Leaflet 2D map
│ │ ├── TimelineSection.tsx # Click-to-expand timeline
│ │ ├── MilitaryTabs.tsx # Tabbed military view
│ │ └── CesiumGlobe/ # 3D globe + hooks
│ ├── lib/
│ │ ├── tracker-config.ts # TrackerConfigSchema (Zod) + types
│ │ ├── tracker-registry.ts # Auto-discovers all trackers
│ │ ├── data.ts # loadTrackerData(slug)
│ │ ├── schemas.ts # All data Zod schemas (16 schemas)
│ │ └── ... # Utilities (map, tier, timeline)
│ └── styles/global.css # Dark theme, CSS custom properties
├── scripts/
│ ├── update-data.ts # AI nightly updater (multi-tracker)
│ ├── hourly-scan.ts # RSS polling + candidate extraction
│ ├── hourly-triage.ts # AI classification of news candidates
│ └── hourly-post.ts # Breaking news social posting
├── .github/workflows/
│ ├── deploy.yml # Build + deploy to GitHub Pages
│ ├── update-data.yml # Nightly AI data refresh
│ ├── init-tracker.yml # One-command tracker creation
│ └── seed-tracker.yml # Historical data backfill
└── package.json
Contributing
Contributions are welcome. The most impactful ways to contribute:
- Request a new tracker topic — open an issue with the topic, region, and start date
- Report a data error — incorrect facts, wrong source tier, missing events
- Suggest a feature — new section types, map layers, visualization ideas
- Submit a PR — fix a bug, improve documentation, or add a missing data point
For code contributions, run npm run build to verify the TypeScript compiles and all tracker schemas validate before opening a PR.
Disclaimer
This platform aggregates publicly available information from multiple sources and perspectives. It does not endorse any particular political position or narrative. All contested claims are explicitly marked. Source tier classifications reflect general reliability categories, not endorsements of specific reporting or outlets.
License
MIT — use freely, attribute if you'd like.