Files
gods-eye-view/DATA_SOURCES.md

108 KiB
Raw Permalink Blame History

Data Sources & Attribution

God's Eye View's code is MIT-licensed. The MIT grant covers the source code only — it does NOT extend to third-party data or visual assets. Every third-party source keeps its own license and terms. This file documents the live and bundled data sources; bundled 3D-model provenance is recorded in public/models/README.md.

How to read this:

  • The non-permissive datasets are carved out, not omitted. Some bundled data (e.g. TeleGeography, CC BY-NC-SA) isn't MIT-compatible. Rather than hide it, we bundle it with a clear license carve-out so the app works out of the box — but it stays under the provider's terms.
  • If your use doesn't fit a dataset's license, remove that dataset. Most importantly: TeleGeography is NonCommercial — commercial users must delete it (or license it from TeleGeography). It's one self-contained folder.
  • Attribution is shown in-app and listed here. Keep it intact. The required Google/Cesium credit renders on the on-globe credit line (bottom-left, #cesium-credits), and every per-layer credit below is registered into the expandable "Data attribution" lightbox on that line (src/data/dataCredits.js → viewer.creditDisplay.addStaticCredit). Both stay visible in clean-view and recording modes.
  • Bundled model attribution lives beside the model files. public/models/README.md records each shipped model's creator, source, license, and modification status.

Live sources (fetched at runtime — not stored in this repo)

Source Used for License / terms Attribution
NOAA GFS (wind) (noaa-gfs-bdp-pds.s3.amazonaws.com) Global 10 m wind, optional 2 m temperature and mean sea-level pressure for Wind. Keyless; latest 6-hourly 0.25° cycle, byte-range GRIB2 reads, cached for an hour U.S. public domain (NOAA); keyless via NOAA Open Data on AWS "NOAA Global Forecast System (GFS)" (courtesy; not an endorsement)
ECMWF IFS (wind) (data.ecmwf.int/forecasts, ECMWF Open Data) The alternative Wind model: 10 m wind, optional 2 m temperature and mean sea-level pressure. Keyless; latest 6-hourly 0.25° run, byte-range GRIB2 reads, cached for an hour CC BY 4.0 plus the ECMWF Terms of Use "This service is based on data and products of the European Centre for Medium-Range Weather Forecasts (ECMWF)", with the CC BY 4.0 link, the modification notice and ECMWF's liability disclaimer — shown in-app
NOAA nowCOAST observed weather (nowcoast.noaa.gov/geoserver/observations/{weather_radar,satellite}/ows, WMS 1.1.1) Rain radar (MRMS base reflectivity, contiguous US, about 4-minute updates) and Satellite clouds (GOES-19/18 Band 14 regional infrared, about 5-minute updates; global infrared mosaic, hourly). Keyless; layer metadata refreshed every 2 minutes, exact-time images cached for up to 24 hours NOAA disclaimer "NOAA nowCOAST · NWS/OAR MRMS radar; NESDIS GOES and global satellite partners"
NOAA nowCOAST lightning density (nowcoast.noaa.gov/geoserver/observations/lightning_detection/ows) Lightning density: 15-minute accumulated strike density on an approximately 8 km grid, Americas and Pacific. Keyless; layer metadata refreshed every 10 minutes, exact-time images cached for up to 24 hours NOAA Level-5 derived product from Vaisala NLDN/GLD360; the product description permits public distribution of this density product, not of raw Vaisala detections "NOAA/NWS nowCOAST; derived from Vaisala NLDN/GLD360"
NOAA NHC / CPHC advisories (www.nhc.noaa.gov/CurrentStorms.json + the mapservices.weather.noaa.gov tropical weather summary MapServer) Cyclone advisories: storm positions, forecast tracks, points and cones for the Atlantic and eastern/central North Pacific. Keyless through /api/cyclones; cached for 5 minutes NWS public-data terms; no endorsement implied "NOAA/NWS NHC / CPHC"
Mapillary (vector tiles, Graph API, MapillaryJS) Street Level: coverage lines, image cones and the embedded viewer. Coverage tiles cached for 24 h Imagery CC BY-SA 4.0; API under the Mapillary terms with a client token "© Mapillary contributors, CC BY-SA 4.0", shown on the globe while the provider is on
Google Street View (Maps JavaScript API) Street Level, on the Google 3D map only (Google's terms): Google's panorama viewer and nearest-panorama lookups; panorama dates and addresses kept for the session only Google Maps Platform ToS (your own key + billing; every panorama load is billed) "Street View imagery © Google" on the globe while the provider is on, and Google's logo and terms in the viewer
KartaView (api.kartaview.org coverage tiles and photo API, cdn.kartaview.org image proxy, storage*.openstreetcam.org photos) Street Level: coverage lines (z13–14 JSON tiles; with the imagery filter on, KartaView's filtered PNG tiles as a mask), nearest-photo lookups, the photo's sequence and the photo itself, fetched by the browser. Keyless; nothing cached beyond the session Imagery CC BY-SA 4.0 (KartaView terms §4); the public API needs no token "© KartaView contributors, CC BY-SA 4.0", shown on the globe while the provider is on
Panoramax (api.panoramax.xyz meta-catalogue: vector tiles and STAC search; pictures from the federated instance holding each one, e.g. panoramax.openstreetmap.fr, panoramax.ign.fr) Street Level: coverage lines and density points, nearest-picture lookups, a sequence's pictures as cones, and the picture itself, fetched by the browser. Keyless; tiles cached by the browser for an hour (the API's own header) Per picture: mostly CC BY-SA 4.0, IGN's Licence Ouverte 2.0; the API needs no token "© Panoramax contributors, licence per picture" on the globe while the provider is on; the caption names each picture's author and licence
OpenStreetMap Map and place data (roads, military areas and names, ALPR, place search, outlines); via vector tiles, hourly ALPR extract, bundled data, Nominatim and optional self-configured Overpass ODbL 1.0 © OpenStreetMap contributors
Google Map Tiles API (Photorealistic 3D Tiles) + Places/Geocoding The 3D globe, voice scene context, and on-demand nearby installation search Google Maps Platform ToS (proprietary, your own key + billing) "Google" / "Google Maps" logo — shown in-app, required
OpenSky Network Primary worldwide live-flight snapshot Non-commercial research/education license Schäfer et al., "Bringing Up OpenSky", IPSN 2014 + opensky-network.org
adsb.lol point API Bounded live-flight fallback when OpenSky has no usable snapshot; GNSS Integrity layer (aircraft-reported NIC/NACp and GPS-loss integrity facts, via /api/gnss-integrity, 60 s server cache) ODbL 1.0 adsb.lol contributors; api.adsb.lol/v2/lat/{lat}/lon/{lon}/dist/{radius}
adsb.lol Military flights + aircraft traces ODbL 1.0 "adsb.lol" (ODbL)
adsbdb (api.adsbdb.com) Aircraft type, model name and registration by ICAO hex for enriched flights; airline and origin/destination airports for the tracked flight's callsign No licence or rate limit is published for the service. Its own credits: aircraft data from PlaneBase, ICAO-to-N-number conversion by Guillaume Michel, and flight route data that "is the work of David Taylor, Edinburgh and Jim Mason, Glasgow, and may not be copied, published, or incorporated into other databases without the explicit permission of David J Taylor, Edinburgh" "adsbdb — api.adsbdb.com" (courtesy); route data credited to David Taylor, Edinburgh, and Jim Mason, Glasgow
AISStream.io Live vessels (AIS) Free, beta, no formal ToS; AIS is a public broadcast "AISStream.io" (courtesy)
CelesTrak Satellite TLEs (SGP4) US-government-origin data, no license; citation requested "CelesTrak (celestrak.org), Dr. T.S. Kelso"
The Space Devs — Launch Library 2 v2.3 Recent launch, payload, stage, and recovery metadata for Space Missions (30d) The Space Devs terms of use: data may be used and shared in any form; avoid forwarding it without added value; attribution is encouraged (not mandatory). Official API limits: 15 unauthenticated calls/hour; optional token "Launch Library 2 — The Space Devs" (courtesy attribution)
Esri World Imagery (ArcGIS Online tile service) The keyless satellite basemap — the default landing when no Google/ion credential is configured, and the "Esri Satellite" map stack Esri Master Agreement: the public World Imagery service is usable in public-facing apps with attribution; no key is required for this classic endpoint, but Esri governs and can change access — an app at scale should review current ArcGIS Location Platform terms "Powered by Esri — Source: Esri, Maxar, Earthstar Geographics, and the GIS User Community" (provider carries the service's own credit line)
USGS Earthquakes U.S. public domain "Data courtesy of the U.S. Geological Survey"
Environment and Climate Change Canada (MSC GeoMet OGC API) Air quality (AQHI) — Canadian station observations ECCC Data Servers End-use Licence (open, attribution required, no endorsement implied) "Contains information licensed under the Environment and Climate Change Canada Data Servers End-use Licence"
NASA GIBS (WMTS tiles + Worldview Snapshots) and NASA CMR (granule catalog) Recent Imagery layer: HLS S30/L30 (Sentinel-2, Landsat 8/9) and VIIRS true-colour tiles draped on the map, per-day thumbnails and PNG exports; the HLS granule catalog (dates, cloud, footprints) for a selected box U.S. public domain (NASA data); keyless, browser-direct (CORS *); no bulk use — one 30-day catalog query per box, tiles bounded to the box, six tile requests in flight "We acknowledge the use of imagery provided by services from NASA's Global Imagery Browse Services (GIBS), part of NASA's Earth Science Data and Information System (ESDIS)." — gibs.earthdata.nasa.gov, HLS
NIFC WFIGS (Wildland Fire Interagency Geospatial Services, ArcGIS feature service) Fire Perimeters layer: current interagency wildfire incident perimeters, containment, and incident facts U.S. public domain (interagency wildland-fire data published through the NIFC Open Data portal); fetched keyless through /api/fire-perimeters (5-minute server cache) with exceededTransferLimit paging "Wildfire perimeters: National Interagency Fire Center (WFIGS)"
InciWeb (inciweb.wildfire.gov) Per-incident "InciWeb ↗" card links to official incident pages (narratives, evacuation/closure notices) U.S. government public incident information. Links are matched best-effort by incident name and state, with incident page origin and update times checked on selection. Same-origin /api/fire-perimeters/inciweb routes cache the catalog for 1 hour and publication metadata for 30 minutes; linked pages remain InciWeb content "Incident information: InciWeb (inciweb.wildfire.gov)"
OpenFreeMap / OpenMapTiles Vector tiles OpenStreetMap data under ODbL 1.0 OpenFreeMap © OpenMapTiles
Overture Maps Foundation Military area names pack ODbL 1.0 Overture Maps Foundation
TomTom Traffic API (flow vector tiles) Traffic roads and live congestion (optional, BYOK) TomTom for Developers terms (proprietary, your own key; free tier currently 200K tile requests/month — see current pricing) "Traffic flow data © TomTom" — registered when live mode activates
Photon (komoot) Keyless place search — the fallback when no Google Maps key is configured, or when Google declines the Geocoding request Service: free public instance, fair use (no bulk/heavy use); underlying data: ODbL 1.0 "Photon (komoot)"
Open-Meteo Current weather in the cockpit Local Info page and cockpit-local dynamic atmospheric effects CC BY 4.0 data licence and adjacent-link attribution requirement Linked "Weather data by Open-Meteo.com" beside the displayed local data
Google News RSS Primary locality-matched headlines in the cockpit Regional News page Google News Terms of Service restrict use to personal, noncommercial use; linked articles remain third-party publisher content and retain publisher terms "Google News RSS" plus each article's linked publisher/domain
GDELT Project DOC 2.0 Fail-soft fallback for location-matched cockpit headlines GDELT Terms of Use: unrestricted academic/commercial/governmental dataset use, with citation and link required; linked articles retain publisher terms "GDELT Project" plus each article's linked publisher/domain
City of Austin Open Data CCTV camera catalog + frames City of Austin Open Data Terms of Use "City of Austin, TX — data.austintexas.gov"
TxDOT ITS (its.txdot.gov) CCTV camera catalogs + frames, Texas districts Public TxDOT traffic camera data "Texas Department of Transportation" (courtesy)
FL511 (Florida DOT) CCTV camera catalog + frames, Florida statewide FL511 content, individual personal use only; any other use needs FDOT's express written consent (terms). Off by default; set CCTV_FLORIDA_ENABLED=1 to enable "Florida DOT — FL511.com" (courtesy)
City of Tallinn (ristmikud.tallinn.ee) CCTV camera catalog + frames, Tallinn intersections Public City of Tallinn traffic camera data "City of Tallinn — ristmikud.tallinn.ee" (courtesy)
Transpordiamet / Tarktee CCTV camera catalog + frames, Estonia road-weather cameras Public Transpordiamet / Tarktee road camera data "Transpordiamet / Tarktee — tarktee.transpordiamet.ee" (courtesy)
Stadt Warendorf webcam Webcam frames, Marktplatz / Historisches Rathaus (config/cctv_sources.warendorf.json) Public municipal webcam data "Stadt Warendorf — webcam.warendorf.de" (courtesy)
Live Traffic NSW (Transport for NSW) CCTV camera catalog + frames, New South Wales CC BY 4.0 — attribution REQUIRED "Live Traffic NSW — Transport for NSW"
Caltrans (cwwp2.dot.ca.gov) CCTV camera catalogs + frames, California districts Public Caltrans traffic camera data "Caltrans — cwwp2.dot.ca.gov" (courtesy)
DelDOT (video.deldot.gov) CCTV camera catalog (tmc.deldot.gov/json/videocamera.json, cached for 15 minutes) + live HTTPS HLS video, Delaware. Keyless Public DelDOT traffic camera streams via the DelDOT traffic map "DelDOT — Delaware Department of Transportation" (courtesy)
TfL Open Data (JamCams) CCTV camera catalog + frames, London TfL Open Data terms — attribution REQUIRED "Powered by TfL Open Data. Contains OS data © Crown copyright and database rights"
Ontario 511 CCTV camera catalog + frames, Ontario highways including Kitchener-area routes Open Government Licence – Ontario "Ontario 511" plus Open Government Licence - Ontario
Fintraffic / Digitraffic (weathercams) CCTV camera catalog + frames, Finland CC BY 4.0 — attribution REQUIRED "Fintraffic / digitraffic.fi, license CC BY 4.0"
DriveBC (Government of British Columbia) CCTV camera catalog + frames, British Columbia highways Open Government Licence – British Columbia — attribution REQUIRED "DriveBC. Contains information licensed under the Open Government Licence – British Columbia"
Open Calgary (data.calgary.ca) CCTV camera catalog + frames, Calgary Open Government Licence – City of Calgary — attribution REQUIRED "Contains information licensed under the Open Government Licence – City of Calgary"
Servei Català de Trànsit (+ Ajuntament de Barcelona, Ajuntament de Terrassa) CCTV camera catalog + frames, Catalonia Llicència oberta d'ús d'informació - Catalunya — attribution REQUIRED "Servei Català de Trànsit"; partner-supplied cameras also name their owner
King County Road Services (services.arcgis.com, King County GIS) CCTV camera catalog + frames, unincorporated King County WA road network KCGIS Center terms — attribution required; public ArcGIS layer "King County Road Services" (partner-city cameras name their owner)
WSDOT (data.wsdot.wa.gov) CCTV camera catalog + frames, Washington State highways WSDOT travel information disclaimer — public "low volume" feed; catalog cached, frames on WSDOT's own image host only "Washington State Department of Transportation (Travel Center)" (courtesy)
Statens vegvesen (catalog ogckart-sn1.atlas.vegvesen.no, frames kamera.atlas.vegvesen.no, HLS kamera.vegvesen.no) CCTV camera catalog + frames + live HLS video, Norway road cameras NLOD 2.0 — attribution REQUIRED "Contains data under the Norwegian licence for Open Government data (NLOD) distributed by Statens vegvesen"
Kartverket (ws.geonorge.no/hoydedata/v1/punkt) Terrain heights (NN2000) used as the ground prior for Statens vegvesen cameras CC BY 4.0 — attribution REQUIRED "© Kartverket", modified (heights over water set to 0 m, rounded to 0.1 m)
NYC DOT Traffic Management Center (webcams.nyctmc.org) CCTV camera catalog + frames, New York City five boroughs NYC DOT requires developers to sign a data-sharing agreement for the camera feed. Off by default; enable only under your own agreement "NYC DOT Traffic Management Center" + NYC DOT's required application disclaimer (in the Data attribution popover)
City of Toronto Open Data (opendata.toronto.ca) CCTV camera catalog + frames, Toronto city streets Open Government Licence – Toronto — attribution REQUIRED "Contains information licensed under the Open Government Licence – Toronto"
GBFS (Lyft / BCycle / Social Bicycles / PBSC) Bikeshare availability Per-feed (attribution-only) Credit the operator (e.g. Austin BCycle) + its license_url
Bike Share Toronto (toronto.publicbikesystem.net) Bikeshare station availability, Toronto Operator GBFS feed. No licence is published: the City's open-data package declares none and the feed has no license_url. Attribution is given to the operator. "Bike Share Toronto (Toronto Parking Authority)"
Bike Itaú / Tembici (*.publicbikesystem.net, seven Brazilian cities, Santiago and Bogotá) Bikeshare station availability: São Paulo, Rio de Janeiro, Salvador, Recife, Porto Alegre, Brasília, Curitiba, Santiago de Chile and Bogotá Operator GBFS feeds. No licence is published: the feeds' system_information.json carries no license_url, operator or attribution fields. Attribution is given to the operator. "Bike Itaú (Tembici)"; "Tembici Bogotá"
Bicing (barcelona.publicbikesystem.net) Bikeshare station availability, Barcelona Operator GBFS feed (PBSC), keyless. The feed publishes no licence; the City's own open-data copy of the same station data is CC BY 4.0 but needs a token. Attribution is given to the operator. "Bicing, Barcelona City Council (B:SM)"
BiciMAD (madrid.publicbikesystem.net) Bikeshare station availability, Madrid Operator GBFS feed (PBSC), keyless. Madrid's open-data catalogue publishes this feed (datos.madrid.es, dataset 900021-0-bicimad-gbfs, owner EMT Madrid) under EMT's open-data terms: commercial and non-commercial reuse, with attribution REQUIRED (section 5.2). "Powered by EMT de Madrid", linking to https://www.emtmadrid.es
Spanish city bikes on PBSC (*.publicbikesystem.net: Zaragoza, Valladolid, A Coruña, Donostia-San Sebastián, Bilbao, Rivas-Vaciamadrid) Bikeshare station availability: Bizi Zaragoza, BIKI, BiciCoruña, Dbizi, Bilbao Bizi, BicinRivas Operator GBFS feeds, keyless. The feeds' system_information.json carries no license_url, and no operator or city publishes a licence for them; MobilityData's catalogue lists CC BY 4.0 without naming a source. Attribution is given to the operator. "Bizi Zaragoza"; "BIKI, AUVASA (Valladolid)"; "BiciCoruña"; "Dbizi (Donostia-San Sebastián)"; "Bilbao Bizi, Bilbao City Council"; "BicinRivas, Rivas-Vaciamadrid City Council"
AMBici (nextbike, gbfs.nextbike.net) Bikeshare station availability, Barcelona metropolitan area (e-bikes) Operator GBFS feed, keyless. system_information.license_id is CC0-1.0; no attribution required, given anyway. "AMBici, Àrea Metropolitana de Barcelona, operated by nextbike"
Oslo / Bergen / Trondheim Bysykkel (Urban Sharing, gbfs.urbansharing.com) Bikeshare availability, Oslo, Bergen and Trondheim city bikes. Keyless GBFS; the proxy sends the Client-Identifier header the operators ask for NLOD 2.0 — attribution REQUIRED (Oslo, Bergen, Trondheim) "Contains data under the Norwegian licence for Open Government data (NLOD) made available by Oslo Bysykkel, Bergen Bysykkel and Trondheim Bysykkel"
Kolumbus / Farte Bysykkel (Entur Mobility, api.entur.io/mobility/v2/gbfs) Bikeshare availability, Kolumbus Bysykkel (Stavanger/Nord-Jæren) and Farte Bysykkel (Skien/Porsgrunn). Keyless GBFS; the proxy sends the ET-Client-Name header Entur requires and is limited to Entur's GBFS paths NLOD per the Entur Mobility API docs — attribution REQUIRED "Contains data under the Norwegian licence for Open Government data (NLOD) made available by Entur (Kolumbus Bysykkel, Farte Bysykkel)"
JCDecaux Cyclocity (api.cyclocity.fr) Bikeshare availability: Bysykkel Lillestrøm, Valenbisi (Valencia) and Sevici (Seville). Keyless GBFS; the proxy is limited to JCDecaux contract paths Licence Ouverte / Etalab (each feed's license_url) — attribution REQUIRED "Bysykkel Lillestrøm, Valenbisi, Sevici: JCDecaux, Licence Ouverte"
MBTA / MassDOT (cdn.mbta.com) Transit layer live vehicles and up to 15 minutes of recently observed positions, Greater Boston MBTA / MassDOT open realtime vehicle data, used for the live view and up to fifteen minutes of recently observed positions; published for developer use and not against their use. Attribution to MBTA / MassDOT (courtesy text)
CapMetro (data.texas.gov) Transit layer live vehicles, Austin TX CapMetro open realtime vehicle data, used for the live view; published for developer use and not against their use. Attribution to CapMetro (courtesy text)
Metro Transit (Metropolitan Council) Transit layer live vehicles, Minneapolis–St Paul Metro Transit / Metropolitan Council open realtime vehicle data, used for the live view; published for developer use and not against their use. Attribution to Metro Transit / Metropolitan Council (courtesy text)
OVapi / Stichting OpenGeo Transit layer live vehicles, Netherlands OVapi / Stichting OpenGeo open realtime vehicle data, used for the live view; published for developer use and not against their use. The client sends a User-Agent and conditional requests. Attribution to OVapi / Stichting OpenGeo (courtesy text)
Entur (api.entur.io) Transit layer live vehicles, Norway Entur open realtime vehicle data, used for the live view; published for developer use and not against their use. The client sends the ET-Client-Name identifying header. Attribution to Entur (courtesy text)
TransLink (Queensland Government) Transit layer live vehicles, South East Queensland TransLink / Queensland Government open realtime vehicle data, used for the live view; published for developer use and not against their use. Attribution to TransLink / Queensland Government (courtesy text)
HSL (realtime.hsl.fi) Transit layer live vehicles, Helsinki HSL (Helsinki Region Transport) open realtime vehicle data, used for the live view; published for developer use and not against their use. Attribution to HSL (Helsinki Region Transport) (courtesy text)
TTC (bustime.ttc.ca) Transit layer live vehicles, Toronto — surface vehicles (buses and streetcars) only Toronto Transit Commission BusTime open realtime vehicle data, published through City of Toronto Open Data and used for the live view. The subway publishes no vehicle positions, so Lines 1/2/4 are absent rather than inferred. Attribution to Toronto Transit Commission — City of Toronto Open Data, under the Open Government Licence – Toronto
MiWay (miapp.ca) Transit layer live vehicles, Mississauga ON MiWay open realtime vehicle data, published by the City of Mississauga under its Open Data Terms of Use, used for the live view. The licence is revocable and asks that the Terms of Use link travel with the data. Attribution to MiWay — City of Mississauga Open Data, linked to the Terms of Use
Hamilton HSR (opendata.hamilton.ca) Transit layer live vehicles, Hamilton ON Hamilton Street Railway open realtime vehicle data, published by the City of Hamilton for commercial and non-commercial use. Not one of its 80 route ids is the number on the bus, so the route-number table in src/data/transitFeeds.js is derived from the City’s own published GTFS routes.txt under the same licence; two generations of id run at once and both are listed. "Contains public sector Data made available under the City of Hamilton’s Open Data Licence" — wording prescribed by the licence
Durham Region Transit (drtonline.durhamregiontransit.com) Transit layer live vehicles, Durham Region ON Durham Region Transit open realtime vehicle data, published under the Region of Durham Open Data Licence v.1.0, which permits commercial use. "Contains public sector information made available under The Regional Municipality of Durham's Open Data Licence"
Guelph Transit (glphtrpcloud.com) Transit layer live vehicles, Guelph ON Guelph Transit open realtime vehicle data, published by the City of Guelph on its open-data developer page and used for the live view. Its route ids are internal database keys, so the 33-row route-number table in src/data/transitFeeds.js is derived from the City’s own published GTFS routes.txt under the same licence. "Contains information licensed under the Open Government Licence – City of Guelph" — wording prescribed by the licence
Kingston Transit (api.cityofkingston.ca) Transit layer live vehicles, Kingston ON Kingston Transit open realtime vehicle data, catalogued by the City of Kingston as open data and used for the live view. "Contains information licensed under the Open Data Licence – City of Kingston" — wording prescribed by the licence
Barrie Transit (myridebarrie.ca) Transit layer live vehicles, Barrie ON Barrie Transit realtime data, published by the City of Barrie under a licence accepted by use of the data. The licence is revocable and requires no attribution. Courtesy credit to the City of Barrie (the licence requires none, and its trademark clause is broad)
YRT/Viva (rtu.york.ca) Transit layer live vehicles, York Region ON York Region Transit realtime data, first-party York Region infrastructure under the YRT Open Data Licence v2.0, which permits commercial use and makes attribution optional. Viva route ids are named by colour from York Region’s published GTFS. "Contains public transit Information made available under YRT’s Open Data Licence" — the licence’s own wording, given though not required
Burlington Transit (opendata.burlington.ca) Transit layer live vehicles, Burlington ON Burlington Transit realtime data under the City of Burlington Open Data Terms of Use, which permit any lawful purpose. The terms are revocable and must travel with the data, so the credit links them. Route ids are internal keys and are joined to the City’s published GTFS. Credit to the City of Burlington plus a link to its Open Data Terms of Use, which the licence requires
Radio Browser Geolocated internet-radio station directory and station-level tags Public-domain directory data under PDDL 1.0; individual broadcaster stream terms apply "Radio Browser" plus a link to the selected broadcaster
Re:Earth Terrain (Mapterhorn) Terrain (keyless globe stacks — OSM etc. — + /api/terrain/heights ellipsoidal-height lookups) Terrain mesh: CC BY 4.0; geoid: EGM2008 (NGA, public domain) "Terrain (keyless globe stacks): Re:Earth Terrain / Mapterhorn (CC BY 4.0) / EGM2008 (NGA)"
OSRM on the FOSSGIS routing servers (routing.openstreetmap.de) Street-following routes for the Directions layer and voice route annotations, via /api/route FOSSGIS routing usage policy: "Display the required attribution and display a link to 'fix the map'", "Use a valid user agent and, if applicable, a correct referrer", "One request per second max", "No scraping, no heavy usage". The full policy is the German FOSSGIS Nutzungsbedingungen; FOSSGIS also states that the server may be embedded in your own pages but "eine gewerbliche Nutzung ist nur mit Einschränkungen erlaubt" (commercial use only with restrictions). Route data derives from OpenStreetMap (ODbL 1.0) "Routing: OSRM on the FOSSGIS servers" + a "fix the map" link — shown in the Data attribution popover

Local receiver input (not fetched from a service)

The optional Local ADS-B layer and the broadcast-FM receiver use radio you receive yourself: a USB RTL-SDR opened in the browser through WebUSB, or the aircraft.json of a decoder you run on your own machine or network (LOCAL_RECEIVER_FEEDS). Radio samples, audio and the optional receiver location stay in the browser. Decoder feeds are read by your local GEV server and relayed only to your browser, with about a second of in-memory caching. When you select a local aircraft, its ICAO address (and an airline-style callsign) is looked up, and aircraft that qualify for a 3D model are looked up by ICAO address, through the same adsbdb proxy the public flight layers use; your server caches those answers on disk and treats them as fresh for 24 hours. Received radio data is not stored or redistributed. ADS-B is an unauthenticated public broadcast and may be incomplete, delayed, spoofed or decoded in error; it is not suitable for navigation or operational use.

Notes on the live sources

  • Air quality (ECCC AQHI). Keyless. Read from the MSC GeoMet OGC API (api.weather.gc.ca): the aqhi-stations catalog plus aqhi-observations-realtime. Coverage is Canada only — ECCC is the single registered provider, and the layer row and readout card both say so. Roughly 134 stations across ECCC's five administrative zones (Atlantic, Quebec, Ontario, Prairies & North, Pacific & Yukon). AQHI publishes hourly, so readings poll every 20 minutes and the station catalog, which changes a few times a year, is refetched only every 12 hours. Observations are requested with latest=true; without it the collection returns the full history, roughly 2,000 rows nationally. Readings older than six hours are dropped rather than displayed as current.

    Readings are stored as { provider, scale, value, band } rather than a bare number, because air-quality indices are not interchangeable: AQHI runs 1-10+ on health risk, the US AQI runs 0-500 on concentration breakpoints, and Europe's EAQI is a five-step category. Naming the index a value belongs to is what lets another network be added later without inventing a shared numeric meaning that does not exist.

    AQHI is reported by ECCC as an integer from 1 to 10 with an open-ended "10+" above that. The API returns the underlying decimal (1.08, 2.32); the layer rounds to the published form rather than displaying a precision the index does not claim.

    Quebec is thinly represented, and that is upstream rather than a filter here: the province runs its own Info-Smog program, so only a handful of Quebec stations appear in ECCC's national feed. The reporting station count also varies hour to hour as stations report or fall silent.

  • Via Lietuva / Eismoinfo (Lithuania). Public road-camera catalogs and periodically updated still images from Eismoinfo, credited to Via Lietuva / eismoinfo.lt in the app. Off by default. The camera endpoints are the eismoinfo.lt website backend and are not among the services listed in Via Lietuva's open-data statement, whose conditions are attribution and reuse on the same terms. Until the statement is confirmed to cover the camera photos, the pack loads only when an operator sets CCTV_LITHUANIA_ENABLED=1; with the flag unset, empty or any other value, the server makes no request to Eismoinfo. eismoinfo-backend/camera-info-table is joined by ID to layer-static-features/VKR. Without lks=true, the latter returns WGS84 [latitude, longitude]; the table's x/y instead use LKS-94 metres. Only the official HTTPS /eismoinfo-backend/image-provider/camera/last?id=… image endpoint is registered. Catalogs use the shared 15-minute cache; frames are fetched on demand and never bundled or archived. These are periodic snapshots, not continuous video. Camera headings are low-confidence estimates. No API key is required. CCTV_LITHUANIA_MAX_SOURCES defaults to 400.

  • Google Maps Platform. You supply your own API key and are bound by Google's ToS. Google Maps Content (tiles, geocodes, places) may not be cached, stored, rehosted, or committed — this app only ever uses it live, which is the compliant pattern. The "Google" attribution is displayed on the globe and must stay visible. Restrict your key (see SECURITY.md).

  • OpenSky Network. Its license is non-commercial, and operational use of the REST API in a live product can require a prior written agreement with OpenSky — even for non-profit/government use. If you deploy this commercially, contact OpenSky for your own terms. The flights layer is a toggle and runs anonymously by default.

  • adsb.lol flight fallback. When OpenSky is unavailable and no last-good OpenSky response exists, the server requests a cached, capped 250 nm adsb.lol point snapshot around the current camera subpoint. This is regional observed context, not worldwide completeness; provenance is exposed in the Flights stats/context row. Military ICAOs remain reconciled through the existing dedicated military registry rather than duplicated.

  • GNSS integrity (adsb.lol). A separate keyless point request samples a 250 nm circle around the screen centre, snapped once to whole degrees. This does not reuse the Flights fallback cache. Cache lifetime is 60 s; 429 backoff is capped at one hour and other upstream failures cool down for 15 s. Future access may require feeder keys under the API terms. Airborne decoded ADS-B v1/v2 aircraft with a known 0–60 s position age qualify, including MLAT-positioned aircraft still broadcasting their own quality. TIS-B/MLAT-derived NIC and NACp are ignored. GPS-loss evidence uses gpsOkLat/gpsOkLon when present, otherwise the current known position. The proxy strips identity metadata and tags its response with classifier gev-nic-nacp-v2; rows carry only integrity facts.

    The method has three separately attributed parts:

    1. GEV classifier (unvalidated): GPS-loss flag, aircraft-reported NACp < 8, or aircraft-reported NIC < 7 except NIC 0 with NACp ≥ 10 (unknown containment). The numerical minima come from US 14 CFR 91.227(c), not a published jamming classifier. Readsb's JSON contract describes the quality field origins and GPS-loss flag.
    2. GPSJAM aggregation: score = 100 × max(0, bad − 1) / total, with percent bands < 2, 2–10, > 10. One bad aircraft is discounted. This is not the raw share of bad aircraft. See the GPSJAM FAQ.
    3. GEV window: 30 minutes over visited views, at least three aircraft per 0.5° cell. These bands were developed for daily totals; with fewer than ten observations a cell can skip the middle band. Source timestamps date evidence even through cache replays, and degraded evidence expires independently.

    Medium/high cells report navigation-integrity anomalies. Interference is one possible explanation, not a detected or located emitter. Avionics faults and manoeuvring military trainers can also lower reported accuracy. Blank areas can be outside coverage or lack enough observations. Attribution: adsb.lol contributors, ODbL 1.0; GPSJAM for aggregation only.

  • adsbdb enrichment. /api/adsbdb resolves an ICAO hex to aircraft type, model name and registration, and the tracked flight's callsign to an airline and an origin/destination pair. Fan-out is deliberately small because adsbdb is a free community API that publishes no quota: at most 4 requests in flight, dispatches dripped to roughly 5/s, and each key asked for at most once per session, with route lookups reserved for the tracked aircraft. The dev-server proxy caches each key for 24 hours in .gev-cache/adsbdb.json, negative answers included, so fresh entries survive server restarts. That gitignored cache remains local to the deployment and is not bundled with this repo. adsbdb publishes no general service license; its README says the route data may not be copied, published, or incorporated into other databases without the explicit permission of David J Taylor, Edinburgh. Deployers are responsible for obtaining any permission their use requires. Enrichment is best-effort and fail-silent — a flight that gets no answer keeps what the flight feed already gave it.

  • Launch Library 2. /api/launches makes a server-side rolling-30-day query against the supported v2.3 detailed launch endpoint, caches successful responses for 15 minutes in memory and on disk, and serves the last successful response during a throttle or transient outage. Anonymous access is limited to 15 calls/hour; deployments can provide LL2_API_TOKEN for authenticated access. The Space Devs' published terms permit using and sharing the API data in any form, ask users not to forward it without adding value, disclaim complete accuracy, and encourage—but do not require—attribution. This app keeps a courtesy credit. Payload and stage/recovery records are shown only when supplied. Failed launches expose their source status and never receive fallback orbit geometry or a live/estimated marker. LL2 supplies launch context and event timing, not continuous ascent telemetry or live orbital state.

  • TfL JamCams. The camera list comes from the keyless api.tfl.gov.uk endpoint (an optional TFL_APP_KEY raises its rate limit); frames come from TfL's public S3 bucket. The "Powered by TfL Open Data" attribution is required by TfL's terms and is registered in the Data attribution popover.

  • Ontario 511 CCTV. The camera list comes from the 511on.ca/api/v2/get/cameras endpoint, which now requires a free developer key (ONTARIO_511_API_KEY: sign up at 511on.ca/my511/register, then request it while logged in at 511on.ca/developers/doc; throttled to 10 calls a minute). Without the key the pack is skipped. Frames are server-registered still images under 511on.ca/map/Cctv/. The source is live-fetched at runtime and attributed under the Open Government Licence - Ontario. Access is governed by Ontario 511's Developer's Access Agreement (511on.ca/developers/resources): the data stays under the Open Government Licence - Ontario unless otherwise specified; key requests are reviewed case by case and ask for the intended use and any third parties that will receive the data; attribution by link to 511on.ca is encouraged, and the Ontario 511 logo may not be altered or used to imply endorsement (this app links and shows no logo); and the data is provided "as is", a disclaimer distributors should pass on, which the credit does.

  • DelDOT live video cameras. The keyless tmc.deldot.gov/json/videocamera.json catalog supplies active cameras and official https://video.deldot.gov/live/…/playlist.m3u8 links. The local server transiently buffers bounded MPEG-TS segments in memory and deletes them on session release or idle expiry. No recordings are retained. CCTV_DELDOT_ENABLED=0 disables the pack. Public availability is not a blanket redistribution license; deployment beyond personal local viewing needs confirmation of applicable DelDOT terms.

  • Fintraffic weathercams. The camera list is one keyless GeoJSON request to tie.digitraffic.fi/api/weathercam/v1/stations (809 stations / 2,275 presets), sent with the Digitraffic-User: gods-eye-view header the service asks clients to identify themselves with and with gzip; frames are stills on weathercam.digitraffic.fi, refreshed on each station's 600 s collection interval, which is also the client's ambient-still refresh cadence for this pack (the active camera keeps the usual 10-second refresh). One preset (a fixed camera view) is one camera; stations not GATHERING and presets not inCollection are dropped. Attribution is required by the CC BY 4.0 licence and is registered in the Data attribution popover. CCTV_FINTRAFFIC_ENABLED=0 is the kill switch.

  • DriveBC highway cameras. The camera list comes from the keyless https://www.drivebc.ca/api/webcams/ endpoint served by the DriveBC.ca site (bcgov/DriveBC.ca); frames come from https://www.drivebc.ca/images/<id>.jpg, built from the numeric camera id. DataBC's DriveBC HighwayCams catalogue entry publishes the same cameras under the Open Government Licence – British Columbia, but its CSV still lists the retired images.drivebc.ca frame URLs, which now return a placeholder. The licence's attribution statement is required and is registered in the Data attribution popover. By default the 250 cameras nearest Vancouver and Victoria load; CCTV_DRIVEBC_MAX_SOURCES changes the cap and CCTV_DRIVEBC_ENABLED=0 turns the pack off. Some cameras in the feed are supplied by partners (TransLink, the City of Vancouver, the City of Surrey, Parks Canada / Alberta Motor Association and others); the feed's per-camera credit is carried onto the camera record and shown beside the provider in the CCTV panel.

  • TxDOT ITS cameras. The catalog comes from the keyless its.txdot.gov/its/DistrictIts/GetCctvStatusListByDistrict endpoint, one call per district. Frames come from the per-camera GetCctvSnapshotByIcdId endpoint, which answers JSON carrying a base64 JPEG rather than an image body; the proxy decodes it only for responses from the official TxDOT origin and validates the JPEG header before serving. Only cameras reporting Device Online are registered. Districts default to Austin and San Antonio (CCTV_TXDOT_DISTRICTS; 25 codes exist statewide); CCTV_TXDOT_MAX_SOURCES caps the pack and CCTV_TXDOT_ENABLED=0 turns it off. Frames are fetched live at request time and are never stored or redistributed.

  • Tallinn ristmikud. Intersection camera stills are fetched live from ristmikud.tallinn.ee (/last/camNNN.jpg). The curated catalog (config/cctv_sources.tallinn.json) supplies coordinates and heading priors; only server-registered ristmikud HTTPS URLs are proxied. Frames are fetched at request time and never stored or redistributed. Disable with CCTV_TALLINN_ENABLED=0.

  • Tarktee / Transpordiamet. Estonia road-weather camera locations and current JPEG URLs come from keyless DATEX2 endpoints on tarktee.transpordiamet.ee (/api/v1/datex/roadCameraLocations + roadCameraImages). Frame URLs rotate with each capture; the 15-minute CCTV source cache refreshes them. Only https://tarktee.transpordiamet.ee/images/… URLs are registered. Disable with CCTV_TARKTEE_ENABLED=0.

  • Warendorf webcam. The Stadt Warendorf Marktplatz webcam, registered from the curated config/cctv_sources.warendorf.json (the Kreis Warendorf registration-office cameras from the contributing PR are indoor waiting rooms and were left out); only the municipal image host is proxied, frames are fetched at request time and never stored or redistributed. Disable with CCTV_WARENDORF_ENABLED=0.

  • Live Traffic NSW cameras. The camera list is the keyless public data.livetraffic.com/cameras/traffic-cam.json feed (Transport for NSW open data, CC BY 4.0); frames are stills on webcams.transport.nsw.gov.au, and only that host is registered. That image host answers non-browser clients with an HTML placeholder, so the proxy identifies as a browser for that one host and as itself everywhere else. Frames are fetched at request time and never stored or redistributed. Disable with CCTV_NSW_ENABLED=0.

  • Open Calgary traffic cameras. Keyless. The camera list is the public Socrata dataset k7p9-kppz on data.calgary.ca; frames are stills on the city's own trafficcam.calgary.ca host, and only that host is registered. Most rows publish an http:// frame URL and the host redirects those to HTTPS, so URLs are upgraded and pinned to that origin before registration. Frames are fetched at request time and never stored or redistributed. The dataset publishes no camera facing: the quadrant field and the quadrant suffix on each camera name are Calgary's address grid, not a bearing, so headings use the shared id-hash fallback at low confidence and are corrected with the in-app calibration gizmo. The licence requires the attribution statement above. Disable with CCTV_CALGARY_ENABLED=0.

  • FL511 Florida cameras. Off by default; set CCTV_FLORIDA_ENABLED=1 to load them. The camera list is the keyless FL511 traffic camera layer on ArcGIS (services.arcgis.com/.../FL511_Traffic_Cameras), published from a Florida Division of Emergency Management account rather than by FL511 directly, and the service carries no licence text of its own. It is paged up to 2,000 rows at a time, ordered by the layer's object id and following ArcGIS's exceededTransferLimit, to cover the ~4,000-camera statewide set. Frames are stills on two Divas Cloud hosts (images-dis.divas.cloud, snapshots.divas.cloud); both are host-pinned and a row whose image resolves elsewhere is dropped. CCTV_FLORIDA_MAX_SOURCES caps the pack (default 500, anchored per region across the state). Each catalog page is read under a 2 MiB cap and redirects are refused. Frames are fetched live at request time and never stored or redistributed. FL511's terms (fl511.com/privacy#disclaimer) license its content for individual, personal use only; any other use, including a public deployment, needs FDOT's express written consent.

  • Catalonia (Servei Català de Trànsit) cameras. The camera list is the keyless https://www.gencat.cat/transit/opendata/cameres.xml WFS/GML feed, fetched over https with redirects refused and the body read capped at 1 MiB, since the list decides ids, coordinates and which allowlisted frame path is proxied. It carries a font field naming the real publisher per camera; this pack keeps SCT's own highway cameras plus hotlinked Barcelona (IMI) and Terrassa municipal cameras (~130 total), each confirmed to return a real frame, so frame URLs are checked against a small host allowlist (mct.gencat.cat, www.bcn.cat, emap.terrassa.cat) rather than one pinned origin (a link carrying user:pass@ userinfo or an explicit port, or pointing outside that host's frame directory, is rejected even on an allowed host; an SCT sctidcam must be a bare .gif/.jpg filename), and every non-SCT camera carries its real owner as a credit shown beside the shared provider. The feed carries no compass heading, so every camera loads at low heading confidence (same as TfL and Fintraffic). SCT's own feed link (RenderService) needed a workaround: it always 302s to a second endpoint (TransitCamera) on a Location the upstream hardcodes as plain http even when requested over https — refused by fetchWithinHost's same-origin (scheme-included) redirect policy — and separately, mct.gencat.cat's TLS setup fails the handshake with Node's fetch outright (ERR_SSL_WRONG_SIGNATURE_TYPE) even though other HTTP clients complete it. The loader therefore builds the TransitCamera URL itself, over plain http, from RenderService's sctidcam id, rather than registering the (broken) upstream link — the only transport this one host actually serves to this runtime. Camera ids are built from the SCT camera file or the partner image path, not the feed's fid (which embeds an upstream server-start stamp and changes on every upstream restart), and rows the feed lists more than once collapse to one camera. The feed carries no camera status field, so a camera its publisher has taken offline still registers and shows the publisher's own "image unavailable" still (SCT and Barcelona both serve one with HTTP 200), the same as other packs without a status field. Frames are fetched at request time and never stored or redistributed. The feed itself states no licence; the pack relies on the Generalitat de Catalunya open-data portal's terms for this dataset (the licence and attribution above). Disable with CCTV_CATALONIA_ENABLED=0.

  • King County road cameras. Keyless. The camera list is one public ArcGIS FeatureServer GeoJSON query (King County DOT Road Services, "King County and WSDOT Traffic Cameras"). The outFields list is explicit on purpose: the layer also carries asset-administration columns — including staff names — that are never fetched. Only live, active cameras with frames on the county's own info.kingcounty.gov image handler are registered (the feed writes http://; the handler serves HTTPS, so URLs are upgraded and pinned before registration). WSDOT-owned rows in the layer are skipped because their frames are WSDOT-hosted, outside the pinned image origin; partner-city cameras hosted on the county image handler (e.g. Newcastle) name their owner as the per-camera credit. The layer publishes no facing, so headings use the shared id-hash fallback at low confidence. Uniquely, the county publishes each camera's hardware Manufacturer/Model (Cohu 3950/3965, Bosch AUTODOME, Axis PTZ domes); both are carried on the source (and served by /api/cctv/sources) as model and manufacturer for identified-hardware consumers (vendor-generic strings such as PTZ name no model and are omitted). Frames are fetched at request time and never stored or redistributed. Disable with CCTV_KINGCOUNTY_ENABLED=0.

  • WSDOT highway cameras. Keyless. The camera list is the Esri JSON layer data.wsdot.wa.gov/travelcenter/Cameras.json — the same layer WSDOT's own Travel Center map consumes (~1,700 point features, EPSG:3857 geometry converted to WGS84 on load; the body carries Windows-1252 bytes and is decoded as such). Only frames on WSDOT's own images.wsdot.wa.gov host are registered — the catalog also lists ~70 partner cameras (Oregon DOT, City of Seattle, lodges, airports) whose own terms apply, and those are skipped rather than proxied. WSDOT's layer metadata marks the feed for "low volume" use (see WSDOT's travel information disclaimer). The catalog is fetched once per CCTV catalog refresh (every 15 minutes), and a camera's frame is fetched only when that camera is viewed; frames are never stored or redistributed. The live feed's CompassDirection is a single cardinal (N/E/S/W), B (both directions — most rows), O, or null. A single cardinal gives a high-confidence heading (the diagonals NE/SE/SW/NW are mapped too should they appear); B, O, null, and any other code carry no single facing and use the shared id-hash fallback at low confidence. By default the 250 cameras nearest Seattle and Spokane load; CCTV_WSDOT_MAX_SOURCES changes the cap (8–1,200) and CCTV_WSDOT_ENABLED=0 turns the pack off. A keyed WSDOT Traveler Information API serves the same population for higher-volume use and is deliberately not required here.

  • Statens vegvesen road cameras. Keyless. The camera list is one GeoJSON request to the OGC API Features view of the official DATEX 3.1 CCTV site table (ogckart-sn1.atlas.vegvesen.no/ogc/features/v1/collections/datex_3_1:CctvSimple/items), so no DATEX account is needed; frames are stills on kamera.atlas.vegvesen.no/api/images/<cameraId>, and only that exact path per camera is registered. Cameras the feed reports as faulty are dropped. About 135 working cameras also publish live HLS (kamera.vegvesen.no/public/<cameraId>/manifest.m3u8, MPEG-TS); those play as live video through the bounded in-memory HLS relay, with the still as the snapshot fallback, and only that exact manifest path per camera is registered. CCTV_VEGVESEN_VIDEO=0 keeps every camera on stills. orientationDescription names the place a camera faces, not a bearing, so it goes into the label and headings use the id-hash fallback at low confidence. By default every live camera loads (~850); CCTV_VEGVESEN_MAX_SOURCES (8–1000) lowers the cap, keeping the cameras nearest Oslo, Bergen, Stavanger, Trondheim, Kristiansand, Bodø and Tromsø and CCTV_VEGVESEN_ENABLED=0 turns the pack off. Frames are fetched at request time and never stored or redistributed. The NLOD attribution is registered in the Data attribution popover.

  • Kartverket ground heights for Statens vegvesen cameras. The camera feed's points are 2D, so the loader asks Kartverket's keyless point-height API (ws.geonorge.no/hoydedata/v1/punkt, CC BY 4.0) for the terrain height at each camera. Requests carry 20 points: the API accepts 50, but above ~20 it answers the extra points from contour lines (hoydekurver, metres to ~20 m off) or not at all. Eight requests run at a time, about 36 for the whole country: a cold lookup took 6–13 s in testing (single requests 0.6–9.5 s). Answers are matched by the coordinates the API echoes and recorded only for points that request asked about. Over water the API returns the sea-floor depth (dybdekurver or Havflate), which is replaced by 0 m, the water surface; for the ~14 bridge cameras that is below the deck, but much closer than the sea floor or the flat prior. Heights are cached in memory by position for the life of the server, and points with no height (a few ferry quays and bridges, or a point a 200 answer leaves out) for 6 h, so the 15-minute catalog refresh only asks about new or moved cameras. The first failing request (a 408, 429 or 5xx, a network error, a request over 10 s, or an unreadable or oversized body) stops the lookup, with no retries, and no new lookup starts until the backoff ends (Retry-After when sent, else 30 min, longer than the refresh; bounded to 1 min–1 h). Any other 4xx marks that request's points as having no height and the lookup carries on. The whole lookup has a 30 s deadline; a lookup cut short by it resumes on the next refresh without a backoff. The lane waits at most 12 s, counted from the start of the loader, and only when more than 10% of the cameras have no answer yet; a few new cameras or expired misses are looked up in the background. A slower lookup keeps filling the cache, and the cameras it had not reached keep the flat prior until the next 15-minute refresh (about 190 of 865 on one slow first run). Only coordinates are sent, with the same User-Agent as the other CCTV requests. CCTV_VEGVESEN_HEIGHTS=0 turns the lookup off. The Kartverket credit, with a note that heights over water are set to 0 m and heights are rounded to 0.1 m, is shown beside the Statens vegvesen entry in the Data attribution popover.

  • NYC DOT Traffic Management Center cameras. Off by default. NYC DOT's developer data feeds page asks developers who want the camera feed to contact [email protected] and sign a data-sharing agreement. This project does not hold one that covers downstream installations, so the pack loads only when an operator who holds their own agreement sets CCTV_NYC_ENABLED=1; with the flag unset, empty or any other value, the server makes no request to NYC DOT. The endpoint needs no key. The camera list is the public webcams.nyctmc.org/api/cameras catalog (~980 cameras across the five boroughs); frames are stills at webcams.nyctmc.org/api/cameras/<uuid>/image, synthesized from a validated UUID rather than taken from the payload, and only that host is registered. Cameras the feed reports as offline are dropped. The catalog publishes no camera facing, so headings use the shared id-hash fallback at low confidence and are corrected with the in-app calibration gizmo. Once enabled, the 250 cameras nearest the borough cores load; CCTV_NYC_MAX_SOURCES (8–400) changes the cap. Frames are fetched at request time and never stored or redistributed. NYC DOT asks every application that uses its data to carry its disclaimer; it is registered verbatim in the Data attribution popover.

  • City of Toronto RESCU cameras. Keyless. The camera list is the City's public tmcearthcameras.json on opendata.toronto.ca (dataset "Traffic Cameras", Transportation Services), served as JSONP and unwrapped with an anchored pattern. This is the municipal network the Ontario 511 pack does not carry: downtown arterials plus the Gardiner, DVP, Allen and Lake Shore. The list publishes no frame URL, so frame URLs are BUILT from the documented CameraImages/loc####.jpg convention and a strictly-digits camera number, pinning the frame proxy to the portal origin by construction; the list fetch refuses redirects and bounds the body it buffers. Frames are fetched at request time and never stored or redistributed. The dataset publishes no camera facing: the D1-D4 fields are the directions of the comparison images (static reference stills captured in 2016 under a different path), not a bearing for the live pan-tilt-zoom frame, so headings use the shared id-hash fallback at low confidence and are corrected with the in-app calibration gizmo. A camera that is temporarily out of service still answers 200 with a byte-identical "Image Unavailable" placeholder rather than an error (about 6% of the network at any moment), so such a camera reads as healthy; the frame it shows is the agency's, not a synthesized one. The licence requires the attribution statement above. Disable with CCTV_TORONTO_ENABLED=0.

  • Camera frame content. Public camera frames can contain people, vehicles and license plates, and the camera layer does nothing with them beyond putting them on the map. A successful upstream response is relayed as the provider served it: nothing in the camera pipeline blurs, redacts, enhances or restores it, and nothing there runs face, plate or object detection or otherwise recognises or classifies what is in the picture. (The ALPR layer described below maps where plate-reader cameras are, from locations contributors tagged in OpenStreetMap; it reads nothing from any camera frame.) When an upstream has no frame for a camera, what you see instead is a Google Street View still or the app's own placeholder card; the panel's source badge names which of them you are looking at, and a refresh that fails after a frame has arrived leaves the last good picture on screen rather than replacing it. The browser resamples each frame for display: onto a fixed 1920x1080 surface for the camera's projection plane in the scene, and onto a 192x108 canvas for the small ambient card. That scaling is the only change made to the picture, and the only pixels the camera layer reads back are a 64x36 downscale hashed to tell whether the picture has changed. Live streams are piped through; the still path reads the image into memory to pass it on — TxDOT wraps its JPEG in a JSON envelope, which is decoded there — and no frame is written to disk (the disk cache, .gev-cache/, holds feed JSON for other layers and never camera imagery). Outside that pipeline, the voice assistant is the one feature that sends imagery anywhere: when it answers a question about what is in view it may attach a downscaled screenshot of the rendered scene — including any camera plane on screen — to the request it sends to the voice model. Frames are fetched only from server-registered camera URLs — a client cannot hand the proxy a URL (see SECURITY.md). What the app does stays inside the line README draws: no named-person search, no face recognition, no tracking individuals.

  • Transit (GTFS-Realtime). The proxy requests only registered operator feeds, validates redirects, bounds responses, and uses conditional requests, short snapshot caching and failure backoff. All sixteen registered regions are live-enabled; each can be disabled independently. Vehicles use delayed playback between reports, with report age and waiting states shown separately. Session-local selected trails are available for every feed. MBTA additionally retains up to 15 minutes of recently observed positions in the running proxy, so available history can survive a browser reload; server restart clears it. History reads never fetch upstream, and other feeds have no proxy retention. Nothing is archived to disk or collected in the background. Operator text credits are included as a courtesy and do not imply endorsement. Heights are aligned to work with Google 3D tiles; subway markers are shown at street level because these feeds do not supply depth. The TTC feed is BusTime, the surface system: it carries buses and streetcars and no subway at all. About four in ten of its vehicles report no route at all (unassigned or deadheading), and those are shown with the feed default rather than a route-established mode. It sends no ETag or Last-Modified, so its conditional requests fall through to the ordinary snapshot cache. Three Golden Horseshoe neighbours run alongside it — MiWay, Hamilton HSR and Durham Region Transit — each bus-only and each polled only near its own region. Durham Region Transit publishes no bearing on any vehicle, so those sprites take their heading from observed movement like any other feed that omits it. Guelph, Kingston and Barrie extend the same pattern eastward and north. Hamilton, Guelph, Burlington and YRT publish route ids that are not the number on the vehicle, so those entries carry a route-name table taken from each operator’s own published GTFS; any id missing from a table renders unchanged rather than blank. A label is never invented: YRT runs a route 9101 that appears nowhere in its published routes, so it stays as the feed sends it. Burlington’s is the one that cannot be shortcut: 351 is route 1 while 3510 is route 10, so the table is a real join rather than a trimmed prefix. GO Transit / Metrolinx is deliberately absent: its REALTIME feed requires an API key issued by manual review, which the keyless admission rule excludes (its static schedule download is keyless, but carries no vehicle positions). Barrie and YRT/Viva each invite acceptance of their licence through a form, and each licence also states that using the data is itself acceptance; this deployment relies on that clause, which is recorded in both entries. Grand River Transit in Waterloo is absent for a different reason: it answers, but its feed header was months stale and it publishes no per-vehicle timestamps, so it would render vehicles that look live and are not. Ottawa’s OC Transpo falls to the same keyless admission rule as GO Transit — its realtime feed requires an API key. London Transit and Thunder Bay Transit publish vehicle positions over plain HTTP with no HTTPS endpoint available. Every other Ontario system — Brampton, Oakville, Niagara, Milton, Windsor, Greater Sudbury, UP Express and a dozen smaller operators — publishes static GTFS schedules only, with no realtime vehicle positions to register. Between the nine included and these exclusions, every Ontario realtime vehicle-position feed catalogued in the Mobility Database is accounted for.

  • Radio Browser. /api/radio/stations discovers official API mirrors, makes bounded and coalesced healthy/geolocated HTTPS-station queries, caches the normalized public-domain directory for 45 minutes, and may serve the last good catalog for up to seven days during an outage. Refreshes must meet minimum accepted-query and station coverage before replacing a warm catalog; schema-valid responses whose rows all fail the product's health policy do not count as successful queries. A usable partial cold catalog is explicitly DEGRADED, and malformed or empty successful payloads are rejected atomically. Every directory and click-count request rejects redirects, validates all resolved addresses as globally routable (including reserved/documentation IPv4 and special/non-global IPv6 exclusions), and pins the TLS connection to a validated address. Only MP3/AAC non-HLS directory rows with public HTTPS stream targets are returned; favicons are intentionally omitted. Pressing play connects one browser audio element directly to the selected broadcaster and calls the directory's click counter through known-ID-only POST /api/radio/click/:uuid. GEV never proxies, caches, records, bundles, or redistributes audio. Radio Browser supplies station-level tags, not dependable current-song or upcoming-program metadata, so Radio filtering never claims either. Direct playback exposes the listener's IP address to the broadcaster, whose own stream terms apply.

  • TomTom Traffic. Optional and BYOK: without TOMTOM_API_KEY the traffic layer runs its built-in simulation and no TomTom data (or attribution) appears. With a key, flow vector tiles are fetched through the server-side /api/tomtom proxy (120 s cache + a daily tile-budget governor — TOMTOM_DAILY_TILE_BUDGET, default 6,000 — sized so a 31-day month stays inside TomTom's 200K monthly free allowance; still a configurable application safety ceiling, not a guarantee; TomTom's current pricing lists 200K free tile requests per month) and the "Traffic flow data © TomTom" credit is registered in the Data attribution popover the moment live mode activates. TomTom data is served live and cached only transiently (≤120 s TTL under .gev-cache/, gitignored) — it is not bundled or redistributed. One 23 KB point-in-time tile snapshot is committed as a decode-test fixture (src/data/fixtures/, © TomTom, never served to the app).

  • Routing (OSRM / FOSSGIS). /api/route proxies the public OSRM instances FOSSGIS e.V. runs for the OpenStreetMap community (car, bike, foot profiles). They are keyless and intended for fair, interactive use — the proxy rate-limits clients (60/min, 200/min total), caps route span and response size, caches each route for 10 minutes, and identifies itself in the User-Agent. Heavy or automated use must run its own OSRM. Routes are computed from OpenStreetMap data (ODbL); the Directions layer and voice routes never redistribute them. A route the router cannot find is reported as such; the Directions layer draws nothing in that case, and voice routes fall back to a clearly labeled straight line.

  • Re:Earth Terrain. Keyless (no API key). Used two ways: (1) src/mapStackController.js swaps in a Cesium.CesiumTerrainProvider pointed at Re:Earth's cesium-mesh/ellipsoid quantized-mesh endpoint for globe stacks without a Cesium ion token (e.g. OSM), replacing a flat EllipsoidTerrainProvider; falls back to the flat provider if the endpoint can't be reached. (2) The server-side /api/terrain/heights proxy (disk-cached, serve-stale) resolves per-point ellipsoidal ground height for entity placement. Both are best-effort with a keyless-safe fallback (bundled EGM96 geoid math) if Re:Earth is unreachable.

  • OSRM on the FOSSGIS routing servers. Keyless (no API key). Every route is requested by a person: clicking A and B in the Directions layer, or a voice "route from A to B". The server-side /api/route proxy sends an identifying User-Agent, pins the upstream host, accepts 2-12 coordinates, rejects any leg over 600 km or a total over 2,500 km, caps the buffered response at 8 MB, times the upstream out at 12 s, rate-limits per client, caches each route for 10 minutes, and coalesces identical requests that are in flight at the same time. Turn-by-turn maneuvers are asked for only when a caller wants them (steps=1), so the callers that do not read them send the smaller request. The "fix the map" link the policy asks for is in the Data attribution popover beside the OpenStreetMap credit.

  • Mapped installations. OpenFreeMap military polygons use a bundled Overture/OSM name index; wide views show named points. Optional operator-configured Overpass and explicit Google Places searches keep their own source paths. Mapped data does not establish current activity or complete coverage.

  • Place search. Named-place fly-to uses Google Geocoding when a Maps key is configured, then Photon's public instance, then /api/geocode (Nominatim search) when neither answers. /api/geocode uses the shared Nominatim forward-search queue at no more than one request per second, sends an identifying User-Agent and Referer, caches answers for five minutes, shares one upstream call between identical searches already in flight, bounds the queue so a burst is refused rather than held, and drops a queued search whose caller has given up. It asks for one result per search and is not used for systematic or bulk queries.

  • Cockpit regional briefing. /api/regional-brief rounds aircraft coordinates into 0.1° cache cells, caches results for five minutes, and resolves physical regions from bundled public-domain Natural Earth polygons without reverse-geocoding requests. Google News RSS is queried with the resolved locality/region first; GDELT is used only when that RSS query fails or is empty. Google's published Google News terms restrict that source to personal, noncommercial use, so commercial deployments must disable/replace it or obtain separate permission; GDELT permits commercial dataset use with citation. The Data attribution popover identifies the active headline sources; article links retain publisher attribution. Headlines are location-query matches, not verified incidents, risk rankings, or evidence that a location is safe. Empty, partial, stale, and unavailable source states remain distinct. Open-Meteo supplies current conditions independently of the news source. WX OFF disables cockpit weather rendering only; the Local Info briefing still fetches its source-backed weather values and displays the required linked Open-Meteo credit.

  • Dynamic weather presentation. While cockpit mode is active, /api/weather-effects requests current Open-Meteo observations for the aircraft/camera location, rounds coordinates into 0.1° cache cells, caches results for five minutes, and may retain a stale observation for up to 30 minutes during a transient outage. WMO condition code selects the visual family; observed cloud cover, precipitation, visibility, wind speed, and wind direction bound its strength and motion. Missing or expired weather renders no synthetic atmospheric effect, and normal globe view never renders the weather overlay.


Bundled snapshots

Static datasets shipped in the repo for an out-of-the-box experience. None are MIT — each keeps its own license (see the carve-out in LICENSE). Each folder also has its own provenance README.

The Bhote Koshi event pack, under public/events/, contains Vantor imagery crops and a GeoPera-derived river centerline under CC BY-NC 4.0, separately from the MIT code. The derived coordinate dataset in src/data/bhoteKoshiFloodPath.js has the same non-commercial restriction and is compiled into the Nepal scene. Commercial users must obtain separate permission or exclude both the event pack and that source-derived dataset from their source and build. Deleting only public/events/bhote-koshi-2026/ does not remove all restricted data; excluding the scene also requires removing its registrations and imports before building. Linked witness posts and geolocation-map records retain their owners' terms; no social-media clips or cached posters are bundled. Other snapshots below are under src/data/local_data/.

Dataset Folder License Commercial use? Attribution
Datacenters (4,351) datacenters/ ODbL 1.0 (OpenStreetMap extract) ✅ (attribution + share-alike on data) © OpenStreetMap contributors (shared credit)
Dams (704) dams/ ODbL 1.0 (OpenInfraMap / OSM extract) ✅ (attribution + share-alike on data) © OpenStreetMap contributors (shared credit) + Open Infrastructure Map
Military area names (36,466) osm_military_names/ ODbL 1.0 (OpenStreetMap, via Overture Maps) ✅ (attribution + share-alike on data) © OpenStreetMap contributors (shared credit) + Overture Maps Foundation
TeleGeography Submarine Cable Map (712 cables + 1,917 landing points) telegeography_submarine_cables/ CC BY-NC-SA 3.0 ❌ NonCommercial — remove for commercial use "© TeleGeography — submarinecablemap.com"
Natural Earth physical regions (1,046 land + 292 marine named polygons) natural_earth/ Public domain ✅ (no restrictions) "Made with Natural Earth" (courtesy credit — not legally required)
DataSF Analysis Neighborhoods (41 SF neighborhood polygons) neighborhoods/ PDDL 1.0 (public domain) ✅ (no restrictions) "City & County of San Francisco — DataSF" (courtesy — not legally required)
Natural Earth countries, states and provinces (260 admin-0/map units + 4,587 admin-1 polygons) natural_earth/ Public domain ✅ (no restrictions) "Made with Natural Earth" (courtesy credit — not legally required)
US Census Bureau counties (3,235 county polygons) us_census_counties/ Public domain ✅ (no restrictions) "U.S. Census Bureau" (courtesy — not legally required)
CCTV ground heights (3,445 cameras) cctv_ground_heights/ Precomputed camera placement heights, aligned to work with Google Photorealistic 3D Tiles (folder README) — —
CCTV Camera Database model-enrichment extract v2.26.0 (17 camera-model records) src/layers/cctv/modelSpecs.js CC0-1.0 (public domain dedication) ✅ (no restrictions) "Specs: cctv-database.com" (courtesy — not legally required)

⚠️ TeleGeography is bundled but NonCommercial

The submarine-cable GeoJSON is CC BY-NC-SA 3.0 (Attribution-NonCommercial-ShareAlike). It is bundled so the cables layer works out of the box, but it is not covered by this project's MIT license. CC BY-NC-SA permits redistribution with attribution and share-alike — which is exactly how it ships here — but the NonCommercial clause means:

If you use God's Eye View commercially, delete src/data/local_data/telegeography_submarine_cables/ (or obtain a commercial license from TeleGeography). It is one self-contained folder; the rest of the app runs without it.

The richer structured dataset is licensed separately/commercially by TeleGeography.

ALPR camera mapping

The optional ALPR layer reads OpenStreetMap surveillance:type=ALPR nodes from a community-hosted hourly US/Canada extract, using detail vector tiles. It shows mapped locations and available tags, not plate records, camera video, current operating status or exhaustive coverage. OSM edit timestamps are not presented as field-verification dates. Other regions show no ALPR data.

Reads are viewport-bounded, with at most 16 tiles per country, four concurrent reads per country, 1,500 displayed records and an hour-long decoded-tile cache. Displayed OSM-derived layers retain a short inline OpenStreetMap credit, plus OpenMapTiles while OpenFreeMap tiles are used; Data attribution retains the full credits. ODbL permits commercial use with attribution and applicable database share-alike/access obligations; it does not license the application code. Trimmed test-only tile fixtures retain their provenance in src/data/fixtures/README.md.

CCTV Camera Database (src/layers/cctv/modelSpecs.js)

The CCTV layer's hardware-model specs are a small verbatim extract (v2.26.0) of the CCTV Camera Database, an open dataset of camera models transcribed from manufacturer datasheets, dedicated to the public domain under CC0-1.0. Only the records for hardware that the integrated public catalogs name (King County, Sarasota County and Sioux Falls) are bundled, compiled into the module. Nothing is fetched at runtime. The records describe camera products (optics, resolution, night vision) only, never endpoints, stream paths or access data. CC0 requires no attribution; the CCTV HUD credits it anyway as SPECS: CCTV-DATABASE.COM beside any spec line it renders.

Bundled OpenStreetMap data

Bundled OSM-derived data is distributed under ODbL 1.0, separately from the MIT code: datacenters, dams (via Open Infrastructure Map), military names, and OSM test fixtures. Keep © OpenStreetMap contributors and offer modified databases under ODbL.

NASA FIRMS acknowledgement

We acknowledge the use of data and/or imagery from NASA's Fire Information for Resource Management System (FIRMS) (https://earthdata.nasa.gov/firms), part of NASA's Earth Observing System Data and Information System (EOSDIS).

FIRMS active fires are fetched live at runtime (CC0 / U.S. public domain data): the /api/firms server-side proxy merges the three VIIRS NRT sources (NOAA-20, NOAA-21, Suomi-NPP) and MODIS NRT (Terra + Aqua), clamped to the trailing 24 h, cached 30 min to respect the shared MAP_KEY transaction quota. Requires a free FIRMS_MAP_KEY (https://firms.modaps.eosdis.nasa.gov/api/map_key/); the layer is empty without it. The former bundled 2026-05-25 snapshot was removed 2026-07-16.

Natural Earth physical regions (natural_earth/)

Curated from the Natural Earth 10m physical vectors (https://www.naturalearthdata.com/ — fetched from the canonical nvkelso/natural-earth-vector GitHub repo, commit ca96624a56bd078437bca8184e78163e5039ad19, 2026-07-28): ne_10m_geography_regions_polys (mountain ranges, deserts, plateaus, peninsulas, islands, …) → regions.json and ne_10m_geography_marine_polys (seas, gulfs, straits, bays) → marine.json. They back the voice-annotation resolver's named-natural-region lookup (src/data/naturalEarthRegions.js), so "outline the Alps" draws the real range polygon offline.

Curation (provenance in each file's meta header): named features only, outer rings only, Douglas-Peucker simplified at ~0.01° with coordinates rounded to 3 decimals, sub-20 km² MultiPolygon crumbs and zero-area sliver artifacts dropped (7.3 MB source → 2.5 MB pack).

Natural Earth is public domain (no permission needed, no attribution legally required — https://www.naturalearthdata.com/about/terms-of-use/). We credit anyway: "Made with Natural Earth". Registration in the in-app dataCredits.js attribution list ships with the resolver wiring (see below).

DataSF Analysis Neighborhoods (neighborhoods/)

neighborhoods/san-francisco.json bundles the City & County of San Francisco's official "Analysis Neighborhoods" dataset (41 neighborhood polygons; DataSF dataset j2bu-swwd, catalog map view p5b7-5n3h). It backs the voice-annotation resolver's offline neighborhood-boundary lookup (src/data/neighborhoodPolygons.js), so "outline Chinatown" draws the city's real boundary polygon with no network dependency.

The dataset is licensed PDDL 1.0 (Open Data Commons Public Domain Dedication and License — public domain; the DataSF metadata declares licenseId: "PDDL"). No attribution is legally required; we note the source here and in the folder's SOURCE.md, which records the retrieval date (2026-07-30), exact download URL, license evidence, and the deterministic transform (scripts/build-sf-neighborhoods.mjs: nhood → name, ~2 m Douglas-Peucker simplification, 6-decimal rounding).


Weather sources

ECMWF IFS wind

Wind also offers ECMWF IFS 10 m forecasts from the keyless ECMWF Open Data service. The proxy reads its JSON Lines inventory and byte-range fetches 10u/10v GRIB messages, optionally adding 2t (2 m temperature) or msl (mean sea-level pressure) from the same run and forecast time. It resamples these fields to the approximately 1° display grid. Data is licensed under CC BY 4.0. The ECMWF Terms of Use also apply. In-app attribution identifies this service as based on ECMWF data and products, links the CC BY 4.0 licence, identifies resampling and animation as modifications, and retains the required ECMWF liability disclaimer. Both model issue time and the selected forecast valid time appear in the WEATHER panel. These are model forecasts, not observations.

NOAA GFS wind

The optional Wind layer animates the global 10 m wind field from NOAA's Global Forecast System (GFS). The /api/wind server-side proxy selects the latest available 0.25° cycle, reads its .idx inventory, byte-range fetches only the UGRD/VGRD 10 m GRIB2 messages, optionally adding TMP at 2 m or PRMSL at mean sea level from the same run and forecast time. It decodes the selected messages with ecCodes (WASM), resamples to a compact grid (1° by default), and serves a manifest plus Float32 U/V and optional scalar values. It is keyless, cached per cycle for an hour, and is a forecast, not an observation: the particles show model flow, not measured wind. The renderer bakes bounded curves through the sampled field and animates their phase on the GPU, with a canvas fallback. Any display lift is a visual aid and does not change the forecast's 10 m level. NOAA GFS data is U.S. public domain; the credit above is a courtesy and does not imply endorsement.

For both models, optional temperature is normalized from K to °C and pressure from Pa to hPa before delivery. A missing, malformed or timed-out companion field does not discard valid wind: the manifest marks that field unavailable, and the UI retains wind without inventing scalar values. The proxy caches by model and requested field, with bounded current/previous grids and shared in-flight loads. Wind speed shading is computed locally from U/V and needs no companion download. The legend and map-center reading explain units and forecast validity; the animation is a visual flow through one forecast, not advancing forecast time. Optional globe relief uses existing terrain vertex normals for view lighting; without those normals it shades global globe curvature only, not local terrain relief. Neither mode represents measured sunlight or a new elevation source. This Wind prototype adds no cloud-volume or radar data. Mapped.earth's public bundles were studied for rendering ideas, but no code or assets were reused and no application licence granting reuse was found. Its presentation is not a weather-data source for this implementation.

Observed weather: NOAA nowCOAST

The Weather section provides keyless, observed MRMS radar reflectivity for the contiguous United States and infrared satellite imagery. Fixed upstream WMS services: https://nowcoast.noaa.gov/geoserver/observations/weather_radar/ows and https://nowcoast.noaa.gov/geoserver/observations/satellite/ows.

  • conus_base_reflectivity_mosaic: approximately 1 km, usually 4-minute updates. dBZ measures radar reflectivity, not rainfall rate, probability or future rain. Coverage gaps do not mean no precipitation. The numeric legend follows NOAA's weather_radar_base_reflectivity style.
  • goes_longwave_imagery: GOES-19/18 Band 14, approximately 2 km, 5-minute updates, regional North America. Clouds only softly dims pixels with a linear brightness ramp from 0.40 to 0.70; Full image retains source alpha. This is a display filter, not a cloud mask or measured cloud volume.
  • global_longwave_imagery_mosaic: approximately 3 km, hourly, nominal 60°S–60°N coverage and typically 2–3-hour latency. It is slower global context.

The UI displays the exact advertised observation time separately from acquisition; latest means the newest available observation, not zero-delay real time. Up to 13 recent advertised frames can be replayed as history. No nowcast is synthesized. Tiles use WMS 1.1.1 EPSG:4326 longitude/latitude bounds; Cesium's geographic 2×1 root grid is capped at level 6 for radar and regional GOES. Global infrared uses one fixed 2048×1024 geographic image on both hosts: the source's request-dependent contrast otherwise creates brightness seams between tiles. The browser decodes and filters it once, then crops 256 px tiles bounded to the manifest extent at maximum level 3. This broad context view has a coarser display resolution than its 3 km source. No browser reprojection is used. Browser imagery owns a displayed frame and a staging frame, retaining the outgoing layer for one render after admission.

On Google 3D Tiles each observed product is instead a raised shell showing one whole-extent image per frame (up to 4096×2048; global infrared 2048×1024). Every product except global infrared also draws a 4096×2048 detail window around the view, requested with a 2:1 bbox inside the product bounds, rounded to 0.25°. The proxy has an 8-request concurrency budget and a 12-second deadline; tiles (256, 512 or 1024 px) are capped at 1 MiB or 4 bytes per pixel plus 64 KiB, whichever is larger, and whole-extent and detail images at 16 MiB. Its shared cache holds up to 128 images and 16 MiB, each exact-time image for at most 24 hours. Metadata refreshes every two minutes with explicitly stale last-good fallback. No key, new dependency, image reprojection job, or full-disk image download is needed.

Credit: NOAA nowCOAST, NWS/OAR MRMS, NESDIS GOES and global satellite partners. NOAA disclaimer. Community context: #85, #588 radar, and #457 clouds. This implementation is original; those contributions have not been merged here.

Weather: NHC/CPHC cyclone advisories

  • Sources: NHC current tropical cyclone status and NOAA tropical weather summary GIS.
  • Rights/credit: NOAA/NWS National Hurricane Center / Central Pacific Hurricane Center; NWS public-data terms. Fetch official products at runtime; no bundled advisory archive and no NOAA endorsement implied.
  • Coverage/meaning: Atlantic and eastern/central North Pacific, not global cyclone coverage. Status position time and advisory issue time remain separate. Forecast track, points and cone require matching advisory numbers across all GIS parts. Cone means uncertainty in the forecast center track, not storm size or a complete hazard boundary.
  • Delivery: keyless same-origin /api/cyclones, five-minute singleflight cache, fixed upstream endpoints, bounded bodies/geometry/deadline, explicit unavailable/stale states. Direct status fetching is unsuitable in browsers because NHC does not advertise CORS.

Weather: observed lightning density

  • Source: NOAA nowCOAST lightning detection WMS, fixed ldn_lightning_strike_density layer and lightning_density style.
  • Rights/credit: NOAA/NWS nowCOAST; derived from Vaisala NLDN/GLD360. Official product description and public distribution terms permit distribution of this NOAA Level-5 derived product, not raw Vaisala detections.
  • Meaning: 15-minute accumulated density on an approximately 8 km grid; source color scale is strikes per km² per minute ×10³. Not individual GLM optical flashes, a live ground-strike counter, an all-clear indication, or global coverage.
  • Coverage: 110°E across the Pacific/Americas to 0°, 25°S–80°N. Display exact advertised observations; ten-minute metadata refresh, source-matched colors, bounded shared imagery cache.

Community weather prior art

The weather design builds on Gustavo Beneduzi's retained GFS/ECMWF contribution commits (#459, #464). Related community proposals informed the observed-weather experience: Sandiv D's on-demand radar and imagery controls (#588); Gustavo Beneduzi's GOES and GLM source work (#457, #458); and HadiMuhammed's NOAA hazard provenance and freshness work (#414). The fixed nowCOAST imagery and NHC advisory implementations are original maintainer work; this acknowledgement does not represent merging those four PRs or equate NOAA density imagery with the raw GLM product.


In-app attribution

The required Google Maps / Cesium credit renders on the on-globe credit line (#cesium-credits, bottom-left) and must stay visible — including in clean-view and recording modes (the whole line, logo + "Google Maps" + the "Data attribution" link, stays on screen; only the GEV panels/HUD fade). The layer-specific credits (adsb.lol, adsbdb, TeleGeography, OSM datacenters/dams/roads, NASA FIRMS, CelesTrak, USGS, City of Austin, Fintraffic, GBFS, Radio Browser, OpenSky, AISStream) are registered into the expandable "Data attribution" popover on that credit line via viewer.creditDisplay.addStaticCredit(new Cesium.Credit(html, /* showOnScreen */ false)) — see src/data/dataCredits.js. When you add a new data source, add its license and attribution to this file and append an entry to DATA_CREDITS in src/data/dataCredits.js so it surfaces in the app.