Optional. Without a server, each phone keeps its data until you export it, and that’s enough to decide.
A server suits a household that:
It’s a single Python file, standard library only (the optional FCC comparison also needs two packages), with a Docker image. In short:
docker compose up -d --build in the server folder of the source code).approve <device_id>). The id is in each phone’s status.set-report-password), then open /report/ on the server: the same report page, live.
It’s as fresh as the phones’ uploads, which come every 15 minutes on Wi-Fi and every hour elsewhere. In the app,
Open the live report goes there too, once the household has a server.export-zips writes the same zips the phones export.On Tailscale, a server that is itself a Tailscale node also records whether each phone reached it directly or through Tailscale’s relays, which is what makes a camera stream smooth or choppy.
The live report’s map can show what each carrier claims to the FCC (the National Broadband Map) beside what your phones measured. The server can build that layer itself:
FC_FCC=auto. About a minute after the server starts, and then every 24 hours, it
downloads the FCC’s coverage files for Verizon, AT&T and T-Mobile in each state where your phones have readings,
and keeps just the hexagons they’ve been in. FC_FCC_STATES (for example MA,VT) limits it to those states. To
build on your own schedule instead, run build-fcc from cron.fcc-cache in the server’s data folder, so each is downloaded once: about 1 MB
for Washington DC, 43 MB for Vermont and 365 MB for New York, plus 4 MB for the FCC’s list of files. The FCC
publishes new data twice a year; the new files go beside the old ones, whose folder you can then delete.A state is used only when all three carriers have their 4G LTE file there, so a missing file is never mistaken for
“claims nothing”. The Docker image has everything this needs. Run straight from Python, the server also needs two
packages for it (pip install h3 requests); without them, the server says so once and does everything else as usual.
The full instructions are in the server’s README in the source code.