Network / MLAT server
Our own MLAT server, open source
mlat-ng locates aircraft that send no ADS-B position, military included, from the times their signals reach our receivers. We wrote it in Rust, it runs as one process for the whole network, and its code is public.
AGPL-3.0 · Rust · works with mlat-client 0.2.13 to 0.4.2
Compared with mlat-server from 26 to 31 October 2026, same traffic, ADS-B positions as the truth.
Measured against mlat-server
For a week, from 26 to 31 October 2026, mlat-ng received a copy of the same feeder traffic as mlat-server, the server we used before. Both were scored against the ADS-B positions of the same aircraft. The figures are for the version that runs today.
More precise positions
On the same aircraft at the same moment, mlat-ng's position was the closest to the truth 66% of the time. The median error went from 273 m to 177 m (−35%).
More aircraft without ADS-B
9.1% more aircraft-minutes for aircraft that send no ADS-B position, such as many military and older aircraft.
Fewer impossible jumps
0.53% of its positions were implausible, against 0.85%.
Aircraft heard by only two receivers
mlat-server needs three receivers and an altitude, or four. mlat-ng also places aircraft heard by two, from their motion and the receivers' coverage: median error about 110 m (measured on 2 November 2026).
No real aircraft hidden
mlat-server dropped every address up to 0xF423F to hide fake Mode A/C tracks, and with them real aircraft with low addresses, such as those from Africa, Qatar and Mexico. mlat-ng drops only the exact fake pattern.
One network, no borders
One process sees every pair of receivers. With five regional servers, a receiver near the edge of its region could not pair with its neighbours across it.
Restarts and failures without a gap
A second instance, on another server, receives the same traffic and takes over from the first. In the test on 3 November 2026, the 478 connected feeders moved over in a median of 5.9 s (7 s at the 95th percentile).
Now that mlat-ng chooses the traffic it asks feeders for, the two can no longer be compared side by side. The method and the decision rule (docs/PLAN.md)
What changes for you
If you build with our data
- The MLAT positions on the map and in the API come from mlat-ng, each with its source marked.
- We do not filter: military, PIA and LADD aircraft stay, including those seen only by our MLAT.
- Commercial use is allowed on every plan, Free included.
If you have a receiver
- Nothing to change: same address (dati.flyitalyadsb.com:30100) and the same mlat-client.
- If your antenna position is off, the network measures it from the clock sync and corrects it when the measure is reliable.
- The coverage mlat-ng learns for each receiver is what Lightcone shows: the aircraft that flew past you that you did not receive.
How it works
The principle is the one of every MLAT: the difference in arrival times of the same signal at several receivers. What changes is how we compute it. The basics: how MLAT works
| mlat-server (as we ran it) | mlat-ng | |
|---|---|---|
| Process | one thread per process, the network split into five regions | one process for the whole network: network I/O on every core, one thread owning the state, aircraft workers |
| Clock pairs | windowed fit and PI drift loop | a Kalman filter per pair (offset and drift), whose variance grows with age |
| Timestamp normalisation | minimum spanning tree | weighted least squares over every usable pair |
| Position solve | diagonal errors, numeric Jacobian | full time covariance, analytic Jacobian, multi-start with a mirror-solution check |
| Tracks | filter fed with fixes only | EKF also fed directly with time differences: 2–3 receivers keep a track alive |
| Inputs | mlat-client | mlat-client plus the same receiver’s Beast feed, merged into one receiver |
| Self-check | none | 5% of ADS-B sync points held out and multilaterated: a continuous accuracy figure |
The code is public
mlat-ng is on GitHub under the AGPL-3.0: you can read it, try it and run it. It speaks the protocol of mlat-client and keeps the mlat-server rules feeders know, both written by Oliver Jowett (mutability) and maintained by wiedehopf: thank you to both.
If you find it useful, a star on GitHub helps other people find it.
Questions
Do I need to change anything on my receiver?
No. The address stays dati.flyitalyadsb.com:30100, and every mlat-client from 0.2.13 to 0.4.2 works.
Are the MLAT positions in the API?
Yes: in the API and on the map, next to ADS-B, each with its source marked. Nothing is filtered, military included, and commercial use is allowed on every plan, Free included.
How was it measured?
For a week, from 26 to 31 October 2026, mlat-ng received a copy of the same traffic as mlat-server. Both were scored against the ADS-B positions of the same aircraft at the same moment.
Can I run it myself?
Yes, under the AGPL-3.0: if you modify it and let others use it over a network, you must offer them its source. mlat-ng does this itself in the message it sends to every mlat-client.