A fast, native internet speed test. Multiple backends behind one clean interface β run against whichever server you trust. Follows your system's light/dark theme. No browser, no tracking, no ads.
| Platform | Status | Get it |
|---|---|---|
| π§ Linux | β v1.7.2 stable | 7 package formats below β .deb, .rpm, AppImage, Snap, Flatpak, AUR, PyPI |
| π macOS | β v0.1.0 alpha | mobile/ β Flutter port; DMG from Releases |
| π± iOS | π§ Planned v0.2 | Coming to App Store |
| π€ Android | π§ Planned v0.2 | Coming to Play Store |
| πͺ Windows | π§ Planned v0.3 | MSIX installer |
The Linux app (this repo root) is Python + GTK4 + libadwaita. Mobile/desktop Apple/Android/Windows all share a single Flutter + Dart codebase under mobile/.
- LibreSpeed works out of the box (1.7.1) β the backend ships with three curated Clouvider US endpoints (NYC, Atlanta, LA) and the GUI shows a "LibreSpeed Server" sub-picker under the Backend dropdown β choose one close to you and click Start. No more "set
LIBRESPEED_URLenv var and restart" dance. If a curated server goes down between releases, v1.7.1 auto-falls-back to the next live one in the list. Self-hosted URLs still work via--librespeed-urlor the env var (and are never auto-switched β your explicit choice is respected). - One-command installer (1.6.16+) β auto-detects your distro and installs the best format. No more "download the .deb then apt install" two-step.
- Ships in 7 formats (1.6.15+) β
.deb,.rpm, AppImage, Snap, Flatpak, PyPI wheel, source tarball. All with full backend parity (Cloudflare / Ookla / M-Lab / LibreSpeed). - Ookla backend live progress (1.6.0+) β sparklines and ping bars animate in real time during the run instead of sitting silent until the end.
- Run Again works on Ookla (1.6.0+) β fresh CLI invocation every click.
- Backend errors wrap inside the card (1.6.0+) β long error messages (M-Lab 401 with headers etc.) no longer push the window wider than your screen.
- Ookla installer can't hang (1.6.0+) β forces IPv4 + hard timeouts on curl + wget.
See CHANGELOG / releases for the full history.
curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bashThe installer auto-detects your distro and installs the best-matching package (.deb on Ubuntu/Debian/Mint, .rpm on Fedora/RHEL/openSUSE, AppImage on everything else). No manual download, no two-step dance.
Alternative one-liner if you'd rather clone the repo first:
git clone https://github.com/mmhfarooque/gui-speedtest.git && cd gui-speedtest && bash install.sh
To remove later:
curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bash -s -- --uninstallIf you prefer to download the package directly:
| Format | Distros | Command |
|---|---|---|
.deb |
Debian, Ubuntu, Mint, Pop!_OS | See below |
.rpm |
Fedora, RHEL, openSUSE | See below |
| AppImage | Any glibc-based distro, portable | See below |
| Snap | Any distro with snapd |
See below |
| Flatpak | Any distro with flatpak |
See below |
| AUR | Arch, Manjaro, EndeavourOS | See below |
| PyPI | Any distro with Python 3.10+ | See below |
# Download the latest .deb from the Releases page: curl -LO https://github.com/mmhfarooque/gui-speedtest/releases/latest/download/gui-speedtest_1.6.0-1_all.deb # Install (apt pulls in GTK4 + libadwaita + python-gi automatically): sudo apt install ./gui-speedtest_1.6.0-1_all.deb
Built on Ubuntu 24.04, works on 22.04+, Debian 12+, and all derivatives.
# Copr repository (coming soon β v1.6.x): sudo dnf copr enable mmhfarooque/gui-speedtest sudo dnf install gui-speedtest
Or grab the .rpm directly from the Releases page.
curl -LO https://github.com/mmhfarooque/gui-speedtest/releases/latest/download/gui-speedtest-1.6.0-x86_64.AppImage chmod +x gui-speedtest-1.6.0-x86_64.AppImage ./gui-speedtest-1.6.0-x86_64.AppImage
No install, no root. Bundles GTK4 + libadwaita.
sudo snap install gui-speedtest
(Snap Store publishing is in review β check snapcraft.io/gui-speedtest for status.)
flatpak install flathub io.github.mmhfarooque.GuiSpeedTest flatpak run io.github.mmhfarooque.GuiSpeedTest
(Flathub submission pending β track it on the Flathub repo.)
# Using any AUR helper: yay -S gui-speedtest # Or paru, trizen, etc.
# System GTK4 + libadwaita must be present first: sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-4.0 gir1.2-adw-1 # Debian/Ubuntu sudo dnf install python3-gobject python3-cairo gtk4 libadwaita # Fedora sudo pacman -S python-gobject python-cairo gtk4 libadwaita # Arch pip install --user gui-speedtest # For M-Lab NDT7 backend: pip install --user "gui-speedtest[all]"
No .desktop registration β launch from a terminal with gui-speedtest --gui.
The same install.sh knows how to remove whichever format is installed β it tries every path quietly and reports what it found. It also removes the Ookla Speedtest CLI by default (since we installed it for you via the in-app "Enable Ookla" button or the gui-speedtest-install-ookla helper) along with Ookla's apt repo + signing key.
curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bash -s -- --uninstallIf you use Ookla from other tools and want to keep the speedtest CLI installed, add --keep-ookla:
curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bash -s -- --uninstall --keep-ooklaOr if you still have the repo cloned:
cd gui-speedtest && bash install.sh --uninstall # (equivalent shortcut: bash uninstall.sh)
If you'd rather not re-download the installer:
Debian / Ubuntu / Mint / Pop!_OS:
sudo apt remove gui-speedtest
# Or wipe config/cache as well:
sudo apt purge gui-speedtestFedora / RHEL / Rocky / Alma:
sudo dnf remove gui-speedtest
openSUSE:
sudo zypper rm gui-speedtest
Arch / Manjaro (AUR):
yay -R gui-speedtest # or: sudo pacman -R gui-speedtestAppImage:
rm ~/.local/bin/gui-speedtest rm ~/.local/share/applications/io.github.mmhfarooque.GuiSpeedTest.desktop # If you dropped it somewhere else (e.g. ~/Applications/), rm it from there.
Flatpak:
flatpak uninstall io.github.mmhfarooque.GuiSpeedTest
Snap:
sudo snap remove gui-speedtest
PyPI (pip):
pip uninstall gui-speedtest
# If you installed with --user: pip uninstall --user gui-speedtestThe app only writes to one place by default:
rm -rf ~/.cache/gui-speedtest/ # removes the rotating log file
There's no config directory, no keyring entries, no crontabs, no systemd units β uninstall is complete once the package is gone and the cache dir is cleared.
The repo ships reinstall.sh which does a clean uninstall-then-install in one step:
cd gui-speedtest && bash reinstall.sh
Or one-line equivalent (downloads the script fresh each time):
curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bash -s -- --uninstall && \ curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bash
Launch the GUI:
gui-speedtest --gui
Click Start Speed Test. Cloudflare is the default β it's global anycast so it works from anywhere with no setup. The four cards (Download, Upload, Ping, Jitter) animate in real time with sparklines and histograms as the test runs. When it finishes, click Run Again to repeat.
To switch backends, use the Backend dropdown in the Connection panel.
| Backend | Default | Notes |
|---|---|---|
| Cloudflare | β | Global anycast, hits your nearest PoP. No setup. Works out of the box. |
| Ookla Speedtest | Wraps the official speedtest CLI. Install with the in-app Enable Ookla button or sudo gui-speedtest-install-ookla. |
|
| M-Lab NDT7 | Academic/research-backed. Non-commercial. Needs websocket-client β pip install 'gui-speedtest[mlab]' or sudo apt install python3-websocket. |
|
| LibreSpeed | β (v1.7+) | Works out of the box. Ships with three curated Clouvider US endpoints (NYC/Atlanta/LA). The GUI shows a server picker under the Backend dropdown β switch between endpoints instantly, no restart. If a curated server is unreachable at run time (v1.7.1+), the app auto-falls-back to the next live one. Point at a self-hosted server via --librespeed-url or $LIBRESPEED_URL if you prefer (custom URLs aren't auto-switched). |
The dropdown only shows backends whose prerequisites are met. If one's missing, the Log button in the header shows an actionable hint.
gui-speedtest # Terminal run, default backend gui-speedtest --gui # Launch the GTK window gui-speedtest --backend ookla # Specific backend gui-speedtest --json # Machine-readable output gui-speedtest --list-backends # Show what's available on your system gui-speedtest --backend librespeed # Uses first built-in LibreSpeed server gui-speedtest --librespeed-list-servers # List the built-in LibreSpeed servers gui-speedtest --backend librespeed --librespeed-url https://speedtest.example.com/ # Self-hosted gui-speedtest --version gui-speedtest --help
JSON output is a single object with connection, latency, download, upload, app keys β pipe it to jq or append to a log file for trend tracking.
Ookla backend doesn't appear in the dropdown.
Click the Log button. If you see A different 'speedtest' binary is on PATH (likely sivel/speedtest-cli ...), that's a different tool with incompatible arguments. Install Ookla's official CLI via the in-app Enable Ookla button.
Slow or hanging speed test on one ISP. Some ISPs in South Asia and Africa advertise IPv6 records that don't have working transit. The app's HTTP-based backends force IPv4 to dodge that (v1.5.3+). If Ookla still hangs during the run itself (not install), pick a different backend or a different Ookla server.
ModuleNotFoundError: No module named 'websocket' when selecting M-Lab.
Install the optional dep: pip install --user 'gui-speedtest[mlab]' or sudo apt install python3-websocket.
Charts blank, text-only cards.
Missing the cairoβGI glue: sudo apt install python3-gi-cairo on Debian/Ubuntu, sudo pacman -S python-cairo on Arch.
Logs for reporting a bug.
~/.cache/gui-speedtest/gui-speedtest.log β or click the Log button in the app and use Copy All.
git clone https://github.com/mmhfarooque/gui-speedtest cd gui-speedtest python3 -m build # sdist + wheel in dist/ ./scripts/build-deb.sh # .deb in parent dir ./scripts/build-appimage.sh # AppImage in dist/ snapcraft # Snap in project root
Local dev loop:
python3 gui_speedtest.py --gui
Lint with ruff check .. CI runs on every push (see .github/workflows/ci.yml).
speedtest-cli(Python) is effectively dead β speedtest.net returns 403 for it.- Official Ookla CLI ships without a GUI and isn't packaged for every distro.
- Fast.com / nperf / etc. require a browser and phone-home telemetry.
- Existing GTK speed tests are either unmaintained or built for GNOME 3 and look out of place in modern desktops.
This app is deliberately small: stdlib-only at runtime (plus websocket-client for M-Lab), no JavaScript, no ads, no account, no tracking. Open source under GPL-3.0-or-later.
GPL-3.0-or-later. See LICENSE.