United States only. The server accepts receivers in the 50 states. Receivers elsewhere are turned away, and the log says why.
What you need
A receiver in the US with its antenna position and height above sea level in your .env
file (the usual FEEDER_LAT, FEEDER_LONG and FEEDER_ALT_M). Use
the antenna's position, not your street address: every metre of error becomes timing error.
An SDR that's already good enough for MLAT. If your receiver does MLAT for adsb.lol, ADS‑B Exchange or adsb.fi, it's fine. Any recent ADS‑B dongle works: RTL-SDR Blog V3 or V4, FlightAware Pro Stick (Plus), Airspy and similar.
1. Turn on Mode A/C
In docker-compose.yml, find the ultrafeeder: service and add this line to
its environment: list:
- READSB_MODEAC=trueThat tells readsb to decode Mode A/C replies as well. It costs a little more CPU; even a Pi 3 copes.
2. Send your map feed
Still in the ultrafeeder: service, add this to the end of your
ULTRAFEEDER_CONFIG line, right after the last entry:
;adsb,feed.modeac.net,30004,beast_reduce_plus_outKeep a ; between every entry. If your line says ULTRAFEEDER_CONFIG=${ULTRAFEEDER_CONFIG},
the list is in your .env file instead: add it there.
3. Add the modeac.net client
Paste this under services:, next to ultrafeeder: and indented the same way.
It reads your name, location and feeder ID from your .env, so it normally needs no editing:
mlat-modeac:
image: ghcr.io/modeac-net/mlat-client-modeac
container_name: mlat-modeac
restart: unless-stopped
environment:
- MLAT_SERVER=feed.modeac.net:31090
- MLAT_USER=${FEEDER_NAME}
- LAT=${FEEDER_LAT}
- LON=${FEEDER_LONG}
- ALT=${FEEDER_ALT_M}m
- UUID=${ULTRAFEEDER_UUID:-}Then start everything:
docker compose up -dCheck it's working
docker logs -f mlat-modeacWithin a minute you should see Handshake complete. Every five minutes there's a
Mode A/C: line with how many replies were received and sent. Press Ctrl+C to stop
watching; the client keeps running. Your aircraft appear on the
live map within a minute or two.
| The log says | What to do |
|---|---|
Mode A/C: 0.0 msg/s received, and it stays at 0 | readsb isn't decoding Mode A/C yet: check step 1, then run docker compose up -d again. |
outside the area this server covers | The location in your .env isn't in the US. Usually a missing minus sign on the longitude (US longitudes are negative, e.g. −83.0). Fix it, then docker compose up -d --force-recreate mlat-modeac. |
LAT and LON must be set | Your .env doesn't have the location variables. Put your values straight into the block instead, like - LAT=40.0123. |
Connection to feed.modeac.net:31090 failed | Usually temporary. The client retries by itself. |
Using adsb.im, PiAware or something else?
adsb.im can join, but not with one click yet: it needs a setting on its Expert page and one command over
SSH. Email me and I'll walk you through it. For a plain readsb
setup, the client's
README has a single docker run command. PiAware hasn't been tried yet.
Don't have a receiver yet? A Raspberry Pi, a 1090 MHz dongle and antenna, roughly $120–150 in all, also lets you feed every other tracker. Get in touch and I'll help you pick parts.
Stuck?
Open a setup-help
issue with the last 30 lines of docker logs mlat-modeac. Issues are public, so
remove your latitude and longitude from the log first. For anything private, email
[email protected].
Leaving
Remove the mlat-modeac: block, the READSB_MODEAC=true line and the
feed.modeac.net entry, then run docker compose up -d --remove-orphans.
Nothing else on your system was changed.