Watch 500 news feeds on your own PC with World Monitor

World Monitor pulls more than 500 news feeds onto a 3D globe that runs on your own machine. Clone it, run three commands, and it starts with zero environment variables. Point its AI at a local Ollama model and no API key ever leaves your box. But its own getting started guide still calls the whole thing a proof of concept.

Key Takeaways

  • World Monitor puts 500 plus news feeds on one map you host yourself.
  • It runs with no API keys and can think using local Ollama.
  • Three commands start it: clone, npm install, npm run dev.
  • Its country risk scores are opinion, and the docs openly say so.
  • The project is six months old, so treat it as a proof of concept.

What is World Monitor and what does it aggregate?

World Monitor is a single-page dashboard that merges news, market data, and map layers into one screen. It comes from Elie Habib , co-founder and CEO of the music streaming firm Anghami, and it ships under AGPL-3.0-only. The code lives at koala73/worldmonitor and the hosted build runs at worldmonitor.app .

The project started as a weekend build in January 2026. The goal was to make a day of messy world news readable on one map. The project’s own history page claims millions of users across more than 170 countries, and WIRED covered the build.

The README feature list counts 500 plus curated feeds across 15 categories, drawn from 65 plus outside providers. A freshness monitor watches 35 source groups and flags the ones that go quiet. The data sources catalog lists the providers one by one.

World Monitor dashboard showing a dark world map with conflict zones and alert dots, a layers checklist on the left, and live news, webcam grid, and AI insights panels along the bottom
The default world build: map on top, live news, webcams, and AI briefs underneath
Image: koala73/worldmonitor

Two map engines share the work. The 3D globe uses globe.gl on top of Three.js. The flat WebGL map uses deck.gl with MapLibre GL. Between them they carry 56 map layer types, and phones fall back to a lighter D3 and TopoJSON view to save battery.

Beyond the news, the dashboard runs signal layers. It correlates military, economic, disaster, and escalation events. A finance radar tracks 29 stock exchanges plus commodities and crypto. Separately, a Country Instability Index scores 31 Tier-1 countries. Six site variants come out of the same tree: world, tech, finance, commodity, happy, and energy. All six speak 25 languages with right-to-left support, and a Tauri 2 desktop build wraps the lot.

World Monitor mission workspace picker listing Crisis Desk, Supply-Chain Risk, Energy Security, News Seeker, Stock Geek, Tech and AI Watcher, and Good News Explorer
Mission presets re-aim the same dashboard at a different beat
Image: koala73/worldmonitor

Per the support status section , every site variant and desktop binary comes out of one codebase and one release process, so the web app and the installer never drift apart on version.

The repo itself is busy. It shows 118 contributors and 313 commits in the last 30 days, against 292 open issues and 964 closed ones.

Running World Monitor locally with Ollama and no API keys

Clone the repo, run npm install, then npm run dev. No signup, no key to paste. The README quick start is blunt about it: the app runs with no environment variables set at all.

One small snag: the README points you at http://localhost:3000, while the getting started guide prints http://localhost:5173, the Vite default. Read the port off your own terminal rather than trusting either page. You can pin it with DEV_PORT in .env.local.

The AI layer is where local hosting pays off. World Monitor tries providers in a fixed order, and Ollama sits first in that chain, ahead of Groq and OpenRouter. A browser-side T5 model waits at the end as the last resort. A machine with Ollama installed never has to call a paid endpoint for a news brief.

The exact keys are in .env.example, which runs to over 1,100 lines. For a local model you want these:

VariableWhat it does
OLLAMA_API_URLAddress of your Ollama server
OLLAMA_MODELWhich pulled model to use
OLLAMA_API_KEYBearer token, left blank for a local unauthenticated box
LLM_API_URLAny OpenAI-compatible endpoint, checked first
LLM_API_KEYToken for that endpoint
LLM_MODELModel name for that endpoint

The generic LLM_* trio is the wider door: any OpenAI-compatible server, so vLLM and llama.cpp work as well as Ollama.

A second local path lives in the browser. Transformers.js and ONNX Runtime Web run small models client side, so summarization keeps working even with the server asleep. The architecture docs say the dashboard stays useful with zero API keys. The static layers, the map, and the ML models all work offline.

World Monitor running with the map and news panels filled in while the AI Insights and Threat Timeline panels sit marked unavailable, waiting for data
Panels that depend on a data source degrade on their own instead of breaking the page
Image: koala73/worldmonitor

Some publishers block requests coming from Vercel, Railway, and AWS. Those RSS feeds return 403, and a circuit breaker switches them off. A home connection sits outside those block lists, so a self-hosted instance can pull feeds the public site has to drop.

How to self host World Monitor with local Ollama

Clone the repository

Run git clone https://github.com/koala73/worldmonitor.git && cd worldmonitor to fetch the vanilla TypeScript and Vite codebase.

Install dependencies

Run npm install. This pulls the Vite toolchain, globe.gl and Three.js for the 3D globe, and deck.gl with MapLibre GL for the flat map.

Start the dev server

Run npm run dev and open the URL your terminal prints. The app boots with no environment variables set. Override the port with DEV_PORT in .env.local.

Pick a site variant

Swap the default world build for a focused one with npm run dev:tech, npm run dev:finance, npm run dev:commodity, npm run dev:happy, or npm run dev:energy. All six variants come from the same codebase.

Point the AI at local Ollama

Install Ollama, pull a model, then set OLLAMA_API_URL and OLLAMA_MODEL in .env.local. Leave OLLAMA_API_KEY blank for a local box. News synthesis now runs on your hardware instead of Groq or OpenRouter.

Add optional feed credentials

Check .env.example for the data sources that want keys, such as Finnhub, EIA, ACLED, and OpenSky. Leave the rest blank. The free feeds keep working without them.

Build for production

Run npm run typecheck and then npm run build:full to produce the deployable bundle.

Deploy the instance

Follow the self-hosting guide to ship the build to Vercel, a Docker container, or plain static hosting.

The architecture and what self hosting actually costs

The docs split setup into three tracks, and the gap between them is the real cost story.

TrackWhat you needWho it is for
App-only local devNode and npm, no env varsAnyone who just wants the dashboard
Contributor buildGo 1.21 plus, Node.js 22 plus, make installPeople editing the .proto contracts
Full Docker stackNode.js 22 plus, Docker or Podman, three secretsPeople running the relay and cache themselves

The full Docker stack is a different animal. It adds a Railway-style relay, Redis, and seed scripts, and it refuses to start until you set RELAY_SHARED_SECRET, REDIS_PASSWORD, and REDIS_TOKEN yourself. The docs point to a SELF_HOSTING.md walkthrough in the repo for that path.

The frontend is deliberately plain. It’s vanilla TypeScript with Vite, no React and no Vue, and the docs put the bundle at about 250KB gzipped. Web Workers handle clustering and correlation off the main thread. IndexedDB stores snapshots and baselines, which the docs describe as megabytes of state.

Behind the hosted site sits far more machinery. There are 290 Protocol Buffer definitions across 35 services, 60 plus Vercel Edge Functions, 21 Railway cron jobs seeding Redis, and a three-tier cache. Page load pre-fetches 38 datasets in a single Redis pipeline call. None of that is required for track one. But it explains why the public site feels instant and a bare clone doesn’t.

The honest self-hosting cost is mostly client side. A WebGL globe plus constant feed polling leans on your GPU and browser far more than on any VPS. I haven’t measured browser memory or CPU on a long-running instance, so treat those numbers as untested here.

Flat WebGL world map in World Monitor with countries shaded red and amber for conflict and alert levels, beside a searchable layer list of military bases, nuclear sites, undersea cables, and pipelines
The deck.gl and MapLibre flat map, the lighter of the two render paths
Image: koala73/worldmonitor

MCP server and CLI access for AI agents

