Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

GUI Speed Test

Release License: GPL v3+ CI

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.


Download

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/.


What's new

  • 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_URL env 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-url or 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.


Quick install (one command, any distro)

curl -fsSL https://raw.githubusercontent.com/mmhfarooque/gui-speedtest/main/install.sh | bash

The 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 -- --uninstall

Manual install β€” pick a format

If 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

Debian / Ubuntu / Mint

# 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.

Fedora / RHEL / openSUSE

# 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.

AppImage (any distro, portable)

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.

Snap

sudo snap install gui-speedtest

(Snap Store publishing is in review β€” check snapcraft.io/gui-speedtest for status.)

Flatpak

flatpak install flathub io.github.mmhfarooque.GuiSpeedTest
flatpak run io.github.mmhfarooque.GuiSpeedTest

(Flathub submission pending β€” track it on the Flathub repo.)

Arch / Manjaro (AUR)

# Using any AUR helper:
yay -S gui-speedtest
# Or paru, trizen, etc.

PyPI (any distro, fallback)

# 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.


Uninstall

One-command uninstall (any format)

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 -- --uninstall

If 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-ookla

Or if you still have the repo cloned:

cd gui-speedtest && bash install.sh --uninstall
# (equivalent shortcut: bash uninstall.sh)

Manual uninstall β€” pick the format you installed

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-speedtest

Fedora / 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-speedtest

AppImage:

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-speedtest

Clean up user data

The 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.

Reinstall (after updates or system upgrades)

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

Quick start

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.


Backends

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.


Command-line usage

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.


Troubleshooting

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.


Build from source

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).


Why another speed test?

  • 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.


License

GPL-3.0-or-later. See LICENSE.


Links

About

Multi-backend GUI internet speed test for Linux (GTK4 + libadwaita)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /