All things are difficult before they are easy, Thomas Fuller.

Arch Linux is an independently developed, free and open-source, rolling release distribution. It is a minimalist, lightweight, and bleeding edge distribution that targets advanced users.
Arch Linux installer. Dowload and burn the image to a flash drive using Ventoy or balenaEtcher. Boot from the flash drive. Arch Linux installer is a menu-driven, command line, Arch Linux installer. It is an easy way to install Arch and more importantly, it is an official script supported by Arch. Burn the Arch ISO and the archinstall package is part of it so can be run directly, just type: archinstall (Main disk: /dev/sdc, 238.47GB).
Filesystem: btrfs (snapshots). Profile: minimal (no desktop), we’ll install Niri manually.
Partition layout.
cat /etc/fstab
# UUIDs are preferred over device names (e.g., /dev/sda1) because they remain stable
# Root partition (/) —the core of my system. Filesystem Type: ext4 (a modern, robust Linux filesystem)
# defaults, shorthand for common default settings
/dev/disk/by-uuid/654e9ff3-82ef-4857-973d-6b5db5e3939a / ext4 defaults 0 1
# EFI System Partition (/boot/efi). Mount Point: /boot/efi (standard location for UEFI bootloaders).
# Filesystem Type: vfat. The FAT32 filesystem is required by UEFI for boot partitions.
/dev/disk/by-uuid/CD18-37B9 /boot/efi vfat defaults 0 1
# Data Partition (/mnt/data). Mount Point: /mnt/data, a user-defined directory for additional storage (e.g., documents, media).
# Filesystem Type: ext4. Same as root —ideal for Linux-only use.
# Options: defaults. Standard read-write access.
UUID=ca04070e-a366-424b-8fa3-c9960c9fbdae /mnt/data ext4 defaults 0
First post-installation steps. (sudo pacman -Syu; Refreshing your keyring: sudo pacman-key --refresh-keys), install and configure reflector (sudo pacman -S reflector, sudo reflector --verbose --country 'Spain' --latest 5 --sort rate --save /etc/pacman.d/mirrorlist), and setup pacman.
# Update the system
sudo pacman -Syu
sudo pacman-key --refresh-keys
# Install essentials
sudo pacman -S --noconfirm \
base-devel git rsync reflector \
zsh neovim bash-completion \
fastfetch eza bat wget curl unzip
# Improve mirrors (important for speed)
sudo pacman -S reflector
sudo reflector --country Spain --latest 10 --sort rate --save /etc/pacman.d/mirrorlist
# passwordless sudo (editing /etc/sudoers), adding:
YOUR-USERNAME ALL=(ALL) NOPASSWD: ALL
# Then, sudo will never ask you for a password for any command.
Install core desktop tools:
sudo pacman -S \
alacritty \ # alacritty: GPU-accelerated terminal emulator; bat: cat with syntax highlighting & Git integration;
xwayland-satellite # It grants rootless Xwayland integration to any Wayland compositor (niri)
firefox
pcmanfm \ # pcmanfm: Lightweight GTK file manager
rofi \ # rofi: Application launcher/menu;
ttf-jetbrains-mono-nerd \ # Patched font JetBrains Mono from nerd fonts library.
copyq \
feh \
wl-clipboard \
grim slurp \
network-manager-applet \
openssh \ # openssh: Secure remote access.
keepassxc \ # keepassxc: Password manager.
vlc filezilla \ # filezilla: FTP/SFTP client.
greetd greetd-tuigreet \ # Display Manager
gparted # gparted: Partition editor
# Deskflow lets you easily share a single mouse and keyboard between multiple computers
sudo pacman -Sy --noconfirm input-leap (or barrier).
Install Niri, Display Manager, and Noctalia Shell (Wayland compositor):
#!/bin/bash
# 🛠️ COMPLETE WAYLAND COMPOSITOR SETUP (NIRE + NOCTALIA SHELL)
# Requires Arch/Arch-based systems with AUR helper (yay) and sudo access
set -euo pipefail # Exit on error, undefined variable, or pipe failure
echo "Installing Niri Wayland compositor and Noctalia Shell..."
yay -S --noconfirm niri noctalia-shell
echo "Setting up Greetd display manager..."
if pacman -Si greetd &> /dev/null; then
# Install greetd and tuigreet (try pacman first, fallback to AUR)
sudo pacman -S --noconfirm --needed greetd
else
yay -S --noconfirm greetd
fi
if pacman -Si greetd-tuigreet &> /dev/null; then
sudo pacman -S --noconfirm --needed greetd-tuigreet
else
yay -S --noconfirm greetd-tuigreet
fi
# Configure Greetd to launch Niri via Tuigreet
# Disable other display managers to avoid conflicts
for dm in lightdm sddm gdm lxdm; do
if systemctl is-active --quiet $dm; then
print_info "Stopping and disabling $dm..."
sudo systemctl stop $dm
sudo systemctl disable $dm
fi
done
sudo tee /etc/greetd/config.toml >/dev/null < [default_session]
command = "tuigreet --greeting 'Welcome to Niri!' --time --cmd niri"
user_session = "niri"
[terminal_session]
command = "tuigreet --cmd /bin/bash"
EOF
# Enable and start services
sudo systemctl enable greetd
sudo systemctl start greetd
echo "Installing essential Wayland utilities..."
sudo pacman -S --noconfirm --needed \
waybar \ # Modern status bar
swaybg \ # Wallpaper setter
swaylock \ # Screen locker
fuzzel \ # Application launcher (rofi alternative)
xdg-desktop-portal-wlr \ # Screen sharing portal for wlroots
wl-clipboard \ # Clipboard utilities (wl-copy, wl-paste)
mako \ # Notification daemon
grim \ # Screenshot tool
slurp \ # Region selection for grim
kanshi \ # Output management (hotplug monitors)
pavucontrol # Audio control (if using PulseAudio/PipeWire)
echo "Creating essential directories and configs..."
CONFIG_DIR="$HOME/.config"
mkdir -p "$CONFIG_DIR"/{niri,waybar,swaylock,mako}
# Sample minimal Niri config (customize as needed)
tee ~/.config/niri/config.toml >/dev/null < # Niri compositor configuration
# See https://github.com/YaLTeR/niri for full documentation
[output]
scale_factor = 1.0
transform = "normal"
[input]
keyboard = { repeat_delay = 500, repeat_rate = 25 }
[cursor]
theme = "default"
size = 24
[layout]
gaps = 8 # Space between windows
border = { width = 2, active = "#5294e2", inactive = "#333333" }
# Key bindings (super = Mod4, usually the Windows key)
[binding]
mod = "Mod4"
# Window management
"mod+Return" = { spawn = "alacritty" } # Replace with your terminal
"mod+d" = { spawn = "fuzzel" }
"mod+q" = { close-window = {} }
# Focus movement
"mod+h" = { focus-column-left = {} }
"mod+l" = { focus-column-right = {} }
"mod+j" = { focus-window-down = {} }
"mod+k" = { focus-window-up = {} }
# Window movement
"mod+Shift+h" = { move-column-left = {} }
"mod+Shift+l" = { move-column-right = {} }
"mod+Shift+j" = { move-window-down = {} }
"mod+Shift+k" = { move-window-up = {} }
# Workspaces
"mod+1" = { focus-workspace = 1 }
"mod+2" = { focus-workspace = 2 }
"mod+3" = { focus-workspace = 3 }
"mod+4" = { focus-workspace = 4 }
"mod+Shift+1" = { move-window-to-workspace = 1 }
"mod+Shift+2" = { move-window-to-workspace = 2 }
"mod+Shift+3" = { move-window-to-workspace = 3 }
"mod+Shift+4" = { move-window-to-workspace = 4 }
# Screenshots
"Print" = { spawn = "grim" }
"Shift+Print" = { spawn = "grim -g \"$(slurp)\"" }
# Screen lock
"mod+Shift+Escape" = { spawn = "swaylock -f" }
# Volume keys (requires pactl from PulseAudio/pipewire)
"XF86AudioRaiseVolume" = { spawn = "pactl set-sink-volume @DEFAULT_SINK@ +5%" }
"XF86AudioLowerVolume" = { spawn = "pactl set-sink-volume @DEFAULT_SINK@ -5%" }
"XF86AudioMute" = { spawn = "pactl set-sink-mute @DEFAULT_SINK@ toggle" }
# Brightness (requires brightnessctl)
"XF86MonBrightnessUp" = { spawn = "brightnessctl set +5%" }
"XF86MonBrightnessDown" = { spawn = "brightnessctl set 5%-" }
# Reload config
"mod+Shift+R" = { spawn = "niri msg action reload-config" }
EOF
# Placeholder for other configs (you can expand later)
touch "$CONFIG_DIR/waybar/config" "$CONFIG_DIR/swaylock/config" "$CONFIG_DIR/mako/config"
echo "Enable screen sharing"
sudo systemctl --user enable --now xdg-desktop-portal
# -------------------- NVIDIA OPTIMIZATIONS --------------------
if lspci | grep -i nvidia &> /dev/null; then
print_info "NVIDIA GPU detected – applying workarounds..."
sudo tee -a /etc/environment >/dev/null < WLR_NO_HARDWARE_CURSORS=1
WLR_RENDERER=vulkan
EOT
echo "NVIDIA environment variables set. Reboot to apply."
fi
SSH. Configure SSH. SSH (Secure Shell) is a widely used secured network protocol to access remote computers in a network.
sudo nvim /etc/ssh/sshd_config
AllowTcpForwarding yes # It allow TCP port forwarding, using SSH as a tunnel between your client and the server.
X11Forwarding yes # It will forward GUI traffic over the connection above.
X11DisplayOffset 10
X11UseLocalhost yes
Enable the sshd service: sudo systemctl enable sshd, sudo systemctl start sshd.
Using ssh-copy-id is an effective way to set up password-less SSH access: ssh-copy-id -i ~/.ssh/id_rsa.pub userName@ServerIPAddress.
If you want to allow the use of graphical applications, you need to add -Y flag: ssh -Y userName@ServerSSHIPAddress
Audio.
sudo pacman - S pipewire wireplumber pipewire-pulse
# Enable Audio
systemctl --user enable pipewire wireplumber
Developer setup, VS Code + Python + Hugo
sudo pacman -S hugo
yay -S visual-studio-code-bin
# Python extensions, https://itsfoss.com/install-vs-code-extensions/
code --install-extension ms-python.python
code --install-extension streetsidesoftware.code-spell-checker
NFS.
# Installing the NFS server:
sudo pacman -S nfs-utils
# Enable it
sudo systemctl enable nfs-server
# Create Shared Directory:
sudo mkdir -p /mnt/data
sudo chown -R nobody:nogroup /mnt/data/
sudo chmod 777 /mnt/data
# Define Exports. Edit `nvim /etc/exports` to define which directories are shared and with which clients.
# Add this line:
/mnt/nfs_share client_IP(rw,sync,no_subtree_check)
# Example: /mnt/data 192.168.1.0/24(rw,sync,no_subtree_check)
# NFS root directory (/mnt/data). Access to this NFS volume is allowed only to the clients from the 192.168.1.0/24 subnet (local network).
# Save the file and export the share(s):
sudo exportfs -a
# Firewall configuration:
sudo ufw allow from 192.168.1.0/24 to any port nfs
# Verify the change: sudo ufw status
Restart the NFS service after reboot:
sudo systemctl restart nfs-kernel-server
Samba.
# Install Samba
sudo pacman -S samba
# Create Shared Directory, i.e., the folder you want to share:
sudo mkdir -p /mnt/data/share
# Set permissions
sudo chown nmaximo7:nmaximo7 /mnt/data/share (Replace with your username/group)
# It grants owner+group write/read, others read
sudo chmod 775 /mnt/data/share
# Configure Samba:
sudo nvim /etc/samba/smb.conf
[sambashare]
comment = Samba on Ubuntu
force user = nmaximo7 # Maps clients to this user (ensure user exists)
browseable = yes # Enables Windows clients to browse the shared directory using Windows Explorer.
path = /mnt/data/share # The path to the shared directory.
writable = yes # If you want others to be able to change it.
public = yes # So that everyone can see the shared directory.
# Check syntax errors in smb.conf
sudo testparm
# Then, restart Samba:
sudo systemctl enable smb && sudo systemctl start smb
# Verify service is active:
sudo systemctl status smbd
Install AUR helper (yay)
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
cd ..
rm -rf yay