machtop is a Linux terminal system monitor focused on machine-level telemetry.
It provides a compact top/htop-style view with better visibility into CPU
frequency, thermal sensors, memory pressure, storage/network I/O, and
accelerator data when the platform exposes it.
The project targets common x86_64 and aarch64 Linux systems, while also
including RK3588-specific enhancements for boards such as the Radxa ROCK 5T.
Most terminal monitors are good at process and CPU usage, but weak on hardware
signals. machtop is built for developers who want one compact TUI that can
show:
- per-CPU usage and current frequency
- machine thermal data from standard Linux interfaces
- RAM, zram, and swap pressure in the summary view
- accelerator and sensor summaries in the overview panel
- per-adapter network throughput and per-device disk throughput
- best-effort GPU and NPU visibility
- top processes, memory, and uptime
It reads directly from kernel interfaces. There is no agent, daemon, or background service to install.
- Dedicated overall CPU status row plus per-CPU usage bars with current frequency and optional per-CPU temperature
- Summary panel with RAM, zram, and swap percentage meters
- Summary panel with machine, accelerator, and sensor status
- Uptime and top processes
- Real-time network RX/TX and disk read/write rates
- Sensor collection from both
/sys/class/thermaland/sys/class/hwmon - Best-effort GPU and NPU frequency and utilization collection
- Graceful degradation when optional metrics are unavailable
- Support for generic Linux machines plus RK3588 profile-specific hints
Prebuilt .deb packages are published for:
amd64arm64arm64_bookwormcompatibility build for Debian 12 based systems such as many RK3588 boards
Download the appropriate package from the Releases page and install it:
sudo dpkg -i machtop_<version>_<arch>.debIf your arm64 machine is on Debian 12 / Bookworm and the standard arm64
package asks for a newer libc6, use the arm64_bookworm compatibility asset.
Prebuilt .pkg.tar.zst packages are published for x86_64.
Download the package from the Releases page and install it:
sudo pacman -U machtop-<version>-1-x86_64.pkg.tar.zstRequirements:
- Linux
- Rust toolchain
- ANSI-capable terminal
Run directly:
cargo runBuild a release binary:
cargo build --release
./target/release/machtopLaunch machtop in an interactive terminal:
machtopControls:
q: quitCtrl+C: quit
Current layout:
- top:
Summary - middle:
CPU - bottom-left:
Processes - bottom-right:
Network & Disk I/O
machtop is designed to work on:
- generic Linux on
x86_64 - generic Linux on
aarch64 - RK3588 boards with additional profile-specific sensor grouping
Support is intentionally capability-based rather than driven by a hardcoded
hardware whitelist. If a machine exposes a metric through supported kernel
interfaces, machtop will try to show it. If not, the UI hides that value
instead of failing.
These usually come from standard kernel interfaces and do not require elevated privileges:
- CPU usage from
/proc/stat - RAM and swap usage from
/proc/meminfo - zram usage from
/proc/swaps - uptime from
/proc/uptime - process information from
/proc/<pid>/... - network throughput from
/proc/net/dev - disk throughput from
/proc/diskstats - CPU frequency from
/sys/devices/system/cpu/cpu*/cpufreq - thermal sensors from
/sys/class/thermal hwmonsensors from/sys/class/hwmon- accelerator frequency from
/sys/class/devfreq
Some drivers expose extra accelerator telemetry only through debugfs. Those
signals are treated as optional:
- GPU utilization may fall back to driver-specific
debugfsnodes - NPU utilization may come from driver-specific
debugfsnodes
If these files are not readable, machtop does not require sudo for the
entire application. The unavailable values are simply omitted.
- RAM is always shown in the summary panel.
swapis derived from system-wideSwapTotalandSwapFree.zramis derived fromzram*entries in/proc/swapsand shown separately when present.- Accelerator and sensor summaries are shown in the left side of
Summarywhen available. - Network and disk throughput are computed from consecutive samples rather than lifetime counters.
- Virtual interfaces and pseudo block devices are hidden by default to reduce noise.
- GPU frequency and NPU frequency are collected from
/sys/class/devfreqwhen available. - GPU utilization may come from
/sys/class/devfreq/*/load, but that value is driver-defined and should be treated as best-effort rather than a universal Linux ABI. - NPU utilization is shown only when the platform exposes a readable,
driver-specific interface. Otherwise
machtopshows frequency only.
On RK3588 systems, machtop applies a profile layer on top of the generic
Linux collectors.
Current RK3588-specific behavior includes:
- improved grouping for
cpu,gpu,npu, andsocthermal summaries - per-CPU temperature mapping derived from known RK3588 thermal zone labels
If those labels are not present, machtop falls back to generic Linux
behavior.
src/main.rs: terminal lifecycle and event loopsrc/app.rs: refresh timing and application statesrc/metrics/: procfs/sysfs collection, derivation, and board profilessrc/ui.rs: layout, formatting, and theme logic
Useful commands:
cargo fmt
cargo test
cargo clippy --all-targets -- -D warningsCI runs on both amd64 and arm64 and checks:
- formatting
- tests
- clippy
The repository includes GitHub Actions workflows for both regular CI and Debian package releases.
git tag v0.1.0
git push origin v0.1.0From the GitHub Actions page, run Release Debian Package and provide a
release_tag, for example:
v0.1.0
The release workflow will:
- build
.debpackages foramd64andarm64 - generate
.sha256checksum files - install each package on the runner and run a smoke test
- upload the assets to the matching GitHub Release
Issues and pull requests are welcome.
If you plan to contribute code, please keep these design constraints in mind:
machtopshould remain useful on generic Linux machines, not only RK3588- hardware-specific metrics must degrade cleanly when unsupported
- new telemetry sources should be explicit about permissions and ABI stability
machtop is usable today, but it is still a pre-1.0 project. The UI, platform
heuristics, and release process will continue to evolve as more hardware is
tested.
Released under the GNU GPLv3 or later. See LICENSE.
