Customization guide for new people that want to customize their first Arch Linux environment
Nevio Gomez · Follow
16 min read · Jun 27, 2023
This guide is made for people that want to customize Arch Linux for the first time and are a bit lost on what to do to make their distro look like the ones in the subreddit r/Unixp*rn. I’ll walk you though the things you need to know to make the choice yourself and customize your distro to your liking. I’ll also go through the installation process of my own customization as an example, that way it’ll be more clear on what to expect in the installation process when installing other programs. (This guide is also available in my dotfiles repository)
Install Arch by following the installation steps in the Arch Linux official installation guide or use the ArchInstall package to automate the installation process. IMPORTANT: If you are installing Arch as a dual boot don’t follow this method. Follow one of these videos instead:
- Manual installation
- ArchInstall installation 1
- ArchInstall installation 2
Also, if you can, I recommend you use a virtual machine first to get a feel on how Arch Linux works, that way you can mess up all you want without any fear.
Here are some virtual machines programs you can use:
- VirtualBox is a free and open-source virtualization software that runs on Windows, macOS, and Linux. It is a popular choice for running Linux distros, as it is easy to use and supports a wide range of operating systems.
- VMware Workstation is a paid virtualization software that runs on Windows and macOS. It is a more powerful option than VirtualBox, and it supports more features, such as nested virtualization and GPU passthrough.
To install Arch using the ArchInstall package and a VM, first load the image and start the VM, once it loads and you see a terminal you can check your internet connection by running:
ping -c 5 https://archlinux.org/
Then run this command:
python -m archinstall --script guided
You’ll see a promp giving you some options similar to this:
Select the options that better work for you, but in my case and configuration these are the options:
- language: English
- keyboard layout: us
- mirror region: Worldwide
- harddrives: VM or partition hardrive here ext4, wipe all selected…
- encryption pwd: encryption password None
- bootloader: systemd-bootct1
- swap: True
- hostname: Name of the host machine
- root pwd: rootpassword
- user account: superuser name and password
- profile: desktop -> i3 -> i3-gaps -> AMD/ATI (open-source)
- audio: pipewire
- kernel: linux
- additional packages: firefox, vim, thunar
- network: Copy ISO network conf…
- timezone: your timezone
- automatic time synch: true
- Additional repos: multilib
After checking that the options are correct select ‘Install’. Go for a coffee ☕ and wait.
After finishing the installation process the script will ask you if you’d like to chroot into the newly created installation. Select no and reboot the machine by running:
reboot
Boot into Arch and you should be greeted by the login manager. Important: remember to remove the ISO file before booting into the machine again if you installed Arch in a VM.
Congrats, Arch is now installed 🎉
If you are used to Windows, you know that until not long ago working with various programs was a pain due to the limited space in your screen. You had to manually resize the windows yourself and minimize the programs you were not using to make space for others. This is different in Unix based systems with the help of Tiling Windows Managers. These are programs that, as the name implies, manage your windows for you (size, spacing, keybinds, etc.). They are very efficient and do not consume a lot of resources. There are a lot of options to choose from, but the one I recommend for people that are starting is i3 since it’s very easy to customize and very well documented. From now on I’ll be using i3 as example but you can install the one you like the most.
In case you want to use other windows manager, here’s a list with other popular options:
- Hyprland is a dynamic tiling window manager based on wlroots. It is highly customizable and offers a variety of features, such as smooth animations, rounded corners, and Dual-Kawase blur.
- bspwm is another tiling window manager that is lightweight and fast. It is a good choice for users who want a powerful and customizable window manager.
- Awesome is a dynamic tiling window manager that is highly customizable. It is a good choice for users who want a powerful and flexible window manager.
Due to the differences on installation for each one, I’ll not through the installation process. You can read their documentation on how to install each one. Take in account that the WMs that I list here are not the only ones that exists, there are a lot of options, but all do the same task.
Now, boot into session and you’ll see a black screen and a bar at the bottom of the screen, all in the incorrect resolution. i3 will then ask if you want a configuration to be created for you, select Yes
and this will create a configuration file at .config/i3 named config where you can add your keybindings, exec commands, etc. If you want to familiarize yourself with the i3WM I'd recommend reading their user guide.
To fix the resolution open your terminal with Mod+enter and run this command (The Mod key is most likely your Windows key):
xrandr
This will give you a list with different screens and their resolutions, select the one that you wish to use and run this command:
xrandr --output *screen name here* --mode "resolution here"
Next, run this command to sync and upgrade all Arch packages:
sudo pacman -Syu
Also, if you wish to change your wallpaper run these commands:
sudo pacman -S feh
feh --bg-scale $HOME/Downloads/some-example-image.jpg
To make this changes permanent navigate to .config/i3 on your terminal and open in vim the config file that’s there. Then add these lines to the end of the file. (If you don’t know how to use vim use this cheat sheet)
exec --no-startup-id xrandr --output *screen-name* --mode "resolution here"
exec --no-startup-id feh --bg-scale $HOME/Downloads/some-example-image.jpg
Also, you might want to assign a keybind for opening a firefox window. To do so, paste this line into your configuration (the location does not matter but it’s a good idea to put all your keybindings after the kill focused window
keybind, that way it's easier to spot them in the file).
bindsym $mod+Shift+b exec firefox --new-window
Now save the file and exit vim and test these changes by rebooting into Arch
reboot
We’ll need to install some packages to use the programs in this guide. Install the required packages by running:
sudo pacman -S ripgrep fzf xsel nodejs npm lazygit git python-pip thunar-archive-plugin zip stylua
In case you want to render Japanese characters install these fonts:
sudo pacman -S noto-fonts-cjk noto-fonts-emoji noto-fonts
In case you want to set a gif wallpaper, follow the instructions in this guide.
And add these two lines to your i3 configuration file (If you did not install the previous script, don’t add them, it will raise an error).
exec --no-startup-id killall back4.sh
exec --no-startup-id sh back4.sh 0.025 ~/path/to/your-gif-file.gif
AUR helpers automate usage of the Arch User Repository. These means that you can install packages maintained by the community or newer versions of a program that’s not updated in the official repository. But be careful as AUR helpers are not supported by Arch Linux.
There are various AUR helpers, but one popular choice is Yay (Yet another yogurt), a pacman wrapper to install AUR packages. You can visit the official github repository for the installation steps or run this command:
pacman -S --needed git base-devel && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si
There are more AUR helpers here under the pacman wrappers section, you can install the one you like the most.
To customize your terminal we will use a terminal emulator and a shell. A terminal emulator is a software program that allows you to interact with a computer’s command-line interface (CLI). It provides a text-based interface that you can use to run commands, navigate directories, and manage files.
There are various terminal emulators, but two of the most popular ones are:
- Alacritty: a lightweight and fast terminal emulator that is focused on performance. It does not have as many features as some of the other terminal emulators on this list, but it is a good choice if you are looking for a terminal emulator that is fast and responsive.
- Kitty: a fast, lightweight, and customizable terminal emulator. It supports a wide range of features, including tabs, panes, keyboard shortcuts, and a built-in file manager. Kitty is also highly customizable, and you can change its appearance and behavior to your liking.
I’ll be using Kitty as terminal emulator in this guide. Install it by running:
sudo pacman -S kitty
Then change the i3 configuration to open Kitty instead of the default terminal by adding this line to the i3 config file:
bindsym $mod+Return exec kitty
You can change Kitty's theme in .config/kitty/kitty.conf. In this repo there are some themes that might be of your interest.
After this we will need to install some Nerd fonts. Nerd fonts add glyphs and icons to your terminal, this will allow, for example, Neovim or Oh-my-zsh to render icons. Visit their page to learn more about them. To download a nerd font, go to this page and download the one you like the most. Once the download finishes, unpack the fonts and place them into ~/.fonts
or ~/.local/share/fonts.
Then run this command for your system to detect the new fonts:
fc-cache -fv
Now let’s choose a shell. Shells are command line interpreters, their primary purpose is to start other programs. I’ll use Zsh in this guide but Fish is also a very popular choice. Install Zsh by running:
sudo pacman -S zsh zsh-completions
Change your default shell by running
chsh -s /bin/zsh
And finally install Oh-my-zsh by running
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
It will ask you if you want to make Zsh your default shell, select yes
. Exit your terminal, launch it again and you will see the terminal in a different style.
To change the theme of Oh-my-zsh change this line in ~/.zshrc
ZSH_THEME="robbyrussel"
And load it using:
source .zshrc
You can find all available Oh-my-zsh themes here.
Note: There are other themes that are not in the aforementioned repository that can be installed and used. Their installation will not be explained in this guide.
A window compositor is a software component that sits between the window manager and the X server. It is responsible for compositing the windows on the screen, which means that it combines the output of all of the windows into a single image. This allows for visual effects such as transparency, shadows, and animations.
Here is a list of some available window compositors:
- Compiz is a powerful compositor that can be used to create a wide variety of visual effects, including transparency, shadows, and animations. It is a bit resource-intensive, but it can be a lot of fun to play around with.
- KWin is the compositor that comes with the KDE desktop environment. It is a lightweight compositor that offers a good balance of features and performance.
- Mutter is the compositor that comes with the GNOME desktop environment. It is a simple and elegant compositor that is well-suited for everyday use.
- Xcompmgr is a lightweight compositor that is good for older systems. It doesn’t offer as many features as some of the other compositors, but it is very efficient.
- Picom is a fork of Compton that is designed to be more efficient and customizable. It is a good choice for users who want a powerful compositor with a lot of features.
I’ll be using Picom as example. Install it by running:
sudo pacman -S picom
Start Picom by running picom
in your terminal, you will see that the terminal is now transparent, but the same goes for all other windows that you have open. We need to fix this.
To modify Picom behavior create or edit the picom.conf file at .config folder, in this case the config file does not need to be in a folder. If you want transparency to be applied to a specific window open your terminal and type:
xprop
Click on the window that you want to apply the transparency and look for WM_CLASS(STRING). Then add this to your configuration. (I’ll use Kitty for this example)
opacity-rule = [
"85:class_g = 'kitty' && focused",
"85:class_g = 'kitty' && !focused",
];
This tells Picom to follow these opacity rules for the specific program that’s running. Now, the same rules can be applied if you don’t want the window to have any transparency, for example, I don’t want Firefox to have any opacity. To achieve this add this line to the opacity-rule in the conf file.
"100:class_g = 'firefox'",
As a side note, Picom uses backends for rendering, some of them handle features that others can’t. The default one is xrender, but you can try others at your own risk. Here is a manual explaining other options available for configuration. In case that changing the Picom backend freezes your computer, open a console by pressing Ctrl+Alt+F2
, log in, change the backend line and reboot.
To run Picom on start up add this line to your i3 config file:
exec --no-startup-id picom
If you are having problems with your Picom configuration you can copy my conf file and from there edit what you want and what not.
An application launcher is a software program that allows you to launch other applications on your Linux system. It’s a graphical user interface (GUI) that provides a convenient way to start applications without having to type their names in a terminal window.
Some popular Application launchers include:
- Ulauncher: This is a popular third-party app launcher that is known for its speed and flexibility. It offers a wide range of customization options, including the ability to add plugins that extend its functionality.
- Albert: This is another popular third-party app launcher that is known for its simple and intuitive interface. It also offers a number of customization options, including the ability to change the theme and add plugins.
- Kupfer: This is a lightweight app launcher that is well-suited for older systems. It offers a basic set of features, but it is very efficient and easy to use.
- Rofi: A versatile app launcher that can be used in a variety of ways. It can be used as a traditional app launcher, but it can also be used as a keyboard-driven interface for other tasks, such as launching websites or searching for files.
I’ll be using Rofi since it’s very easy to customize, greatly versatile and very well supported by the community. To install it run:
sudo pacman -S rofi
Then run it using rofi --show drun
. Here you can read about other options to run rofi.
Create a rofi folder in your config and add the files from iamverysimp1e’s config, this will give you a start for you to customize your own Rofi theme.
There are other preconfigured and easy to customize Rofi themes in this repo.
To assign Rofi a keybinding add this to your i3 config file:
exec --no-startup-id sh rofi -show drun
A status bar is a horizontal (or vertical) bar that displays information about the current state of a program or the system as a whole. It is typically located at the bottom of the screen, but it can also be placed in other locations.
There are many different status bars available for Linux, some of the most popular ones include:
- i3bar: This is a simple and lightweight status bar that is commonly used with the i3 window manager.
- Waybar: a highly customizable status bar that is designed for Wayland compositors. Waybar is very flexible and can be configured to display a wide variety of information, including the current time and date, the status of network connections, the battery level, the volume level, the current workspace, and more.
- polybar: a popular status bar that is known for its flexibility and ease of use.
I’ll use polybar as example. Install it by running:
sudo pacman -S polybar
Then create a polybar folder in .config to hold your configuration. Polybar configuration deserves a guide on it's own but you can set a basic one following these steps. First copy my Polybar config files into your folder. In the same folder, grand permissions to these files:
chmod +x launch.sh
chmod u+x scripts/diskusage
chmod u+x scripts/memory
chmod u+x scripts/network
Then add this to your i3 config file:
exec --no-startup-id sh ~/.config/polybar/launch.sh
Another option to easily set a Polybar theme is by installing the themes at polybar-themes in your system. All the installation and configuration steps are in the repository.
Polybar is pretty well documented, you can read the documentation in their repository if you have any doubt about how to use it or how to customize it.
It’s pretty common for a file manager and file reader to take a lot of resources. Luckily for Linux environments, there are lightweight options available. Ranger is a console file manager with VI key bindings and Zathura is a highly customizable and functional document viewer. One great benefit of using these two programs is how little memory they use.
To install both programs run:
sudo pacman -S zathura ranger
Some notes. If you want Ranger to preview the images in Kitty, then you’ll need to install Pillow by using this command:
pip install pillow
If there’s a warning telling you that “The script x is installed in ‘/home/myusername/.local/bin’ which is not on PATH” then add it. For Zsh add export PATH=$PATH:/home/username/.local/bin
at the end of .zshrc.
Also if you want Zathura to show the pdf page with it’s original colors set recolor to false in the configuration file. set recolor "false"
You can assign Ranger a keybind similar to this
bindsym $mod+Shift+v exec kitty -e ranger
First, let’s install Spotify using the package in the official Arch repo (Do not use the Snap package since Spicetify is not gonna work with it)
sudo pacman -S spotify-launcher
Open it and log in. Check your audio. Close it and install spicetify-cli, we will use it to customize Spotify and add extensions. Follow their guide for the installation process or install it by running:
curl -fsSL https://raw.githubusercontent.com/spicetify/spicetify-cli/master/install.sh | sh
Check that spicetify is installed by running spicetify --help
.
Then run the spicetify
command. This will create a config-xpui.ini file where you'll configure the Spicetify variables.
Navigate to the Spicetify folder in your .config folder and open config-xpui.ini. Here you will modify spotify_path and prefs_path. Their official guide tells you how to find both paths, but in my case they look like this:
spotify_path = /home/ngz91/.local/share/spotify-launcher/install/usr/share/spotify/
prefs_path = /home/ngz91/.config/spotify/prefs
After this, you can change your own theme using this command (I’d recommend doing this inside the spicetify Themes folder):
spicetify config current_theme "Path_to_your_configuration"
To add extensions, create an Extensions folder inside the Spicetify folder and use this command:
spicetify config extensions "Extension_name"
Run spicetify backup apply
to create a backup and then run spicetify apply
.
Visit the Unixp*rn forum to see some awesome spicetify themes.
You can use this kaybind to launch spotify:
bindsym $mod+Shift+m exec spotify-launcher
Neovim is a terminal based text editor, it’s extremely powerful and customizable, and very hard to configure if you don’t know what you are doing. I recommend using a Neovim premade configuration before making your own, or you can configure one yourself by following Tatsuya Matsuyama video, that way you can get a starting minimal configuration and also get an understanding of how Neovim configurations work.
Some good premade configurations are:
These are all community maintained and very stable.
The main language used for configuring neovim is Lua. You can familiarize yourself with the language by watching this video, but by knowing the basics you can make your own configuration.
A Neovim configuration folder structure looks something like this:
├── init.lua
├── lua
│ └── user
│ ├── plugin1.lua
│ ├── plugin2.lua
│ ├── plugin3.lua
...
│ ├── lsp
│ │ ├── configs.lua
│ │ ├── handlers.lua
│ │ ├── init.lua
│ │ ├── null-ls.lua
│ │ └── settings
│ │ ├── lsp1Settings.lua
│ │ ├── lsp2Settings.lua
...
└── plugin
└── packer_compiled.lua
init.lua
is the first file Neovim loads, here you can require other files with the plugins configurations or scripts that you wanna run. lua/user
is where your Lua scripts and plugins configurations are, you can require them in init.lua
by using the require function require("user.plugin1")
. There's also a lsp (language server protocol) folder where all lsp configuration files lie, here you can configure your language servers and lsp based plugins like lsp-saga, illuminate, etc.
NOTE: This is not a standard, there are various ways this folder can be structured, but this one is very easy to understand.
To install plugins there are various plugins managers, but the two most popular are Packer.nvim and lazy.nvim. If you decide for Packer, there’s an AUR package available, this will take care of the configuration for you:
yay -S nvim-packer-git
Follow their guide on how to add plugins to your configuration. But before adding plugins you might want to disable some plugins that come with Neovim and are not used, these are:
"netrw",
"netrwPlugin",
"netrwSettings",
"netrwFileHandlers",
"gzip",
"zip",
"zipPlugin",
"tar",
"tarPlugin",
"getscript",
"getscriptPlugin",
"vimball",
"vimballPlugin",
"2html_plugin",
"logipat",
"rrhelper",
"spellfile_plugin",
"matchit",
This guide is one of the most complete guides for configuring Neovim, if you have any doubt about how to configure a plugin or any other type of configuration, the answer, most likely, can be found there. Also, visit the Neovim reddit forum if you have any doubt, it’s a very open and welcoming community.
I hope this guide helped you in your configuration process. If you have found anything that’s not clear or wrong, please let me know, I’ll be updating this guide every now and then.
Here are some resources that you might find useful for continuing your ricing journey.
- R/unixp*rn the home for *NIX customization
- Arch linux webpage
- Eric Murphy youtube channel.
- chrisatmachine Youtube and Github for neovim configurations and plugins.
- Alpha2phi Neovim articles.