Skip to content
Yet another cross-platform graphical process/system monitor.
Branch: master
Clone or download

Latest commit

dependabot-preview Update assert_cmd requirement from 0.12 to 1.0 (#94)
Updates the requirements on [assert_cmd]( to permit the latest version.
- [Release notes](
- [Changelog](
- [Commits](assert-rs/assert_cmd@v0.12.0...v1.0.0)

Signed-off-by: dependabot-preview[bot] <>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]>
Latest commit f44de81 Mar 27, 2020


Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Update Mar 13, 2020
assets [ImgBot] Optimize images (#68) Mar 6, 2020
docs reflected auto config creation Mar 2, 2020
sample_configs Add basic flag to sample config, also fixed incorrect flag name for c… Mar 3, 2020
src Fix division by zero when memory data is not available (#85) Mar 20, 2020
tests Updated documentation, made error in args clearer Mar 10, 2020
.all-contributorsrc docs: add mqudsi as a contributor (#88) Mar 20, 2020
.gitignore [skip travis] Update .gitignore to ignore .idea Feb 29, 2020
.markdownlint.json [skip travis] Update README with compatibility chart Jan 3, 2020
.travis.yml Update travis for windows build Mar 24, 2020
Cargo.toml Update assert_cmd requirement from 0.12 to 1.0 (#94) Mar 27, 2020
LICENSE Initial commit Aug 28, 2019 Moved badge Mar 20, 2020
rustfmt.toml Refactoring. Mar 2, 2020


Build Status link tokei All Contributors

A cross-platform graphical process/system monitor with a customizable interface and a multitude of features. Supports Linux, macOS, and Windows. Inspired by both gtop and gotop.

Quick demo recording showing off searching, maximizing, and process killing. Terminal: Kitty Terminal, Font: IBM Plex Mono, OS: Arch Linux. Theme based on gruvbox (see sample config).


Features of bottom include:

  • CPU widget to show a visual representation of per-core (and optionally average) usage.

  • Memory widget to show a visual representation of both RAM and SWAP usage.

  • Networks widget to show a log-based visual representation of network usage.

  • Sortable and searchable process widget. Searching supports regex, and you can search by PID and process name.

  • Disks widget to display usage and I/O per second.

  • Temperature widget to monitor detected sensors in your system.

  • Flags to customize the display.

  • Config file support for custom colours and default options.

  • Maximizing of widgets of interest to take up the entire window.

  • A minimal mode that focuses less on charts and more on data, similar to htop.

  • Zooming in/out by time to see more/less data.

More details about each widget and compatibility can be found here.

Config files

For information about config files, see this document for more details, and this config for an example.


In all cases you can install the in-development version by cloning from this repo and using cargo build --release. This is built and tested with Rust Stable (1.42 as of writing).

In addition to the below methods, you can manually build from the Releases page by downloading and building.

I officially support and test 64-bit versions of Tier 1 Rust targets. I will try to build and release 32-bit versions for Linux and Windows, but as of now, I will not be testing 32-bit for validity beyond building.


cargo install bottom


Installation methods on a per-distro basis:

Arch Linux

You can get the release versions from the AUR by installing bottom or bottom-bin. For example, using yay:

yay bottom
# Or
yay bottom-bin

Debian (and anything based on it, like Ubuntu)

A .deb file is provided on each release:

curl -LO
sudo dpkg -i bottom_0.2.2_amd64.deb


You can get release versions via Chocolatey:

choco install bottom
# Or
choco install bottom --version=0.2.2 # Version number may be required for newer releases


You can get release versions using Homebrew:

brew tap clementtsang/bottom
brew install bottom
# Or
brew install clementtsang/bottom/bottom


Run using btm.

Command line options

  • -h, --help shows the help screen and exits.

  • -a, --avg_cpu enables also showing the average CPU usage in addition to per-core CPU usage.

  • -m, --dot-marker uses a dot marker instead of the default braille marker.

  • Temperature units (you can only use one at a time):

    • -c, --celsius displays the temperature type in Celsius. This is the default.

    • -f, --fahrenheit displays the temperature type in Fahrenheit.

    • -k, --kelvin displays the temperature type in Kelvin.

  • -v, --version displays the version number and exits.

  • -r <RATE>, --rate <RATE> will set the refresh rate in milliseconds. Lowest it can go is 250ms, the highest it can go is 264 - 1. Defaults to 1000ms, and lower values may take more resources due to more frequent polling of data, and may be less accurate in some circumstances.

  • -l, --left_legend will move external table legends to the left side rather than the right side. Right side is default.

  • -u, --current_usage will make a process' CPU usage be based on the current total CPU usage, rather than assuming 100% CPU usage.

  • -g, --group will group together processes with the same name by default (equivalent to pressing Tab).

  • -S, --case_sensitive will default to matching case.

  • -W, --whole will default to searching for the world word.

  • -R, --regex will default to using regex.

  • --cpu_default, --memory_default, --disk_default, --temperature_default, --network_default, --process_default will select the corresponding widget on startup. By default the process widget is selected.

  • -s, --show_disabled_data will show data entries in the chart legends even if the lines for that entry are disabled.

  • -C, --config takes in a file path leading to a TOML file. If the file doesn't exist, one will be created.

  • -b, --basic will enable basic mode, removing all charts from the main interface and condensing data.

  • -t, --default_time_value will set the default time interval charts will display to (in milliseconds). Lowest is 30 seconds, defaults to 60 seconds.

  • -d, --time_delta will set the amount each zoom in/out action will change the time interval of a chart (in milliseconds). Lowest is 1 second, defaults to 15 seconds.



  • q, Ctrl-c to quit. Note if you are currently in the search widget, q will not work so you can still type.

  • Esc to close a dialog window, widget, or exit maximized mode.

  • Ctrl-r to reset the screen and all collected data.

  • f to freeze the screen from updating with new data. Press f again to unfreeze. Note that monitoring will still continue in the background.

  • Ctrl/Shift-arrow or H/J/K/L to navigate between widgets. Note that on macOS, some keybindings may conflict with existing ones; H/J/K/L should work however.

  • Up or k and Down or j scrolls through the list if the widget is a table (Temperature, Disks, Processes).

  • ? to get a help screen explaining the controls. Note all controls except Esc to close the dialog will be disabled while this is open.

  • gg or Home to jump to the first entry of the current table.

  • G (Shift-g) or End to jump to the last entry of the current table.

  • Enter on a widget to maximize the widget.

  • + to zoom in (reduce time interval, smallest is 30 seconds).

  • - to zoom out (increase time interval, largest is 10 minutes).

  • = to reset zoom.


  • / to allow for enabling/disabling showing certain cores on the chart with Space.


  • dd to kill the selected process.

  • c to sort by CPU usage. Sorts in descending order by default. Press again to reverse sorting order.

  • m to sort by memory usage. Sorts in descending order by default. Press again to reverse sorting order.

  • p to sort by PID. Sorts in ascending order by default. Press again to reverse sorting order.

  • n to sort by process name. Sorts in ascending order by default. Press again to reverse sorting order.

  • Tab to group together processes with the same name. This disables PID sorting. dd will now kill all processes covered by that name.

  • Ctrl-f or / to open the search widget.

Search widget

  • Tab to switch between searching for PID and name respectively.

  • Esc to close.

  • Ctrl-a and Ctrl-e to jump to the start and end of the search bar respectively.

  • Ctrl-u to clear the current search query.

  • Backspace to delete one character behind the current cursor position.

  • Delete to delete one character at the current cursor position.

  • Left and Right arrow keys to move the cursor within the search bar.

  • Alt-c/F1 to toggle ignoring case.

  • Alt-w/F2 to toggle matching the entire word.

  • Alt-r/F3 to toggle using regex.

Note that q is disabled while in the search widget.

Mouse actions

  • Scrolling with the mouse will scroll through the currently selected list if the widget is a scrollable table.

  • Scrolling on a chart will zoom in (scroll up) or zoom out (scroll down).

Bugs and Requests

Spot an bug? Have an idea? Leave an issue that explains what you want in detail and I'll try to take a look.


Contribution is welcome! Just submit a PR. Note that I develop and test on stable Rust.

If you spot any issue with nobody assigned to it, or it seems like no work has started on it, feel free to try and do it!


Thanks goes to these wonderful people (emoji key):

Marcin Wojnarowski


Mahmoud Al-Qudsi


This project follows the all-contributors specification. Contributions of any kind welcome!

Thanks, kudos, and all the like

You can’t perform that action at this time.