About

For those seeking documentation, the ArchWiki is the best resource available. In fact, it's so good that it can be a perfect trap for a curious mind. My goal here is to gather the information I find relevant for my own use case, allowing me to setup and maintain a simple and aesthetic Arch Linux Wayland environment while minimizing the chances of falling down a rabbit hole.

it's called "dotfiles" because that folder ".config" starts with a dot and is therefor hidden

and we customize these hidden text files for ~20 programs because we're neurotic lovers of beauty 🤷

-- from a Reddit user on r/unixporn

Components

The main building blocks, a.k.a packages1

System

Desktop

Theme

Terminal

Tools

Clients

Utilities and Quality of Life

  • Bat: Cat clone with syntax highlighting and git integration
  • Bob: A version manager for neovim
  • Bottom: A graphical process/system monitor
  • Cava: Console-based Audio Visualizer for Alsa
  • Delta: A syntax-highlighting pager for git, diff, grep, and blame output
  • Eza: A modern replacement for ls (community fork of exa)
  • Fastfetch: Like Neofetch, but much faster because written in C
  • Fd: Simple, fast and user-friendly alternative to find
  • Fzf: Command-line fuzzy finder
  • Gitui: Blazing fast terminal-ui for git written in Rust
  • Ripgrep: A search tool that combines the usability of ag with the raw speed of grep
  • Yay: Yet another yogurt. Pacman wrapper and AUR helper written in go
  • Zoxide: A smarter cd command for your terminal
1

For the exhaustive package list, you can check the packages.toml

Live USB

The steps to create a bootable USB containing the Arch Linux ISO.

Download the ISO

Download the ISO file from https://archlinux.org/download/.

Note: the BitTorrent Download is the recommended option and the file will look like this archlinux-version-x86_64.iso.torrent.

USB Drive Name

Find out the name of your USB drive:

ls -l /dev/disk/by-id/usb-*

To make sure it is not mounted, run lsblk and search for the MOUNTPOINTS column, you should see an empty space:

lsblk

Write the ISO

Write the ISO to the USB drive using pv:

sudo pv path/to/archlinux-version-x86_64.iso -Yo /dev/disk/by-id/usb-My_flash_drive-0:0

Note: the USB drive name should look something like /dev/disk/by-id/usb-SanDisk_Cruzer_Blade_4C530000100920118104-0:0.
Make sure to not append any partition number like My_flash_drive-0:0-part1.

For more information about this topic, check the Arch Linux wiki

Live Environment

Console Configuration

Font

First of all, improve the default font size using setfont:

setfont ter-222b

Keyboard

To change the default keyboard layout:

# for example, to set a brazilian keyboard layout
loadkeys br-abnt2

Some Verification

UEFI Mode

To make sure the system is booted in UEFI mode, check the output of the following command. It should return 64, for a 64-bit system:

cat /sys/firmware/efi/fw_platform_size

Internet Connection

To check the internet connection:

ping archlinux.org

System Clock

To ensure the system clock is synchronized, run:

timedatectl

Partitions

Partitioning the Disk

Device Identification

To identify available disks, the fdisk -l command will give you all the necessary information, but lsblk can also be used. My favorite flags are lsblk -o NAME,SIZE for a concise output and lsblk --fs when I need to check file system information.

Always make sure to identify and select the correct device.

Otherwise, the following steps may result in unintended data loss.

Optimal Logical Sector Size (exclusive for NVMe devices)

To check the formatted logical block address (LBA) size of your NVMe drive:

nvme id-ns -H /dev/nvme0n1 | grep "Relative Performance"
LBA Format  0 : Metadata Size: 0   bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good (in use)
LBA Format  1 : Metadata Size: 0   bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better

You can confirm it by running lsblk -td and looking at the LOG-SEC column value.

Note: On the example above the sector size in use (512 bytes) is not the optimal one.

To change the logical block address size, you can use the nvme format command specifying the preferred value with the --lbaf parameter:

nvme format --lbaf=1 /dev/nvme0n1

Partition Tables

To write the partition tables using cfdisk:

cfdisk /dev/the_disk_to_be_partitioned
Make sure to set the correct type for the efi partition.

Example Layout:

Mount pointPurposeSuggested sizePartition type
/efiefi1 GiBEFI System
[SWAP]swap8 GiBLinux filesystem
/rootRemainderLinux filesystem

To verify the partitions using fdisk:

fdisk -l /dev/partitioned_disk

Formatting Partitions

To create an Ext4 file system for the root:

mkfs.ext4 /dev/root_partition

To initialize the swap partition:

mkswap /dev/swap_partition

To format the EFI partition:

mkfs.fat -F 32 /dev/efi_system_partition

Filesystem Label

Now is a good time to add a label to the efi partition. This will be useful later to set the rEFInd configuration. Using dosfslabel:

dosfslabel /dev/efi_system_partition ARCHIE

You can verify it using lsblk:

lsblk -o NAME,LABEL

Mounting the File Systems

Mount the root volume to /mnt:

mount /dev/root_partition /mnt

Mount the EFI partition:

mount --mkdir /dev/efi_system_partition /mnt/efi

Enable the swap volume:

swapon /dev/swap_partition

Installation

Mirror List

To update the mirrorlist using reflector:

reflector --protocol https --verbose --latest 25 --sort rate --save /etc/pacman.d/mirrorlist

Install Essential Packages

To install the essential packages to the new root:

pacstrap -K /mnt base linux linux-firmware base-devel git nano networkmanager

Fstab

To generate an fstab file:

genfstab -U /mnt >> /mnt/etc/fstab

Chroot

To change root into the new system:

arch-chroot /mnt

Time

To set the time zone:

ln -sf /usr/share/zoneinfo/Region/City /etc/localtime

Note: You can verify it using the command date:

date

To generate the /etc/adjtime file:

hwclock --systohc

To set up time synchronization with systemd-timesyncd:

systemctl enable systemd-timesyncd.service

Localization

Uncomment the #en_US.UTF-8 UTF-8 line editing the /etc/locale.gen file:

nano /etc/locale.gen

To generate the locales:

locale-gen

Create the locale.conf file, setting the LANG variable accordingly:

nano /etc/locale.conf
LANG=en_US.UTF-8

Hostname

To set a hostname create a hostname file, adding its name, e.g. desktop:

nano /etc/hostname
desktop

Root password

To set the root password, run:

passwd

Creating New User

To create new user, adding it to the wheel group:

useradd -m -G wheel username

To add a password to the user, run:

passwd username

Edit the sudoers configuration file, uncommenting the # %wheel ALL=(ALL:ALL) ALL line:

EDITOR=nano visudo
## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL:ALL) ALL

Enable Network

To enable NetworkManager service:

systemctl enable NetworkManager

Boot Loader

Install systemd-boot

bootctl install

Edit the /efi/loader/loader.conf file:

nano /efi/loader/loader.conf
default  arch.conf
timeout  4
console-mode auto

Create the /efi/loader/entries/arch.conf file:

nano /efi/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw

To make it easy to set the UUID you can use the blkid command and append the output to the arch.conf file.

blkid -s UUID /dev/root_partition >> /efi/loader/entries/arch.conf

Copy everything that is inside the /boot path to /efi.

Reboot

To exit the chroot environment:

exit

To unmount all the partitions and reboot:

umount -R /mnt
reboot

That's it. Good luck!

By the Way

If you have succeeded, there's one last thing to be done.

First download fastfetch:

sudo pacman -S fastfetch

Now run it and enjoy your new achievement:

fastfetch

Note: jokes aside, this last step is a simple and efficient way to verify your installation.

Pos-Installation

Double Checking

To check the timesyncd service, run:

timedatectl status

To refresh the entire system:

sudo pacman -Syyu

Make sure to have some basic system packages installed:

sudo pacman -S --needed base-devel bash curl gcc git ncurses xz zstd

Installing Some Compilers

Install clang:

sudo pacman -S clang

Install go:

sudo pacman -S go

Install lua:

sudo pacman -S lua

Install rustup:

sudo pacman -S rustup
rustup update stable

Graphic Drivers

OpenGL

Install mesa:

sudo pacman -S mesa

AMD

For Vulkan support:

sudo pacman -S vulkan-radeon

Nvidia

Install the nvidia package:

sudo pacman -S nvidia

UKI

Busybox

Install busybox to enable an emergency shell in case of a panic during the boot process:

sudo pacman -S busybox

Microcode

Install amd-ucode or intel-ucode according with your CPU.

sudo pacman -S amd-ucode
sudo pacman -S intel-ucode

Booster

