Skip to Content
Edmond Kacaj

27 mins read


Rofi configuration

Rofi is a tool that can be described as a window-switcher, application launcher and dmenu replacement.


Ever wonder how to open your apps faster? That's what an app launcher is for. It's a little tool that lets you quickly find and run programs on your computer, usually just by typing a few letters. Instead of clicking through menus or hunting for icons, you can open anything in a snap, especially if you prefer using your keyboard. It's a great way to boost your productivity.

I'm using Rofi on my system, so in this post, I'll show you how to set it up. I'm on Debian Linux, but these steps should work for most Linux systems. Hope you find it helpful! 😊

🔍 What is Rofi?

Rofi is a lightweight, fast, and highly customizable application launcher for Linux. Designed for efficiency, it provides a quick and seamless way to open applications, switch between windows, and execute commands—all from a simple and intuitive interface. Unlike traditional launchers, Rofi is optimized for keyboard-driven workflows, making it an excellent choice for users who prefer minimal mouse interaction.

But Rofi is more than just an application launcher—it can also act as:

  • A window switcher 🖥️: Easily navigate between open applications across multiple workspaces.
  • A dmenu replacement 📜: A more powerful and flexible version of dmenu, with extra features like fuzzy search and theming.
  • An SSH launcher 🔐: Quickly connect to remote machines without manually typing SSH commands.
  • A file browser 📂: Search and open files directly from the Rofi interface, streamlining navigation.

Install and Configure Rofi

Installing Rofi

Rofi is easy to install using your system’s package manager. If you're using a Debian-based system like Ubuntu, just run:

bash
# Update package list sudo apt-get update # Install Rofi sudo apt-get install rofi

Note: The version in your package manager might not be the latest. If you want the newest features, you may need to build Rofi from source.

Rofi comes with different modes that make it even more useful. You can also extend it with scripts and plugins.

Here are some of the built-in modes:

  • run – Launch apps from your system’s $PATH. You can also open them in a terminal.
  • drun – Launch apps based on their .desktop files (this is the most common way to use Rofi).
  • window – Quickly switch between open windows on your desktop.
  • ssh – Easily connect to remote machines using SSH.
  • filebrowser – Browse and open files directly from Rofi.
  • keys – View Rofi’s internal keyboard shortcuts.
  • script – Use custom scripts to add new features.
  • combi – Combine multiple modes into one for convenience.

To open Rofi in a specific mode, use the -show flag followed by the mode name.

For example, to launch Rofi in app launcher mode (drun), run:

sh
rofi -show drun

This will open Rofi, allowing you to search and launch installed applications just like a traditional app launcher.

Rofi in combi mode
Rofi in combi mode, displaying a searchable list of applications.

I have configured Rofi to open in combi mode when I press ALT + SHIFT + P. This mode lets you search and run applications. Additionally, you can cycle through other modes using:

  • SHIFT + LEFT ⬅️
  • SHIFT + RIGHT ➡️

This makes it easy to switch between different Rofi functionalities seamlessly.

Rofi’s power comes from its flexibility. You can configure different modes, keybindings, and themes by editing:

If you don’t want to start from scratch, you can dump the default configuration using:

sh
rofi -dump-config > ~/.config/rofi/config.rasi

This will generate a file with all possible settings and their current values. Default values will be commented out, making customization easier.

For example:

