Tracking a civil flight asks Planespotters for that aircraft's photo, once per aircraft, straight from the browser. The CONTEXT panel's CONTACTS view shows it under the flight's name with the photographer's credit, as a plain link to the photo's page. Only images on plnspttrs.net and pages on www.planespotters.net are ever shown or linked. Military aircraft and a converted TR-3B are never looked up. Flight lookups (type, route, photo) whose source failed temporarily are asked again after a 60-second cool-down; an answer, found or not, and a permanent refusal stay final for the session. A route belongs to the callsign it was looked up for, so a callsign change drops the old route. Browser QA scripts that track a flight answer the photo lookup themselves, so they never call the third party.
160 KiB
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.mdrecords 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 kept in server memory 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, 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 |
Planespotters.net (api.planespotters.net/pub/photos/hex/{hex}) |
One thumbnail photo of the tracked aircraft, by ICAO hex, in the CONTEXT panel's CONTACTS view under the tracked flight's name | Planespotters photo API terms; each photo remains the copyright of its photographer. Thumbnails may be hotlinked on the condition that the photographer is named next to the photo and the photo links to its Planespotters page with a followable link | "Photo © {photographer}" beside every photo, linked to its Planespotters page; "Planespotters.net" in Data attribution |
| AISStream.io | Live vessels (AIS) | Free, beta, no formal ToS; AIS is a public broadcast | "AISStream.io" (courtesy) |
| CelesTrak | Satellite TLEs (SGP4) and SATCAT records (object type, operational status, owner) that file each satellite under a class | 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)" |
S2 Underground GhostMaps (github.com/s2underground/GhostMaps) |
S2 GhostMaps layer: the current edition of S2's KMZ intel products (Common Intelligence Picture, 30-day kinetic pull, Border Crisis Map, Iran and Yemen products, newest incident drop). Keyless. /api/ghostmaps reads the branch head from git's ref advertisement every 15 s (GHOSTMAPS_POLL_SECONDS, minimum 5 s), lists the tree through the GitHub REST API only when the head changes (optional GITHUB_TOKEN), downloads files by commit-pinned raw URLs into .gev-cache/ghostmaps/ and pushes new catalogs to browsers over server-sent events |
CC BY-NC-SA 4.0 (repository README: "S2 Underground © 2025 by S2A1"); non-commercial, attribution required; files are fetched at runtime, never stored in this repository | "S2 GhostMaps intel products: S2 Underground © by S2A1, CC BY-NC-SA 4.0" — shown in-app |
| 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)" |
FAA Special Use Airspace (services6.arcgis.com FeatureServer Special_Use_Airspace) |
Prohibited & Restricted Airspace layer: US prohibited (P) and restricted (R) special-use airspace polygons (not the UAS Facility Map or UAS flight restrictions), altitude limits from the *_VAL/*_UOM/*_CODE fields, times of use, and controlling agency |
U.S. public domain (FAA aeronautical data published through the FAA AIS Open Data portal); fetched keyless through /api/drone-airspace (1-hour server cache). Informational only — not a substitute for official UAS flight-planning tools |
"Prohibited & restricted airspace: FAA Special Use Airspace" |
iNaturalist API (api.inaturalist.org/v2/observations, /v1/grid/{z}/{x}/{y}.grid.json) |
Wildlife Sightings layer: verifiable wildlife observed within the last 48 h (whales 7 d), by observation time, in the current view, with taxon, observation time, quality grade and eligible photo | Per-record licences; observations default CC BY-NC. Photos CC0/BY/BY-SA/BY-NC/BY-NC-SA shown; ND and all-rights-reserved photos link-only. Keyless via /api/inaturalist/observations (5-min cache; global sample 10 min; stale ≤ 1 h; 60 requests/min and 8,000/day upstream caps). NonCommercial content: commercial redistributors must filter to CC0/BY/BY-SA or remove the layer. No AI training on this content |
"Wildlife sightings: iNaturalist contributors (licences per record; photos credited on each card)" |
Acartia (acartia.io/api/v1/sightings/current) |
Wildlife Sightings layer: Salish Sea marine mammal reports with validated species, observation time, reporting provider and trust flag; WHALES includes only the frozen cetacean list | CC BY 4.0, each provider credited per sighting. Keyless via /api/acartia/sightings (10-min cache; stale ≤ 24 h). Positions rounded to 0.01° on the server; free-text comments excluded. Marine-conservation use; Be Whale Wise |
"Wildlife sightings: Acartia (CC BY 4.0; each provider credited per sighting) · Be Whale Wise" |
| 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 |
| Icelandic Road and Coastal Administration (Vegagerðin, IRCA) | CCTV camera catalog + frames, Iceland road cameras | CC BY 4.0 (IRCA terms of use, Act 45/2018) — attribution REQUIRED; no suggestion of IRCA endorsement; IRCA and State logos are excluded; real-time data is provided as is | "Icelandic Road and Coastal Administration (Vegagerðin)", CC BY 4.0 |
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) |
| Hong Kong Transport Department / DATA.GOV.HK | CCTV camera catalog + frames, Hong Kong traffic snapshot cameras | DATA.GOV.HK Terms of Use — attribution REQUIRED | "Hong Kong Transport Department / DATA.GOV.HK" |
Webcam Romania — Giroc (webcamromania.ro, w4.webcamromania.ro) |
Optional Giroc camera metadata, JPEG snapshot and live HLS video | Provider terms: video belongs to the original camera operator; no open video redistribution licence asserted. The camera page offers an embed. Local opt-in via CCTV_SOURCES_FILE; media is fetched at runtime, never bundled. |
"Webcam Romania · webcamromania.ro"; source link and rights notice in the Data attribution popover |
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" |
Houston TranStar (traffic.houstontranstar.org, frames www.houstontranstar.org) |
CCTV camera catalog + frames, Greater Houston | No licence. The TranStar disclaimer (Content Usage) prohibits copying or distribution, and external framing or linking to specific images, without TxDOT's prior written permission. Off by default; enable only if you hold TxDOT's written permission | "Houston TranStar" (courtesy) |
Autostrada del Brennero (A22) (catalog tourism.api.opendatahub.com, frames www.autobrennero.it/WebCamImg/) |
CCTV camera catalog + frames, A22 Brenner–Modena motorway, Italy | Public Autobrennero webcam images; camera list republished by the Open Data Hub, whose records are tagged CC0 (ClosedData: false, licence holder Autobrennero); Autobrennero publishes no terms of its own for the images |
"Webcam images © Autostrada del Brennero S.p.A., via the Open Data Hub (NOI Techpark)" (courtesy) |
| 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 |
| SMTR Rio de Janeiro (dados.mobilidade.rio) | Transit layer live vehicles, Rio de Janeiro: municipal buses (SPPO) and the Mobi-Rio BRT, as two feeds | CC BY 4.0, stated on both data.rio catalog pages. Keyless GTFS-Realtime published by the Secretaria Municipal de Transportes, labelled beta, with a gateway limit of 5 requests a second and 60 a minute. Line names come from SMTR’s GTFS routes.txt (dados.mobilidade.rio/gtfs/schedule), under the same licence. |
Attribution to SMTR / Prefeitura da Cidade do Rio de Janeiro under CC BY 4.0 |
| ZDiTM Szczecin (zditm.szczecin.pl) | Transit layer live vehicles, Szczecin, Poland: buses and trams as one feed | CC0 1.0, stated on the ZDiTM developer page: “The data are provided free of charge under the CC0 1.0 licence, for use in any context, with no prior notification required.” Keyless GTFS-Realtime; the page says one update a minute, measured at about every 20 seconds. The feed carries no route id, so every vehicle takes the default bus mode. | None required (CC0); credited to ZDiTM Szczecin as a courtesy |
| Carris Metropolitana (api.carrismetropolitana.pt) | Transit layer live vehicles, Lisbon Metropolitan Area, Portugal | Keyless GTFS-Realtime documented in the operator’s public API repository (github.com/carrismetropolitana/api). No licence is stated for the realtime endpoint; the operator’s static GTFS is CC BY 4.0. Included on the same basis as the Metro Transit and OVapi feeds and credited as a courtesy; it can be switched off if Carris objects. Speeds are published in km/h and converted to m/s by the proxy. Route ids are read as the line number per the operator’s /v2/routes. |
Courtesy credit to Carris Metropolitana |
| Prague PID (api.golemio.cz) | Transit layer live vehicles, Prague and Central Bohemia, Czechia | CC BY (https://pid.cz/o-systemu/opendata/). Stated: “Data, která lze stáhnout přímo zde z webu, jsou stejně jako celý obsah webu opatřena licencí CC-BY” The PID open-data page lists this realtime feed and licenses the data it publishes under CC BY, crediting the author and any changes. The same page says data served from other sources follows that source’s licence; the feed is served by Golemio, the city’s data platform, which states none of its own. Keyless since the catalogue moved it off the X-Access-Token endpoint. Speeds are m/s, checked against movement on 2026-11-07. Route ids are L plus a number whose range gives the mode and the line (metro L991 is A, train L1004 is S4, ferry L1801 is P1), read from PID’s GTFS routes.txt. |
Pražská integrovaná doprava (PID) / Golemio |
| Warsaw buses and trams (mkuran.pl) | Transit layer live vehicles, Warsaw, Poland | Warsaw Open Data Project Usage Terms (https://mkuran.pl/gtfs/). Stated: “The City Hall requires a credit by providing the name Miasto Stołeczne Warszawa, data download date (use the timestamp from the FeedHeader) and link to http://api.um.warszawa.pl.” Positions come from the Warsaw City Hall API, repackaged as GTFS-RT by Mikołaj Kuranowski’s unofficial feed. The credit names the city, links its API and carries the date of the feed timestamp, the three things the terms ask for. Vehicle timestamps ran about two minutes old on 2026-11-07, which the delayed playback absorbs. | Miasto Stołeczne Warszawa (api.um.warszawa.pl) |
| Bordeaux TBM (bdx.mecatran.com) | Transit layer live vehicles, Bordeaux, France | Licence Ouverte / Etalab 2.0 (https://transport.data.gouv.fr/datasets/offres-de-services-bus-tram-et-scolaire-au-format-gtfs-netex-gtfs-rt-siri-lite). The quote is the licence field of the national access point’s dataset record (fr-lo is the Licence Ouverte), which asks only for credit. The apiKey in the URL is not a credential: it is the same fixed string printed in the open-data listing for everyone. Speeds are m/s. The trams (A–F) and BAT³ boats ride numbered route ids (tram A is 59), mapped from TBM’s static GTFS; other numbered lines are buses. |
Bordeaux Métropole (TBM) |
| Sendai City Bus (api-public.odpt.org) | Transit layer live vehicles, Sendai, Japan | CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Served by the Open Data Challenge for Public Transportation (ODPT) public API, which needs no key for this feed; the catalogue records CC BY 4.0 as its licence. Vehicle timestamps ran about two minutes old on 2026-11-07. Speeds are m/s. | 仙台市交通局 (Sendai City Transportation Bureau) / ODPT |
| Poznań buses and trams (ztm.poznan.pl) | Transit layer live vehicles, Poznań, Poland | ZTM Poznań open-data terms (https://www.ztm.poznan.pl/otwarte-dane/dla-deweloperow/). Stated: “Treści udostępniane są bezwnioskowo i bezpłatnie, na zasadach powszechnego dostępu i stanowią źródło informacji.” Reuse is free on three conditions: name the source, give the date of the last update, and say the data were processed. The credit names ZTM, says processed, and carries the date of the feed timestamp as the update date. The feed carries no bearing, so heading comes from movement between fixes. | Zarząd Transportu Miejskiego w Poznaniu (processed) |
| Gdańsk buses and trams (ckan2.multimediagdansk.pl) | Transit layer live vehicles, Gdańsk, Poland | CC BY 4.0 (https://dane.gov.pl/pl/dataset/38599,rozklady-jazdy-i-lokalizacja-przystankow-gtfs-rt). The national catalogue (dane.gov.pl) lists this dataset under CC BY 4.0. No bearing; heading comes from movement. Speeds are m/s. | Zarząd Transportu Miejskiego w Gdańsku |
| Edmonton Transit Service (gtfs.edmonton.ca) | Transit layer live vehicles, Edmonton, AB | City of Edmonton Open Data Agreement (https://www.edmonton.ca/transportation/Web-version2.1-OpenDataAgreement.pdf). The agreement is the same municipal template as Mississauga and Burlington: a licence to use, modify and distribute for any lawful purpose, in any medium. It was read from search excerpts; the PDF itself would not extract here. Route ids are zero-padded. Speeds are m/s. | Contains information licensed under the Open Data Agreement – City of Edmonton |
| Halifax Transit (gtfs.halifax.ca) | Transit layer live vehicles, Halifax, NS | Open Government Licence – Halifax v1.0 (https://www.halifax.ca/home/open-data/open-data-license), modelled on OGL – Canada 2.0. Stated: “The information provider grants you a worldwide, royalty-free, perpetual, non-exclusive licence to use the Information, including for commercial purposes, subject to the terms below.” No logos or implied endorsement. Speeds are m/s. | Contains information licenced under the Open Government Licence – Halifax |
| Victoria Regional Transit (bct.tmix.se) | Transit layer live vehicles, Victoria, BC | BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use). Stated: “BC Transit grants you a limited, revocable and non-exclusive license to use, reproduce, and redistribute the Data in accordance with these Terms.” The grant is revocable, like the Ontario municipal templates. Route ids carry a -VIC system suffix. Speeds are m/s. |
BC Transit |
| Montpellier TaM (gtfsproxy.e-tam.fr) | Transit layer live vehicles, Montpellier, France | ODbL (https://transport.data.gouv.fr/datasets/offre-de-transport-tam-en-temps-reel-gtfs-rt-urbain-et-suburbain). The quote is the dataset record’s licence field. ODbL asks for credit and share-alike on a derived database; the layer redistributes no database, it draws the positions. Speeds are km/h: readings ran 3.3 times the measured movement on 2026-11-07, so the proxy converts them. | Montpellier Méditerranée Métropole (TaM) |
| Kraków buses (gtfs.ztp.krakow.pl) | Transit layer live vehicles, Kraków, Poland | No licence stated (https://gtfs.ztp.krakow.pl/). ZTP publishes this feed keyless on its own GTFS server and lists it in the Mobility Database, but states no licence there or on dane.gov.pl. Shipped on the same basis as Metro Transit and OVapi; switch it off if ZTP objects. | Zarząd Transportu Publicznego w Krakowie |
| Kraków trams (gtfs.ztp.krakow.pl) | Transit layer live vehicles, Kraków, Poland | No licence stated (https://gtfs.ztp.krakow.pl/). Same server and basis as the bus feed. | Zarząd Transportu Publicznego w Krakowie |
| Vilnius public transport (stops.lt) | Transit layer live vehicles, Vilnius, Lithuania | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2383). Published keyless by the city transport agency on stops.lt; no licence found. Shipped on the same basis as Metro Transit and OVapi. Answered 522 once on 2026-11-07 and normally since. | SĮ Susisiekimo paslaugos (stops.lt) |
| Bucharest public transport (gtfs.tpbi.ro) | Transit layer live vehicles, Bucharest, Romania | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2104). Keyless public endpoint from the metropolitan transport authority; no licence found. Same basis as Metro Transit and OVapi. | TPBI (Transport Public București–Ilfov) |
| Rome public transport (romamobilita.it) | Transit layer live vehicles, Rome, Italy | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-1776). Keyless file on the agency’s own site; the catalogue’s older /sites/default/files/ path now 404s. No licence found; same basis as Metro Transit and OVapi. Fewer than one vehicle in five carries a bearing, so most headings come from movement. |
Roma Servizi per la Mobilità |
| Turin GTT (percorsieorari.gtt.to.it) | Transit layer live vehicles, Turin, Italy | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2696). Official keyless endpoint; no licence found. Same basis as Metro Transit and OVapi. Route ids append U for urban lines. |
Gruppo Torinese Trasporti (GTT) |
| Venice ACTV buses (tpl.actv.it) | Transit layer live vehicles, Venice, Italy | ACTV open-data catalogue (https://actv.avmspa.it/it/content/catalogo-dei-dati-metadati-e-banche-dati-actv). ACTV lists this feed in its own open-data catalogue; that page would not render for a script, so its licence is not quoted. Same basis as Metro Transit and OVapi. Route ids append a two-letter network code (_UM, _ES, _UN). |
ACTV S.p.A. |
| Venice ACTV waterbuses (tpl.actv.it) | Transit layer live vehicles, Venice, Italy | ACTV open-data catalogue (https://actv.avmspa.it/it/content/catalogo-dei-dati-metadati-e-banche-dati-actv). Same catalogue and basis as the ACTV bus feed. | ACTV S.p.A. |
| Adelaide Metro (gtfs.adelaidemetro.com.au) | Transit layer live vehicles, Adelaide, SA | No licence stated for the realtime feed (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-1772). Official keyless endpoint; the state catalogue page refused automated reads, so no licence is quoted. Same basis as Metro Transit and OVapi. Speeds are m/s. The server picks its encoding from Accept, hence the override. | Adelaide Metro |
| MARTA buses (gtfs-rt.itsmarta.com) | Transit layer live vehicles, Atlanta, GA | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-1601). Official keyless endpoint; no licence found. Same basis as Metro Transit and OVapi. Speeds are m/s. | MARTA |
| Denver RTD (open-data.rtd-denver.com) | Transit layer live vehicles, Denver, CO | RTD GTFS-realtime licence agreement (https://www.rtd-denver.com/business-center/open-spatial-data/gtfs-realtime-license-agreement). Stated: “RTD hereby grants you non-exclusive, limited and revocable rights to use, reproduce, and redistribute the Data”. Read 2026-11-09: a click-through agreement that RTD may change without notice; it permits redistribution, asks for no credit wording, and bars RTD trademarks from use with the data, so the credit stays plain text. The feed itself is keyless. Speeds are m/s. | Regional Transportation District (RTD) |
| Cluj-Napoca CTP (cluj-rt-feed.gtfs.ro) | Transit layer live vehicles, Cluj-Napoca, Romania | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2614). Keyless; no licence found. Same basis as Metro Transit and OVapi. | Compania de Transport Public Cluj-Napoca |
| Iași CTP (iasi-rt-feed.gtfs.ro) | Transit layer live vehicles, Iași, Romania | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2118). Keyless; no licence found. Same basis as Metro Transit and OVapi. | Compania de Transport Public Iași |
| Rzeszów city transport (mpkrzeszow.pl) | Transit layer live vehicles, Rzeszów, Poland | MPK Rzeszów open data (https://www.mpkrzeszow.pl/otwartedane/). Listed on the operator’s open-data page, which names no licence. No bearing; heading comes from movement. | MPK Rzeszów |
| Málaga EMT (gtfs.emtmalaga.es) | Transit layer live vehicles, Málaga, Spain | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2213). Keyless; no licence found. Same basis as Metro Transit and OVapi. No bearing; heading comes from movement. | EMT Málaga |
| Carris (Lisbon city) (gateway.carris.pt) | Transit layer live vehicles, Lisbon, Portugal | No licence stated (https://mobilitydatabase.org/feeds/gtfs_rt/mdb-2930). Keyless official gateway; no licence found. Same basis as Metro Transit and OVapi. Carries neither bearing nor speed, and vehicle reports run about a minute old. Route ids append a variant. | Carris |
| BAS.MY Johor Bahru (api.data.gov.my) | Transit layer live vehicles, Johor Bahru, Malaysia | CC BY 4.0 (https://developer.data.gov.my/realtime-api/gtfs-realtime). Stated: “All GTFS Realtime feeds are licensed under CC BY 4.0.” Served keyless by Malaysia’s national open-data API, which caps GTFS Realtime at 4 requests a minute and refreshes positions every 30 seconds, so the proxy caches this feed for 30 seconds. Without the trailing slash the API redirects. Route ids append an operator code. | BAS.MY / data.gov.my |
| BAS.MY Kota Bharu (api.data.gov.my) | Transit layer live vehicles, Kota Bharu, Malaysia | CC BY 4.0 (https://developer.data.gov.my/realtime-api/gtfs-realtime). Same API, licence and rate limit as Johor Bahru. | BAS.MY / data.gov.my |
| Rouen Astuce (api.mrn.cityway.fr) | Transit layer live vehicles, Rouen, France | Licence Ouverte 2.0 (https://transport.data.gouv.fr/datasets/donnees-statiques-et-temps-reel-du-reseau-astuce-metropole-rouen-normandie). The metropolis publishes its realtime data under the Licence Ouverte (dataset record quoted); and this is its own TCAR vehicle feed from that record; the suburban TAE and TNI networks are separate feeds and are not read. Route ids carry the network prefix (TCAR:); line 90 is the Métro (a street-running light rail, drawn as a tram) and 99 the Calypso boat. |
Métropole Rouen Normandie (Astuce) |
| Toulon Mistral (feed-rdtpm-toulon.ratpdev.com) | Transit layer live vehicles, Toulon, France | Licence Ouverte 2.0 (https://transport.data.gouv.fr/datasets/reseau-de-transport-urbain-de-la-metropole-toulon-provence-mediterranee). Dataset record’s licence field quoted. Speeds are km/h: readings ran 3.5 times the measured movement on 2026-11-07, so the proxy converts them. Route ids are zero-padded. | Métropole Toulon Provence Méditerranée (Mistral) |
| Le Havre LiA (opendata.transports-lia.fr) | Transit layer live vehicles, Le Havre, France | ODbL (https://transport.data.gouv.fr/datasets/reseau-de-transport-en-commun-lia-gtfs-siri). The network publishes under ODbL (dataset record quoted); and this is its own GTFS-RT vehicle feed from that record; route ids carry the network prefix 8-. The layer draws positions and redistributes no database. Lines A and B are the tramway. |
Le Havre Seine Métropole (LiA) |
| Tours Fil Bleu (data.filbleu.fr) | Transit layer live vehicles, Tours, France | Licence Ouverte 2.0 (https://transport.data.gouv.fr/datasets/fil-bleu-syndicat-des-mobilites-gtfs-gtfs-rt). Dataset record’s licence field quoted. | Fil Bleu – Syndicat des Mobilités de Touraine |
| 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)" |
OpenSeaMap (tiles.openseamap.org) |
Sea Marks layer: raster overlay of buoys, lighthouses and ports (#10) | Chart tiles CC BY-SA 2.0; data ODbL 1.0 via OpenStreetMap | "Sea marks © OpenSeaMap contributors (CC BY-SA 2.0) · Data © OpenStreetMap contributors (ODbL)" |
OpenSnowMap (www.opensnowmap.org) |
Ski Pistes layer: raster overlay of ski runs and lifts (#10) | Tiles CC BY-SA; data ODbL 1.0 via OpenStreetMap; bulk tile download forbidden without prior agreement | "Ski pistes © www.opensnowmap.org (CC BY-SA) · Data © OpenStreetMap contributors (ODbL)" |
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): theaqhi-stationscatalog plusaqhi-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 withlatest=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-tableis joined by ID tolayer-static-features/VKR. Withoutlks=true, the latter returns WGS84[latitude, longitude]; the table'sx/yinstead 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_SOURCESdefaults to 400. -
Freeway Bureau and Highway Bureau, MOTC (Taiwan). National freeway cameras use the Freeway Bureau’s keyless MOTC 2.0 CCTV table, refreshed daily and fetched at runtime (never bundled). Freeway Bureau data follows the Open Government Data License, Taiwan v1.0; the app credits the Bureau, names the dataset and links the licence. If that catalog is unreachable and no last-good source list exists, the app falls back to the Highway Bureau’s free provincial-road CCTV XML feed, with attribution as requested by the Bureau. Its MJPEG streams are accepted only from cctv-ss01 through cctv-ss08.thb.gov.tw over HTTPS; the frame proxy extracts one bounded JPEG per request. This fallback covers provincial roads, not national freeways. Neither feed requires an API key. CCTV_TAIWAN_ENABLED=0 disables both; CCTV_TAIWAN_MAX_SOURCES defaults to 600 (bounded to 1–2000).
-
Québec CCTV (MTQ / Québec 511, Montréal and scenic links).
public/quebec-cameras.jsoncontains 680 MTQ positions from the official georeferenced WFS (CC BY 4.0), 426 Montréal camera locations derived from OSM (ODbL 1.0), and 14 scenic records with per-row provenance and accuracy. The MTQ video is opt-in (CCTV_QUEBEC_VIDEO_ENABLED=1): the CC BY 4.0 licence covers the camera locations only, and Québec 511's terms for embedding its clips on another site are unconfirmed, so by default MTQ cameras link to the Québec 511 viewer page instead. With the flag set, the 680 MTQ cameras play the operator's five-second MP4 clip directly in the viewer's browser fromwww.quebec511.info/Carte/Fenetres/camera.ashx?id=<id>&format=mp4, only after the viewer presses Play, so Québec 511 sees the viewer's IP address; Québec 511 refreshes those clips every few minutes. A second browser request supplies an approximate map still. The app does not proxy, store, or read video pixels, and no camera images are bundled. The selected-camera credit names both sources: locations MTQ under CC BY 4.0, video Québec 511. Montréal and scenic entries have provider-page links rather than direct frame URLs; their source-page terms apply. The video remains hosted by Québec 511 under its service terms. No API key is required;CCTV_QUEBEC_ENABLED=0disables the pack. Confirm Québec 511's terms of use before settingCCTV_QUEBEC_VIDEO_ENABLED=1on a public deployment. -
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).
-
Sea Marks and Ski Pistes (#10). Two keyless raster overlay layers under Infrastructure, OpenSeaMap sea marks and OpenSnowMap ski pistes, requested tile by tile as the camera views them, with no prefetch, bulk download or caching on our side (OpenSnowMap forbids bulk tile download without prior agreement). They drape on the globe on the OSM and Bing stacks and on the Google Photorealistic tileset on Google 3D (see
src/maps/imageryHost.js). OpenRailwayMap and OpenInfraMap, also requested in #10, are not included: OpenRailwayMap's tile server only answers requests whose Referer is its own site, and OpenInfraMap serves vector tiles that need a vector rendering pipeline. -
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/gpsOkLonwhen present, otherwise the current known position. The proxy strips identity metadata and tags its response with classifiergev-nic-nacp-v2; rows carry only integrity facts.The method has three separately attributed parts:
- 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.
- 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. - 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/adsbdbresolves 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 (for the flights layer's enrichment, a lookup that failed temporarily, such as an outage, a timeout, a rate limit or an authorization refusal that may clear, may be asked again after a 60-second cool-down; an answer, found or not, and a permanent refusal such as a 404 are final; Local ADS-B lookups are asked once), 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. -
Planespotters photos. When you track an aircraft, the browser asks
https://api.planespotters.net/pub/photos/hex/{hex}directly (the API answers cross-origin, so no key and no server proxy are involved) for that aircraft only, once per hex per session, through the same enrichment queue as adsbdb, with an 8-second timeout. A miss is remembered for the session; a request that failed temporarily (an outage, the timeout or a rate limit) may be asked again after a 60-second cool-down while the aircraft stays tracked, as for the flights layer's other enrichment. Either way no photo shows meanwhile. The first photo whose image is anhttps://URL on*.plnspttrs.net, whose page is anhttps://www.planespotters.netURL, and which names its photographer is shown in the CONTEXT panel's CONTACTS view, under the tracked flight's name (src/ui/views/panels/AwarenessPanel.vue), and nowhere else; a vessel, an installation, a military aircraft or a converted TR-3B has none, and a military aircraft or TR-3B is never looked up. Anything else is dropped, so the app never shows or links outside Planespotters (src/data/planespottersPhoto.js, also exported asgods-eye-view/sources/planespottersfor servers that cache the lookup). The photo follows the attribution rules: the thumbnail is hotlinked from the URL the API gives (never copied or re-hosted), the photographer's name is visible text next to it ("Photo © {photographer}"), and the photo and credit are a plain link to the photo's Planespotters page withtarget="_blank" rel="noopener"and neverrel="nofollow". If the image fails to load, the photo and its credit are hidden. -
Launch Library 2.
/api/launchesmakes 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 provideLL2_API_TOKENfor 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.ukendpoint (an optionalTFL_APP_KEYraises 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/camerasendpoint, 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 under511on.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.jsoncatalog supplies active cameras and officialhttps://video.deldot.gov/live/…/playlist.m3u8links. 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=0disables 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 theDigitraffic-User: gods-eye-viewheader the service asks clients to identify themselves with and with gzip; frames are stills onweathercam.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 notGATHERINGand presets notinCollectionare dropped. Attribution is required by the CC BY 4.0 licence and is registered in the Data attribution popover.CCTV_FINTRAFFIC_ENABLED=0is 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 fromhttps://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 retiredimages.drivebc.caframe 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_SOURCESchanges the cap andCCTV_DRIVEBC_ENABLED=0turns 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. -
City of Ottawa traffic cameras. Camera images come from the city's Traffic Camera Images API, which requires an access certificate requested through the city's registration form and allows one certificate and user id to fetch a camera at most once every 60 seconds. Set
OTTAWA_CAMERA_CERTIFICATE; without it the pack is skipped and makes no request. The camera list is the documented keylesstraffic.ottawa.ca/map/service/cameraJSON (camera number, English and French names, coordinates, owner). Frames aretraffic.ottawa.ca/opendata/camera?c=<number>; the server adds the certificate and the user idgevat fetch time, so no catalog response carries the key, and serves each camera from one shared in-memory frame per minute. MTO cameras carried on the city feed keep their owner as a per-camera credit. The feed publishes no bearing, so headings use the shared id-hash fallback at low confidence, and no status field, so a camera the city takes offline still registers. Frames are never stored on disk. The city states no redistribution licence for the images; the certificate request asks how they will be used, so describe the deployment there.CCTV_OTTAWA_MAX_SOURCEScaps the pack (default 250, nearest downtown) andCCTV_OTTAWA_ENABLED=0turns it off. -
World cams image subset. The normal CCTV catalog adds 1,176 Oregon TripCheck stills and 1,054 MLIT river cameras from the curated
config/cctv_sources.world-image-cameras.jsonexport; disable it withCCTV_WORLD_CAMERAS_ENABLED=0. The export's Vegagerðin rows are left out because the Iceland pack already loads those cameras. The server validates and pins each image URL to its provider path, fetches a frame only when a camera is viewed, and never stores or redistributes it. ODOT allows businesses, private citizens and organizations to use TripCheck images and asks for credit ("Camera courtesy of ODOT"); TripCheck also carries partner cameras run by Oregon counties and cities, Caltrans and WSDOT, which keep their owner's name in the camera label. MLIT's site terms follow the Government of Japan Standard Terms of Use 2.0 (CC BY 4.0 compatible, commercial use allowed, source credit required) and ask tools not to collect data periodically, pointing regular collection to the river information data service; frames are therefore fetched only on view and refresh at most every ten minutes per camera. Both credits are registered in the Data attribution popover. -
TxDOT ITS cameras. The catalog comes from the keyless
its.txdot.gov/its/DistrictIts/GetCctvStatusListByDistrictendpoint, one call per district. Frames come from the per-cameraGetCctvSnapshotByIcdIdendpoint, 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 reportingDevice Onlineare registered. Districts default to Austin and San Antonio (CCTV_TXDOT_DISTRICTS; 25 codes exist statewide);CCTV_TXDOT_MAX_SOURCEScaps the pack andCCTV_TXDOT_ENABLED=0turns 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 withCCTV_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. Onlyhttps://tarktee.transpordiamet.ee/images/…URLs are registered. Disable withCCTV_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 withCCTV_WARENDORF_ENABLED=0. -
Live Traffic NSW cameras. The camera list is the keyless public
data.livetraffic.com/cameras/traffic-cam.jsonfeed (Transport for NSW open data, CC BY 4.0); frames are stills onwebcams.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 withCCTV_NSW_ENABLED=0. -
Open Calgary traffic cameras. Keyless. The camera list is the public Socrata dataset
k7p9-kppzondata.calgary.ca; frames are stills on the city's owntrafficcam.calgary.cahost, and only that host is registered. Most rows publish anhttp://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: thequadrantfield 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 withCCTV_CALGARY_ENABLED=0. -
FL511 Florida cameras. Off by default; set
CCTV_FLORIDA_ENABLED=1to 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'sexceededTransferLimit, 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_SOURCEScaps 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.xmlWFS/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 afontfield 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 carryinguser:pass@userinfo or an explicit port, or pointing outside that host's frame directory, is rejected even on an allowed host; an SCTsctidcammust be a bare.gif/.jpgfilename), and every non-SCT camera carries its real owner as acreditshown beside the sharedprovider. 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 byfetchWithinHost'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 theTransitCameraURL itself, over plain http, fromRenderService'ssctidcamid, 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'sfid(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 withCCTV_CATALONIA_ENABLED=0. -
Iceland (Vegagerðin / IRCA) cameras. The camera list is the keyless
https://gagnaveita.vegagerdin.is/api/vefmyndavelar2014_1JSON feed (about 500 camera views at roughly 170 stations), fetched over https with redirects refused and the body read capped at 2 MiB, since the list decides ids, coordinates and which frame path is proxied. Frames are JPEG stills inhttps://www.vegagerdin.is/vgdata/vefmyndavelar/; only links inside that directory are registered (userinfo, explicit ports and encoded path separators are rejected). Camera ids come from the frame file name. The feed'sSkyringview description is the camera label, and a stated facing ("til vesturs", "í suður", "séð austur") sets a high-confidence heading; a view that states none, or two different ones ("niður á veg", a bare road direction), takes the id-hash low-confidence pose. The feed has no elevation, so cameras carry a flat prior that the client's ground snap corrects. IRCA publishes road camera images under CC BY 4.0 and requires the licensor to be acknowledged without implying endorsement; the pack shows the attribution above (licensor, dataset, CC BY 4.0, terms link and no-endorsement note) in the Data attribution popover, and every camera record carries the licence string. IRCA describes the images as fetched several times per hour (a live frame'sLast-Modifiedwas about four minutes old on 2026-11-06) and the real-time data as provided as is, without warranty. Frames are fetched at request time and never stored or redistributed. Disable withCCTV_ICELAND_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
outFieldslist 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 owninfo.kingcounty.govimage handler are registered (the feed writeshttp://; 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 hardwareManufacturer/Model(Cohu 3950/3965, Bosch AUTODOME, Axis PTZ domes); both are carried on the source (and served by/api/cctv/sources) asmodelandmanufacturerfor identified-hardware consumers (vendor-generic strings such asPTZname no model and are omitted). Frames are fetched at request time and never stored or redistributed. Disable withCCTV_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 ownimages.wsdot.wa.govhost 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'sCompassDirectionis 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_SOURCESchanges the cap (8–1,200) andCCTV_WSDOT_ENABLED=0turns the pack off. A keyed WSDOT Traveler Information API serves the same population for higher-volume use and is deliberately not required here. -
Hong Kong Transport Department traffic snapshot cameras. Keyless. The English camera list is the public DATA.GOV.HK XML at
static.data.gov.hk/td/traffic-snapshot-images/code/Traffic_Camera_Locations_En.xml; frames are stills ontdcctv.data.one.gov.hk, and only that host is registered. Frame URLs are rebuilt from each camera key (https://tdcctv.data.one.gov.hk/{KEY}.JPG) rather than taken verbatim from the catalog. Stills were probed to answer directly on that origin with no redirect hop. Frames are fetched at request time and never stored or redistributed. The dataset publishes no camera facing, so headings use the shared id-hash fallback at low confidence and are corrected with the in-app calibration gizmo. By default nearly the full catalog loads (~1,013; pack cap 1,100), prioritized nearest Central, Tsim Sha Tsui, Sha Tin, Tsuen Wan, Tai Po, Fanling, Tuen Mun, Yuen Long and Tseung Kwan O so a lowered cap still spans Hong Kong Island, Kowloon and the New Territories. When the sum of packs exceeds the catalog-wide ceiling, shared round-robin keeps every lane represented.CCTV_HK_MAX_SOURCES(8–1200) changes the cap andCCTV_HK_ENABLED=0turns the pack off. The DATA.GOV.HK Terms of Use require attribution to the Government / Transport Department / DATA.GOV.HK. -
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 onkamera.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=0keeps every camera on stills.orientationDescriptionnames 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ø andCCTV_VEGVESEN_ENABLED=0turns 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 (dybdekurverorHavflate), 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=0turns 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 setsCCTV_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 publicwebcams.nyctmc.org/api/camerascatalog (~980 cameras across the five boroughs); frames are stills atwebcams.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.jsononopendata.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 documentedCameraImages/loc####.jpgconvention 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: theD1-D4fields 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 withCCTV_TORONTO_ENABLED=0. -
Houston TranStar cameras. Keyless. The camera list is the public
traffic.houstontranstar.org/data/layers/cctvSnapshots_json.jscatalog (~1,000 cameras across Greater Houston); frames are stills atwww.houstontranstar.org/snapshots/cctv/<id>.jpg, synthesized from a validated numeric id rather than taken from the payload, and only that host is registered. Cameras whose catalog id is0(a different, non-snapshot class) and cameras outside Greater Houston are dropped. TranStar'sdirfield is the side of the freeway the camera sits on, not the way it faces: TranStar's own map shows it as "Traffic closest to the camera is traveling …" (South → eastbound, North → westbound, West → southbound, East → northbound). That travel direction (90°, 270°, 180°, 0°) seeds the heading as a low-confidence prior with the low-confidence pose;Noneor an unknown value uses the shared id-hash fallback at low confidence. Headings are corrected with the in-app calibration gizmo. Off by default. TranStar's Content Usage terms prohibit copying or distributing the site's information, and external framing or linking to specific images, without TxDOT's prior written permission; its FAQ grants permission-free use only for the RSS feeds. This project does not hold that permission for downstream installations, so the pack loads only when an operator who holds TxDOT's written permission setsCCTV_HOUSTON_ENABLED=1; with the flag unset, empty or any other value, the server makes no request to TranStar. Once enabled, it loads the 250 cameras nearest downtown, Uptown, the Medical Center, IAH and Galveston;CCTV_HOUSTON_MAX_SOURCES(8–400) changes the cap. Snapshots update about every 3 minutes, which is also the ambient still cadence. Frames are fetched from TranStar and relayed to the browser on demand, buffered only transiently per request, sent withCache-Control: no-store, and not archived. -
Autostrada del Brennero (A22) webcams. Keyless. The camera list is one request to the Open Data Hub tourism API (
tourism.api.opendatahub.com/v1/WebcamInfo?source=a22), run by NOI Techpark in South Tyrol, which republishes Autobrennero's own list of 13 motorway webcams with coordinates and kilometre markers. Frames are the operator's stills onwww.autobrennero.it/WebCamImg/km<N>.jpg, refreshed about once a minute, and only the exact image for each camera's kilometre is registered. The feed names no bearing, so headings use the id-hash fallback at low confidence. The road climbs from about 20 m in the Po valley to about 1,370 m at the Brenner Pass, so each camera's ground elevation comes from a per-kilometre table sampled from the Copernicus GLO-90 DEM (via Open-Meteo's elevation API); a camera not in the table uses a 200 m prior. The Open Data Hub tags every record CC0 (ClosedData: false, Autobrennero as licence holder), but that tag is the aggregator's metadata and Autobrennero publishes no terms of its own for the images, so they are credited to the operator as a courtesy and are not redistributed. Frames are fetched at request time and never stored. Disable withCCTV_A22_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 fifty-two registered feeds, covering forty-nine 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, YRT and Rio’s SMTR 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
9101that appears nowhere in its published routes, so it stays as the feed sends it. Burlington’s is the one that cannot be shortcut:351is route 1 while3510is 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 country coverage (optional). Set
RADIO_PRIORITY_COUNTRIES=IN,PLin the local.envand restart to include stations beyond the global click charts. The operator may choose up to eight unique ISO alpha-2 country codes; no key is needed. Each country adds one bounded query (at most 200 rows) and reserves up to 40 unique, usable stations inside the existing 750-station catalog. Country seeds precede specialist-tag seeds and global popularity fill; unused slots return to the shared pool. This is a coverage preference, not an exhaustive national directory or a guarantee of stations in every city. Countries with no eligible HTTPS MP3/AAC geolocated stations remain empty. An unset list preserves global selection. Country requests share the directory cache and three-worker pool; failed country queries are reported in coverage without blocking a healthy global refresh. Failed/degraded refreshes back off for one minute, with at most three mirrors per query. -
Radio Browser. In every installation, including when
RADIO_PRIORITY_COUNTRIESis unset, each request tries at most three mirror candidates (later fallback candidates are skipped), and failed or partial catalog refreshes back off for 60 seconds. A cold-start failure therefore continues returning 503 during that delay even if upstream recovers./api/radio/stationsdiscovers 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; broad/specialist responses whose rows all fail the product's health policy do not count as successful queries. Optional priority-country outcomes are advisory: valid, in-limit responses with no eligible stations succeed as empty results, while failed or malformed country queries report unsuccessful coverage without degrading the global catalog. A usable partial cold catalog is explicitlyDEGRADED, and non-array or empty broad/specialist payloads are rejected atomically. Individual structurally malformed rows are skipped rather than failing the whole query; the response carries their boundedrejectedStationCount(at most 10,000), which the client adds to its own rejected rows and reports as degraded coverage without discarding the accepted generation. 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-onlyPOST /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_KEYthe 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/tomtomproxy (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/routeproxies 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.jsswaps in aCesium.CesiumTerrainProviderpointed at Re:Earth'scesium-mesh/ellipsoidquantized-mesh endpoint for globe stacks without a Cesium ion token (e.g. OSM), replacing a flatEllipsoidTerrainProvider; falls back to the flat provider if the endpoint can't be reached. (2) The server-side/api/terrain/heightsproxy (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/routeproxy sends an identifyingUser-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. -
FAA Special Use Airspace. Keyless.
/api/drone-airspacequeries the public FAA AIS FeatureServer for prohibited (P) and restricted (R) zones only — not MOAs, TFRs or other SUA types — with simplified geometry, a body cap, paging, a one-hour cache and stale-on-error. The layer is US coverage, informational only, and is not a substitute for B4UFLY, LAANC or a preflight briefing. Data is fetched at request time and never stored or redistributed. US government public domain; courtesy attribution is registered in the Data attribution popover. -
iNaturalist. Keyless.
/api/inaturalist/observationsreturns cached random view samples (newest first globally), at most 200 per request. Recency uses observation time: the v1d1filter and a rolling 48 h cutoff (whales 7 d); date-only rows qualify when their day starts within the window. Observation caches last 5 min (global 10 min), with stale fallback ≤1 h./api/inaturalist/gridsupplies density counts, cached 15 min. Both share a paced queue capped at 60/min and 8,000/day; only request counters persist in.gev-cache/. The server caches projected records, never raw responses. Private records are excluded; obscured coordinates become 0.2° cells. Observer identity is retained only for photo attribution. Eligible photos load directly frominaturalist-open-data.s3.amazonaws.com, with creator credit on ambient cards and creator/licence on selection. Per-record licences and noncommercial restrictions apply as listed above. Attribution appears in the layer row and Data attribution popover. Coverage follows community observations, not a census; Acartia adds Salish Sea marine mammals. -
iNaturalist grid (cell schema risk).
/api/inaturalist/gridshares observation-date, taxa, quality, pacing and budget rules with observations. A strict 64×64 UTFGrid schema guard fails closed; only logical-cell keys, counts and coordinates survive projection. Raw tiles, observation identifiers and free text are not retained. Projected tiles use a 400-entry LRU, 15-minute freshness and at most one hour of stale fallback. Views request at most six tiles; cached and adjacent-zoom coverage publishes before network waits, independently of observation pages. Cells supply a noninteractive density glow ranked within the view, from teal to amber with mono/CRT support. Every sighting badge comes from a real observation at its public position. Counts describe observations, not a population census. The endpoint is documented in the v1 and v2 API docs as “Grid Tiles UTFGrid” (/grid/{z}/{x}/{y}.grid.json), but its per-cell records are not specified; schema drift disables grids until revalidated. Seedocs/KNOWN-ISSUES.md. -
Acartia. Keyless.
/api/acartia/sightingsreads the current 7-day marine-mammal feed for ALL, MAMMALS and WHALES views intersecting 45.5–50.5° N, 126–121° W in the Salish Sea. WHALES accepts recognized cetaceans; other identified marine mammals appear under ALL/MAMMALS. The server rounds positions to 0.01° and drops comments before caching projected records (10 min fresh, stale ≤24 h); raw responses are not retained. Selected text cards credit the reporting provider under CC BY 4.0 and show Be Whale Wise guidance./sightings/currentanswers without a key today, but Acartia's README asks API users to create an account and generate an API key on the Acartia dashboard and to follow its community guidelines. Attribution also appears in the layer row and Data attribution popover. Opportunistic sightings, not a census. -
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 (
PHOTON_URL; unset uses the public instance, empty disables it), then/api/geocode(Nominatim search) when neither answers./api/geocodeand the voice outline route/api/geocode/outlineshare one Nominatim queue (NOMINATIM_URL; unset, empty and invalid values disable it; an operator must explicitly select an authorized endpoint): one request at a time at least 1.1 s apart, an identifyingUser-AgentandReferer, a short queue that refuses a burst, a pause after 429/403/5xx answers (honouringRetry-Afterin full), at most one retry after a network failure, and a per-install daily cap on public-instance requests (NOMINATIM_DAILY_CAP, default 50). Processes using the same installation state file hold one lock through the actual fetch invocation and recording the next public start, with the daily slot persisted before invocation; restarts share that count, spacing and any pause. An unfinished dispatch marker fails closed until operator recovery; it is never automatically reclaimed. Public access fails closed if the state file cannot be read, locked, written or semantically validated. This coordination does not span independent installations or state directories and does not establish an application-wide public-service allowance or authorize public use. An operator-selected non-public endpoint is outside the public cap, spacing and durable-state requirement; an upstream cooldown is kept with the endpoint that returned it rather than leaking across operator URLs. Answers are cached on disk (outlines 90 days, places 30 days, no-results 24 hours); failures are not cached. Outlines are looked up only for an explicit ask, after bundled data and any configured Overpass, and only results whose type suits the ask are used. Administrative outline responses expose country/admin-1/admin-2 identity only when the selected Nominatim row has a recognized, unambiguous address type consistent with its own name; numeric rank, ambiguous types, missing fields and contradictory names do not manufacture identity. It is not used for systematic or bulk queries. -
Street and building outlines. Voice street highlights, pointed-at buildings and grounds use the OpenFreeMap vector tiles the traffic layer already loads. Traffic and outlines share one bounded pending fetch/decode owner per immutable XYZ tile; materialized outline geometry is charged to the retained-byte ceiling and capped by coordinate count. Consumer result caches and request lifetimes remain independent, while eviction or explicit teardown cancels queued idle projections and releases their decoded owner. No Overpass request is made unless
OVERPASS_UPSTREAMSis configured. Named grounds require a returned name matching the selected place, except that an ask whose head noun names a kind of grounds (a school, university or college, hospital, cemetery, stadium or zoo) may use the part of the smallest unnamed tile area of that class that holds the resolved place; a differently named area never answers. Other anonymous landcover polygons cannot establish identity, so unsupported grounds stay unavailable rather than borrowing a nearby POI name. -
Voice areas and place search. Voice areas (
resolve_area) use the same outline sources as voice outlines. Voice place search (osm_query,/api/osm/features) runs only on an operator-configured Overpass: a fixed list of kinds, a bounded box and result count, one query at a time, answers cached for a day. It never uses Nominatim. -
Cockpit regional briefing.
/api/regional-briefrounds 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 OFFdisables 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-effectsrequests 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,352) | 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 |
| Québec CCTV source catalog (1,120 locations) | public/quebec-cameras.json |
Mixed: MTQ locations CC BY 4.0; Montréal camera nodes ODbL 1.0; scenic records retain per-record provenance. No video files are bundled or cached. | Location data is per-record; video remains hosted by Québec 511 and its platform terms apply; scenic source pages may have separate terms | MTQ / Données Québec CC BY 4.0; © OpenStreetMap contributors (ODbL); scenic operator and position source shown in the selected-camera panel |
| World camera image subset (2,230 locations) | config/cctv_sources.world-image-cameras.json |
Mixed: ODOT TripCheck public images (ODOT permits use with credit) and MLIT site content under terms compatible with CC BY 4.0. Frames are not bundled or persisted; the server holds a bounded in-memory cache. | Per-source terms apply; NZTA Journey Planner web-cache rows are excluded; Vegagerðin rows are served by the Iceland pack instead | Oregon Department of Transportation (Camera courtesy of ODOT) and Japan Ministry of Land, Infrastructure, Transport and Tourism (出典:国土交通省 川の防災情報) |
| 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" |
| UCS Satellite Database UCS-Satellite-Database 5-1-2023 (3,564 records; operator, owner country, purpose) | ucs_satellites/ |
Free, unrestricted use (UCS database manual, section 3) | ✅ (acknowledgement requested) | "UCS Satellite Database (UCS-Satellite-Database 5-1-2023), https://www.ucsusa.org/satellite_database" |
| Imaging sensor pack (46 Earth-observation platforms: swath, resolution) | imaging_sensors/ |
Individual specification facts from operator and agency pages, cited per entry | ✅ (facts only) | "Imaging sensor swaths: operator and agency specifications" |
| 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) |
| Natural Earth populated places (7,342 points: name, position, rank) | 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) |
| US Census Bureau places (32,629 city, town and CDP polygons) | us_census_places/ |
Public domain | ✅ (no restrictions) | "U.S. Census Bureau" (courtesy — not legally required) |
| Who's On First neighborhoods (61,441 polygons) | wof_neighborhoods/ |
Per source: CC BY, ODC-By, Open Government licences, CC0, PDDL, public domain (folder ATTRIBUTION.md) |
✅ (attribution) | "Neighborhood boundaries: Who's On First and contributors"; per-source credits in the folder |
| Yale Bright Star Catalogue (9,096 stars, sky background) | sky/ |
Public domain | ✅ (no restrictions) | "Yale Bright Star Catalogue (Hoffleit & Warren, via CDS)" (courtesy credit) |
| ESO Milky Way panorama (eso0932a, blurred cube map, sky background) | sky/ |
CC BY 4.0 | ✅ (attribution; changes stated) | "ESO/S. Brunier" |
| 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 + v2.29.0 (20 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 extract (v2.26.0, plus the Bosch MIC
records from v2.29.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 records for hardware named by the integrated public catalogs (King County,
Sarasota County and Sioux Falls) or by the City of Amsterdam register proposed in
#251 are bundled, compiled into the
module. Nothing is fetched at runtime. The MIC records keep their specification fields; their
titles are shortened to model codes and colour aliases are added. 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 two VIIRS NRT sources (NOAA-20, NOAA-21)
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. Suomi NPP (VIIRS_SNPP_NRT)
is not requested: NASA stopped delivering it on 2026-11-02.
UCS Satellite Database (ucs_satellites/)
Operator, owner country and purpose for active satellites, keyed by NORAD number, from the Union of Concerned Scientists Satellite Database release UCS-Satellite-Database 5-1-2023 (data current through 2023-05-01; https://www.ucsusa.org/satellite_database). The satellites layer joins it to CelesTrak positions and SATCAT records to file each satellite as a station, imaging, telecom, Starlink, probe or debris object, and to name its operator and owner. Section 3 of the UCS database manual: "The Database is free and its use is unrestricted. We request that its use be acknowledged and referenced in written materials. References should include the version of the Database that was used, which is indicated by the name of the Excel file, and a link to or URL for the webpage www.ucsusa.org/satellite_database." The app acknowledges it in the Data attribution popover. UCS has paused updates since this release; Starlink rows are dropped (Starlink is classed by name). Build: scripts/build-ucs-satellites.py; curation in the folder README.
Imaging sensor pack (imaging_sensors/)
Swath widths and ground resolutions for 46 Earth-observation platforms (Landsat, Sentinel, MODIS, VIIRS, GOES, Himawari, Gaofen, CBERS, RADARSAT, TerraSAR-X, COSMO-SkyMed, ALOS, KOMPSAT, SPOT, Pléiades, WorldView, SkySat, PlanetScope, ICEYE, Capella, Umbra and others), compiled 2026-11-04 from the operator and agency pages cited per entry. The orbital view draws each satellite's sensor swath to scale and caps its zoom at that swath. Facts only; no text or images copied. A swath is confirmed on an operator, agency (ESA's eoPortal included) or academic page; resellers are not cited. The CEOS MIM Database (CC BY 4.0) is not yet used. Sources and unverified values: the folder README.
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).
Natural Earth populated places (natural_earth/populated_places.json)
Natural Earth 10m populated places (ne_10m_populated_places_simple, the same pinned
nvkelso/natural-earth-vector commit and SHA-256 as the admin-1 build reads), reduced to one
row per place: name, latitude and longitude rounded to 3 decimals, scalerank and rank_max
(7,342 places, 229 KB). From 8x the orbital view names the most prominent place within half
its width ("Sichuan, China · near Chengdu"), offline, with the states and provinces pack giving
the division. Public domain; credited "Made with Natural Earth" with the other packs. Rebuild:
node scripts/build-admin-packs.mjs --only places; provenance in the folder README.
Sky background (sky/)
Sources, licences, the changes CC BY asks to state, hashes and build commands
are in sky/README.md.
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).
Local CCTV source packs (config/)
The server can read a local camera list from CCTV_SOURCES_FILE (default
config/cctv_sources.austin.json, which ships empty) and inline JSON from
CCTV_SOURCES_JSON; the two are merged, and inline entries win on a duplicate
id. A non-empty local pack replaces the live open-data camera packs unless
CCTV_FORCE_AUSTIN=1 is set. The packs under config/ show the schema, and a
pack's cameras keep their own source's license and attribution.
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'sweather_radar_base_reflectivitystyle.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_densitylayer andlightning_densitystyle. - 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, Planespotters.net, 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.