Tray app that runs Ookla Speedtest® CLI on a schedule, plots download/upload over time, and can alert via the tray icon when speeds fall below thresholds. This measures throughput to Speedtest servers, not live NIC traffic.
CLI download: speedtest.net/apps/cli
License: This project’s source code is under the MIT License (LICENSE in the repo root). GitHub reads that file and shows the license on the repository home page.
Third‑party: The GUI stack uses Qt via PySide6 (LGPL v3). Ookla Speedtest® CLI (speedtest.exe) is separate software—obtain it from Ookla and comply with their terms. The Speedtest name and marks belong to Ookla.
- Windows (as set up here; source may run elsewhere with PySide6).
- Python 3.10+ for running or building from source.
speedtest.exe— from Ookla (see link above). You may place it next to the project, invendor\, onPATH, or set the path in the app Settings.
git clone <your-repo-url> bandwidth-monitor
cd bandwidth-monitorThe folder you cd into should contain requirements.txt and the bandwidth_monitor package (all commands below assume you are at that repository root).
pip install -r requirements.txt
python -m bandwidth_monitorOptional: copy CLI next to the project root so auto-detection finds it without Settings:
Copy-Item -Path "path\to\your\speedtest.exe" -Destination ".\speedtest.exe" -Force- Put Ookla’s
speedtest.exeinvendor\(create the folder if needed):
New-Item -ItemType Directory -Force -Path ".\vendor" | Out-Null
Copy-Item -Force ".\speedtest.exe" ".\vendor\speedtest.exe"
# Or copy from anywhere:
# Copy-Item -Force "C:\path\to\speedtest.exe" ".\vendor\speedtest.exe"- Install build dependencies and build:
pip install -r requirements.txt
pip install pyinstaller
python -m PyInstaller --clean bandwidth_monitor.spec- Output:
dist\BandwidthMonitor.exe
A prebuilt dist\BandwidthMonitor.exe may be committed in this repository for convenience; rebuild locally to refresh it after code changes.
With this layout you normally do not need to set the CLI path in Settings (leave it blank).
Note: If PyInstaller errors on Python 3.13 while analyzing PySide6, use Python 3.11 or 3.12 for the build, or use the Nuitka command below.
Install tools, then build a one-file executable. Include the CLI if vendor\speedtest.exe exists:
pip install -r requirements.txt
pip install nuitka ordered-set zstandard
python -m nuitka --onefile --windows-disable-console --enable-plugin=pyside6 `
--include-data-files=vendor/speedtest.exe=speedtest.exe `
--output-dir=dist --output-filename=BandwidthMonitor.exe `
bandwidth_monitor\main.pyIf you are not bundling speedtest.exe, omit the --include-data-files=... line.
First compile can take a long time; a C compiler (e.g. MSVC) is required.
Shipping Ookla’s binary may be subject to their license and terms. Use only as they allow. Prebuilt dist/BandwidthMonitor.exe bundles their CLI only when built per vendor/README.txt; your obligations for that bundle are not covered by the MIT License above (Ookla + Qt LGPL still apply).
%LOCALAPPDATA%\BandwidthMonitor\
settings.json
history.jsonl
See description.txt for the original project brief and vendor\README.txt for bundling notes.
From the repository root, after creating an empty repo on your host (GitHub, etc.):
git init
git add .
git status # build/ and most of dist/ ignored; dist\BandwidthMonitor.exe tracked if present
git commit -m "Initial commit: Bandwidth Monitor"
git branch -M main
git remote add origin <your-repo-url>
git push -u origin mainIgnored: build/, loose files under dist/ (e.g. Nuitka main.build), speedtest.exe at repo root / vendor/, zip archives, virtualenvs — see .gitignore. dist/BandwidthMonitor.exe is included when you commit it (~50 MB; fine under GitHub’s 100 MB file limit; consider Releases if you prefer not to grow history).