An open-source network speed and latency tester with a rich terminal UI. Deploy your own server anywhere and measure real throughput between any two points on your network.
- Run your own speed test servers -- Ookla's private Speedtest server now costs $5,000+/year. Sparkyfish is free and open source.
- No artificial limits -- test at whatever speed your server and client can handle: 1 Gbps, 10 Gbps, or beyond.
- Rich terminal UI -- real-time streaming line charts for download, upload, and latency built with Bubble Tea and ntcharts.
- No net-neutrality concerns -- ISPs can't selectively prioritize your test traffic.
- Simple architecture -- one static binary for the client, one for the server. No dependencies.
- Cross-platform -- Linux, macOS, Windows, FreeBSD, OpenBSD. amd64 and arm64.
sudo dpkg -i sparkyfish_<version>_amd64.deb
sudo rpm -i sparkyfish_<version>_amd64.rpm
yay -S sparkyfish
Download the archive for your platform from the Releases page and extract the binary to somewhere in your $PATH.
Requires Go 1.22+:
git clone https://github.com/chrissnell/sparkyfish.git
cd sparkyfish
make client # builds bin/sparkyfish
sudo apt install ./sparkyfish-server_<version>_amd64.deb
sudo systemctl enable --now sparkyfish-server
sudo rpm -i sparkyfish-server_<version>_amd64.rpm
sudo systemctl enable --now sparkyfish-server
yay -S sparkyfish-server
sudo systemctl enable --now sparkyfish-server
The packages create a sparkyfish system user, install a systemd unit, and place the default config at /etc/default/sparkyfish-server. Edit that file to set your location and other options:
# /etc/default/sparkyfish-server
SPARKYFISH_OPTS="-listen-addr=:7121 -location='Dallas, TX' -cname=speedtest.example.com"
Then restart: sudo systemctl restart sparkyfish-server
A Helm chart is included in packaging/helm/sparkyfish-server/.
helm install sparkyfish-server ./packaging/helm/sparkyfish-server \
--set sparkyfish.location="Dallas, TX" \
--set sparkyfish.cname="speedtest.example.com"
Key values:
| Value | Default | Description |
|---|---|---|
sparkyfish.location |
"" |
Physical location shown to clients |
sparkyfish.cname |
"" |
Canonical hostname reported to clients |
sparkyfish.debug |
false |
Enable verbose server logging |
service.type |
LoadBalancer |
Kubernetes service type |
service.externalTrafficPolicy |
Local |
Preserves client source IPs |
service.annotations |
{} |
Annotations for MetalLB, etc. |
The deployment runs as non-root with a read-only root filesystem and all capabilities dropped.
docker run -d -p 7121:7121 ghcr.io/chrissnell/sparkyfish:latest \
-location="Dallas, TX"
Note: Docker networking overhead can reduce throughput accuracy. For production use, prefer running the binary directly or in Kubernetes with hostNetwork.
Requires Go 1.22+:
git clone https://github.com/chrissnell/sparkyfish.git
cd sparkyfish
make server # builds bin/sparkyfish-server
sparkyfish <server-hostname>[:port]
The default port is 7121. The client connects, runs latency probes, then measures download and upload throughput, displaying live results in the terminal.
Keyboard controls:
q/Ctrl+C-- quitr-- re-run the test (after completion)
The terminal must be at least 60x24 characters.
| Flag | Default | Description |
|---|---|---|
-listen-addr |
:7121 |
IP:port to listen on |
-cname |
Canonical hostname reported to clients | |
-location |
Physical location displayed to clients | |
-debug |
false |
Enable verbose logging |
Make sure port 7121/tcp is open in your firewall.
Sparkyfish uses a simple, open TCP protocol on port 7121. See docs/PROTOCOL.md for details. You're welcome to implement your own compatible client or server.
MIT
