Skip to content
devfbePublic

About

Terminal system monitor for Linux, inspired by btop, htop and glances

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

🦖 raptop

A terminal system monitor for Linux, inspired by btop, htop and glances — written in Rust.

CI License: MIT MSRV Built with Ratatui

    ____  ___    ____  __________  ____
   / __ \/   |  / __ \/_  __/ __ \/ __ \
  / /_/ / /| | / /_/ / / / / / / / /_/ /
 / _, _/ ___ |/ ____/ / / / /_/ / ____/
/_/ |_/_/  |_/_/     /_/  \____/_/

raptop puts CPU, memory, disks, network, processes, connections, containers, sensors and cgroups into one keyboard- and mouse-driven dashboard, with a detail view for each.

raptop cycling through its dashboards, the CPU, memory, disk, network, process, hardware health and system views, three themes and the help overlay

Linux only. raptop reads /proc, /sys and the cgroup v2 hierarchy; it does not build for other operating systems.

Features

  • Dashboards and detail views — two dashboard layouts, plus views for CPU, memory, disks, network, processes, hardware health, system information, cgroups, network connections and containers, and drill-downs into a single process or container
  • CPU — usage split into user, system, I/O wait and steal, per-core bars labelled by topology (P-/E-cores and SMT siblings on hybrid CPUs), history graphs, clock speeds and thermal throttling
  • Memory — used, cached, buffers, swap and zram, and the biggest memory consumers
  • Disks — usage as df reports it (blocks reserved for root count as neither used nor available), inodes, and per-disk read/write rates with a history chart. Network file systems (NFS, CIFS, …) are left out, so a hung server cannot stall the collector
  • Network — per-interface rates and totals with RX/TX graphs; a connections view in the style of ss/netstat with the owning process
  • Processes — sortable by 14 columns, filterable, with htop-like keys: tree view (F5), threads folded into their process (H unfolds them), CPU% per core or as a share of the machine (I), and states including D (waiting for I/O) and t (traced)
  • Signals — send TERM, KILL, STOP, CONT, HUP, INT, USR1 or USR2 to the selected process or to every tagged one. raptop checks that a PID still belongs to the process you picked (through a pidfd where the kernel has them), and asks twice before signalling PID 1 or its own parent
  • Process detail — memory maps and regions, shared libraries, cgroups, namespaces, open file descriptors, OOM score, I/O counters and the environment (values hidden until you reveal them)
  • Containers — Docker, Podman, containerd and CRI-O containers found by their cgroups, with names and images from the Docker or Podman API socket (rootful or rootless, $DOCKER_HOST honoured); a detail view shows cgroup v2 limits and the container's processes
  • Hardware health — temperatures with the matching core clock, batteries (charge, power, health, time remaining), fans and pressure stall information
  • Cgroup explorer — browse the cgroup v2 tree with memory, CPU and process counts
  • Alerts — CPU, memory and swap usage are rated Ok, Careful, Warning or Critical; the bottom bar counts the active alerts
  • Responsive — data is collected on a thread of its own, so a slow /proc or file system never freezes the screen or Ctrl+C
  • Seven themes — Cyberpunk, Dracula, Nord, Gruvbox, Tokyo Night, Catppuccin Mocha and Matrix, switchable on the fly
  • Export — the current snapshot as JSON, or the process table as CSV, to a private (0600) file
  • Persistent settings — an in-app settings overlay that saves to a TOML config file

Requirements

  • Linux with /proc and /sys. The cgroup explorer and container detection need cgroup v2 (the default on current distributions).
  • A terminal with Unicode, and ideally true-color, support.
  • No root needed. As an unprivileged user, details of other users' processes (open files, memory maps, environment) are not readable, and only your own processes can be signalled.

Installation

Release binaries

Every release has fully static binaries for x86_64 and aarch64 Linux, with the man page and shell completions:

sha256sum -c raptop-v0.1.0-x86_64-unknown-linux-musl.tar.gz.sha256
tar xzf raptop-v0.1.0-x86_64-unknown-linux-musl.tar.gz
install -Dm755 raptop-v0.1.0-x86_64-unknown-linux-musl/raptop ~/.local/bin/raptop

With Cargo

Needs Rust 1.88 or newer:

cargo install --locked --git https://github.com/devfbe/raptop raptop

