i3 comes perfectly usable out of the box, but If there’s one thing you should have learned by now, I like customizing everything. By default, i3 comes with basic tools to facilitate a tiling WM workflow. That being said, there are some programs that are must haves in my opinion, that don’t come with i3.


i3 comes with i3bar installed and enabled by defult. i3bar is a perfectly fine status bar, and if you’re interested in using it, I recommend checking out Luke Smith’s overview of his i3bar setup. However, I prefer polybar, mostly for aesthetic reasons.

Configuring polybar

Configuring polybar is pretty straightforward. By default, there a config file located at ~/.config/polybar/config. The name of the default bar is example. Simply run polybar example to start the bar. I recomend starting the bar from a terminal so you can see any errors polybar may throw at you. These errors will mostly warn you about misconfigurations in your config file, missing fonts, and the like.

To get started with your custom config, I recommend looking at reddit, and the Arco Linux dotfiles for interesting modules. The creator of polybar also has some slick looking themes on his repo. Basically, you can copy the modules from any polybar config, and edit the specifics to suite your needs.

For example, here is my configuration for the download speed module, seen in the top right of my statusbar.

type = internal/network
interface = wlp3s0
;interface = enp14s0
;interface = enp0s31f6
;interface = enp4s0
label-connected = "%downspeed:7%"
format-connected = <label-connected>
format-connected-prefix = ""
format-connected-prefix-foreground = ${colors.foreground-alt}
format-connected-foreground = ${colors.foreground}
format-connected-background = ${colors.background}
;format-connected-underline = #62FF00

This module is a stock polybar module, but it won’t work if you don’t uncomment the correct interface for your system! I use the following lines to import my colorscheme to polybar.

background = ${xrdb:color0:#222}    
background-alt = ${xrdb:color3:#222}
foreground = ${xrdb:color7:#222}    
foreground-alt = ${xrdb:color2:#555}
highlight = ${xrdb:color2:#f00}
urgent = #f00      

I have this section to enable a system tray, for programs that use it. Nextcloud, Steam, etc.

tray-detached = false
tray-position = right
tray-offset-x = 0
tray-offset-y = 0
tray-maxsize = 16
tray-padding = 0
tray-scale = 1
tray-background = ${colors.background}

Keep running polybar from the terminal until it looks the way you want, without any fatal errors. Then, I add the following line to my i3 config: exec_always pkill -9 polybar ; polybar main. This kills and restarts polybar everytime you refresh i3. This is an easy way to quickly reload your polybar config to test things, or if it glitches for some reason.

Like i3bar, polybar supports many custom modules and scripts. For example, my cmus module runs a bash command every second to check the status of my music player, cmus. I added some logic for click behavior, and now it is a fully functioning music widget.

type = custom/script
exec = ~/.config/polybar/player-cmus.sh
interval = 1
click-left = cmus-remote -n
click-right = cmus-remote -r
click-middle = cmus-remote -u

It really is that simple. The script mentioned above can be found in my dotfiles.


In the default i3 config, there is a built in hotkey to launch dmenu, a program launcher. dmenu is great. I personally prefer rofi, because I’ve been usig it for a long time now. Both rofi and dmenu serve basically the same purpose. They are general menu applications. This means they can be used for the default purpose, which is to choose and launch programs, but also so much more. You can integrate rofi or dmenu into your statusbar, and create interactive menus for any possible purpose.

Configuring rofi

Admittedly, I have been using rofi exclusively as an application launcher. Since I rarely touch the mouse in my workflow, having GUI click-through menus seems counterintuitive for my purpose. The configuration of rofi is pretty straightforward. I literally have a single line in the file ~/.config/roficonfig.

rofi.theme: ~/.cache/wal/colors-rofi-dark.rasi

This will make rofi check the colorscheme cached by wal the last time I generated a theme. More on that later. Interestingly enough, most of the real configuration is done in ~/.Xresources. The below section gives rofi a pretty slick look in my opinion. Simply edit these settings to your preferences and run sudo xrdb -merge .Xresources to apply the changes. Arch users may have to download the xorg-xrdb package in order to run the last command.

! rofi setup      
rofi.color-enabled:         true
rofi.separator-style:       solid
rofi.font:                  curieMedium 20
rofi.bw:                    2
rofi.columns:               1
rofi.yoffset:               0
rofi.fake-transparency:     false
rofi.hide-scrollbar:        true
!rofi.opacity:               90
rofi.location:              0
rofi.width:                 50
rofi.lines:                 10
rofi.fixed-num-lines:       true

With rofi, there is no need for a taskbar, start menu, or any other cluttered GUI elements. I then edited the keybind in my i3 config to lauch rofi instead of dmenu.

Other programs:

ranger: Terminal based file manager. Great for easy browsing and previewing of files.

xcwd: I add bindsym $mod+Shift+Return exec urxvt -cd "xcwd" to my i3 config, and now I have the “Open terminal in current directory” functionality.

gotop: Terminal task manager/resource monitor. Functional and cool looking.

Here is a list of awesome command line apps. Pick out the ones that you need and suite your workflow! If You’re running arch, don’t forget to check the AUR for these packages, it makes managing all these programs much easier.

Next time, we take a closer look at theming.