Install booster:

sudo pacman -S booster

Set the configuration file accordingly:

sudo nano /etc/booster.yaml
extra_files: busybox,fsck,fsck.ext4
modules_force_load: amdgpu,hid_generic,usbhid

Note: the modules_force_load: amdgpu,hid_generic,usbhid line is not obligatory.

For NVIDIA you can replace amdgpu with the following:

modules_force_load: nvidia,nvidia_modeset,nvidia_uvm,nvidia_drm

Ukify

Install systemd-ukify:

sudo pacman -S systemd-ukify

Set the configuration accordingly:

sudo nano /etc/ukify.conf
[UKI]
Linux=/boot/vmlinuz-linux
Initrd=/boot/amd-ucode.img /boot/booster-linux.img
Cmdline=@/etc/kernel/cmdline
OSRelease=@/etc/os-release
Splash=/usr/share/systemd/bootctl/splash-arch.bmp

Note: probably this configuration isn't required because it will be replaced by the kernel-install one.

Kernel-install

Set the install.conf file:

sudo nano /etc/kernel/install.conf
layout=uki
uki_generator=ukify

Set the ukify configuration in the uki.conf file:

sudo nano /etc/kernel/uki.conf
[UKI]
Linux=/boot/vmlinuz-linux
Initrd=/boot/amd-ucode.img /boot/booster-linux.img
Cmdline=@/etc/kernel/cmdline
OSRelease=@/etc/os-release
Splash=/usr/share/systemd/bootctl/splash-arch.bmp

To verify the current kernel-install paths and parameters configuration, run:

kernel-install inspect

Kernel Command Line

To check the parameters your system was booted up with, run:

cat /proc/cmdline

To include new kernel parameters to the UKI, for example nvme_load=YES, nowatchdog, quiet, splash, etc. use the /etc/kernel/cmdline file:

sudo nano /etc/kernel/cmdline

rEFInd

Install refind package:

sudo pacman -S refind

Install it with the refind-install script:

refind-install

Note: for comfort I will use the su command that launches an interactive shell as root.

To add the catppuccin theme, create a themes directory inside refind installation path:

cd /efi/EFI/refind
mkdir themes

Clone the repo inside the themes folder:

cd themes
git clone https://github.com/catppuccin/refind.git catppuccin

It requires a include themes/catppuccin/mocha.conf line to be appended to the end of refind.conf file.

To go back to the refind directory:

cd /efi/EFI/refind

We can now customize the refind.conf by adding a new menuentry for the systemd-boot boot loader. Although it might seem a bit contradictory to use rEFInd to launch systemd-boot, rEFInd's role here is to provide a simple and customizable interface that can handle a dual-boot scenario for different available distros.

nano refind.conf
menuentry "Arch Linux" {
    icon /EFI/refind/themes/catppuccin/assets/mocha/icons/os_arch.png
    volume "ARCHIE"
    loader /EFI/systemd/systemd-bootx64.efi
}

include themes/catppuccin/mocha.conf

Note the catppuccin theme being included in the last line.

For more info, check rEFInd official documentation

To exit the interactive shell simply run exit.

Package Manager

Pacman

Update pacman configuration file:

sudo nano /etc/pacman.conf
# Misc options
#UseSyslog
Color
ILoveCandy
#NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5

An example can be found on EndeavourOS repo

Yay

First, create and cd into an apps directory:

mkdir apps && cd apps

To install yay:

git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si

Additional Pacman Hooks

Install extra pacman hooks for the kernel-install:

yay -S pacman-hook-kernel-install

Pacman Utilities

Install the pacman-contrib package:

sudo pacman -S pacman-contrib

Enable the paccache.timer to periodically clean the pacman cache:

systemctl enable paccache.timer

Generating the UKI

Reinstall the kernel package to trigger the kernel-install in order to generate the unified kernel image:

sudo pacman -S linux

To list the current available boot entries which have been configured, run:

sudo bootctl list

If everything seems correct, reboot the system:

reboot

Home Sweet Home

Bootstrap

To install chezmoi:

sudo pacman -S chezmoi

To initialize it:

chezmoi init https://github.com/<user>/dotfiles.git

To apply it:

chezmoi apply

Note: a lot of packages will be installed. Probably would be a good idea to reboot the system after it.

For the exhaustive list of packages, you can check the packages.toml file from the repo.

