Skip to main content

sysresource-monitor

PyPI version Python versions License: MIT Downloads Platform Built with PySide6

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 - psutil doesn'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

sysresource_monitor-0.2.1.tar.gz (17.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sysresource_monitor-0.2.1-py3-none-any.whl (20.3 kB view details)

Uploaded Python 3

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

Hashes for sysresource_monitor-0.2.1.tar.gz
Algorithm Hash digest
SHA256 24803ed9b36829d72555b0ebd0073b68612502f2d7b97ece3b50b5b3d95993e3
MD5 da931cbdfec24be091c40cf90406a202
BLAKE2b-256 7224cb349ed5f9ee6e5e4ebbd22be4b7b6a3001c00168cdcf4c0ddbeecea3eff

See more details on using hashes here.

File details

Details for the file sysresource_monitor-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for sysresource_monitor-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b1073b2884e575756bbd64352a48a21ac307bdd97140c21f7a472a05ae2e5ff1
MD5 6f1b72db45da9f5834e637e6e5a5a22b
BLAKE2b-256 4a8b14a94fd939b58810801f10d8b6e24f686d8a8d9889e98d21c2a8d4326fb9

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

This release

0.2.1 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page