ADSB Trident

ADS-B TRIDENT

Linux / ARM Edition — Headless ADS-B Receiver & Web Viewer

v2.0.6 — April 2026

Moving from ModeSMixer2 to a similar, more enhanced application!
More info on the Windows version: FlightAware Discussion Thread

What is ADS-B Trident?

ADS-B Trident is a lightweight, headless ADS-B receiver companion that turns any Linux machine — Raspberry Pi, ARM single-board computer, x86_64 server, or even a RISC-V board — into a full-featured aircraft surveillance station accessible from any browser on your network.

Written in pure Python (stdlib only, no pip installs), Trident reads aircraft data from any dump1090-compatible source (dump1090-fa, readsb, dump1090-mutability, tar1090, adsbexchange-feed) and serves a rich web UI on port 8185. Install it, point your browser to http://<your-host>:8185/trident/ — done.

What You Get

Leaflet Map

Live aircraft icons, track lines, range rings, polar range polygon, airline colouring, weather radar overlay.

Radar Scope (Globes)

Classic sweep animation with range rings and coastline overlay.

3D Globe

MapLibre / deck.gl globe with altitude extrusions, FIR/TMA overlays, day/night shader.

Signal Monitor

Real-time RSSI/noise, aircraft count, message rate, range tracker for receiver gain tuning.

Flights Table

Sortable live list with hex, callsign, registration, type, operator, route, altitude, speed, distance, RSSI.

Statistics & Charts

Live counters plus historical plots — messages per hour, polar distance, range buckets, heatmap.

Cross-Tab Navigation

Click an aircraft in any view and every open tab follows (BroadcastChannel sync).

Settings Page

Browser-based first-run configuration at /trident/settings — auto-detects receiver position.

Why Trident?

  • 100% open-source stack — no proprietary runtimes, no account required, works offline after initial tile cache
  • ~135 KB installed footprint, ~50 MB RAM at runtime
  • Pure Python 3.9+ stdlib — no virtual env, no pip, no node
  • Architecture-independent — ARM (Pi 3/4/5/Zero 2), ARM64, x86_64, RISC-V
  • systemd service — starts on boot, recovers on crash
  • Full 21-page Linux manual included (accessible via the Help button)
  • Works offline after initial map-tile cache

System Requirements

Requirement Details
Hardware Any board or PC with 256 MB free RAM and a network interface
OS Linux (kernel 3.10+) with systemd
Python Python 3.9 or later (stdlib only)
Feed source Any dump1090-compatible aircraft.json running locally
Storage ~1 MB for application; ~500 MB with the optional aircraft database

Distribution Packages

Three install formats are provided — all contain the same payload (Python source, web UI, manual, install scripts). All are architecture-independent (noarch / all).

adsb-trident_2.0.6_all.deb133 KB

Debian / Ubuntu / Raspberry Pi OS / Mint / Kali

sudo dpkg -i adsb-trident_2.0.6_all.deb # install sudo dpkg -r adsb-trident # remove

adsb-trident-2.0.6-2.noarch.rpm173 KB

Fedora / RHEL / Rocky / Alma / CentOS / openSUSE

sudo rpm -i adsb-trident-2.0.6-2.noarch.rpm # install sudo rpm -e adsb-trident # remove

adsb-trident_2.0.6_linux.tar.gz196 KB

Any Linux (universal fallback — Arch, Alpine, Void, Gentoo, etc.)

tar xzf adsb-trident_2.0.6_linux.tar.gz cd adsb-trident-2.0.6 sudo bash install.sh # install sudo bash /opt/adsb-trident/uninstall.sh # remove

Auto-detection: The tarball’s install.sh detects your distro, locates the running dump1090/readsb feed, picks the service user, writes settings.ini, and sets up the systemd unit — no manual configuration required on most setups.

Aircraft Database (DBa)

The install packages are kept small (~135–196 KB) and do NOT include the aircraft database. The database is distributed separately inside the companion ZIP file as the DBa/ folder.

What’s inside DBa/

DBa/
trident.sqb ~178 MB Aircraft registrations, types, operators, flight routes
basestation.sqb ~84 MB Optional fallback DB
geo_json/ Coastline / FIR overlays for the radar and 3D globe
CURRENT/ Max-range polygon data (distances.json, upintheair.json)
3d-*.html 3D globe view pages

Without DBa/ the app will still track aircraft on the map, but you will only see hex codes — no registration, type, operator, or route lookups. The radar and 3D globe overlays will also be missing.

How to install DBa/

After installing the package, copy the entire DBa/ folder from the ZIP into the application directory and set ownership:

sudo cp -r DBa /opt/adsb-trident/ sudo chown -R $(stat -c %U /opt/adsb-trident):$(stat -c %G /opt/adsb-trident) /opt/adsb-trident/DBa sudo systemctl restart adsb-trident

