Global Threat Map: a Next.js front end over the Valyu intelligence APIs
Global threat map. Learn wars, conflicts, military bases and history of nations.
At a glance
- What is it?
- unicodeveloper/globalthreatmap is a self-hosted OSINT dashboard that plots events, country conflicts and military bases on a Mapbox map. The interesting part is not the map. It is that almost every fact on screen arrives from Valyu API calls at request time.
- Who is it for?
- Adopt it if you want a working Next.js shell for Valyu-backed situational awareness and you are prepared to pay for Valyu and Mapbox usage per request. Do not adopt it if you need an offline dataset, a citable archive, or anything that will still render when an API key expires.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 75 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What the project actually does, and who it is for
The README describes the project as a real-time global situational awareness platform that plots security events, geopolitical developments and threat indicators on an interactive map, and calls it an OSINT command center. That framing is accurate about the shape of the product and slightly generous about the depth. What you get is a Next.js dashboard with four surfaces: a Mapbox map with clustered event markers, a filterable event feed, a country modal that splits current and historical conflicts into separate tabs, and a research panel that generates dossiers on named entities. The audience is narrow. It suits a developer or analyst who already has Valyu access and wants a visual front end rather than a blank notebook. It suits a small team that wants a shared screen for monitoring. It does not suit anyone who needs an auditable record, because the material shows no database layer, no persistence and no export of the raw event stream. The only exports named in the README are CSV and PowerPoint, and those belong to the dossier feature, not to the map.
The map is the UI; Valyu is the data layer
The architecture is visible in the project structure. There is an app/api directory with separate route handlers for events, entities, reports, countries/conflicts and military-bases. Those routes are the boundary between the browser and the outside world. lib/valyu.ts holds the Valyu client and the API functions, lib/geocoding.ts handles location extraction, and lib/event-classifier.ts assigns categories and threat levels. The map component reads from stores/map-store.ts, a Zustand store that the README says holds viewport, layers and bases. So the data flow is: a route handler calls Valyu, the classifier and geocoder normalise the response, the store holds it, and react-map-gl renders it. Nothing in the supplied material suggests a scheduled ingest job or a cache. Events are fetched through the API route, which means the freshness of the map is the freshness of the upstream call, and an upstream outage is a blank map. That is a deliberate simplification, and it is also the project's main structural risk.
Country conflicts, military bases and where the numbers come from
Clicking a country opens a modal with two tabs: current conflicts in red, historical conflicts in blue. The README states that conflict data is synthesized using the Valyu Answer API with cited sources, and that the selected country fills red and blinks while data loads. The military base layer is different. US bases render as green markers, NATO installations as blue, and the README puts US coverage at 30 or more bases worldwide across Europe, Asia-Pacific, the Middle East, Africa and the Americas. Clicking a base shows its name, type and host country. The base data is described as loading automatically when the map initializes, which suggests a bundled or route-served dataset rather than a live query. That distinction matters: base positions are the one layer that can plausibly work without an API key, while events and conflict analysis cannot. The README does not state where the base list was compiled from or when it was last checked, so treat the marker set as illustrative rather than authoritative.
Running it: keys, env file and the two commands that matter
The prerequisites are Node.js 18 or later, a Mapbox account with an API token, and a Valyu API key. Installation is npm install, then a .env.local file in the project root with NEXT_PUBLIC_MAPBOX_TOKEN, VALYU_API_KEY and NEXT_PUBLIC_APP_MODE set to self-hosted. An optional OPENAI_API_KEY enables what the README calls AI-powered location extraction for better accuracy, which tells you the default geocoding path is weaker without it. Then npm run dev and localhost:3000. The README also ships a Railway deploy button, so the hosted path exists if you would rather not manage the environment yourself. Two things are worth flagging. First, NEXT_PUBLIC_MAPBOX_TOKEN is a public variable, which is how react-map-gl works, but it means the token is exposed in the client bundle and should be restricted by URL in the Mapbox dashboard. Second, the README gives no migration step, no seed command and no test command, so there is nothing to run between install and dev.
The dossier feature is the expensive part
Intel dossiers are the most ambitious feature and the least predictable to operate. You enter an entity, described in the README as nations, militias, PMCs, cartels or political figures, and the app returns roughly a 50 page intelligence report, a CSV export with locations, coordinates, key figures, related organisations, dated events and source URLs, and an 8-slide PowerPoint briefing. That output is generated through Valyu's Deep Research API. The README does not state a token budget, a per-dossier cost, a timeout, or what happens when generation fails halfway. For a self-hoster this is the feature that decides whether the project is cheap or expensive, because a single dossier is a long-running, high-token request while the event feed is a stream of small ones. If you plan to expose the dossier button to more than one person, measure a few runs against your own Valyu account before you let anyone near it. The page count is a claim in the README, not something this review can verify.
Where it breaks, and what it is not
There is no release in the supplied material, no version tag and no changelog, so upgrades mean tracking main. The licence is unknown: no LICENSE file appears in the repository information provided, which is a real blocker for anyone deploying this inside a company. Beyond licensing, the failure modes follow from the architecture. Every substantive view depends on Valyu being reachable and your key being valid, so rate limits and quota exhaustion degrade the product to a dark map with a base layer. The classifier and geocoder sit between raw search results and the screen, and the README gives no accuracy figures for either, so threat levels and marker positions should be read as machine-assigned labels rather than verified facts. The project is also not an archive. There is no mention of a database, so you cannot ask what the map showed last Tuesday. If your requirement is a defensible record of who reported what and when, this is the wrong tool, regardless of how good the map looks.
Compared with GDELT and the raw Valyu SDK
The obvious alternative for event mapping is GDELT, which publishes a coded, timestamped event stream that you can download and store yourself. The difference in approach is fundamental. GDELT gives you a dataset you own, with documented coding rules and historical depth, and you build the map on top. globalthreatmap gives you a rendered map and asks Valyu for the content, so you get a faster start and an AI-synthesised narrative layer, but no local corpus and no reproducibility. The second alternative is skipping the app entirely and calling the Valyu SDK from a notebook or a small script. That is the right move if you only want the dossier output, because the map, the Zustand store and the Mapbox token add nothing to a text report. Pick this project when the visual layer is the point: a wall display, a shared situational view, a demo. Pick GDELT when the data layer is the point.
Maintenance, cost and what to check before you commit
The dependency surface is broad for a project this size. Next.js 16 with the App Router, Mapbox GL JS and react-map-gl, Tailwind CSS v4, zod, Zustand, react-markdown with remark-gfm, and the valyu-js client. Next.js and Tailwind both move quickly, and Tailwind v4 in particular changed configuration conventions, so expect upgrade work when you bump the framework. The last push recorded is 2026-07-02 and there are no releases, which means the practical maintenance model is pulling main and reading the diff. On cost, there are two meters running: Mapbox map loads, which are billed per load and are easy to blow through with auto-pan left on, and Valyu calls, which scale with how often the feed refreshes and how many dossiers you generate. Neither the README nor the repository metadata states a licence, so before any commercial or internal deployment, confirm the licence terms with the maintainer. That single check decides whether the rest of this evaluation is even relevant to you.
Editorial conclusion
Adopt it if you want a working Next.js shell for Valyu-backed situational awareness and you are prepared to pay for Valyu and Mapbox usage per request. Do not adopt it if you need an offline dataset, a citable archive, or anything that will still render when an API key expires. Before deploying, confirm the repository licence, because no LICENSE file is visible in the supplied material, and check the current Valyu pricing and rate limits, since the event feed, country conflict modal and deep research dossiers all bill against the same key.
Community notes