Skip to content

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

…
MLAT feeders connected now live
66%
of the time closer to the truth
177 m
median error, against 273 m
+9.1%
more aircraft without ADS-B

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
Processone thread per process, the network split into five regionsone process for the whole network: network I/O on every core, one thread owning the state, aircraft workers
Clock pairswindowed fit and PI drift loopa Kalman filter per pair (offset and drift), whose variance grows with age
Timestamp normalisationminimum spanning treeweighted least squares over every usable pair
Position solvediagonal errors, numeric Jacobianfull time covariance, analytic Jacobian, multi-start with a mirror-solution check
Tracksfilter fed with fixes onlyEKF also fed directly with time differences: 2–3 receivers keep a track alive
Inputsmlat-clientmlat-client plus the same receiver’s Beast feed, merged into one receiver
Self-checknone5% 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.

Star it on GitHub github.com/flyitalyadsb/mlat-ng

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.