The database lookup thread will pick up trident.sqb automatically — aircraft info should start appearing within a few seconds.

SD card tip: On a Raspberry Pi with an SD card, the initial DB scan can be slow. Consider placing DBa/ on a USB SSD for faster lookups.

Quick Start

  1. Transfer the package and the companion ZIP to your Linux host (scp, USB, wget)
  2. Install using the appropriate command for your distro (see packages above)
  3. Copy the DBa/ folder from the ZIP into /opt/adsb-trident/ and set ownership (see section above)
  4. Open http://<host-ip>:8185/trident/ in any browser
  5. On first run, the Settings page appears — verify your position and feed path, click Save
  6. Aircraft should appear within seconds

License & Credits

ADS-B Trident is free software. Map tiles courtesy of OpenStreetMap contributors. Aircraft database compiled from public registries. 3D globe powered by MapLibre GL JS and deck.gl.

ADSB Trident for Linux

Evangelos

2 Likes

Great!

:+1: :+1: :+1:

1 Like

Installed on RPi

  • Downloaded ADSB Trident for Linux on Windows computer from Google Drive using following link:
    ADSB Trident for Linux

  • Copied the downloaded file TRIDENT-LINUX.ZIP.to Raspberry Pi using SCP client (WinSCP etc)

  • Unzipped the zip file by following command:
    sudo unzip TRIDENT-LINUX.ZIP
    The above caommand produced following package:
    adsb-trident_2.0.6_all.deb

  • Installed the deb package by following command:
    sudo dpkg -i adsb-trident_2.0.6_all.deb
     

EDIT:
After installation, noted each of the following 3 commands take abnormally long time:

sudo systemctl restart adsb-trident

sudo systemctl stop adsb-trident

sudo reboot

 

 

 

 

 

@abcd567

Good Morning
For the program to work fully you must also copy the database /Dba/ to program folder.
Its is separate in the .zip to avoid triplication. So maybe it is for that reason it had a delayed start.
Was the DBa.zip inside your download ?

Here is what I got on unzipping downloaded zip file TRIDENT-LINUX.ZIP.

Please give me full path of folder in which to place unzipped folder DBa

 

 

@abcd567

put it in : /opt/adsb-trident/

Claude said :
The .deb installs everything to /opt/adsb-trident/. So they should place the unzipped DBa folder at: /opt/adsb-trident/DBa/ The .deb already creates that path — they just need to copy/replace the contents

I did following:

sudo cp -r DBa /opt/adsb-trident/

Contents of folder /opt/adsb-trident/DBa after above command:

 

Checked, found all of the following 3 commands are still taking abnormally long time to execute:

sudo systemctl restart adsb-trident
sudo systemctl stop adsb-trident
sudo reboot

 

CLAUDE’S RESPONSE TO YOUR COMMENTS :

● Found the problem. Here's what's happening:

  Root cause: server.serve_forever() blocks the SIGTERM handler

  The main.py shutdown handler calls server.shutdown() — but server.shutdown() must be called from a different thread   than the one running serve_forever(). Since the SIGTERM handler runs on the main thread (the same one running  serve_forever()), it deadlocks. The shutdown() method waits for serve_forever() to finish, which is waiting for   shutdown() to signal it. Classic deadlock.

  That's why systemctl stop, restart, and reboot all hang — systemd sends SIGTERM, the handler deadlocks, and systemd  waits 90 seconds before sending SIGKILL.

  Fix

  The shutdown handler should set a flag and let serve_forever() exit on its own, or call shutdown() from a separate   thread:

  Tell the user to edit /opt/adsb-trident/main.py on the RPi and replace the shutdown section. Or I can give them the exact fix to paste. Here's what the shutdown function and the serve_forever block should look like:

      # Graceful shutdown
      def shutdown(sig, frame):
          print('\n[STOP] Shutting down...')
          mgr.stop()
          # server.shutdown() must be called from a different thread
          threading.Thread(target=server.shutdown, daemon=True).start()

      signal.signal(signal.SIGINT, shutdown)
      signal.signal(signal.SIGTERM, shutdown)

  They need to add import threading at the top (already imported in server.py but not main.py). Actually, threading   isn't imported in main.py. Let me also add TimeoutSec=10 to the service file so systemd doesn't wait 90 seconds even  if something else goes wrong.

  Tell the user to run these commands on the RPi:

  # Fix the deadlock in main.py
  sudo sed -i 's/        server.shutdown()/        import threading; threading.Thread(target=server.shutdown,   daemon=True).start()/' /opt/adsb-trident/main.py

  # Add TimeoutSec to service file as safety net
  sudo sed -i '/\[Service\]/a TimeoutStopSec=10' /etc/systemd/system/adsb-trident.service
  sudo systemctl daemon-reload

  # Restart (should now be instant)
  sudo systemctl restart adsb-trident

  The server.shutdown() deadlock is the classic Python HTTPServer trap — it must be called from a thread other than the   one running serve_forever().

