A terminal system monitor for Linux, inspired by btop, htop and glances — written in Rust.
____ ___ ____ __________ ____
/ __ \/ | / __ \/_ __/ __ \/ __ \
/ /_/ / /| | / /_/ / / / / / / / /_/ /
/ _, _/ ___ |/ ____/ / / / /_/ / ____/
/_/ |_/_/ |_/_/ /_/ \____/_/
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.
Linux only. raptop reads
/proc,/sysand the cgroup v2 hierarchy; it does not build for other operating systems.
- 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
dfreports 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/netstatwith the owning process - Processes — sortable by 14 columns, filterable, with htop-like keys:
tree view (
F5), threads folded into their process (Hunfolds them), CPU% per core or as a share of the machine (I), and states includingD(waiting for I/O) andt(traced) - Signals — send
TERM,KILL,STOP,CONT,HUP,INT,USR1orUSR2to 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_HOSThonoured); 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
/procor file system never freezes the screen orCtrl+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
- Linux with
/procand/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.
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/raptopNeeds Rust 1.88 or newer:
cargo install --locked --git https://github.com/devfbe/raptop raptopnix run github:devfbe/raptop # try it
nix profile add github:devfbe/raptop # install it (with man page and completions)git clone https://github.com/devfbe/raptop.git
cd raptop
cargo build --release # → target/release/raptopA 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.
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, powershellraptop # 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.
Press ? in raptop for the same overview.
| 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 |
| 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 |
| Key | Action |
|---|---|
j / ↓, k / ↑ |
Next / previous row |
g / Home, G / End |
First / last row |
← / → |
Scroll the columns of a table that does not fit |
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.
| 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 |
| Key | Action |
|---|---|
Space |
Expand / collapse the selected node |
e |
Expand all |
c |
Collapse all |
| 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.
| 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.
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 belowNetwork 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.
| 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.
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.
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.
MIT — see LICENSE.
