modeac.net

Add your receiver

If your receiver runs ultrafeeder in Docker, joining is three small edits to the docker-compose.yml you already have. It takes about five minutes, and your other feeds keep running exactly as before.

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=true

That 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_out

Keep 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 -d

Check it's working

docker logs -f mlat-modeac

Within 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 saysWhat to do
Mode A/C: 0.0 msg/s received, and it stays at 0readsb isn't decoding Mode A/C yet: check step 1, then run docker compose up -d again.
outside the area this server coversThe 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 setYour .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 failedUsually 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.