A terminal network performance toolkit — one static binary, no dependencies.
- Speed test — internet download/upload/latency via speedtest.net (Ookla) or Cloudflare
- LAN speed server — host a browser speed test page; any phone/laptop on your network can test against your machine
- Packet loss — ICMP burst testing with loss %, latency distribution and jitter (packetlosstest.com style)
- MTR — traceroute with live per-hop loss and latency stats
Everything runs in the terminal: an interactive TUI when run bare, plain/JSON output for scripts.
Homebrew (macOS / Linux):
brew install cognitobit/tap/netpulseWindows (PowerShell):
irm https://raw.githubusercontent.com/CognitoBit/netpulse/main/install.ps1 | iexmacOS / Linux:
curl -fsSL https://raw.githubusercontent.com/CognitoBit/netpulse/main/install.sh | shOr grab a binary from releases.
netpulse # interactive menu
netpulse speed # speed test (--backend ookla|cloudflare)
netpulse serve # LAN speed test server on :7333
netpulse loss # packet loss test (defaults: 8.8.8.8, 1.1.1.1, 10 pings/sec, 30s)
netpulse mtr google.com # live traceroute stats
Every test command accepts --plain (line output) or --json (machine-readable final document), and detects non-TTY output automatically.
Examples:
netpulse loss --targets 8.8.8.8,1.1.1.1 --interval 50ms --duration 1m
netpulse mtr cloudflare.com --cycles 20 --json
netpulse speed --backend cloudflare --plain
netpulse serve --port 8080
- Windows: ICMP works without elevation. The LAN server triggers a one-time Windows Firewall prompt — allow it on Private networks.
- macOS: everything works unprivileged.
- Linux: the packet loss test works unprivileged if
net.ipv4.ping_group_rangeallows it (most distros). MTR needs raw sockets — run withsudo, or grant the binarycap_net_rawonce:(Realsudo setcap cap_net_raw+ep "$(command -v netpulse)"mtrhas the same requirement.) - Mid-path hops showing high loss while the final hop shows 0% is normal — routers deprioritize ICMP replies.
go build -o netpulse .
Releases are built by GoReleaser via GitHub Actions on version tags (v*).
Future: Scoop bucket (scoops:) can be added to .goreleaser.yaml once a bucket repo exists.
