A small always-on-top readout for CPU, GPU, memory, disk and network — a floating bar of coloured chips, each with a live sparkline behind the value.
- Windows 10 or 11
- Python 3.10 or newer on
PATH(python.org) - Optional: an NVIDIA GPU for the GPU chips, and LibreHardwareMonitor for CPU temperature (see below)
git clone https://github.com/viruztt/SysMonitorBar.git
cd SysMonitorBar
run.bat
Or download the ZIP from GitHub, extract it, and double-click run.bat.
The first run creates a .venv beside the script, installs the dependencies,
and then launches the bar with pythonw (no console window). Later runs start immediately.
Manually, if you prefer:
py -3 -m venv .venv
.venv\Scripts\python -m pip install -r requirements.txt
.venv\Scripts\pythonw main.pyselftest.bat prints one reading from every sensor and exits — the quickest
way to see what your machine actually exposes.
- Drag the bar anywhere; the position is remembered.
- Right-click for the menu: pick which metrics to show, toggle per-core bars and sparklines, set opacity, text size and refresh rate.
- Hover a chip for detail (GPU model, VRAM in MiB, exact GB, fan, watts).
- A tray icon shows/hides the bar and quits it.
- Window layer (right-click menu) sets how the bar stacks: Always on top, Normal (other windows can cover it), or Always at the bottom (it sits on the wallpaper, below everything). The bar has no taskbar button, so if you lose it in the stack use Bring to front on the tray icon.
- Click-through (right-click menu) makes the bar ignore the mouse entirely, so it can sit over a game or editor without stealing clicks. Re-enable it from the tray icon, since the bar itself won't accept a right-click while click-through is on.
| Chip | Source |
|---|---|
| CPU, RAM, SWAP, DISK Space, DISK Read/Write, NET Up/Down | psutil |
| GPU Util / VRAM / Temp / Power | NVML (nvidia-ml-py), falling back to nvidia-smi |
| CPU Temp | LibreHardwareMonitor → OpenHardwareMonitor → LHM web server → ACPI |
Windows exposes no CPU temperature through any normal API — psutil returns
nothing there, which is why most Python monitors skip it. The app tries four
sources in order and uses the first that answers:
- LibreHardwareMonitor's WMI provider (
root\LibreHardwareMonitor) — the reliable one. Download LibreHardwareMonitor, run it as administrator, and in its options enable Run in background plus the WMI provider. Leave it running (it can start minimised with Windows) and the chip populates. - OpenHardwareMonitor's WMI provider, if you use that instead.
- LibreHardwareMonitor's built-in web server on
http://localhost:8085. - The ACPI thermal zone — present on some boards, and often reports the chipset rather than the CPU, so it is the last resort.
Until one of those is available the chip reads n/a; everything else works
regardless. The tooltip tells you which source is in use.
config.json is written next to main.py on first use and updated whenever you
change something from the menu.
| Key | Meaning |
|---|---|
interval |
Seconds between samples (default 1.0) |
chips |
Which metrics to show, in order |
opacity |
Window opacity, 0.0–1.0 |
font_size |
Point size; chip height scales with it |
window_layer |
top, normal, or bottom |
click_through |
Ignore mouse input entirely |
show_per_core |
Thin per-core utilisation bars under the chips |
show_sparklines |
History fill behind each value |
history |
Sparkline length in samples |
disk_path |
Drive to report for DISK Space (default: system drive) |
Deleting config.json restores the defaults.
Run install_startup.bat once. It puts a shortcut in your Startup folder
pointing straight at .venv\Scripts\pythonw.exe main.py, so the bar appears at
sign-in with no console window flashing up. remove_startup.bat undoes it.
Run run.bat at least once first — the shortcut points into .venv, which that
creates. If you move or rename the folder, run install_startup.bat again so the
shortcut picks up the new path.
Prefer to do it by hand? Press Win+R, run shell:startup, and drop a shortcut
to run.bat in the folder that opens.
main.py entry point (--selftest for a headless sensor dump)
run.bat first-run installer + launcher
install_startup.bat add/remove the Windows startup shortcut
remove_startup.bat
selftest.bat sensor dump
tools/
make_screenshot.py renders docs/screenshot.png from made-up readings
sysmonitor/
config.py JSON settings load/save
sensors.py sampling thread → Snapshot
cputemp.py CPU temperature providers
gpu.py NVML / nvidia-smi
widget.py the floating bar
- Sampling runs on its own thread, so the UI never blocks on a slow WMI call. Typical CPU cost is well under 1% at a 1-second interval.
- Disk I/O and network figures are deltas between samples, in MB/s.
- Multiple NVIDIA GPUs each get their own chip set (
GPU0 Util,GPU1 Util, …). - Chips wrap onto extra rows rather than running off the screen edge.
Your settings (config.json) are git-ignored, so they never end up in the
repository.