conf
configuration { /* modes: "window,drun,run,ssh";*/ /* font: "mono 12";*/ /* location: 0;*/ /* yoffset: 0;*/ /* xoffset: 0;*/ /* fixed-num-lines: true;*/ /* show-icons: false;*/ /* terminal: "rofi-sensible-terminal";*/ /* ssh-client: "ssh";*/ /* ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]";*/ /* run-command: "{cmd}";*/ /* run-list-command: "";*/ /* run-shell-command: "{terminal} -e {cmd}";*/ /* window-command: "wmctrl -i -R {window}";*/ /* window-match-fields: "all";*/ /* icon-theme: ;*/ /* drun-match-fields: "name,generic,exec,categories,keywords";*/ /* drun-categories: ;*/ /* drun-show-actions: false;*/ /* drun-display-format: "{name} [<span weight='light' size='small'><i>({generic})</i></span>]";*/ /* drun-url-launcher: "xdg-open";*/ /* disable-history: false;*/ /* ignored-prefixes: "";*/ /* sort: false;*/ /* sorting-method: "normal";*/ /* case-sensitive: false;*/ /* cycle: true;*/ /* sidebar-mode: false;*/ /* hover-select: false;*/ /* eh: 1;*/ /* auto-select: false;*/ /* parse-hosts: false;*/ /* parse-known-hosts: true;*/ /* combi-modes: "window,run";*/ /* matching: "normal";*/ /* tokenize: true;*/ /* m: "-5";*/ /* filter: ;*/ /* dpi: -1;*/ /* threads: 0;*/ /* scroll-method: 0;*/ /* window-format: "{w} {c} {t}";*/ /* click-to-exit: true;*/ /* max-history-size: 25;*/ /* combi-hide-mode-prefix: false;*/ /* combi-display-format: "{mode} {text}";*/ /* matching-negate-char: '-' /* unsupported */;*/ /* cache-dir: ;*/ /* window-thumbnail: false;*/ /* drun-use-desktop-cache: false;*/ /* drun-reload-desktop-cache: false;*/ /* normalize-match: false;*/ /* steal-focus: false;*/ /* application-fallback-icon: ;*/ /* refilter-timeout-limit: 8192;*/ /* xserver-i300-workaround: false;*/ /* pid: "/run/user/1000/rofi.pid";*/ /* display-window: ;*/ /* display-windowcd: ;*/ /* display-run: ;*/ /* display-ssh: ;*/ /* display-drun: ;*/ /* display-combi: ;*/ /* display-keys: ;*/ /* display-filebrowser: ;*/ /* kb-primary-paste: "Control+V,Shift+Insert";*/ /* kb-secondary-paste: "Control+v,Insert";*/ /* kb-clear-line: "Control+w";*/ /* kb-move-front: "Control+a";*/ /* kb-move-end: "Control+e";*/ /* kb-move-word-back: "Alt+b,Control+Left";*/ /* kb-move-word-forward: "Alt+f,Control+Right";*/ /* kb-move-char-back: "Left,Control+b";*/ /* kb-move-char-forward: "Right,Control+f";*/ /* kb-remove-word-back: "Control+Alt+h,Control+BackSpace";*/ /* kb-remove-word-forward: "Control+Alt+d";*/ /* kb-remove-char-forward: "Delete,Control+d";*/ /* kb-remove-char-back: "BackSpace,Shift+BackSpace,Control+h";*/ /* kb-remove-to-eol: "Control+k";*/ /* kb-remove-to-sol: "Control+u";*/ /* kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";*/ /* kb-accept-custom: "Control+Return";*/ /* kb-accept-custom-alt: "Control+Shift+Return";*/ /* kb-accept-alt: "Shift+Return";*/ /* kb-delete-entry: "Shift+Delete";*/ /* kb-mode-next: "Shift+Right,Control+Tab";*/ /* kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/ /* kb-mode-complete: "Control+l";*/ /* kb-row-left: "Control+Page_Up";*/ /* kb-row-right: "Control+Page_Down";*/ /* kb-row-up: "Up,Control+p";*/ /* kb-row-down: "Down,Control+n";*/ /* kb-row-tab: "";*/ /* kb-element-next: "Tab";*/ /* kb-element-prev: "ISO_Left_Tab";*/ /* kb-page-prev: "Page_Up";*/ /* kb-page-next: "Page_Down";*/ /* kb-row-first: "Home,KP_Home";*/ /* kb-row-last: "End,KP_End";*/ /* kb-row-select: "Control+space";*/ /* kb-screenshot: "Alt+S";*/ /* kb-ellipsize: "Alt+period";*/ /* kb-toggle-case-sensitivity: "grave,dead_grave";*/ /* kb-toggle-sort: "Alt+grave";*/ /* kb-cancel: "Escape,Control+g,Control+bracketleft";*/ /* kb-custom-1: "Alt+1";*/ /* kb-custom-2: "Alt+2";*/ /* kb-custom-3: "Alt+3";*/ /* kb-custom-4: "Alt+4";*/ /* kb-custom-5: "Alt+5";*/ /* kb-custom-6: "Alt+6";*/ /* kb-custom-7: "Alt+7";*/ /* kb-custom-8: "Alt+8";*/ /* kb-custom-9: "Alt+9";*/ /* kb-custom-10: "Alt+0";*/ /* kb-custom-11: "Alt+exclam";*/ /* kb-custom-12: "Alt+at";*/ /* kb-custom-13: "Alt+numbersign";*/ /* kb-custom-14: "Alt+dollar";*/ /* kb-custom-15: "Alt+percent";*/ /* kb-custom-16: "Alt+dead_circumflex";*/ /* kb-custom-17: "Alt+ampersand";*/ /* kb-custom-18: "Alt+asterisk";*/ /* kb-custom-19: "Alt+parenleft";*/ /* kb-select-1: "Super+1";*/ /* kb-select-2: "Super+2";*/ /* kb-select-3: "Super+3";*/ /* kb-select-4: "Super+4";*/ /* kb-select-5: "Super+5";*/ /* kb-select-6: "Super+6";*/ /* kb-select-7: "Super+7";*/ /* kb-select-8: "Super+8";*/ /* kb-select-9: "Super+9";*/ /* kb-select-10: "Super+0";*/ /* ml-row-left: "ScrollLeft";*/ /* ml-row-right: "ScrollRight";*/ /* ml-row-up: "ScrollUp";*/ /* ml-row-down: "ScrollDown";*/ /* me-select-entry: "MousePrimary";*/ /* me-accept-entry: "MouseDPrimary";*/ /* me-accept-custom: "Control+MouseDPrimary";*/ timeout { action: "kb-cancel"; delay: 0; } filebrowser { directories-first: true; sorting-method: "name"; } }