With Nix

nix run github:devfbe/raptop                 # try it
nix profile add github:devfbe/raptop         # install it (with man page and completions)

From source

git clone https://github.com/devfbe/raptop.git
cd raptop
cargo build --release      # → target/release/raptop

A fully static musl binary: just static (or just static aarch64-unknown-linux-musl), which needs the musl target and a matching <target>-gcc; the Nix dev shell provides both for its own architecture.

Man page and completions

The binary prints its own man page and completion scripts:

raptop --generate-man > raptop.1
raptop --generate-completions bash > raptop.bash   # also: zsh, fish, elvish, powershell

Usage

raptop                               # defaults: Cyberpunk theme, 1 s refresh
raptop --theme nord                  # pick a theme
raptop --refresh 500                 # refresh every 500 ms
raptop -t tokyo-night -r 2000 -d     # combine options; -d writes a debug log
Option Short Description Default
--theme <name> -t cyberpunk, dracula, nord, gruvbox, tokyo-night, catppuccin-mocha (or catppuccin, mocha), matrix cyberpunk
--refresh <ms> -r Refresh interval in milliseconds, 100–30000 1000
--debug -d Write a debug log to $XDG_STATE_HOME/raptop/raptop.log (~/.local/state/raptop/raptop.log) off
--help / --version -h / -V Print help or version

Command-line options override the config file.

Key bindings

Press ? in raptop for the same overview.

General

Key Action
q / Q Quit
Ctrl+C Quit — also from dialogs and text fields
Ctrl+Z Suspend to the shell (fg resumes)
Esc Close an overlay, clear an applied filter, or leave a detail view; from Health, System, Cgroups, Connections and Containers go back to the dashboard; otherwise quit
? / F1 Help overlay (j/k/g/G scroll it)
F2 Settings overlay
t / F3 Next theme
T Previous theme
Space Pause / resume refreshing (in tree views: expand/collapse)
+ / = Refresh faster (100 ms steps, down to 100 ms)
- Refresh slower (100 ms steps, up to 30 s)
E Export the snapshot (JSON) or the process table (CSV), see export_format
H Show / hide threads as rows of their own
I CPU% per core (up to 100 % × cores) ↔ as a share of all cores

Views

Key View
1 Dashboard
! Dashboard 2 (alternative layout)
2 CPU
3 Memory
4 Disks
5 Network
6 Processes
7 / B Hardware health: sensors, batteries, fans, pressure
8 System information (neofetch-style)
9 Cgroup explorer
0 Network connections
D Containers
Tab Next view
Shift+Tab Dashboards: move focus between the process, disk and network panels; process detail: next panel
Enter Open the selected process or container; on a focused dashboard disk/network panel, open that view; in the process detail's environment panel, reveal the selected value

Tables

Key Action
j / ↓, k / ↑ Next / previous row
g / Home, G / End First / last row
← / → Scroll the columns of a table that does not fit

Process table

In the process view, and on the dashboards while the process panel has focus.

Key Action
/ Filter: case-insensitive text match on name, command line, user or PID (Enter keeps it, Esc drops it)
F5 Table ↔ tree (process view)
p n u s Sort by PID, name, user, state
c m d w Sort by CPU%, MEM%, disk read, disk write
S i Sort by swap, CPU time
< , / > . Previous / next of all 14 sort columns
r Reverse the sort order (pressing a sort key again does the same)
v Tag / untag the selected process and move down
V Clear all tags
F9 / x Signal dialog for the tagged processes, or the selected one

In the signal dialog: j/k choose the signal, Enter sends it, Esc/q closes the dialog.

Disk, network and connection tables

Key Action
s Next sort column
r Reverse the sort order
l / L Connections: listening sockets only
/ Connections: filter by address, port or process name

Tree views (process tree, cgroup explorer)

Key Action
Space Expand / collapse the selected node
e Expand all
c Collapse all

Settings overlay (F2)

Key Action
j / k Select a setting
Enter / Space Toggle, cycle, or edit the setting
← / → (h / l) Cycle through the values
Ctrl+S Save to the config file
Esc / q / F2 Close; with unsaved changes asks: s save, d discard, c keep editing

Changes take effect immediately; saving makes them permanent.

Mouse

