Profile
Back to NewsBack
GitHub Trending 17 min
Reader Mode
011-sam-110/Provenance: Governments, space agencies, seismologists and UN clusters publish an enormous amount of live data for free, in formats almost nobody can read. Provenance renders 41 of those feeds on one globe: government road cameras, aircra

011-sam-110/Provenance: Governments, space agencies, seismologists and UN clusters publish an enormous amount of live data for free, in formats almost nobody can read. Provenance renders 41 of those feeds on one globe: government road cameras, aircra

4 hours ago

Provenance: a night satellite globe carrying live undersea cables, satellites, earthquakes and country-instability signals

Provenance

A live map of the world's open data, where every dot says who published it and how it knows.

Live at provenance-online.com Licensed AGPL-3.0-only Next.js 15 TypeScript MapLibre GL v5 4,264 unit tests

A 39-second recording of the Provenance console. The question 'quakes in the USA last 24h' is typed in the command palette and becomes three filter chips: layer Earthquakes, place USA, time Last 24 hours. The map flies to the United States and draws the earthquakes. One earthquake in Texas opens with its precision line, 'Exact point', and links that open the same spot in Google Earth, Google Maps, Copernicus Browser, OpenStreetMap and Wikimapia. Then the static cameras are switched on, and one Idaho road camera at Bear Lake opens with its live picture.

Recorded on the live site on 2026-10-08. Nothing in it is staged: the earthquakes, the cameras and the camera picture are what production served.

TL;DR

  • What it is: a free, live globe of public data. It shows about 20,000 official road cameras, 70,698 webcams, aircraft, satellites and 45 signal layers, for example earthquakes, wildfires and undersea cables.
  • Why it is different: every dot names who published it, how the number was made, and what it cannot tell you.
  • Try it: provenance-online.com. The core map needs no key and no login. To run it locally: npm install && npm run dev.
  • When a source fails: the layer shows an empty set or its last good data. It never shows invented data. On 2026-09-14, satellites and 4 signal layers were empty.
  • Licence: AGPL-3.0 for the code. Each data source keeps its own terms.
Production check, 2026-09-14: what the live site returned, and the open issues

_Status: live at provenance-online.com and runs locally with no keys. Coverage is real but partial and depends on public upstreams staying open, so here is what production actually returned on 2026-09-14, against 462f125:_

| Check | Result | |---|---| | all 34 GET /api/signals/ | 34 of 34 answered 200. 30 returned data and 4 were empty: ReliefWeb (needs an approved appname, which is a free registration and not a key), ENTSO-E grid load (needs a free key), NASA FIRMS active fires (its key is set, and it still returned 0 rows) and Ransomware.live victims (keyless, 0 rows) | | GET /api/coverage | 20,011 cameras, 19,827 of them online, the same total on three reads 75 s apart. 16 of 17 feeds answered. NZTA was stale and served its last good 313 cameras | | GET /api/planes | 3,000 aircraft, a proportional spatial sample capped from at least 4,106 seen. Only 1 of the 4 type batches answered on that read, so the upstream figure is a lower bound | | GET /api/satellites | 0 satellites. The route answered celestrak_unavailable on two reads about three minutes apart | | webcam layer | 70,698 webcams in 196 static tiles under public/webcams/, harvested from Windy on 2026-09-05. GET /api/webcams, the live fallback, returned 1,609 | | npx vitest list | 4,264 tests across 403 files collected. This counts the suite and does not run it |

All four empty layers still answered 200 with an empty set, which is the contract: a dormant or failing upstream degrades to an honest blank, never a 5xx and never invented data. The same contract is why satellites read 0 instead of an error page. Two of the blanks are not explained yet: FIRMS has its key and Ransomware.live needs none, so neither one is waiting on configuration.

Why the camera count is one number again. On Vercel, /api/coverage gave a range: four reads 70 s apart on 2026-08-18 returned 12,866, 13,066, 13,266 and 12,866. Every serverless instance kept its own copy of the camera cache, and each request reached whichever instance the router picked. Production now runs as one Node process on AWS Lightsail (deploy/provenance.service), so one read gives one number, and three reads 75 s apart returned the same 20,011. One caveat remains: a feed that fails keeps its last good cameras, so a total can include a stale feed. The NZTA row above is that case.

