GDLCOT broadcasts the local Cursor on Target (CoT) air picture as GDL90 over UDP, so Electronic Flight Bag (EFB) apps — ForeFlight, FlyQ EFB, Garmin Pilot — display the same traffic that TAK sees. It is the reverse of adsbcot: CoT in, GDL90 out.
GDLCOT 2.0.1 and later rebuild the PyTAK client in-process with bounded backoff when the CoT source is unavailable or local network policy is being replaced. Each attempt gets new queues, workers, and transports.
GDLCOT subscribes to CoT (by default the AryaOS / ATAK Mesh SA multicast group), keeps a table of air tracks, and once a second emits GDL90 Heartbeat, Ownship and Traffic Report datagrams the way a stratux or GDL 90 receiver would. Any traffic feeding your TAK network — ADS-B via adsbcot, drone Remote ID via dronecot, tracks from a TAK Server — shows up in the cockpit.
- Put the iPad/iPhone on the same Wi-Fi network as the device running GDLCOT (e.g. join the AryaOS hotspot).
- That's it — ForeFlight auto-detects GDL90 traffic on UDP port 4000 and lists it under More → Devices. FlyQ and Garmin Pilot behave the same.
On AryaOS / Debian, from the snstac package repo:
sudo apt install gdlcot
sudo systemctl enable --now gdlcotOr from source:
python3 -m pip install gdlcotThe Debian package installs:
/usr/bin/gdlcot/etc/default/gdlcot/lib/systemd/system/gdlcot.service(ships disabled; enable as above)
PyTAK-style, via /etc/default/gdlcot (systemd EnvironmentFile), the
environment, or an INI file with a [gdlcot] section:
| Key | Default | Description |
|---|---|---|
COT_URL |
udp+ro://239.2.3.1:6969 |
CoT source (PyTAK URL). Default is the Mesh SA multicast group. |
GDL90_URL |
udp+broadcast://255.255.255.255:4000 |
GDL90 egress. Broadcast is the stratux/ForeFlight convention; unicast udp://host:port also works. |
STALE_SECS |
60 |
Drop tracks not updated within this many seconds. |
UPDATE_HZ |
1 |
GDL90 update rate (heartbeat convention is 1 Hz). |
OWNSHIP_UID |
— | CoT UID whose track becomes the Ownship Report (e.g. this device's gpstak/lincot UID). |
OWNSHIP_LAT / OWNSHIP_LON / OWNSHIP_ALT_FT |
— | Static ownship position fallback. If no ownship is configured, GDLCOT sends heartbeat + traffic only. |
CALLSIGN |
GDLCOT |
Ownship callsign shown in the EFB. |
PYTAK_* options (TLS client certs, etc.) are passed through to PyTAK,
so any PyTAK-supported CoT source works, including TAK Server over TLS.
Notes:
- GDL90 Traffic Reports carry pressure altitude, because that is what
every other aircraft's transponder reports and what an EFB needs to compute
relative altitude. GDLCOT reads it from
<__adsb alt_baro="...">, which adsbcot publishes from readsb. - When a source does not provide pressure altitude — a non-adsbcot feed, or a
target reporting
ground— GDLCOT falls back to CoT's geometrichae. That is approximate: geometric and pressure altitude differ with local pressure, routinely by hundreds of feet. Better than dropping the track, but it is a fallback, not the intent. - The Ownship Geometric Altitude message uses geometric altitude, which is what that message is for.
- EFBs treat all of this as advisory traffic, not certified ADS-B In.
- Tracks with UIDs like
ICAO-A1B2C3(adsbcot convention) keep their real 24-bit ICAO address; other tracks get a stable self-assigned address hashed from the UID.
GDLCOT is part of the snstac TAK gateway family, built on PyTAK and pre-installed on AryaOS: adsbcot (aircraft via ADS-B), aiscot (ships via AIS), dronecot (drone Remote ID), lincot / gpstak (own position via GNSS), aprscot (APRS amateur radio), windtak (weather stations) and charontak (CoT routing).
make editable install_test_requirements
make pytest
make package # Debian package via stdebCopyright Sensors & Signals LLC — Apache License, Version 2.0.