A free, self-hosted check-in logger for AllStar ham radio nets.
Net Logger listens to your AllStar node, turns each transmission into text, and builds the net roster for you: callsigns, names, license class, traffic and short-time flags, rechecks, and first-time check-ins. Net control watches it live in a browser on a laptop or phone.
It is receive-only. It links in monitor mode and never transmits, so it adds nothing to the air.
- Live roster: check-ins appear as stations call in, in order. Calls from any country; US calls get name and class from callook.info.
- Flags from speech: "with traffic", "short time", "call me back" are picked up and flagged.
- Recheck list: who asked to be called back and hasn't been.
- First-timer tag: calls never logged before, so net control can welcome them.
- Node control: connect the logger to any AllStar node and disconnect it from the dashboard.
- Accounts: an admin plus as many net control operators as you need.
- Scheduled nets: weekly, monthly (first to last weekday) or one time. The net opens, links the node, and closes on its own.
- Past nets: every net's roster and full transcript, searchable, with CSV and text downloads.
- Stats: check-ins per net over time, first-timers, stations heard, and your regulars, by net and time range.
- CSV export after the net.
- Works on a phone: big tap targets, light and dark mode, screen reader friendly.
Your AllStar node ──link──> Logger's private node (1999) ──USRP audio──> Net Logger
│
Net control's browser ─────────────────────────────────────────> dashboard :8080
- A private node on your AllStar server links to the net's node in monitor mode.
- It streams audio to Net Logger over USRP (UDP).
- Net Logger splits it into transmissions, transcribes each one with Whisper (runs locally, no cloud), and pulls out callsigns.
- The dashboard updates every two seconds.
A. On your AllStar server (recommended). If you run your own ASL3 node, install Net Logger right on it. One script sets up the logger node and node control without touching your existing node settings, and the logger can link to any public node through your server. See docs/same-server.md.
cd /opt && sudo git clone https://github.com/InnerSpark/netlogger.git
cd netlogger && sudo ./install.sh
B. On another computer with Docker. A Mac, Linux box, or Pi that gets audio from your AllStar server over the network. See the quick start below and docs/allstar-setup.md.
Either way you need an AllStar node you control. Anyone licensed can get a node number free from AllStarLink.
- Speech to text needs CPU: 2+ cores and 2 GB free RAM for
base.en, 4 cores and 4 GB forsmall.en. Apple Silicon Macs and modern x86 boxes handlesmall.eneasily. - Option A: Debian with ASL3.
- Option B: Docker (Docker Engine, Docker Desktop, or OrbStack on a Mac), and a network path from the AllStar server to the logger (same LAN, or a VPN like Tailscale).
- Get the code and settings file:
git clone https://github.com/InnerSpark/netlogger.git cd netlogger cp .env.example .env - Edit
.env. For node control, fill in theAMI_*settings. Everything is explained in the file. - Start it:
The first start downloads the Whisper model (about 500 MB for
docker compose up -d --buildsmall.en). - Open
http://<this-computer>:8080and create the admin account. - Follow the Health page. After you create the admin account, the app opens a Health page (admins only) with a live health check and a setup guide and step-by-step AllStar instructions, with your node number, ports, and addresses already filled in and a Copy button on every snippet. The same steps are in docs/allstar-setup.md.
Useful commands:
docker compose logs -f # watch what it hears
docker compose restart # restart it
docker compose down # stop it
- Enter the net name and click Open net. Nothing is logged until a net is open.
- Under AllStar nodes, connect to the net's node if it isn't already.
- Check-ins appear as stations call in. First time marks new calls. Not found means the call didn't validate: use Fix call.
- Flags set themselves from what's said. Click to change them.
- Add check-in by hand for anything missed.
- Close net, then Export CSV.
Open Nets and click Schedule a net. Pick the day, start time, length and node. At start time the logger opens the net (named with the date), links the node in monitor mode, and closes it when the time is up. It unlinks the node afterward unless you turn that off. If a net is already open, the scheduled one is skipped. Times use the time zone of the browser that created the schedule.
Stats charts check-ins per net (returning vs first time) and shows nets held, typical check-ins compared with the period before, stations heard, first-timers, and a regulars list with attendance. Filter by time range and by scheduled net. Show table lists every value.
Nets lists every net with its start, length and check-in count. Open one to see the roster and the full transcript (search by call or words), or download the CSV or transcript.
Net Logger is for licensed amateur radio operators.
- The first person to open the dashboard creates the admin account with their callsign. It's checked against the FCC license database (via callook.info); unknown or expired licenses are refused.
- Admins add users on the Users page by callsign. Operators run nets and connect nodes. Admins also manage users.
- Hams outside the US: callook.info only covers US licenses, so an admin ticks "I checked this license myself" when adding them. The same box works if the FCC lookup is down. If the first admin is outside the US, their call is accepted as entered.
- Licenses are re-checked every 30 days at login. An expired license loses access until a current callsign is verified.
- Passwords are at least 10 characters and stored as scrypt hashes. Changing or resetting a password logs that account out everywhere else.
- Five wrong passwords in a row from one address slows further tries down.
- To run without license checks (a club demo, say), set
REQUIRE_LICENSE=0.
If the only admin forgets their password, reset it on the server. It prints a new random password and logs that account out everywhere:
sudo netlogger reset-password W6ABC # install.sh
docker compose exec netlogger python -m netlogger reset-password W6ABC # DockerUse a username or a callsign. Log in with the new password, then change it under Change password.
Every net, check-in, transcript and account lives in one SQLite file: /var/lib/netlogger/netlog.db (install.sh) or /data/netlog.db in the Docker volume.
- Back up any time, even during a net:
sudo netlogger backup(Docker:docker compose exec netlogger python -m netlogger backup). Copies go tobackups/next to the database, newest 10 kept. - install.sh backs up automatically before every upgrade.
- To save a copy somewhere else:
sudo netlogger backup /var/lib/netlogger/before-move.db, then copy that file off the server. - Restore:
sudo systemctl stop netlogger, copy the backup overnetlog.db(owned bynetlogger), thensudo systemctl start netlogger. - Backups hold password hashes, so they're readable by the
netloggeruser only. Keep off-server copies private too.
- Only put the dashboard on the internet behind HTTPS. The installer sets this up for a subdomain (see docs/same-server.md). With Docker, keep it on your LAN or VPN, or put it behind a reverse proxy with HTTPS and set
COOKIE_SECURE=1andTRUST_PROXY=1. - The AMI account only needs
commandrights. Limit it to the logger's address inmanager.conf. - Report security issues privately: see SECURITY.md.
All settings live in .env. See .env.example for the full list with notes. Change a setting, then run docker compose up -d.
Replay a recording of a past net as if it came from the node. Open a net in the dashboard first.
docker compose cp old_net.wav netlogger:/tmp/old_net.wav
docker compose exec netlogger python3 tools/replay.py /tmp/old_net.wav
It splits the audio at pauses and sends each piece like a real transmission. Any format ffmpeg reads works.
Nothing shows in Last heard
Start with the Health page in the app (admins only). Its health check shows whether audio is arriving and whether node control can reach your server.
- Logs:
journalctl -u netlogger -f(installer) ordocker compose logs -f(Docker). Do you see[2.3s] ...lines when someone keys up? - Is the logger node linked? Check the AllStar nodes card, or on the AllStar server run
sudo asterisk -rx "rpt lstats 1999". - Can the AllStar server reach this computer on UDP 34001? Check firewalls and your VPN.
Heard, but no check-ins: is a net open?
Calls come out wrong
- Read the raw text in Last heard. If Whisper heard it right but the call is wrong, it's a parser bug: please open an issue with the line.
- If Whisper heard it wrong, try a bigger model (
small.en, thenmedium.en), and list your regulars inKNOWN_CALLS. - To tune on real audio: set
SAVE_AUDIO=50, let it hear some transmissions, then runtools/tune.py base.en small.ento compare models side by side.
Names and class are blank: callook.info is unreachable, or the call isn't a US call. Check-ins still log. Fix call with the same call retries the lookup.
Node control says it can't reach the server: check AMI_HOST, that port 5038 is open to this computer, and the permit line in manager.conf.
- Callsigns from any country are logged (ITU format: VE3ABC, G4XYZ, 2E0ABC, DL1AB, VK2ABC). Name and class lookup is US only (callook.info), so other calls log without a name. Lookups for other countries are welcome as a contribution.
- The first callsign in a transmission is logged as the check-in. If net control reads out a new call, remove the extra row.
- Weak signals and doubles need a manual fix.
- If the internet between the AllStar server and the logger drops, logging stops. The net itself keeps running.
See CONTRIBUTING.md for running it locally, tests, and the code layout.
AGPL-3.0. Free to use, change, and share. If you run a modified version for other people to use over a network, you must share your changes under the same license. See LICENSE.
Net Logger is not affiliated with AllStarLink, Inc. Operators are responsible for following their country's amateur radio rules.
