i3 window manager setup on Debian Bullseye

In this blog, we will look at setting up i3 tiling window manager, and a status bar for i3 named i3status-rust. All of this is tested on Debian Bullseye. Some basic understanding of configuring i3 is expected.

This is part 2 in a series of 3 blogs regarding setup of Debian Bullseye on a Laptop with i3 window manager. Read part 1 here.

Login manager

A display manager, or login manager, is typically a graphical user interface that is displayed at the end of the boot process in place of the default shell.

Let’s start by installing a login manager. We will be using LightDM.

This will also install the GTK greeter for LightDM. Next time we boot up, this is what will greet us during login instead of the command line prompt.

Installing i3

Next, lets install i3 and related components:

So what did we just install?

  1. i3 – The tiling window manager
  2. i3lock – Simple screen locker
  3. dunst – A notification daemon
  4. rofi – Window switcher & application launcher

For i3lock, dunst and rofi I use the default configuration that comes out of the box but all of these are quite configurable.

  • i3lock: this man page lists supported arguments.
  • rofi: I found this blog that has a series of posts describing what rofi can do.
  • dunst: ArchWiki goes into some configuration details.

Before starting with the next step, let’s confirm that everything done till now works well. Restart the machine, and we should first be greeted with the drive decryption prompt, followed by the login manager. Once we login, we should see i3 with the default configuration.

i3 configuration

My entire dot-config is available here and the i3 configuration is available here. It utilizes various scripts present in the bin folder at the root of the repository. It also references a few applications that I will be outlining in the next blog.

Third party fonts used, all open source, are listed here and can be installed by following the approaches outlined on the Debian wiki.

Here’s how my desktop looks with a single monitor:

A screenshot from the social tab of my i3 window manager. Single monitor.
A screenshot from the social tab of my i3 window manager. Single monitor.
The full desktop with the second monitor connected via HDMI.
The full desktop with the second monitor connected via HDMI.

Workspace configuration

In i3, workspaces are an easy way to group a set of windows.

I have 5 workspace dedicated to:

  1. Coding,
  2. Browsing,
  3. Social apps (In screenshot),
  4. Terminal / Editor,
  5. Media / Others.

Commonly used applications are mapped to specific workspace via the i3 configuration file. The workspace 1: Coding, 2: Browsing and 5: Media / Others appear on the secondary monitory if it is connected. All of this is configured using the i3 config file. The social workspace has a slightly complicated layout defined in it’s layout file, generated using the i3-save-tree utility.

i3 status bar configuration

I use the i3status-rust status bar’s toggle icons to make common actions easier to perform. The associated scripts for these toggle icons are located here and the i3rust bar configuration is here. The touch pad toggle also has a global keyboard shortcut configured via xbindkeys. I’ll discuss this in some more detail later. When the external display is connected another i3rust bar is displayed with additional information. The configuration for that can be found here.

Custom scripts / Toggles

My i3status bar links has a few toggles that trigger custom scripts. Here’s a brief description of these:

  1. Limit BAT – I often have my laptop connected to AC power. To preserve battery life it’s generally a good idea to limit the maximum battery charge to about 70-80%. Enabling this switch limits the battery charging to 75%.
  2. HDMI – Toggles the external monitor if connected. Two scripts are used here: activate_hdmi.sh enables the HDMI display, and laptop_only.sh disables it. Modify the scripts using xrandr to configure it as per your setup.
  3. VPN – Uses wg-quick to toggle the Wireguard interface.
  4. Touchpad – This uses 2 scripts: 1. touchpad_is_enabled.sh and 2. toggle_touchpad.sh. The touchpad’s current state is determined by the first script, and the second one is used to toggle it’s state.

The custom scripts work with my laptop, but may need tweaks to work with your hardware. I’ve found ArchWiki to be a good source of information regarding specific laptops.

In the next blog, we will discuss Laptop keybindings and the applications that I use daily.

Debian Bullseye setup with NVIDIA hybrid graphics

I had been using PopOS on my laptop for a couple of years, but wanted to shift back to using the i3 window manager. My laptop has the NVIDIA MX150 graphics chipset along with the inbuilt Intel GPU and the primary reason to use PopOS was to get switchable NVIDIA graphics working properly. I had trouble getting this to work back in June, 2018 but I expect it to work now with recent versions of the X.Org Server and the NVIDIA graphics driver.

To get the recent version of the Linux kernel and various packages I will be install the testing version of Debian code-named Bullseye.

This is part 1 in a series of blogs regarding setup of Debian Bullseye on a Laptop with i3 window manager.

This blog post will touch on important points to consider when setting up Debian Bullseye on a laptop, and the setup of X.org server with NVIDIA graphics drivers.