==================

I have an RPi 3B+ where I tested it, but I did not notice any delay.

HTH
Evangelos

Further to Trident planes count. I noticed that it counts Mode-S whereas the Windows version does not. Then I remembered I asked Claude to omit due to many ‘ghost’ spikes in max range.
so I asked Claude to run an inquiry on my RPi regarding this and here its answer


  - 2 have alt+gs+squawk (896477, 4bccb9) — useful, but still no lat/lon
  - 1 has alt only (407f63) — no position, no speed
  - 11 have NOTHING — just a hex code and RSSI, seen times of 100-300 seconds (stale)

  You were right. Mode-S only aircraft have no lat/lon, and most don't even have altitude or speed. They're just hex   ghosts from DF11 all-call replies. Accepting them would add 14 useless rows to the aircraft list with no position to  plot on the map.

  The current code is correct — DF11 alone never creates aircraft, only ADS-B (DF17/18) does. The RPi's count of "5  Mode-S" is dump1090 padding its numbers with these position-less ghosts. Your Windows Trident showing 59/0/1 is  actually the cleaner, more honest count.

  No code change needed.

PS. forgot how to put text in a box, I remember you said something about ‘`’ circumflex but not sure I use it properly…

Applied above noted fix, but manually, as above noted sed commands were giving error messages. Now restart, stop, and reboot execute with normal fast speed.

 

1 Like

``` at top of block of code and ``` at bottom of block of code, like shown below:

```
Block of code here
```

 

1 Like

yes, many times Claude does not get it right like us humans :wink:

So v2.0.7 here

Trident Linux / ARM v2.0.7

❯ BY CONTRAST 50002 LESS MESSAGES / MORE PANES, AND 30003 MORE MESSAGES / LESS PLANES !!! MIRACLE !

● That's actually the expected and better result!

  Port 30003 (dump1090 raw): Fires a MSG line for every single Mode-S frame decoded off the air in real-time — thousands of messages per minute. Many are from aircraft with no position (just squitter pings), so you get high message count  but lots of incomplete entries.

  Port 50002 (Trident): Sends consolidated, clean data once per second — each tracked aircraft gets a complete set of  MSG lines (callsign + position + velocity + squawk) only when the data actually exists. Fewer messages, but every  plane shown has usable data.

  So more planes with fewer messages = our output is working perfectly. VRS isn't wasting time on partial/junk frames.

  Your friend can now connect:
  - BaseStation → port 50001 (Kinetic DLE binary)
  - VRS → port 50002 (SBS text, "BaseStation" receiver type)

  Both confirmed working!
1 Like

Failed to install v2.0.7 on RPi Model4 with RaspberryPI OS Bookworm:

 

Hi @abcd567

● The build script ran on the Pi at /tmp/build_v207.py. The issue is that Python's tarfile.open() defaults to format=tarfile.PAX_FORMAT on Python 3.8+, and dpkg on older Raspbian chokes on the PAX x headers.

try this please

v2.0.7 deb only

Version 2.0.7 works OK, but takes long time to execute command sudo systemctl restart adsb-trident

 

 

AI suggests following :


● Tell the user to edit these 2 files on the Pi:

  File 1: /lib/systemd/system/adsb-trident.service — add one line:

  TimeoutStopSec=5

  after the RestartSec=5 line.

  File 2: /usr/local/share/adsb-trident/main.py — replace the shutdown function (around line 85):

  Find this:
      def shutdown(sig, frame):
          print('\n[STOP] Shutting down...')
          output_mgr.stop()
          mgr.stop()
          server.shutdown()
          sys.exit(0)

  Replace with:
      def shutdown(sig, frame):
          print('\n[STOP] Shutting down...')
          output_mgr.stop()
          mgr.stop()
          server._BaseServer__shutdown_request = True

  And replace:
      try:
          server.serve_forever()
      except KeyboardInterrupt:
          shutdown(None, None)

  With:
      try:
          server.serve_forever(poll_interval=0.5)
      except KeyboardInterrupt:
          pass
      print('[STOP] Exited.')

  Then run:
  sudo systemctl daemon-reload
  sudo systemctl restart adsb-trident

  Restart should take under 1 second after that.

Thank you.
This fixed the very long time taken to restart. Now restart takes only few seconds.

 

1 Like

@abcd567

Welcome. Now I am working to convert it from monolithic to modular so it easier for anybody
with Python / Javascript knowledge to modify or repair the code.

Evangelyul, your upgrade V2.0.7 is working perfectly feeding BaseStation. Like ABCD, also completed the amenments you posted and that fixed the restart. :ok_hand: Thanks again. :+1:

1 Like