World Monitor’s programmatic access section lists an MCP server, a REST API, a CLI, and SDKs in three languages. The browser is treated as one client among several, and agents and scripts are first-class users rather than an afterthought bolted on later.

The MCP server answers at https://worldmonitor.app/mcp over Streamable HTTP. Listing tools is public, while calling one needs an X-WorldMonitor-Key header or an OAuth 2.1 flow.

The CLI is the cheapest way to look around. The worldmonitor npm package responds to npx worldmonitor tools, which prints every MCP tool with no key at all. Install it globally with npm install -g worldmonitor and you also get a wm alias. Real calls such as worldmonitor risk IR --api-key wm_xxx do need a key.

For scripts, the REST base is https://api.worldmonitor.app, described by a published OpenAPI spec . The SDKs are zero-dependency and mirror the CLI: Python via worldmonitor-sdk , Ruby via the worldmonitor gem , and Go via sdk/go . The project also publishes llms.txt and an agent skills catalog of 25 skills.

The agent path is a paid, hosted service. Keys come from worldmonitor.app/pro . The docs give no standalone recipe for running the MCP server beside your own dashboard. The nearest thing is the Tauri desktop build, whose Node.js sidecar mirrors the cloud API handlers locally. Anyone planning an offline agent setup should test that before committing.

World Monitor settings dialog with an API Keys tab badged Pro, theme, font, map tile provider and map theme dropdowns, and the interface flipped to right-to-left Persian
The API Keys tab carries a Pro badge, here shown with the UI switched to Persian
Image: koala73/worldmonitor

World Monitor vs other self-hosted news readers

Most self-hosted feed readers stop at reading. World Monitor tries to be a situation map, and the trade is complexity.

ProjectLicenseLanguageAI briefsMap viewAgent API
World MonitorAGPL-3.0-onlyTypeScriptYes, local or hostedYes, 3D and WebGLYes, MCP plus REST
FreshRSSAGPL-3.0PHPNoNoREST and Fever
MinifluxApache-2.0GoNoNoREST
NewsBlurMITPythonNoNoREST

FreshRSS and Miniflux are the safer picks for plain reading. Miniflux in particular is one Go binary and a Postgres database, and it has years of production use behind it. World Monitor, in contrast, carries a much larger surface to keep running.

Limits and licensing

The license section is short. The code is AGPL-3.0-only, and commercial use is allowed as long as you meet the copyleft and source-availability terms that come with it.

An instance your team reads internally is fine, and so is a fork once you share the source where required. Private-source proprietary use or official branding needs a separate commercial or trademark deal.

The Country Instability Index needs a warning label, and to the project’s credit it wears one. The score is 40 percent baseline risk plus 60 percent live events. The event half then blends four inputs: unrest at 25 percent, conflict at 30 percent, security at 20 percent, and information pressure at 25 percent. Every weight is published on the CII methodology page , which also disowns any outside pedigree for the numbers. They trace back to no academic index, no peer-reviewed paper, and no third-party risk product, and the page tells you to read them as opinionated rather than empirical.

Never quote a CII number as if a standards body issued it. Offline users get one more wrinkle. The published scores come from a server-side endpoint, while the browser-side scorer is documented as a fallback renderer. So a fully disconnected instance still paints the map, though the numbers may drift from the hosted ones.

Feed bias is structural too. Somebody picked those 500 feeds, and an AI layer on top inherits whatever slant the picking carried. Support for 25 languages with native feeds softens that. The docs are similarly frank about coverage gaps. Vessel tracking leans on shore-based receivers that reach only about 50km out, so open ocean and remote regions stay thin.

Then there is age. The repo was created on 2026-01-08, so everything here is six months old. The getting started guide still calls the project a proof of concept that demonstrates what is possible with public data.

So the fair verdict splits. Clone it tonight for the local-first news dashboard, because that part genuinely works with no keys and no account. Watch the agent tooling, since the MCP and SDK layer is unusually complete for a project this young. Don’t build a compliance workflow or a real decision on the instability scores, at least not yet.