# Aether runtime configuration. # # cp .env.example .env # # Read at startup, so changes take effect on restart with no rebuild. Every value here # is operational configuration: Aether needs no credentials of any kind, and the ADS-B # feed it polls requires no API key. # # Your `.env` is git-ignored and should stay that way. Nothing secret belongs in it # either — if this project ever grows a credential, it belongs in the environment or a # secret store, not in a file that lives next to the source. # Observer position, the origin of the local ENU frame. Default: Athens. SITE_LAT=37.9838 SITE_LON=23.7275 SITE_ALT_M=70 # Live ADS-B feed. {lat} {lon} {dist} are substituted at runtime. ADSB_URL=https://api.adsb.lol/v2/lat/{lat}/lon/{lon}/dist/{dist} ADSB_RADIUS_NM=250 # Hard ceiling on one response body, bytes. Bounds memory against a hostile or broken # upstream; the parser is never the limit. 8 MiB is ~90x the observed steady-state # response for this site and radius (measured: 91,547 / 91,543 / 91,543 bytes), so it # cannot fire on legitimate traffic even at a much larger radius. MAX_BODY_BYTES=8388608 # Sensor poll period and tracker cycle period, milliseconds. POLL_MS=2000 CYCLE_MS=1000 # Drop a track after this many seconds with no accepted observation. TRACK_TIMEOUT_S=45 # Conjunction screening: look-ahead horizon and separation minima. # 9260 m = 5 NM lateral, 305 m = 1000 ft vertical (ICAO en-route minima). HORIZON_S=180 MIN_HORIZ_M=9260 MIN_VERT_M=305 # Kalman tuning. Q = process noise PSD (m^2/s^3), R = measurement variance (m^2). PROCESS_NOISE=4.0 MEAS_VAR=900.0 # Reject a measurement beyond this many sigma of the innovation. GATE_SIGMA=5.0 # Rows of the air picture to render. DISPLAY_ROWS=18