// GODSIGH configuration — every URL, interval, and tunable in one place. // All feed paths are RELATIVE so the app works identically at "/" (dev) and // "/godsigh/" (prod). Never introduce a leading-slash path. export const CONFIG = { // Same-origin proxy endpoints (serve.py in dev; nginx location blocks in prod). proxy: { opensky: 'proxy/opensky', celestrak: 'proxy/celestrak', }, basemaps: { // Data Mode — dark high-contrast raster. dark: { url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c', 'd'], credit: '© OpenStreetMap contributors © CARTO', maximumLevel: 19, }, // Photo Mode — Sentinel-2 cloudless mosaic (no key). photo: { url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2023_3857/default/g/{z}/{y}/{x}.jpg', credit: 'Sentinel-2 cloudless by EOX — modified Copernicus Sentinel data 2023', maximumLevel: 14, }, }, // Timeline spans now ± windowHours. windowHours: 6, // Live-only layers (aircraft, live AIS) pause when the clock is scrubbed // further than this from wall-clock now. liveThresholdSec: 600, // Camera opens on the Persian Gulf theater. camera: { lon: 53.0, lat: 25.5, height: 2_800_000 }, satellites: { sampleStepSec: 60, // one SGP4 sample per minute across the window cap: 120, // hard ceiling on tracked satellites // Each source is one Celestrak query. `filter` = keep only names containing // one of these tokens; `keepOnly` = keep only these exact names; `max` = // cap this source's contribution so one big constellation can't crowd out // the rest. Rare/high-value sources are listed first so the global cap // never starves them. sources: [ { q: 'GROUP=stations&FORMAT=tle', keepOnly: ['ISS (ZARYA)', 'CSS (TIANHE)'] }, { q: 'NAME=COSMOS%202486&FORMAT=tle' }, // Russian Persona-class recon { q: 'NAME=COSMOS%202506&FORMAT=tle' }, { q: 'GROUP=resource&FORMAT=tle', filter: ['WORLDVIEW', 'LEGION', 'PLEIADES', 'CAPELLA', 'GAOFEN', 'SKYSAT', 'ICEYE', 'UMBRA', 'LANDSAT', 'SENTINEL-1', 'SENTINEL-2', 'GEOEYE', 'KOMPSAT', 'CARTOSAT', 'RESURS'], }, { q: 'NAME=GAOFEN&FORMAT=tle', max: 30 }, // large Chinese EO fleet — cap it ], }, aircraft: { // null bbox = global (a global states/all call costs the same 4 credits as // any large bbox). Or set {lamin, lomin, lamax, lomax}. bbox: null, pollMs: 90_000, // Callsign prefixes flagged as military (highlighted + optionally filtered). // Trimmed OpenSky callsigns are matched by prefix. Curated list of common // NATO/allied air-transport & tanker call words; extend freely. militaryPrefixes: ['RCH', 'REACH', 'LAGR', 'DUKE', 'POLO', 'CNV', 'RRR', 'ASCOT', 'GAF', 'BAF', 'IAM', 'PLF', 'HKY', 'NATO', 'CFC', 'MC', 'SAM', 'EVAC'], }, // Earthquakes, wildfires, disasters, severe-weather, launches, NSW bushfires // are now data-defined in js/registry.js (Wave 3). Their shared colors stay in // CONFIG.colors below (quakeMin/quakeMax/fire). // Military aircraft — REAL unfiltered military traffic (the OSINT prize OpenSky // hides: RCH/Reach airlift, tankers, the Area 51 "Janet" shuttle). Now on the // FREE, keyless adsb.lol /v2/mil feed via proxy/mil (same {ac:[...]} shape as // the old paid ADS-B Exchange feed, so the layer code is source-agnostic). // proxy/adsbx-mil still exists server-side as a paid fallback but is unused. adsbx: { proxyMil: 'proxy/mil', // RELATIVE — works at "/" and "/godsigh/"; free adsb.lol pollMs: 60_000, // 1 min — free feed, no quota (server 60s cache coalesces) }, // Optional live AIS. Leave blank to use the demo fleet only (roadmap feature). AISSTREAM_API_KEY: '', colors: { // satellites (by name token) GAOFEN: '#ff4d4d', COSMOS: '#ff9f40', WORLDVIEW: '#4dd2ff', LEGION: '#4dd2ff', CAPELLA: '#9d7bff', PLEIADES: '#7bff9d', SENTINEL: '#ffd24d', ISS: '#ffffff', CSS: '#ffffff', satDefault: '#66ffcc', // aircraft (by altitude band) aircraftLow: '#ffb347', aircraftMid: '#ffe74d', aircraftHigh: '#4dd2ff', aircraftMil: '#ff5964', // military-callsign tint (overrides altitude band) militaryReal: '#ff453a', // REAL military (ADS-B Exchange feed) militaryEmerg: '#ff2d95', // military squawking 7500/7600/7700 or emergency // earthquakes (magnitude ramp: amber → red) quakeMin: '#ffcf50', quakeMax: '#ff3b30', // wildfires fire: '#ff7a1a', // ships shipNormal: '#7bff9d', shipToll: '#ffe74d', shipDark: '#ff4d4d', shipIdle: '#8a97a3', // infra chokepoint: '#ff003c', pipeline: '#ffbf40', facility: '#35e0ff', event: '#ff4d4d', }, };