Introduction
SysMonitor is a command-line tool written in C++11. It samples CPU, memory and running processes on a fixed interval and redraws a color-coded display in your terminal. With auto-optimization turned on, it lowers the priority of any process that stays above your CPU threshold.
- Live CPU and memory readings, with bars that change color as load rises.
- A table of the ten busiest processes with PID, memory and priority.
- Optional auto-optimization that never runs unless you pass
-o. - One codebase for Windows, Linux and macOS.
Installation
SysMonitor is built from source with CMake. Install the tools for your platform first.
Linux
sudo apt install build-essential cmake git
On Fedora use sudo dnf install gcc-c++ cmake git. On Arch use
sudo pacman -S base-devel cmake git.
macOS
brew install cmake git
Windows
Install Visual Studio 2019 or newer with the C++ tools, or MinGW-w64, plus CMake 3.15 or newer. With Chocolatey:
choco install git cmake mingw -y
Build
git clone https://github.com/AccoladesIO/sysmonitor.git
cd sysmonitor
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
The binary is written to build/bin/sysmonitor. To install it system-wide on Linux or macOS,
run sudo cmake --install .. With MinGW on Windows, add -G "MinGW Makefiles" to the
cmake .. command. With Visual Studio, use -G "Visual Studio 16 2019" -A x64.
Quick start
sysmonitor start # monitor only
sudo sysmonitor start -o # monitor and optimize
sysmonitor start -i 5 -o -t 70 # every 5s, optimize above 70% CPU
On startup SysMonitor measures a baseline for about five seconds, then starts drawing. Press
Ctrl+C to stop. On Windows, run the terminal as Administrator when you use -o.
Commands and options
Usage: sysmonitor <command> [options]
| Command | What it does |
|---|---|
start |
Starts monitoring. This is the default when no command is given. |
--help, -h |
Prints usage. |
--version, -v |
Prints the version and the platform it was built for. |
Options for start:
| Option | Short | Description | Default |
|---|---|---|---|
--optimize |
-o |
Enable auto-optimization. | Off |
--interval <seconds> |
-i |
Seconds between updates. | 2 |
--threshold <percent> |
-t |
Per-process CPU % that triggers optimization. | 80 |
--quiet |
-q |
Skip the startup banner and the live display. | Off |
A non-numeric value for -i or -t prints an error and exits with code 1.
Reading the display
Each refresh redraws four panels: a header, CPU usage, memory usage and the top processes. A fifth panel,
optimization status, appears when -o is on.
┌─ CPU USAGE ─────────────────────────────────────┐
│ Current: 28.50% (↓ 45.20% improvement)
│ [██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 28.5%
└─────────────────────────────────────────────────┘
| Color | Load | Meaning |
|---|---|---|
| Green | Up to 60% | Healthy. |
| Yellow | Above 60% | Moderate load. |
| Red | Above 80% | High load. Processes above the threshold are optimized when -o is on. |
The improvement figure compares current CPU with the baseline measured at startup. An arrow down means CPU is below baseline. An arrow up means it is above.
Auto-optimization
When -o is set, each refresh checks the process list. Any process above the CPU threshold
whose priority value is below 10 is moved to a lower priority. Nothing is killed, and no process is touched
when -o is off.
| Platform | Change applied |
|---|---|
| Linux, macOS | Nice value set to 10 with setpriority. |
| Windows | Priority class set to Below Normal. |
Each optimized process is logged with its name and PID to sysmonitor.log in the config
directory. The author reports up to 45% lower mean CPU usage in the project README. Your result depends on
your workload, so compare with and without -o.
Configuration
SysMonitor loads defaults from config.json at startup and saves them again when you quit.
Command-line flags override the file for that run.
| Platform | Location |
|---|---|
| Linux, macOS | ~/.config/sysmonitor/config.json |
| Windows | %APPDATA%\SysMonitor\config.json |
In version 2.0.1 the file holds one key and value per line, not JSON:
interval 2
optimize 0
threshold 80
history_length 120
color_scheme default
graph_type sparkline
auto_save 1
log_level info
The flags -i, -t and -o map to interval,
threshold and optimize. Set auto_save to 0 to stop the
file from being rewritten on exit.
Logging
Every run appends to sysmonitor.log in the config directory. Each line has a timestamp, a
level and a message, and is flushed as soon as it is written. SysMonitor logs the start of the baseline
measurement, each process it optimizes, and the moment monitoring stops.
[2026-09-29 14:02:06] [INFO] Establishing baseline metrics...
[2026-09-29 14:02:13] [INFO] Optimized process: chrome (PID: 4312)
[2026-09-29 14:09:40] [INFO] Monitoring stopped
Follow it live with tail -f ~/.config/sysmonitor/sysmonitor.log on Linux and macOS, or
Get-Content -Wait on Windows. Press Ctrl+C or send SIGTERM to stop cleanly. With
auto_save on, your settings are then written to config.json, and a failed save is
logged as a WARN line.
Permissions
- Windows: run the terminal as Administrator, or priority changes fail.
- Linux: run with
sudo, or grant the capability once withsudo setcap cap_sys_nice=eip /usr/local/bin/sysmonitor. - macOS: run with
sudo. If macOS still blocks it, add your terminal under Privacy and Security, Full Disk Access.
Monitoring alone needs no elevated rights.
Troubleshooting
Optimization does nothing
Start with elevated rights (see Permissions). The startup text should read
Auto-optimization: ENABLED. Also check that a process actually exceeds the threshold, which is
80% CPU by default.
Command not found
Run the binary from the build folder with ./build/bin/sysmonitor start, or add its folder to
your PATH.
Garbled output or missing colors
Use a terminal with ANSI color support: Windows Terminal, iTerm2 or GNOME Terminal. On Linux and macOS, set
export TERM=xterm-256color.
CMake cannot find Visual Studio
Configure with MinGW instead: cmake .. -G "MinGW Makefiles".
Not in this build
The project README also lists stop, status, config,
benchmark and export commands, the --daemon and --log
options, and in-app keyboard shortcuts. The 2.0.1 source does not implement them yet, so this page leaves
them out.
Contributing
Fork the repository, create a feature branch, make your change and open a pull request. Bugs and questions go to GitHub Issues.