NomadWiFi

Documentation

NomadWiFi is one Go core with two faces: a WPF desktop app and a command line tool. Both make the same decisions, because both run the same engine.

Install

The installer is the easiest route, and the one the in-app update prompt uses. It is per-user: it installs to %LOCALAPPDATA%\Programs\NomadWiFi and never asks for administrator rights, on install or on update.

Or with a package manager:

# the desktop app and the CLI
winget install mory-dev.NomadWiFi

# the CLI on its own
scoop install nomadwifi

# the CLI from source -- note this build is not code-signed
go install github.com/mory-dev/nomadwifi/cmd/nomadwifi@latest

What the installer does

Installed layout

%LOCALAPPDATA%\Programs\NomadWiFi\
  nomadwifi.exe        # the desktop app
  core\nomadwifi.exe   # the engine it drives, and the CLI

Both are called nomadwifi.exe on purpose, which is why they live in separate folders: the app resolves its engine from core\ only, and refuses any candidate that resolves to itself. It is the same binary either way, so putting core\ on your PATH is all the CLI needs.

Portable archives

Zips are still published for anyone who would rather not install anything: NomadWiFi-windows.zip (app plus engine) and nomadwifi-cli-windows.zip (the CLI alone). Unzip either anywhere — the app still needs core\nomadwifi.exe beside it.

Updating

NomadWiFi checks for a new release at most once a day and offers it in a banner with an Install now button. The download is verified against the published SHA-256 digest before it is run, and a mismatch is refused rather than executed. Dismissing the banner silences that specific version, not all future ones.

From a terminal:

$ nomadwifi update             # report whether a newer release exists
$ nomadwifi update --install   # download, verify and run it
$ winget upgrade mory-dev.NomadWiFi
No administrator rights needed. Wi-Fi profiles are written per-user, so scanning, connecting, warming and roaming all work from a normal account. The only action that asks for elevation is pausing a VPN client that has no command line of its own.

Requirements

How access points are scored

Every radio in range gets a quality score, and the score is explained rather than asserted — hover a row in the app, or read reasons in the JSON output.

SignalEffectWhy
Band6 GHz > 5 GHz > 2.4 GHzWider channels, far less interference.
802.11 standardbe > ax > ac > n > gNewer radios sustain higher throughput at the same signal.
RSSIScaled −100 dBm → 0%, −50 dBm → 100%Derived from measured dBm, not from the driver's link quality, which reports the connected access point at ~99% regardless.
Airtime congestionPenalty as BSS Load risesA strong access point with forty clients on it is slower than a middling one that is idle.
EncryptionSmall bonus for modern ciphersWPA3/CCMP over TKIP or none.
ReadinessSaved > prepared > open > needs a passwordA network that cannot be joined right now is not a useful roam target.

When it decides to move

Roaming is deliberately reluctant. A switch costs a second of connectivity, so it happens for a reason and not on a single bad sample.

Every switch verifies the result: association, then a gateway probe, then internet reachability. If the new access point does not carry traffic within the deadline, NomadWiFi reconnects the previous one and puts the failed access point in a penalty box so it is not tried again straight away.

A captive portal is not treated as degradation. You are behind a sign-in page, not on a bad access point, and roaming away would just lose your place in the queue.

Warming

Venues publish the same key across several names — Hotel, Hotel_5G, Hotel Lobby, Hotel Floor2. Warming recognises the family, copies the key you already have onto the siblings, and writes the Windows profiles ahead of time, so failover is a connect rather than a connect-plus-prompt.

Where it keeps things

PathContents
%USERPROFILE%\.nomadwifi\state.jsonProfiles NomadWiFi created, verification status, failure counts, penalty box, last venue.
%USERPROFILE%\.nomadwifi\scan-cache.jsonThe rolling view of access points, so a one-shot command sees the whole venue rather than one sweep.

Delete either file to start fresh; both are rebuilt automatically.

Next

Desktop app

Window, tray states, auto-roam, captive portal banner, starting with Windows.

Command line

Every command and flag, the JSON shapes, and the agent protocol.

VPN & portals

Why Wi-Fi breaks under a tunnel, which clients can be controlled, and what happens when they cannot.