Hint: A good reference for essential packages is to check the ones available in the Arch Linux live system (ISO). You can find them here. Another good source is to check the packages available in the EndeavourOS ISO. You can find them in their repo.

Graphical Interface

To launch niri from the tty:

niri-session

Shell

To check if Nushell is in the valid shells list:

cat /etc/shells

To set Nushell as login shell:

chsh -s /usr/bin/nu <user>

Note: Reboot the system to check if everything is ok

Font

To refresh the font cache:

sudo fc-cache -fv

SSH

To generate a new SSH key:

ssh-keygen -t ed25519 -C "your_email@example.com"

To check the public key:

cat ~/.ssh/id_ed25519.pub

To test the SSH connection:

ssh -T git@github.com

Neovim

To install and set Neovim nightly using bob:

bob install nightly
sudo bob use nightly

To increase the maximum number of inotify watches and queued events. Edit the /etc/sysctl.conf file:

sudo nano /etc/sysctl.conf
fs.inotify.max_queued_events=524288
fs.inotify.max_user_watches=524288

Pandoc

Download Pandoc latest release from the repo

To install it:

sudo tar xvzf /path/to/pandoc-version-linux-amd64.tar.gz --strip-components 1 -C /usr/local

Display Manager

To enable the ly service:

systemctl enable ly

To edit ly default configuration:

sudo nano /etc/ly/config.ini