Action Effect
Wheel Scroll the view's table (on the dashboards, the panel under the pointer)
Click on a row Select it (on the dashboards, also focus its panel)
Click on a column header Sort by that column; click again to reverse
Click on a tab in the bottom bar Switch to that view
Click elsewhere on the bottom bar Next theme
Right-click on the bottom bar Previous theme

Mouse support can be switched off with mouse_enabled = false.

Configuration

raptop reads $XDG_CONFIG_HOME/raptop/config.toml (usually ~/.config/raptop/config.toml) at startup. A missing file or missing keys fall back to the defaults below; raptop does not create the file — the settings overlay (F2, then Ctrl+S) writes it. A config at the old location ~/.config/raptop.toml is still read; saving writes the new location, which then takes precedence. If the file cannot be parsed, raptop says so and starts with the defaults; saving from the settings overlay then keeps the broken file as config.toml.bak instead of overwriting it.

theme = "cyberpunk"
refresh_ms = 1000                   # 100–30000
default_view = 1                    # 1 = Dashboard … 9 = Cgroups, 10 = Connections, 11 = Containers
show_kernel_threads = false
show_threads = false                # list threads as rows of their own (H)
show_cpu_idle = true                # idle line in the CPU breakdown graphs
mouse_enabled = true
show_header = true
process_sort_field = "cpu"          # pid, name, cpu, mem, virt, mem%, user, state, threads, time, read, write, swap, command
sort_direction = "desc"             # or "asc"
export_format = "json"              # "json" (whole snapshot) or "csv" (process table)
# export_dir = "/home/you/exports"  # default: $XDG_STATE_HOME/raptop/exports (~/.local/state/…)
docker_socket = "/var/run/docker.sock"
docker_grouping = false             # keep each container's processes together in the process list
hidden_interfaces = []              # e.g. ["lo", "veth*"]: exact names, or a prefix ending in *
hidden_mounts = []                  # e.g. ["/snap", "/boot/efi"]: these mount points and everything below

Network connections are collected only while the connections view is open (listing them means walking every process's file descriptors), so an export taken in any other view contains no connections.

Themes

Theme Look
Cyberpunk Neon pink and cyan on dark purple — the default
Dracula Soft purples and greens on dark grey
Nord Cool arctic blues
Gruvbox Warm retro oranges and yellows
Tokyo Night Dark blue with vivid highlights
Catppuccin Mocha Pastels on a dark base
Matrix Green on black

Switch with t / T (or click the bottom bar), set a default with --theme or in the settings.

The Dracula, Nord, Gruvbox, Tokyo Night and Catppuccin themes are adaptations of those projects' color palettes: Dracula, Nord, Gruvbox, Tokyo Night and Catppuccin.

Architecture

A Cargo workspace with three crates, so that data collection knows nothing about the terminal:

raptop/
├── src/main.rs            # the raptop binary: command line, config, startup
└── crates/
    ├── raptop-core/       # data collection and models — no UI dependencies
    │   └── src/
    │       ├── collector.rs, collector/   # SystemCollector: /proc, /sys, cgroups,
    │       │                              # containers, disks, sensors, topology
    │       ├── models/    # SystemSnapshot and everything in it, config, signals
    │       ├── history.rs # ring buffers of recent values for the graphs
    │       ├── alert.rs   # threshold alerts
    │       ├── export.rs  # JSON / CSV export
    │       └── sanitize.rs# strips terminal control characters from system strings
    └── raptop-tui/        # the ratatui frontend
        └── src/
            ├── app.rs              # App: event loop, views, keyboard and mouse
            ├── collector_thread.rs # runs the collector off the UI thread
            ├── terminal.rs         # terminal setup/restore, signals, Ctrl+Z
            ├── theme.rs            # color themes and formatting helpers
            └── widgets/            # one module per panel or view

raptop-core produces a SystemSnapshot — a plain, serializable value — on every refresh. The TUI renders it; another frontend could consume the same snapshots.

Contributing

Bug reports, ideas and pull requests are welcome. See CONTRIBUTING.md for the development setup and the checks a change has to pass, and SECURITY.md for reporting vulnerabilities. Changes are listed in CHANGELOG.md.

License

MIT — see LICENSE.

About

Terminal system monitor for Linux, inspired by btop, htop and glances

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages