# NetSpeedTray puts the network readout on the Windows taskbar itself

> NetSpeedTray is a Python and PyQt6 application that docks live upload and download speeds into the Windows 10 or 11 taskbar, with a separate Monitor window for history, per-process detail and data usage. It refuses to invent per-app bandwidth figures because Windows cannot attribute bytes per application without a driver.

**erez-c137/NetSpeedTray** — A lightweight, open-source network monitor for Windows that displays live upload/download speeds directly on the Taskbar with a native look and feel.

- Repository: https://github.com/erez-c137/NetSpeedTray
- Website: https://github.com/erez-c137/NetSpeedTray
- Stars: 789 · Forks: 58
- Language: Python
- License: GPL-3.0
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/erez-c137-netspeedtray

## The gap NetSpeedTray targets sits between Task Manager and the desktop

The project starts from a specific complaint about Windows. Network usage has been visible in Task Manager for a long time, but you have to open Task Manager to see it, and the numbers are gone the moment you click away. The author says this was the gap he wanted to close on his own machine, and that he could not find a widget he trusted to do it cleanly.

The answer is to put the readout on the taskbar. In its simplest state the widget shows only up and download speeds, updated every second by default. Expanding it adds a live mini-graph, then CPU, GPU and RAM figures with temperatures and power draw, and then everything at once. Auto-detection selects the primary internet connection, or you can pick specific adapters yourself, and colour-coded thresholds make heavy traffic stand out.

Two properties of that design are worth noticing. The widget is described as docking to the taskbar itself in the 2.x era, so it no longer hides behind the Start menu or system flyouts as an ordinary system tray icon would. And the project states the widget needs no admin rights, which is unusual for a tool that reads hardware sensors and network counters on Windows.

## Double-click opens the Monitor, and the widget is only the headline

Everything beyond the readout lives in one window, called the Monitor, and you reach it by double-clicking the widget. The Overview tab carries live tiles with adaptive sparklines, a network panel with inline latency, a data-usage card, and the applications holding the most connections, with every card able to drill into detail.

The Network tab adds up and down history over a live per-app connection list showing how many connections each program holds, how many are active, and the distinct hosts it reaches, with a filter per network interface. The Hardware tab shows a combined CPU, GPU and RAM history graph over a live per-process list of CPU, RAM and GPU percentage, plus a telemetry band of temperatures, power and memory.

Settings are described as six pages with a live preview: General, Widget, Appearance, Hardware, Network and Advanced. General covers language, update rate, behaviour, preferred monitor and configurable double-click and middle-click actions, while Appearance handles fonts, colours and arrow-style presets with a live widget preview that updates as you change things.

So the widget is the glanceable layer and the Monitor is where investigation happens. That split is the structural decision in the project, and it is why the app can show a per-process CPU and GPU list without those numbers having to fit on a taskbar.

## Per-app speed figures are deliberately absent

The most interesting limitation is a chosen one. The project states plainly that there are no fake per-app speeds, because Windows cannot attribute network bytes per app without a driver, so nothing is dressed up.

Instead of a throughput column per application, the per-app list is built on connections: how many each program holds, how many are active, and which distinct hosts it reaches. That is a genuinely different question from bandwidth. A browser with sixty open sockets and a download client with one active socket can show the same connection counts and completely different traffic, and the interface will not tell you which is which.

The trade-off is deliberate and defensible. Requiring a driver means an installer that touches the kernel, elevation prompts, and a different security profile, and the author explicitly lists no admin rights as a requirement for the widget. If your question is which process is eating your bandwidth, this tool answers a narrower question than the one you had. If your question is which hosts a program is talking to and how much it has open, the Monitor answers it directly.

## Four ways to install, all pointing at the same signed binaries

The documented install path is a single package manager command:

```bash
winget install --id erez-c137.NetSpeedTray
```

That is the option to reach for first on Windows 10 or 11 (64-bit). The project also points to the release page for a Setup.exe or a Portable.zip, and states that both are digitally signed so you get no SmartScreen warnings. Signing is done by the SignPath Foundation, which the project credits for letting the app install cleanly.

There is a Microsoft Store listing as well, described as the same signed installer and the same free open-source app in one click. The README adds a warning that it is the only NetSpeedTray on the Store and that anything with a similar name is not this project, which is worth heeding since the package name is easy to imitate.

One requirement is easy to miss. CPU and GPU temperatures on some hardware need an optional helper, and the README links to a section about hardware monitoring and LibreHardwareMonitor for the details. The widget itself runs without admin rights, but the temperature band is the part that may need extra setup depending on your hardware.

## Portable builds that update themselves since 2.1.4

Since version 2.1.4, the portable build updates itself. The description of that mechanism is that the build is verified, swapped and relaunched without you touching a file.

That is the reason to prefer the portable zip over the installer in some setups. A self-updating portable copy means you can keep the application on a removable drive or in a per-user directory and still receive fixes, without an installer rewriting system state. The verification step is what makes this worth doing at all: an unauthenticated self-update would be a worse security posture than manual updates, and the project says the update is verified before the swap happens.

It also means the portable build has a different lifecycle from the installer build. If you pin a version for reproducibility, note that the portable path will move forward on its own. The README does not document a way to freeze the portable build at a given version, and it does not document a channel or schedule setting for the self-update, so the update policy appears to be a single behaviour rather than something you can configure.

## A Python and PyQt6 stack sitting under a native-looking widget

The implementation is Python with PyQt6, and the pinned dependency set is visible in the repository. The compiled requirements file is generated with pip-compile under Python 3.13, and its header records the command that produces it:

```bash
pip-compile --output-file=requirements.txt requirements.in
```

The runtime list is short and legible. PyQt6 6.9.1 and its Qt6, SIP and pywin32 pieces carry the interface and the Windows-specific access. psutil 7.0.0 and wmi 1.5.1 provide the process, CPU and hardware counters, with the Windows-only entries marked by a sys_platform condition equal to win32. numpy 2.3.2, matplotlib 3.10.5 and pillow 12.3.0 cover charting and image work, and python-dateutil and fonttools round out the transitive set.

Reading that list tells you something about the architecture. The charting stack is matplotlib rather than a native plot control, which fits an application that draws history graphs inside a PyQt6 window. The two Windows-specific packages, psutil and wmi, are the path by which per-process CPU, RAM and GPU figures are obtained, and the same pairing is why per-app network attribution is limited to connections rather than bytes. The repository layout adds src/, build/, assets/, screenshots/ and dev-requirements files alongside documentation files for the database schema, translations and privacy.

## No telemetry, no ads, and a stated privacy posture

The project advertises itself as open source, signed, with no ads and no telemetry, and it repeats the point in the context of why it exists: no browser tab open, no third process to babysit, no telemetry, no ads and no tracking. The emphasis on not needing a third process is worth noting for a taskbar utility, since a background app that spawns helpers is the usual reason people uninstall one.

The repository backs the claim with documents rather than assertions alone. A privacy.md file sits at the root alongside DATABASE.md, which describes the data model, and TRANSLATORS.md, which points to the fact that the interface is localised through the General page language setting.

That data model matters more than it sounds for a tool that records network history. An app that keeps per-connection and per-host records and exports statistics is effectively holding a browsing and application activity log, so where that log is stored, how long it is kept and whether the export format is machine readable are the questions to answer. The README does not document the retention period or the export file format, so those details have to be read in DATABASE.md or the Monitor itself.

## A fast release cadence under GPL-3.0

The project moves quickly. Version 2.1.5 was released on 2026-09-04, 2.1.6 on 2026-09-06 and 2.1.7 on 2026-09-23, and the last push was on 2026-10-20. The repository is not archived and the default branch is main.

A cadence like that cuts both ways. It means an installed copy goes stale quickly, and the portable build's self-update exists partly because manual updates would not keep up. It also means you should expect behaviour to shift between minor versions in a tool with a large settings surface.

The licence is GPL-3.0. For a desktop utility that a user runs on their own machine, that licence is the normal way to share such a tool, and the requirement to publish modifications of the distributed program is the part to keep in mind if you plan to fork or redistribute a build. The signed binaries are the ones the project distributes, and signing tells you the binary came from the project's build pipeline rather than being rebuilt locally.

The last push date is also the honest answer to how current the project is: the code was being worked on the same day the description of the current state was written.

## Conclusion

NetSpeedTray suits a Windows desktop user who wants upload and download speed visible without opening Task Manager, and who accepts a per-app view limited to connection counts rather than attributed bandwidth. It does not suit someone who needs per-application traffic attribution, because the project states Windows cannot provide that without a driver. Before installing, confirm your platform is 64-bit Windows 10 or 11, decide between the signed installer and the self-updating portable build, and check the LibreHardwareMonitor helper requirement if you care about CPU and GPU temperatures.

## FAQ

### How do I install NetSpeedTray on Windows?

The project documents `winget install --id erez-c137.NetSpeedTray`, and also links to a signed Setup.exe and Portable.zip on the releases page, plus a Microsoft Store listing. Windows 10 or 11 on 64-bit is required.

### Does NetSpeedTray show the speed of each application separately?

No. The project states that Windows cannot attribute network bytes per app without a driver, so it shows per-app connection counts, active connections and reachable hosts instead of per-app speeds.

### Do I need administrator rights to use NetSpeedTray?

The widget needs no admin rights according to the project description. CPU and GPU temperatures on some hardware need an optional helper, with LibreHardwareMonitor referenced in the hardware monitoring section of the README.

### What happens to the portable version of NetSpeedTray over time?

Since version 2.1.4 the portable build updates itself, verified, swapped and relaunched without you touching a file.

### What licence is NetSpeedTray released under?

The repository lists the GPL-3.0 licence. The README also states the project is free, open source, signed, and carries no ads and no telemetry.

## Sources

- [erez-c137/NetSpeedTray on GitHub](https://github.com/erez-c137/NetSpeedTray)
- [License: GPL-3.0](https://github.com/erez-c137/NetSpeedTray/blob/main/LICENSE)
- [Project website](https://github.com/erez-c137/NetSpeedTray)
- [README](https://github.com/erez-c137/NetSpeedTray/blob/main/README.md)
- [Releases](https://github.com/erez-c137/NetSpeedTray/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/erez-c137-netspeedtray