Open issues, stated plainly. Satellites and aircraft have the live gaps shown in the table, and neither is diagnosed yet. Castle Rock 511, which fanned out to ten US and Canadian 511 systems at the time (New York has since left it for the CARS platform), answered 12,771 cameras on this read. In August it answered about 6,200 to 6,600, and part of that gap was our own code: a uniform 10-second per-feed timeout in lib/sources/registry.ts, applied to an adapter that needed about 18.5 s warm and about 40 s cold. The feed now has its own 60 s budget. Whether 12,771 is everything those systems publish has not been measured. Best-accuracy photo geolocation wants a local GeoCLIP sidecar, without which /locate falls back to a vision-model estimate.

Every figure above will drift, which is why each one is dated and pinned to a commit rather than left floating. CLAUDE.md holds the command to re-measure each one, and docs/API_KEYS.md holds the canonical env-var names.

✨ Features

Governments, space agencies, seismologists and UN clusters publish an enormous amount of live data for free, in formats almost nobody can read. Provenance renders 59 live layers on one globe, and every layer carries the body that published it, how its numbers were arrived at, and what it cannot tell you.

  • Globe to map in one view. A satellite Earth flattens into a street or topographic map as you zoom.
  • Every layer is attributed. Each one states its publisher, its method, a confidence class and a limitation.
  • Truncation is declared. A capped response says how many rows existed and how it chose the rows you see.
  • Official road cameras, no key. The cameras come directly from the agencies that operate them, one dot for each camera.
  • Aircraft and satellites. Live ADS-B positions worldwide. Your browser calculates the satellite orbits.
  • A console for analysts at /app: a widget catalogue, presets, shareable layouts, country dossiers and CSV or GeoJSON export.
  • A landing page that cannot drift. No count is typed into it. Each figure comes from a committed data file.
