spdtst
A small, private-by-default internet speed test for the terminal.
spdtst measures download speed, upload speed, latency, and jitter. test_full also reports the public IP, ISP, and approximate location that the selected test endpoint can provide. It automatically finds a responsive public LibreSpeed-compatible server, or can use a server you provide.
Why spdtst?
- Simple: one command, readable output.
- Portable: Python 3.10+ with a small MIT-licensed system-certificate helper.
- Private by default: no accounts, telemetry, or result sharing. Connection details are requested only by
test_full. - Open: MIT-licensed project code and no dependency on a proprietary test client.
- Scriptable: use JSON output or save newline-delimited JSON locally.
Install
Use pipx to install the current release in an isolated environment:
pipx install https://github.com/brunozapico/spdtst/releases/download/v0.1.0/spdtst-0.1.0-py3-none-any.whl
Homebrew users can install the same release with:
brew tap brunozapico/tap
brew install spdtst
To install directly from the repository instead:
pipx install git+https://github.com/brunozapico/spdtst.git
Verify the installation:
spdtst --version
Usage
Run the standard network test (download, upload, latency, and jitter):
spdtst test
Run the extended test, which adds public IP, ISP, and approximate location when the endpoint supports it:
spdtst test_full
test-full is also accepted as a shell-friendly alias.
Commands and options
| Command | Description |
|---|---|
spdtst test |
Finds a responsive public server, then measures download, upload, latency, and jitter. |
spdtst test_full |
Runs the network test plus public IP, ISP, and approximate location. |
spdtst test-full |
Alias for test_full. |
spdtst --version |
Prints the installed version. |
spdtst --help |
Shows command help. |
Both test commands accept:
| Option | Description |
|---|---|
--server URL |
Use this LibreSpeed-compatible backend instead of automatic discovery. |
--duration SECONDS |
Set the duration of each transfer measurement; default: 5 seconds. |
--output json |
Print a machine-readable JSON result. |
--save |
Append the result to the default local history file. |
--save-to PATH |
Append the result to a chosen JSONL file; also enables saving. |
Examples:
spdtst test_full --save
spdtst test --server https://speed.example.com/backend
spdtst test_full --output json
spdtst test --duration 10 --save-to ./speed-history.jsonl
Saved results
--save stores one JSON object per line (JSONL), which is easy to inspect or process with other tools. Its default location is platform-aware:
| Platform | Default file |
|---|---|
| macOS | ~/Library/Application Support/spdtst/results.jsonl |
| Linux | $XDG_STATE_HOME/spdtst/results.jsonl, or ~/.local/state/spdtst/results.jsonl |
| Windows | %LOCALAPPDATA%\\spdtst\\results.jsonl |
No results are saved unless --save or --save-to is supplied.
How server discovery works
Without --server, spdtst retrieves the public server directory maintained by LibreSpeed and probes its available entries in parallel. It runs the test against the responsive server with the lowest observed latency. Public servers are external services, so availability and their terms can change; --server is the deterministic option for personal or organizational use.
spdtst implements its client protocol itself with Python's standard library. It does not vendor LibreSpeed code or use Speedtest by Ookla services, brands, or APIs. LibreSpeed-compatible endpoints are a protocol choice, not a bundled dependency. test_full asks the selected endpoint for connection details; because this data is controlled by that endpoint, some fields may be unavailable or only approximate.
Stack
- Python 3.10+
- Python standard library (
argparse,urllib,concurrent.futures) - truststore (MIT) to use the operating system's trusted certificates
setuptoolsfor packagingunittestfor the included test suite
License
The spdtst source code is available under the MIT License.
This is an independent project and is not affiliated with LibreSpeed or Ookla.
Metadata
Release files for spdtst 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| spdtst-0.1.0.tar.gz | 10.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| spdtst-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.2 kB
Release files / spdtst-0.1.0.tar.gz
| Download URL | spdtst-0.1.0.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f7caf6cfab7927ac95d796f4883fe1d8f709113ba640947b9e3bd57cfb3f5f66
|
|
BLAKE2b-256 checksum How to use checksums |
71ab12b076938aaad13662de04e980a5440bf5df21d96653fd3481478aad5017
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logRelease files / spdtst-0.1.0-py3-none-any.whl
| Download URL | spdtst-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d734f8d0f8303d0c8a266c830ed5af036d7c16c85399606bcdb2327dc9e6713
|
|
BLAKE2b-256 checksum How to use checksums |
8ce2e5e3906f52b1db3cc886912f5581ab7db91435869f6673eb8aa15ade2d2f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency log