sysresource-monitor
CPU, RAM and per-drive disk usage on a small always-on-top toast that parks itself just above the system clock - and slides out of the way the moment your cursor comes near it.
🖥 System Resources 61%
CPU 6.2 of 8 cores idle 25°C 23%
▁▃▁▂█▁▂▁ <- one bar per logical core
RAM 6.7 GB free of 15.9 GB 58%
CPU↑ python.exe 7%
RAM↑ studio64.exe 1.7 GB 11%
C: 161.0 GB free of 350.9 GB 54%
D: 62.2 GB free of 125.2 GB 50%
G: 152.9 GB free of 350.9 GB 56%
updated 23:23:24 every 5s 3 drives % = in use
No config file, no HTTP server, no background service - a tray icon and a toast, plus a CLI for when you just want the numbers.
Install
pip install sysresource-monitor
From a checkout:
pip install -e .
Requires Python 3.11+, PySide6 for the toast and psutil for the numbers.
Use
sysresource-monitor # launch the tray toast
sysresource-monitor --interval 2 # ... sampling every 2 seconds
sysresource-monitor --all-mounts # ... including mounts psutil hides
sysresource-monitor status # print one sample as a table
sysresource-monitor status --json # print one sample as JSON
sysresource-monitor status --swap # include swap usage
sysresource-monitor status --watch # redraw the table every 5 seconds
sysresource-monitor status --watch 2 # ... every 2 seconds instead
sysresource-monitor status --no-procs # skip the top-consumer scan
sysresource-monitor status --no-temp # skip the temperature query
Also runs as python -m sysresource_monitor [...], or on Windows via
run_monitor.bat, which pins the py -3.13 launcher so a stray python on
PATH can't pick an interpreter without PySide6 installed.
What it shows
Each row pairs what is spare (in words, on the left) with what is in
use (the percentage, on the right). Those are opposite quantities, so the
left-hand text always names itself - idle, free - and the percentage column
is labelled once, in the footer, as % = in use.
| Row | left: spare capacity | right: in use |
|---|---|---|
| CPU | 6.2 of 8 cores idle, plus temperature |
current load |
| core strip | one bar per logical core | per-core load |
| RAM | 6.7 GB free of 15.9 GB |
memory in use |
| CPU↑ | the process using the most CPU | its share of the machine |
| RAM↑ | the process using the most RAM, and how much | its share of RAM |
| One row per fixed drive | 161.0 GB free of 350.9 GB |
space in use |
The core strip earns its place on a busy machine: one pegged core reads as 12% overall on a 8-thread box, which looks calm on the CPU row and obvious on the strip.
Per-process CPU is normalised by core count, so CPU↑ 25% means a quarter of
the whole machine, the way Task Manager counts it - not a quarter of one core.
The terminal view prints both figures.
About the temperature
There is no portable way to read a CPU temperature, so this is best-effort and the row simply omits it when nothing will answer:
- Linux/FreeBSD -
psutil.sensors_temperatures(), preferring a real package sensor (coretemp,k10temp,zenpower,cpu_thermal). - Windows -
psutildoesn't implement that call at all, and the usual substitute,MSAcpi_ThermalZoneTemperature, needs an elevated process. The fallback is the ACPI thermal-zone performance counter, which any user can read. That is a chassis/zone reading rather than the CPU die, so treat it as indicative. If you want a true die temperature, run something like LibreHardwareMonitor alongside. - macOS - nothing without a signed helper, so the row stays hidden.
The badge in the header is the highest pressure of all of them, and it colours the whole card: green under 70%, amber from 70%, red from 90%. Each row's own percentage is coloured on the same scale, so a drive filling up stands out without you reading the numbers.
Where it sits, and how it moves
The toast anchors to the bottom-right of the work area - the desktop minus the taskbar - so on a default Windows setup it lands directly above the clock. Move the taskbar or change its size and the toast follows on the next sample.
The touch-and-go behaviour is the same as cursorhub's: bring the mouse into the toast's corner and it slides to the opposite side of the screen in a 250 ms ease-out, then slides home once the cursor leaves. It never takes focus and never eats a click - it just gets out of the way.
Refresh cadence
Three cadences, because the numbers cost wildly different amounts to read:
| Every | What | Why |
|---|---|---|
5s (--interval) |
CPU, per-core, RAM | free |
| 15s | disks, top consumers | disk_usage() can block on a dead network mount; the process scan walks every PID |
| 30s | temperature | on Windows it shells out to PowerShell, about a second each time |
Sampling happens on a worker thread, so a slow mount never freezes the toast, and a tick is skipped rather than queued if the previous one is still running. Values from the slower passes stay on screen between them, so no row ever blanks.
Per-process CPU counters are primed once at the first scan, because
cpu_percent() has nothing to diff against on a first call - without that, the
first reading is 0.0 for every process and the "top consumer" is just whichever
process happened to be enumerated first.
Unreadable mounts - empty optical drives, offline shares, mounts you can't stat
- are skipped rather than raised. A monitor that dies because a share went offline is worse than one missing a row.
Tray menu
- Refresh now - resample immediately, disks included
- Show toast / Hide toast
- Quit
Single-click or double-click the tray icon to bring the toast back.
Layout
sysresource_monitor/
stats.py psutil sampling + byte/percent formatting (Qt-free)
monitor.py the toast, the tray icon, the refresh timer
cli.py `status` table, --json, --watch
__main__.py argument dispatch
stats.py imports nothing from Qt, so sysresource-monitor status works over
SSH or in a container where there's no display to put a toast on.
Licence
MIT - see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sysresource_monitor-0.2.1.tar.gz.
File metadata
- Download URL: sysresource_monitor-0.2.1.tar.gz
- Upload date:
- Size: 17.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24803ed9b36829d72555b0ebd0073b68612502f2d7b97ece3b50b5b3d95993e3
|
|
| MD5 |
da931cbdfec24be091c40cf90406a202
|
|
| BLAKE2b-256 |
7224cb349ed5f9ee6e5e4ebbd22be4b7b6a3001c00168cdcf4c0ddbeecea3eff
|
File details
Details for the file sysresource_monitor-0.2.1-py3-none-any.whl.
File metadata
- Download URL: sysresource_monitor-0.2.1-py3-none-any.whl
- Upload date:
- Size: 20.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1073b2884e575756bbd64352a48a21ac307bdd97140c21f7a472a05ae2e5ff1
|
|
| MD5 |
6f1b72db45da9f5834e637e6e5a5a22b
|
|
| BLAKE2b-256 |
4a8b14a94fd939b58810801f10d8b6e24f686d8a8d9889e98d21c2a8d4326fb9
|