How each feature works, with the sources and figures
  • One continuous globe-to-map engine - a single MapLibre projection: 'globe' instance shows a satellite Earth and flattens into a satellite, street or topographic map as you zoom. No cross-fade seam, one WebGL context. 3D mode calls map.setTerrain() against AWS terrarium raster-DEM tiles from zoom 6 (TERRAIN_MIN_ZOOM), because terrain crashes MapLibre's depth pass while the map is still a globe.
  • 59 layers, each independently attributed - four core layers (cameras, webcams, aircraft, satellites) plus 55 global-signal layers, each opt-in and drawn as its own hazard pin: earthquakes (USGS, EMSC and eight national seismic agencies, one dot per quake), wildfires (NIFC, GDACS, EFFIS), volcanoes (USGS, JMA, GDACS), severe storms (NASA EONET cyclones, NOAA SPC and NWS) and floods (GDACS, NWS, Copernicus EMS), GDACS disaster alerts, tropical cyclones (NHC and JTWC) with NHC's forecast cones and outlook areas, NOAA tsunami messages, USGS and JMA volcano alert levels, Copernicus emergency-mapping activations, US and Canadian weather warnings (NWS, ECCC), active fires (NASA FIRMS, with Himawari and GOES detections from Geoscience Australia, NOAA HMS and INPE), aurora and space weather (NOAA), magnetometer stations (FMI, USGS), rocket launches, undersea cables, their landing stations and their charted routes (NOAA, EMODnet), GPS jamming (daily and the last hour) and official GNSS jamming warnings, nuclear plants, airports, ports, national internet outages (IODA), cloud-provider outages, armed conflict (UCDP verified events, U.S. Embassy security alerts, UK and Canadian travel advice) and protests (U.S. Embassy demonstration alerts and the same travel advice), the places the world headline stream names, air quality (Open-Meteo plus OpenAQ stations), UK street crime, US city crime (seven police departments' own portals), ransomware claims (Ransomware.live), cyber incidents the victims disclosed (SEC 8-K Item 1.05, Washington AG), top attacking networks (SANS ISC DShield), forced displacement (UNHCR), ReliefWeb emergencies, ENTSO-E grid load, military ADS-B, gliders and FLARM trackers (Open Glider Network) and AIS ships, Ukraine air-raid alerts, the war in Ukraine (DeepState's front line and its recent changes, documented vehicle losses on both sides from WarSpotting and LostArmour, Russian sites near NATO from the reporting that names them, and war news from both sides' outlets and Telegram channels, all scraped on provenance-1), and road works, road incidents and road closures (TfL in London, DriveBC in British Columbia, Transport for NSW, Fintraffic in Finland, and nine state and provincial 511 systems in the US and Canada), and measured road speed in Hong Kong (Transport Department). A 56th source, the composite Country Instability Index, is registered and documented but is deliberately not a map layer: it has no pin of its own and instead feeds the Brief, the Country Instability widget and the country dossier.
  • Every layer says how it knows - each of the 56 carries a provenance card: what a single pin actually is, the method behind it, a confidence class (today 22 official, 16 reported, 11 measured, 4 modelled, 3 derived) and a limitation that is never allowed to be empty. There is no "not documented yet" fallback, because tests/unit/signals-explain.test.ts fails the build when a layer is registered without one.
  • Truncation is declared, not hidden - an endpoint that caps its response says so in a coverage record: how many rows existed upstream, how many are here, and how the survivors were chosen. On 2026-09-14, UK crime returned 1,500 of 11,181 that way, GPS jamming 400 of 475, rocket launches 30 of 363, and aircraft 3,000 of at least 4,106 (a spatial sample, so every region keeps its share).
  • 51 camera feeds, 59 agency networks, 20 countries, 45 of the feeds keyless - the actual agency feeds (TfL, Caltrans, SCDOT, Finland Digitraffic, Castle Rock 511, Oregon TripCheck, DriveBC, NZTA, Iceland, Estonia, Traffic Scotland, CET-SP Sao Paulo, two Serbian operators - MUP border crossings and JP Putevi Srbije toll plazas - BIHAMK in Bosnia and Herzegovina, ACT in Puerto Rico, and Houston TranStar, the first network added by discovery rather than by hand; then, from the source audit of 2026-10-16, the six states on the CARS platform - New York, Minnesota, Iowa, Indiana, Kansas and Colorado - each as a feed of its own, 511 Virginia, Washington State DOT, Michigan's Mi Drive, TxDOT ITS, Tamar Crossings, the cities of Toronto, Calgary and Vancouver, Statens vegvesen in Norway, DGT in Spain, the Metropole de Lyon, Via Lietuva in Lithuania, North Macedonia's state roads, Hong Kong's Transport Department, QLDTraffic's traffic and flood cameras, Live Traffic NSW, Taiwan's Highway Bureau, Bellingen Shire's flood cameras, USGS streamgage cameras, ALERTCalifornia and the Alaska Volcano Observatory). Six more feeds are built and wait for a free key: Tyne and Wear UTMC, the City of Ottawa, Manitoba 511, 511 Newfoundland and Labrador, 511 Yukon and DARS/DRSI in Slovenia (docs/API_KEYS.md section 8); until their key is set they hold no cameras and /api/coverage lists them as dormant. Feeds and networks are not the same count here, because Castle Rock alone carries nine separate 511 deployments (Florida, Georgia, Idaho, Louisiana, New England, Ontario, Alberta, Nova Scotia, New Brunswick), which, with each other feed counting once, is what takes 51 feeds to 59 agencies. All of it is normalised into one Camera shape and drawn as one dot per camera at every zoom - no count badges, no aggregation. Cameras clustered until 2026-09-03; the badges covered a measured 51.9% of the Europe rectangle at world zoom, which is a poor trade for hiding a circle layer the GPU draws without complaint. Each camera opens its live still or HLS video through a closed proxy that takes a camera id, never an arbitrary URL, resolves it behind a host allowlist and caches at that source's own cadence. A feed that fails keeps its last-good cameras instead of silently deleting its region.
  • Aircraft and satellites - live ADS-B from adsb.lol (ODbL), pulled worldwide by ICAO type in one request and capped as a proportional spatial sample so every region keeps its share, with breadcrumb trails and route enrichment fetched on click; satellites propagated in the browser from CelesTrak TLEs with SGP4, so the server never ticks orbits and the constellation moves at frame rate.
  • A terminal-style console - a dense OSINT shell at /app: 88 widget types in a ⌘K catalogue, three presets that rearrange the workspace and re-skin the map layers in one tap, 13 monitor variants, a drag-and-snap widget grid, and any layout shareable as a ?c= URL. A first visit opens the Globe preset, which is the map with no widgets in front of it. Every layer and every widget is one ⌘K entry away. Countries are clickable for a sourced dossier (UK FCDO travel advice, the instability index with each contributing layer linked, and the signals active there), and every widget dumps its visible rows as CSV or GeoJSON.
  • A landing page that cannot drift - no count is typed into the page. Each one is read from a committed data file that is either pinned by a test or generated from a production run. The globe at / draws one saved snapshot of the live map, written by scripts/gen-landing-snapshot.mjs, and the page prints the snapshot's date.

