The process of setting up a good development environment takes time. You often switch between tools until it feel comfortable. I have been going through the same process and I feel I am almost in a stable state. Here is my current setup so that I don’t have to undergo the evolution again.

Os - Debian

I have been using Debian GNU/Linux for a while and haven’t find a reason to switch. It keeps perfect balance between stability, security and availability of latest version of softwares.

Display and Window Managers

I recently switched to i3wm, a tiling window manager and polybar a status bar. That made me switch from gdm to lightdm as the former spawns a lot of unnecessary services.



Debian provides a meta package i3 that installs i3wm with necessary tools.

sudo apt-get install i3 \
  feh \ # utility to set wallpaper
  brightnessctl \
  pulseaudio-utils \ # volume control utility

Polybar has not been packaged for Debian yet. Building from source is straight forward once dependencies are met.

sudo apt-get install libcairo2 libcairo2-dev \
  libxcb-composite0-dev \
  libxcb-ewmh-dev \
  libxcb-icccm4-dev \
  libxcb-image0-dev \
  libxcb-util0-dev \
  libxcb-xfixes0-dev \
  python-xcbgen \
  xcb-proto \
  libcurl4 \
  libcurl4-gnutls-dev \
  fonts-font-awesome \ # icon support
  fonts-noto-mono \

# clone the repo
git clone --recursive --depth=1
cd polybar
git checkout 3.3.1 -b b3.3.1 # checkout version 3.3.1

i3 and polybar can be customized with configuration files. Here are my configs

  sudo apt-get install lightdm

After installation, Debian will prompt you to choose default display manager.

Logout and select i3 from lightdm settings. Done!!

Shell and Terminal

Fish + tmux is good duo that you may want to try.

fish gives better predictions and auto-completion than bash. tmux lets you control a number of terminals from a single window.

I use alacritty as my terminal. It is a fast, gpu accelerated terminal written in Rust.


Alacritty has to be built from source since Debian doesn’t have it packaged yet. You need to have rust and cargo installed.

sudo apt-get install cmake pkg-config libfreetype6-dev libfontconfig1-dev libxcb-xfixes0-dev
cargo build --release

To create a desktop entry

sudo cp target/release/alacritty /usr/local/bin # or anywhere else in $PATH
sudo cp extra/logo/alacritty-term.svg /usr/share/pixmaps/Alacritty.svg
sudo desktop-file-install extra/linux/alacritty.desktop
sudo update-desktop-database

To make it default terminal app, run

sudo update-alternatives --config x-terminal-emulator

and select alacritty.

Both fish and tmux are availabe in debian package repo.

sudo apt-get install fish tmux
chsh -s `which fish` # make fish default shell

Editor - GNU Emacs

I use GNU Emacs a highly customizable text editor with Henrik Lissner’s doom-emacs configuration.


GNU Emacs releases are available in Debian package repository. I use GNU Emacs 27 which is based on master branch. To build from source,

sudo apt-get build-dep emacs # install dependencies
git clone
cd emacs
sudo make install
  # copy private configs to ~/.doom.d
  # clone
  git clone ~/.emacs.d
  cd .emacs.d
  git checkout develop
  ./bin/doom refresh

This will install all the required Elisp packages.

Doom Emacs depends on several tools for each module to function properly. We will see configuring Doom Emacs modules in next part. Thank you!