Want to tweak the look of Rofi? You can also dump the current theme and modify it:

sh
rofi -dump-theme > ~/.config/rofi/current.rasi

This allows you to fully customize Rofi’s appearance, making it match your desktop’s aesthetic.

For example:

css
/** * rofi -dump-theme output. * Rofi version: 1.7.5 **/ * { separatorcolor: rgba ( 255, 204, 0, 100 % ); selected-active-foreground: rgba ( 52, 199, 89, 100 % ); alternate-active-foreground: var(active-foreground); background: rgba ( 28, 28, 30, 93 % ); urgent-foreground: rgba ( 255, 59, 48, 100 % ); alternate-urgent-background: transparent; normal-background: transparent; lightbg: rgba ( 242, 242, 247, 100 % ); background-color: transparent; bordercolor: rgba ( 44, 44, 46, 100 % ); alternate-active-background: transparent; active-foreground: rgba ( 52, 199, 89, 100 % ); selected-normal-foreground: White; urgent-background: transparent; alternate-normal-foreground: var(foreground); selected-active-background: rgba ( 44, 44, 46, 100 % ); selected-urgent-background: rgba ( 255, 59, 48, 100 % ); active-background: transparent; selected-normal-background: rgba ( 44, 44, 46, 100 % ); foreground: White; selected-urgent-foreground: White; alternate-normal-background: transparent; normal-foreground: var(foreground); alternate-urgent-foreground: var(urgent-foreground); } window { padding: 0.5000em ; children: [ "inputbar","message","wrapper-mode-switcher","listview" ]; location: center; anchor: north; background-color: rgba ( 142, 142, 147, 95 % ); border-radius: 10px ; border-color: Black/30%; border: 2px ; spacing: 0px ; y-offset: -15.5000em ; } wrapper-mode-switcher { orientation: horizontal; expand: false; spacing: 0; children: [ "icon-ms-ic1","mode-switcher","icon-ms-ic2" ]; } icon-ms-ic1 { size: 16; vertical-align: 0.80; expand: false; border-color: var(separatorcolor); border: 0px 0px 2px ; } icon-ms-ic2 { size: 16; vertical-align: 0.80; expand: false; border-color: var(separatorcolor); border: 0px 0px 2px ; } mode-switcher { expand: true; spacing: 0px ; border: 0px ; } button { padding: 2px ; border-color: var(separatorcolor); border: 0px 0px 2px ; } button selected.normal { text-color: White; background-color: Black/50%; border-color: var(separatorcolor); border: 2px 2px 0px ; border-radius: 10px 10px 0px 0px ; } sidebar { expand: false; border-color: var(separatorcolor); border: 2px 0px 0px ; } message { text-color: Black; padding: 4px ; background-color: rgba ( 209, 209, 214, 50 % ); margin: 0px 0px 0.5000em ; border-color: rgba ( 142, 142, 147, 100 % ); border: 2px ; expand: false; border-radius: 5px ; } listview { padding: 0.5000em ; scrollbar: false; background-color: Black/50%; border-radius: 0px 0px 10px 10px ; border-color: var(separatorcolor); border: 0px 2px 2px ; expand: true; spacing: 2px ; } element { padding: 4px ; border-color: transparent; border: 1; } element selected.normal { background-color: rgba ( 142, 142, 147, 90 % ); border-color: rgba ( 142, 142, 147, 80 % ); border: 1; text-color: var(selected-normal-foreground); } element selected.urgent { background-color: var(selected-urgent-background); border-color: rgba ( 142, 142, 147, 80 % ); border: 1; text-color: var(selected-urgent-foreground); } element selected.active { background-color: var(selected-active-background); border-color: rgba ( 142, 142, 147, 80 % ); border: 1; text-color: var(selected-active-foreground); } element alternate.normal { background-color: var(alternate-normal-background); text-color: var(alternate-normal-foreground); } element alternate.urgent { background-color: var(alternate-urgent-background); text-color: var(alternate-urgent-foreground); } element alternate.active { background-color: var(alternate-active-background); text-color: var(alternate-active-foreground); } scrollbar { width: 4px ; padding: 0; handle-width: 8px ; border: 0; } inputbar { padding: 0px 0px 0.5000em ; text-color: var(normal-foreground); children: [ "wrapper" ]; } case-indicator { text-color: var(normal-foreground); } textbox-sep { expand: false; vertical-align: 0.50; str: "/"; text-color: rgba ( 142, 142, 147, 100 % ); } num-filtered-rows { expand: false; vertical-align: 0.50; str: "/"; text-color: rgba ( 142, 142, 147, 100 % ); } num-rows { expand: false; vertical-align: 0.50; str: "/"; text-color: rgba ( 142, 142, 147, 100 % ); } tb-wrap { orientation: horizontal; expand: false; children: [ "num-filtered-rows","textbox-sep","num-rows" ]; } wrapper { text-color: Black; padding: 4px ; children: [ "icon-k","entry","tb-wrap" ]; orientation: horizontal; background-color: White/70%; border-radius: 5px ; border-color: rgba ( 142, 142, 147, 100 % ); border: 2px ; spacing: 0.5000em ; } icon-k { filename: "input-keyboard"; expand: false; vertical-align: 0.50; size: 24; } entry { vertical-align: 0.50; } error-message { padding: 0.5000em ; background-color: rgba ( 142, 0, 0, 10 % ); border-color: rgba ( 142, 0, 0, 100 % ); border-radius: 10px ; border: 2px ; }

My Rofi Configuration

I use Debian on my PC and have customized Rofi to fit my workflow see: rofi-configuration.

The original theme design is by Aditya Shakya (GitHub).

🔥 Final Thoughts

Rofi is a game-changer when it comes to workflow efficiency. With a few tweaks, you can turn it into an ultra-fast, personalized launcher that fits your needs perfectly. Try out different configurations, experiment with themes, and make Rofi work for you!