📸 Screenshots

The Streets board: a full-bleed live map open on a pre-drawn circle over the densest cluster of live cameras measured, prompting you to draw your own area before any camera-wall tiles appear

Streets is a board of camera walls you compose yourself. Every tile holds a list of live views rather than one, so 47/60 is a slot cycling through the sixtieth camera it was given - sixty road cameras added in a single drag of a box across London. Search a place, paste a YouTube link, or arm a tile and pick straight off the map.

What a tile says about the road, and what it refuses to say

Each tile also states the conditions where its camera stands, and the interesting part is what it refuses to say. Where a road-weather station publishes a surface state and that reading survives every disqualification rule, the tile shows the operator's own word for it. Everywhere else it derives a line from air weather and says from air in the line itself, reporting rainfall rather than a road state - rain 1h, never wet, because an hour of rain does not tell you whether a surface is wet, frozen or already dry. Measured live on 2026-09-03: of 19,808 cameras, 912 carry a surface field and 649 survive every rule, which is 3.3%. A reading from a station over 10 km away, or one the operator has flagged stale or faulty, is refused rather than downgraded, so a camera with a distant station shows less than one that never had a station at all. Open the tile and the panel discloses exactly what was refused and whose rule refused it - the 10 km limit is ours, the staleness verdicts are the operator's.

| The console at /app: brief, hazards and the live map | Cameras over London, before clustering was removed on 2026-09-03 | |---|---| | !The Provenance OSINT terminal showing what's abnormal, disasters, world headlines and a dark world map | !Camera clusters over London on the dark basemap | | Every camera opens its live frame, attributed | The landing page's argument, in one section | | !A live TfL camera on the A406 with its source, coordinates and refresh cadence | !Every dot has a receipt: a raw USGS earthquake record beside the pin it becomes |

🛠 Stack

Next.js 15 (App Router) · TypeScript · React 19 · MapLibre GL JS v5 · hls.js · satellite.js (SGP4) · h3-js · react-grid-layout · zod · posthog-js · Vitest · Playwright · self-hosted on AWS Lightsail (Node behind Caddy) and served through Cloudflare.

All data and tile sources (keyless first)

TfL · Caltrans · SCDOT · Finland Digitraffic · Castle Rock 511 · Oregon TripCheck · DriveBC · NZTA · Iceland · Estonia · Traffic Scotland · CET-SP (Sao Paulo) · MUP Srbije · JP Putevi Srbije · BIHAMK · ACT (Puerto Rico) · Houston TranStar · CARS 511 (NYSDOT, MnDOT, Iowa DOT, INDOT, KDOT/KC Scout, CDOT) · 511 Virginia (VDOT) · WSDOT · Mi Drive (MDOT) · TxDOT ITS · Windy webcams · adsb.lol · adsb.fi · adsbdb · Virtual Radar Server standing data · Open Glider Network · CelesTrak · USGS · EMSC · GeoNet · INGV · GFZ GEOFON · Geoscience Australia · JMA · Earthquakes Canada · BMKG · IGN · NASA EONET · NASA FIRMS · GDACS · Copernicus EMS · NIFC · EFFIS · INPE · NOAA · JTWC · JMA · CMA · Environment and Climate Change Canada · US Census Bureau (county centroids) · IODA · Open-Meteo · OpenAQ · UCDP · GDELT (instability index attention term) · U.S. Department of State · Global Affairs Canada · GeoNames · data.police.uk · SFPD · Seattle PD · DC MPD · Montgomery County PD · Chicago PD · Boston PD · KCPD · SEC EDGAR · Washington AG · SANS ISC DShield · abuse.ch · Ransomware.live · UNHCR · ReliefWeb · ENTSO-E · TeleGeography · The Space Devs · OurAirports · NOAA Aviation Weather Center · FAA ATCSCC · Avinor · Hong Kong Airport Authority · OpenStreetMap (QLever) · Wikidata · US NRC · US EIA · Elexon · IESO · gpsjam.org · alerts.in.ua · EUROCONTROL AUGUR · NOAA Office for Coastal Management · EMODnet · US FCC · UNCTAD · Eurostat · USACE · AISStream.io · UK FCDO (gov.uk) · CoinGecko · Frankfurter/ECB · Esri World Imagery · OpenFreeMap (OpenMapTiles) · CARTO (label fonts) · OpenTopoMap · Natural Earth · AWS Terrain Tiles.