Note: A lot of the software recommendations and configurations are my personal preferences. Hence this blog will not always go into details expanding why something is being installed.

Laptop configuration

I use an Asus Vivobook S15, 2018 model. My laptop configuration is as follows:

  • CPU: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
  • RAM: 16 GB
  • Network Chipset: Intel® Dual Band Wireless-AC 8265
  • Storage: 128 GB SATA SSD, 128 GB + 1TB SATA HDD 5400rpm
  • Audio: Intel Corporation Sunrise Point-LP HD Audio (rev 21)
  • Display:
    1. NVIDIA Corporation GP108M [GeForce MX150]
    2. Intel Corporation UHD Graphics 620

Debian installation

We will use the network install ISO (netinst). I will not go into the details of the installation process but just mention a couple of noteworthy things,

  1. I encrypted my home partition by following the instructions here. This will add an additional step during each boot cycle to enter the password, in order to decrypt the hard drive.
  2. The WiFi chip needs a bit of additional configuration which I’ve covered in blog post here.

During the install I did not install any desktop environments, as I will be setting up the i3 window manager later.

Setting up encryption on the drive

Post install setup

Since I did not install any desktop environment, the first boot-up displays a command line prompt.

Let’s get some basic utilities setup,

  1. Install sudo and add the current user to the sudoer’s list – usermod -a -G sudo <username>. Run the previous commands as root.
  2. Install:
    1. ncduNCurses Disk Usage
    2. htopInteractive Process Viewer
    3. lessMan page
    4. unzip & zip – Unzip / zip an archive in Linux
    5. wgetRetrieving files using HTTP, HTTPS, FTP and FTPS
    6. curlcommand line tool and library for transferring data with URLs

The commands below can be used to complete the steps above:

X.Org server setup

I’m using X.Org server with Xinput:

NVIDIA driver installation

All the information regarding NVIDIA driver installation is available in the Debian documentation.

My output for the command: lspci -nn | egrep -i "3d|display|vga" returns:

This means that I have a hybrid graphics chipset, and need to look at this additional documentation after installing the driver. This allows certain applications to be rendered on the dedicated MX150 GPU while the basic UI still uses the low powered Intel HD GPU.

Installation notes

Update apt sources to add non-free:

Then run the following to install the Linux headers and the GPU driver:

This installed NVIDIA driver version: 440.100-2

Using NVIDIA PRIME render offload

At the time of writing this blog, Nvidia driver version 450.xx is available in Debian bullseye repositories, so these should not be necessary anymore. To identify the driver version, you can run: nvidia-settings -v

The documentation states that this should work out of the box, but on my laptop running: xrandr --listproviders did not display a provider named NVIDIA-G0 which is mentioned here.

I decided to install NVIDIA driver version: 450.xx from Debian sid. To do that, I added the following to the sources.list and then used apt-pinning:

Once a window manager is setup (we will do this in the next blog), run nvidia-settings to configure application and power profile for the dedicated GPU.

In the next blog, I will share my i3 window manager configuration and go through some of finer details while setting it up.

My tools on Linux

Update 2016-01-16

Development of Crunchbang has now stopped. There are a few community spin-offs available, Bunsen Labs and Crunchbang++. I’m now using a netinst version of Debian at home with the i3 window manager, and Bunsen Labs on my office laptop. Both are working well. I’m still using the same set of software for my work, in addition to a few more, so this post is still valid.

I’ve been using Linux at home and work for over 5 months now. I’m using a Debian based distribution called Crunchbang. Over these past few months I’ve developed/programmed using multiple technologies and have gathered a collection of tools, that I use on a daily basis.

Eclipse with NodeEclipse – Check UpdateIDE for Node.jsLink
NetbeansIDE for PHPLink
DbeaverGUI client for Cassandra and othersLink
MySQL WorkbenchMySQL/MariaDB GUI clientLink
DiaFlowchart and DiagramsLink
SoapUITesting – API and Web ServicesLink
TildaDrop down terminalLink
RemminaGTK RDP ClientLink
TomboyNote Taking AppLink
GMTPMTP ClientLink
GIMPImage manipulationLink

Continue reading “My tools on Linux”

Setting up my fresh Crunchbang installation

Update 2016-01-16

Development of Crunchbang has now stopped. There are a few community spin-offs available, Bunsen Labs and Crunchbang++. Although most of what’s been written here should be applicable to these distributions, it hasn’t been tested. I’m now using a netinst version of Debian at home with the i3 window manager, and Bunsen Labs on my office laptop. Both are working well.