Reboot the system (I'm neurotic):

reboot

# there's no place like home

Finishing

Catppuccin

Bat

To include the new syntax highlighting theme, rebuild bat's cache:

bat cache --build

To check if the Catppuccin theme is now available:

# the output should be Catppuccin Mocha
bat --list-themes | rg "Catppuccin"

Firefox

To apply Catppuccin Mocha Mauve color theme to firefox simply click here

Neovim

To fetch Neovim configuration, simply launch it:

nvim

To include the api-key for the WakaTime plugin:

# launch the website and copy the api key
start https://wakatime.com/api-key
# run the following cmd inside neovim and paste the key
WakaTimeApiKey

Yazi

To fetch the plugins using Yazi package manager:

ya pack -i
ya pack -u

Note: This will install and update the plugins according to the yazi/package.toml file.

Dev Stuff

Rust

Toolchains

To install the nightly channel:

rustup toolchain install nightly

To check the installed toolchains:

rustup toolchain list

Targets

To include support for the Wasm target:

rustup target add wasm32-unknown-unknown

To check the installed targets:

rustup target list --installed

Fly.io

Update the DNS

This is a necessary step for my environment. Not sure if this will be the case for anyone else.

To get the list of the current active profiles:

nmcli connection show --active

To check the current DNS values

nmcli connection show 'NAME' | rg dns

To update the DNS:

nmcli connection modify 'NAME' ipv4.dns "8.8.8.8 1.1.1.1"

To reconnect:

nmcli connection down 'NAME'
nmcli connection up 'NAME'

flyctl

To installing flyctl:

curl -L https://fly.io/install.sh | sh

To sign in using flyctl:

fly auth login

Miscellaneous

Profile-sync-daemon

To generate the configuration file and check the current status:

psd preview

To edit the sudoers adding the necessary rights

sudo visudo
<username> ALL=(ALL) NOPASSWD: /usr/bin/psd-overlay-helper

To edit the psd.conf configuration file:

sudo nvim .config/psd/psd.conf
# Uncomment and set to "yes" to use overlayfs instead of a full copy to reduce
# the memory costs and to improve sync/unsync operations. Note that your kernel
# MUST have this module available in order to use this mode.
#
USE_OVERLAYFS="yes"
#
BROWSERS=(firefox)

To enable the psd service:

systemctl --user enable psd.service

NetworkManager

Wi-Fi Connection

To get the list of available Wi-Fi networks

nmcli device wifi list

To connect to a Wi-Fi

nmcli device wifi connect <SSID_or_BSSID> password <password>

Update the DNS

To get the list of the current active profiles:

nmcli connection show --active

To check the current DNS values

nmcli connection show 'NAME' | rg dns

To update the DNS:

nmcli connection modify 'NAME' ipv4.dns "8.8.8.8 1.1.1.1"

To reconnect:

nmcli connection down 'NAME'
nmcli connection up 'NAME'

Tlp

To enable the service:

systemctl enable tlp.service

To mask the rfkill:

systemctl mask systemd-rfkill.service
systemctl mask systemd-rfkill.socket

Virtual Machine

To check if virtualization is enabled:

grep -Ec '(vmx|svm)' /proc/cpuinfo

To install necessary packages:

sudo pacman -Syu virt-manager qemu-desktop dnsmasq iptables-nft

To enable libvirtd service:

sudo systemctl enable --now libvirtd.service

To add the user to the libvirt group:

sudo usermod -aG libvirt $env.USER

To restart the libvirtd service:

systemctl restart libvirtd.service

Live USB

  • Download the ISO file from the Arch Linux website
  • Find the USB drive name: ls -l /dev/disk/by-id/usb-*
  • Make sure it is not mounted: lsblk
  • Write the ISO to the USB drive:
sudo pv path/to/archlinux-version-x86_64.iso -Yo /dev/disk/by-id/usb-My_flash_drive-0:0

Live Environment

Console Configuration

  • Improve the default font size: setfont ter-222b
  • Change the default keyboard layout, if necessary:
# for example, to set a brazilian keyboard layout
loadkeys br-abnt2
  • Make sure the system is booted in UEFI mode:
# the output should be 64 for 64-bit system
cat /sys/firmware/efi/fw_platform_size
  • Check the internet connection: ping archlinux.org
  • Ensure the system clock is synchronized: timedatectl

Partitions

Partitioning the Disk

  • Identify available disks: lsblk -o NAME,SIZE
  • Create the partitions:
cfdisk /dev/the_disk_to_be_partitioned
PurposeSuggested sizePartition typeMount point
efi1 GiBEFI System/efi
swap8 GiBLinux filesystem[SWAP]
rootRemainderLinux filesystem/
  • Verify the partitions: fdisk -l /dev/partitioned_disk

Formatting the Partitions

  • Create an Ext4 fs for the root: mkfs.ext4 /dev/root_partition
  • Initialize the swap: mkswap /dev/swap_partition
  • Format the efi to FAT32: mkfs.fat -F 32 /dev/efi_system_partition
  • Add a label to the efi partition:
dosfslabel /dev/efi_system_partition ARCHIE
  • Verify the result: lsblk /dev/partioned_disk -o NAME,FSTYPE,LABEL

Mounting the File System

  • Mount the root partition to /mnt: mount /dev/root_partition /mnt
  • Mount the efi partition to /mnt/efi: mount --mkdir /dev/efi_system_partition /mnt/efi
  • Enable the swap: swapon /dev/swap_partition

Installation

  • Update the mirrorlist:
reflector --protocol https --verbose --latest 25 --sort rate --save /etc/pacman.d/mirrorlist
  • Install the essential packages to the new root:
pacstrap -K /mnt base linux linux-firmware base-devel git nano networkmanager

Configuring the System

  • Generate an fstab file: genfstab -U /mnt >> /mnt/etc/fstab
  • Change root into the new system: arch-chroot /mnt
  • Set the time zone: ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
  • Verify the new local time: date
  • Generate the /etc/adjtime: hwclock --systohc
  • Set up time synchronization:
systemctl enable systemd-timesyncd.service
  • Edit the locale.gen file:
nano /etc/locale.gen
# Uncomment this line
en_US.UTF-8 UTF-8
  • Generate the locales: locale-gen
  • Create the locale.conf file, setting the LANG variable accordingly:
nano /etc/locale.conf
LANG=en_US.UTF-8
  • Create the hostname file:
nano /etc/hostname
desktop
  • Set the root password: passwd

Creating New User

  • Create new user, adding it to the wheel group:
useradd -m -G wheel <username>
  • Add a password to the user: passwd <username>
  • Edit the sudoers configuration file:
EDITOR=nano visudo
## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL:ALL) ALL

Set the Boot Loader

  • Install systemd-boot: bootctl install
  • Edit the loader.conf file:
nano /efi/loader/loader.conf
default  arch.conf
timeout  4
console-mode auto
  • Create the arch.conf entry:
nano /efi/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
  • Append the UUID number:
blkid -s UUID /dev/root_partition >> /efi/loader/entries/arch.conf
  • Copy everything that is inside /boot to /efi directory:
cd /efi
cp /boot/* .
  • Enable the NetworkManager service: systemctl enable NetworkManager

Finishing

  • Exit the chroot environment: exit
  • Unmount all the partitions: umount -R /mnt
  • Reboot: reboot

# good luck!

Verifying the Installation

  • Download fastfetch: sudo pacman -S fastfetch
  • Run it: fastfetch

# enjoy your new achievement!

Pos-Installation

Double Checking

# sorry I'm neurotic

  • Check the timesyncd service: timedatectl status
  • Refresh the system, including the package database: sudo pacman -Syyu
  • Make sure some basic system packages are installed:
sudo pacman -S --needed base-devel bash curl gcc git ncurses xz zstd

Installing Some Compilers

  • clang: sudo pacman -S clang
  • go: sudo pacman -S go
  • lua: sudo pacman -S lua
  • rustup:
sudo pacman -S rustup
rustup update stable

Graphic Drivers

OpenGL

  • Install mesa:
sudo pacman -S mesa

AMD

  • For Vulkan support:
sudo pacman -S vulkan-radeon

Nvidia

  • Install the nvidia package:
sudo pacman -S nvidia

UKI

Busybox

  • Install busybox:
sudo pacman -S busybox

Microcode

  • Install amd-ucode or intel-ucode according with your CPU.
sudo pacman -S amd-ucode
sudo pacman -S intel-ucode

Booster

  • Install booster:
sudo pacman -S booster
  • Set the configuration file accordingly:
sudo nano /etc/booster.yaml
extra_files: busybox,fsck,fsck.ext4
modules_force_load: amdgpu,hid_generic,usbhid
  • For NVIDIA you can replace amdgpu with the following:
modules_force_load: nvidia,nvidia_modeset,nvidia_uvm,nvidia_drm

Ukify

  • Install systemd-ukify:
sudo pacman -S systemd-ukify
  • Set the configuration accordingly:
sudo nano /etc/ukify.conf
[UKI]
Linux=/boot/vmlinuz-linux
Initrd=/boot/amd-ucode.img /boot/booster-linux.img
Cmdline=@/etc/kernel/cmdline
OSRelease=@/etc/os-release
Splash=/usr/share/systemd/bootctl/splash-arch.bmp

Kernel-install

  • Set the install.conf file:
sudo nano /etc/kernel/install.conf
layout=uki
uki_generator=ukify
  • Set the ukify configuration:
sudo nano /etc/kernel/uki.conf
[UKI]
Linux=/boot/vmlinuz-linux
Initrd=/boot/amd-ucode.img /boot/booster-linux.img
Cmdline=@/etc/kernel/cmdline
OSRelease=@/etc/os-release
Splash=/usr/share/systemd/bootctl/splash-arch.bmp
  • Verify the current kernel-install configuration:
kernel-install inspect

Kernel Command Line

  • Check the parameters your system was booted up with:
cat /proc/cmdline
  • Include new kernel parameters to the UKI:
sudo nano /etc/kernel/cmdline

rEFInd

  • Install refind package: sudo pacman -S refind
  • Install it with the refind-install script: refind-install
  • Start an interactive shell as root: su
  • Create the themes directory inside refind installation path:
cd /efi/EFI/refind
mkdir themes
  • Clone the catppuccin repo inside the themes directory:
cd themes
git clone https://github.com/catppuccin/refind.git catppuccin
  • Go back to the refind directory:
cd /efi/EFI/refind
  • Edit the refind.conf, adding a new menuentry for the systemd-boot and also including the mocha.conf file:
nano refind.conf
menuentry "Arch Linux" {
    icon /EFI/refind/themes/catppuccin/assets/mocha/icons/os_arch.png
    volume "ARCHIE"
    loader /EFI/systemd/systemd-bootx64.efi
}

include themes/catppuccin/mocha.conf
  • Exit the interactive shell: exit

Package Manager

Pacman

  • Update pacman configuration file:
sudo nano /etc/pacman.conf
# Misc options
#UseSyslog
Color
ILoveCandy
#NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5

Yay

  • Create and cd into the apps directory:
mkdir apps && cd apps
  • Install yay:
git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si
# I'm not sure about this one
yay -Y --gendb

Additional Pacman Hooks

Install extra pacman hooks for the kernel-install:

yay -S pacman-hook-kernel-install

Generating the UKI

  • Reinstall the kernel package to generate the unified kernel image:
sudo pacman -S linux
  • Check the current available boot entries:
sudo bootctl list

If everything seems correct, reboot the system: reboot

Home Sweet Home

Bootstrap

  • Install chezmoi: sudo pacman -S chezmoi
  • Initialize it:
chezmoi init https://github.com/<user>/dotfiles.git
  • Apply the changes: chezmoi apply
  • Reboot the system: reboot

Not Far From Home

  • Refresh the font cache:
sudo fc-cache -fv
  • Launch niri from the tty: niri-session
  • Check if Nushell is in the valid shells list: cat /etc/shells
  • Set Nushell as login shell:
chsh -s /usr/bin/nu <user>

SSH

  • Generate a new SSH key:
ssh-keygen -t ed25519 -C "your_email@example.com"
  • Check the public key:
cat ~/.ssh/id_ed25519.pub
  • Test the SSH connection:
ssh -T git@github.com

Neovim

  • Install and set Neovim nightly using bob:
bob install nightly
sudo bob use nightly
  • Increase inotify maximum numbers:
sudo nano /etc/sysctl.conf
fs.inotify.max_queued_events=524288
fs.inotify.max_user_watches=524288

Pandoc

sudo tar xvzf /path/to/pandoc-version-linux-amd64.tar.gz --strip-components 1 -C /usr/local

Display Manager

  • Enable the ly service: systemctl enable ly

Reboot the system: reboot

# there's no place like home

Finishing

Catppuccin

  • Rebuild bat's cache to add the new syntax highlighting: bat cache --build
  • Check if Catppuccin is available:
bat --list-themes | rg "Catppuccin"

Neovim

  • Launch Neovim to fetch its configuration: nvim
  • Include the api-key for WakaTime plugin:
# launch the website and copy the api key
start https://wakatime.com/api-key
# run the following cmd inside neovim and paste the key
WakaTimeApiKey

Yazi

  • Fetch the plugins using Yazi package manager:
ya pack -i
ya pack -u

Dev Stuff

Rust

  • Install the nightly channel:
rustup toolchain install nightly
  • Include support for the Wasm target:
rustup target add wasm32-unknown-unknown
  • Check the installation:
rustup toolchain list
rustup target list --installed

Miscellaneous

Profile-sync-daemon

  • Generate the configuration file and check the current status:
psd preview
  • Edit the sudoers adding the necessary rights
sudo visudo
<username> ALL=(ALL) NOPASSWD: /usr/bin/psd-overlay-helper
  • Edit the psd.conf configuration file:
sudo nvim .config/psd/psd.conf
# Uncomment and set to "yes" to use overlayfs instead of a full copy to reduce
# the memory costs and to improve sync/unsync operations. Note that your kernel
# MUST have this module available in order to use this mode.
#
USE_OVERLAYFS="yes"
#
BROWSERS=(firefox)
  • Enable the psd service:
systemctl --user enable psd.service

NetworkManager

Wi-Fi Connection

  • Get the list of available Wi-Fi networks
nmcli device wifi list
  • Connect to a Wi-Fi
nmcli device wifi connect <SSID_or_BSSID> password <password>

Update the DNS

  • Get the list of the current active profiles:
nmcli connection show --active
  • Check the current DNS values
nmcli connection show 'NAME' | rg dns
  • Update the DNS:
nmcli connection modify 'NAME' ipv4.dns "8.8.8.8 1.1.1.1"
  • Reconnect:
nmcli connection down 'NAME'
nmcli connection up 'NAME'

Tlp

  • Enable the service:
systemctl enable tlp.service
  • Mask the rfkill:
systemctl mask systemd-rfkill.service
systemctl mask systemd-rfkill.socket

Virtual Machine

  • Check if virtualization is enabled:
grep -Ec '(vmx|svm)' /proc/cpuinfo
  • Install necessary packages:
sudo pacman -Syu virt-manager qemu-desktop dnsmasq iptables-nft
  • Enable libvirtd service:
sudo systemctl enable --now libvirtd.service
  • Adding the user to the libvirt group:
sudo usermod -aG libvirt $env.USER
  • Restarting the libvirtd service:
systemctl restart libvirtd.service

System Maintenance

  • Update the mirrorlist:
sudo reflector --protocol https --verbose --latest 25 --sort rate --save /etc/pacman.d/mirrorlist
  • Refresh the entire system:
yay -Syyu

# work in progress