🚀 Run

npm install
npm run dev                 # landing page at http://localhost:3000, console at /app

production build:

npm run build && npm run start npm test # 4,264 tests across 403 files (Vitest), counted on 2026-09-19 npx vitest list # enumerate the suite without running it

No API keys are needed for the core map. Optional keys unlock the dormant extras, and the canonical names live in docs/API_KEYS.md (WINDY_WEBCAMS_API_KEY, OPENAQ_API_KEY, RELIEFWEB_APPNAME, ENTSOE_API_TOKEN, AISSTREAM_API_KEY, FINNHUB_API_KEY, FRED_API_KEY). A local GeoCLIP sidecar improves /locate accuracy.

🧠 How it works

app/(site)/page.tsx ─── the landing page: a globe drawn from one saved snapshot
                        of the live map; its figures come from committed data files
app/(console)/app/ ──── the console shell
  └── components/WorldMap.tsx ─ one maplibregl.Map (projection: 'globe')
        basemap registry (satellite / streets / topo) + 3D terrain
        per-hazard signal icons + clickable Natural Earth country layer
  ├── lib/sources/*      one adapter per camera feed -> Camera (zod), merged + last-good
  ├── lib/signals/*      one adapter + one registry entry per source (34, 33 of them map layers)
  ├── lib/signals/explain.ts   the provenance card for every layer, enforced by a test
  ├── lib/planes/*       spatial sampler, trails + enrichment (the adsb.lol type pull is lib/sources/adsb.ts)
  ├── lib/satellites/*   CelesTrak TLE -> SGP4 propagation on a client tick
  ├── lib/geo/*          Natural Earth borders, advisory + instability dossier
  ├── lib/proxy/*        closed image + HLS proxies (host allowlist, per-source cache)
  └── lib/console/*      widget registry (79 types), 3 presets, shareable ?c= layouts
API routes:  /api/cameras · /api/camera · /api/coverage · /api/status · /api/planes
             /api/satellites · /api/signals/[id] · /api/proxy · /api/hls · /api/webcams
             /api/news · /api/brief · /api/markets · /api/advisory · /api/recon
             /api/near · /api/geocode · /api/flight · /api/geolocate · /api/og

Adding a camera source or a signal layer is one adapter file, one registry entry and a fixture test. A signal layer then appears on the map, in the rail and in the widget catalogue with no further edits. The normalisation layer, the proxy that fronts every image, and the rule that a failing upstream resolves to an empty set or the last good answer are the core of the project.

Licence

Copyright © 2026 011-sam-110.

Provenance is free software licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only).

You may use, study, modify and redistribute it. The condition is reciprocity: if you distribute a modified version, or run one as a network service, you must make your source available to its users under the same licence. That network clause (section 13) is the reason this licence was chosen over MIT: the natural way to reuse this project is to host it, and a licence that only bound redistribution would not reach that.

Concretely, the running app links to this repository from the console header and the site footer. Those links are how section 13's offer of source is served, so they are a licence obligation rather than decoration.

The data is not covered by this licence

The AGPL covers this codebase only. Every upstream feed keeps its own separate terms, and some require attribution that is reproduced in the app: TfL Open Data, Windy.com webcams, OpenFreeMap, OpenMapTiles, CARTO and OpenStreetMap basemaps, NASA EONET and FIRMS, USGS, GDACS, TeleGeography and adsb.lol, among others. Redistributing this code does not grant you any right to their data, so check each source before relying on it.

The photographs on the landing page are not covered by it either: they are from Pexels under the Pexels License, which allows use and modification without attribution and forbids selling unaltered copies or redistributing them on other stock photo or wallpaper platforms, and docs/IMAGE-LICENSES.md lists the source and terms of every image.

Third-party code

None. No code was copied from any other project; koala73/worldmonitor was read for factual endpoint information only, which is not copyrightable.

History

The repository used to be called TrafficNerd-V2 and the product was briefly called OpenData. Both are now Provenance. It is the web rewrite of TrafficNerd v1, which was a London-only terminal app.

Chat with me