Files
kestrelos/docs/tracking.md
T
Madison Grubb aa8a0bd83f
PR / lint (pull_request) Failing after 31s
PR / test (pull_request) Successful in 45s
PR / docker-build (pull_request) Successful in 1m3s
PR / e2e (pull_request) Successful in 1m33s
Add ADS-B, AIS, and ALPR map layers with live CoT streaming.
Ingest aircraft and vessel tracks via OSINT feeds and tactical CoT, expose viewport-filtered SSE to the map, and add an OSM ALPR layer with tiled caching and performant marker sync.
2026-06-24 16:24:41 -04:00

1.7 KiB

ADS-B and AIS

Aircraft and vessels use the same CoT store as ATAK/iTAK. The map consumes GET /api/cot/stream (SSE, viewport bbox). Toggle Air, Surface, and Team on the map.

Accuracy tiers

  1. Tactical (best): local SDR/AIS receiver → adsbcot / aiscot → KestrelOS CoT :8089 (sub-second updates).
  2. Vessels (live OSINT): AISStream WebSocket push as vessels transmit.
  3. Aircraft (awareness OSINT): OpenSky bbox poll — not a live stream; typical lag ~5s.

For tactical use, run local receivers. Do not rely on OpenSky alone.

Freshness

Tracks update via SSE update events (CoT :8089, AISStream) or coalesced snapshot after each OpenSky poll. Stale tracks are removed automatically (team ~90s, OSINT ~30s without a new fix).

OSINT feeds run only while a map client is connected (SSE subscriber). Keep the map tab visible for live updates.

Self-hosted

ADS-B: adsbcottls://host:8089

[adsbcot]
COT_URL = tls://kestrelos.example.com:8089
FEED_URL = tcp+beast://127.0.0.1:30005

AIS: aiscottls://host:8089

[aiscot]
COT_URL = tls://kestrelos.example.com:8089
FEED_URL = tcp://127.0.0.1:10110

Use KestrelOS credentials (see atak-itak.md).

OSINT APIs (optional)

Set these only if you want viewport OSINT without local receivers:

Variable Purpose
AISSTREAM_API_KEY AISStream WebSocket
OPENSKY_CLIENT_ID / OPENSKY_CLIENT_SECRET OpenSky OAuth (recommended for production)

UIDs: ICAO.* (ADS-B), MMSI.* (AIS). Icons follow CoT type (a-f-A-*, a-f-S-*, a-f-G-*).