For the past year and a half, I’ve been working primarily on Microsoft’s stack – C#.NET, ASP.NET Web Forms, HTML, CSS, JavaScript (jQuery primarily). My company recently started taking up projects on open source software such as PHP, WordPress and Android. This gave me an opportunity to shift to Linux again. I’ve always been fond of Linux. The ability to customize and fine tune your system to just the way you like it gives me a sense of freedom and power.

Last Friday, I installed Crunchbang. It is a Linux distribution derived from Debian. The purpose of this post is to outline the various steps I followed to get Crunchbang ready for use. I can then refer to this post whenever I’m setting up my system again, or helping someone else set up theirs.

Hardware Configuration

I’ll start of with my computer specifications first. This might help people with similar hardware configuration to find a solution to their problems.

ProcessorIntel i5-4570 CPU @ 3.20GHz
MotherboardGigabyte H87M-D3H
Video CardMSI HD 7850 Hawk
Monitor(s)Philips 190VW (1440 X 900) Dell S2240L (1920 x 1080)

System Update

Once Crunchbang is installed and you boot up for the first time a handy script starts up that allows you to update your system and installed software. This script can be invoked later on as well by running cb-welcome command on the terminal.

Installing LAMP and Java

Follow the script and install Java and the LAMP stack. It is also possible to install – Git, SVN and drivers for printer.

Installing AMD Proprietary Driver

After the script has finished, it’s time to install the graphics driver.

I followed the manual method outlined in this post on the Crunchbang forums. I tried using smxi to do it for me, but I think it was having trouble disabling the default Radeon drivers. Follow the exact steps, and reboot whenever advised.

Setup dual monitors in AMD CCC

Okay, so driver installation is over. It’s time to set up dual monitors. By default, after you’ve installed Crunchbang on a system that has dual monitors and an AMD graphics card, the monitors will duplicate each other. Once you’ve installed the driver you can change that setting. Fire up the AMD Catalyst Control Center by running amdcccle command on the terminal.

Change the mode to extend the display to two monitors rather than duplicate the display –

Multiple Monitors in AMD CCC

Placing monitors in the correct order (left or right of each other) is as simple as dragging them into place. You can also change the resolution from this screen.

Another problem that people with DELL S2240L and AMD cards will have that the display on the monitor won’t re-size to fit the entire screen. The fix for that is available through CCC –

Dell S2240L Overscan Correction

Note that the CCC makes changes to the xorg.conf file in /etc/X11. If you don’t want to make these changes everytime you reinstall Crunchbang, just backup that file.

Installing Logitech Wireless Driver

I have a wireless Logitech keyboard. With the new motherboard the keyboard is not auto detected by Crunchbang. Installing the driver found here and then restarting resolves the issue.

Boot Error : platform-microcode : intel-ucode … (not found?)

If you are running new Intel hardware, the following error –

platform microcode: firmware: agent aborted loading intel-ucode/06-1a-05 (not found?)

seems to pop up during boot. It’s basically harmless, but can be fixed by installing intel-microcode using APT.

Un-install Software

VLC Media Player

Install Software

Following is a list of software I install after installing #!


Torrent client


Music player


Use existing #! script, under the Openbox menu, Networking tab.


Video player

Then change add the following to the ~/.mplayer/config

This raises the max volume to 400%.



Google Chrome

Use existing #! script, under the Openbox menu, Networking tab.


Monitor screen color manager

I know the above line, doesn’t make it sound very exciting, but you really should give flux a go.

  • Grab the binary from here. That’s the xflux daemon (command line, but for X-Windows).
  • Add the following line to Openbox autostart file to start xflux daemon on system startup.


Development IDE for PHP

Grab the installer from here


C / C++ Editor

Grab the .deb from here


Grab the .deb installation files from here
Run the following commands one after the other –

Customize Startup and Openbox Menu

autostart.sh determines the applications to be run at start-up and menu.xml defines the layout of the Openbox menu.

Here is my current autostart.sh file and here is my menu.xml.

Customize Conky and Tint2

Conky is basically a system monitor software for the X Window System. It can be extend via plugins and can be customized to show things such as weather.

Tint2 is a task-bar designed to be simple and lightweight. Here’s my tint2 config file.

My Conky configuration can be found here. The result –

Conky Screenshot

That’s it. That’s all I do once Crunchbang has been installed. It took me about four hours hours, but with this post as a reference, next time I should be able to reduce that time to about an hour.

Crunchbang is wonderful distribution that is minimalist, fast, stable and extremely customizable. It runs very well on old and new hardware. They have a helpful and friendly community. So, if you are looking for a new Linux distribution to try out, do give Crunchbang a test drive.

  1. List of software that can be installed using APT on !#.