Setting Up Arch Linux with Hyprland & PipeWire (No Bloat Walkthrough)

Setting Up Arch Linux with Hyprland & PipeWire (No Bloat Walkthrough)

How I Set Up a Lean Arch Linux System with Hyprland and PipeWire

Updated: September 2026 | Category: Linux Infrastructure | Author: Alex Mercer

Most desktop operating systems have turned into telemetry-heavy nightmares. Windows 11 pushes background indexing that chews up RAM for features nobody asked for. macOS is slightly better, but you're locked into Apple's hardware design decisions. I wanted something different: a rock-solid workstation that boots in under six seconds, sits below 500 MB of RAM at idle, and stays out of my way while I code.

This isn't a quick auto-install guide. We are building an Arch Linux environment from scratch using full-disk LUKS encryption, Btrfs subvolumes for zero-friction rollback snapshots, the Hyprland Wayland compositor, and PipeWire audio. Expect to open a terminal and type every command manually. If something breaks, you'll actually know how to fix it.

Hardware Prerequisites: What You Need First

Wayland compositors handle display rendering directly through the GPU. If you run legacy hardware or certain Nvidia cards without modern proprietary drivers, you might run into screen flickering. Intel integrated graphics and AMD Radeon GPUs usually work right out of the box with zero driver hacks.

Hardware Bare Minimum What Works Best
CPU 64-bit dual-core processor Modern 6-core+ chip (x86_64-v3)
RAM 2 GB 16 GB+ for serious multitasking
Disk Space 20 GB SSD 100 GB+ NVMe PCIe drive
GPU Intel HD 6000+ AMD RX 6000/7000 or Intel Arc

Step 1: Flash the Image and Initialize the Drives

Grab the Arch ISO from a fast mirror, verify its signature, and flash it to a spare USB drive using dd. Plug it in, boot into UEFI mode, and check your network interface:

# Check internet access
ping -c 3 archlinux.org

If you use Wi-Fi instead of Ethernet, launch iwctl to authenticate against your local access point before continuing.

Now let's wipe the drive structure on your main target disk (assuming /dev/nvme0n1 here). We need a small 1 GB EFI partition and a large partition for everything else:

# Clear partition tables on the target disk
parted /dev/nvme0n1 mklabel gpt

# Partition 1: 1GB EFI System Partition
parted /dev/nvme0n1 mkpart ESP fat32 1MiB 1025MiB
parted /dev/nvme0n1 set 1 esp on

# Partition 2: Rest of the disk for encrypted root
parted /dev/nvme0n1 mkpart primary 1025MiB 100%

# Format the EFI loader partition
mkfs.fat -F32 /dev/nvme0n1p1

Step 2: Set Up Full-Disk Encryption (LUKS2) & Btrfs Subvolumes

Don't skip encryption. If your laptop gets stolen, plain partitions expose your SSH keys, browser sessions, and personal data immediately. We use LUKS2 with Argon2id to resist brute-force cracking attempts.

# Encrypt the primary system partition
cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha512 --pbkdf argon2id /dev/nvme0n1p2

# Open the encrypted container
cryptsetup open /dev/nvme0n1p2 cryptroot

# Format the decrypted container as Btrfs
mkfs.btrfs -L ARCH_ROOT /dev/mapper/cryptroot

Next, isolate system directories into Btrfs subvolumes. This separation allows us to take snapshots of the OS root (@) before updating packages without cluttering home files or system logs.

# Mount container temporarily to set up subvolumes
mount /dev/mapper/cryptroot /mnt

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@var_log
btrfs subvolume create /mnt/@snapshots

umount /mnt

# Mount everything with performance-tuned compression
mount -o noatime,compress=zstd:1,subvol=@ /dev/mapper/cryptroot /mnt

mkdir -p /mnt/{boot,home,var/log,.snapshots}
mount -o noatime,compress=zstd:1,subvol=@home /dev/mapper/cryptroot /mnt/home
mount -o noatime,compress=zstd:1,subvol=@var_log /dev/mapper/cryptroot /mnt/var/log
mount -o noatime,compress=zstd:1,subvol=@snapshots /dev/mapper/cryptroot /mnt/.snapshots

# Mount the separate EFI partition
mount /dev/nvme0n1p1 /mnt/boot

Step 3: Base Package Installation & System Configuration

Use pacstrap to pull in the essential core system tools along with the optimized Zen kernel, which gives us lower latency under heavy background loads:

# Bootstrap basic packages into target filesystem
pacstrap -K /mnt base base-devel linux-zen linux-zen-headers linux-firmware amd-ucode btrfs-progs sudo neovim git NetworkManager

# Generate filesystem table
genfstab -U /mnt >> /mnt/etc/fstab

# Enter the root directory of your new system
arch-chroot /mnt

Inside the chroot, set up timezones, system locales, hostnames, and admin credentials:

ln -sf /usr/share/zoneinfo/UTC /etc/localtime
hwclock --systohc

echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
echo "arch-workstation" > /etc/hostname

# Root password
passwd

# User setup
useradd -m -G wheel,video,audio,storage -s /bin/bash sysadmin
passwd sysadmin

# Grant sudo permissions to wheel group
echo "%wheel ALL=(ALL:ALL) ALL" > /etc/sudoers.d/wheel-group
chmod 0440 /etc/sudoers.d/wheel-group

Configure Ramdisk for Disk Decryption

Because your root volume lives inside an encrypted block device, update /etc/mkinitcpio.conf so the system asks for your passphrase at boot. Look for the HOOKS= line and adjust it to match this exact sequence:

HOOKS=(base udev autodetect microcode modconf kms block encrypt btrfs filesystems keyboard fsck)

Rebuild the initial ramdisk image:

mkinitcpio -P

Install the Bootloader (systemd-boot)

GRUB works fine, but systemd-boot is much simpler and faster on standard UEFI platforms.

bootctl install

# Configure bootloader default options
cat < /boot/loader/loader.conf
default arch.conf
timeout 3
console-mode max
editor no
EOF

# Find target partition UUID
export DISK_UUID=$(blkid -s UUID -o value /dev/nvme0n1p2)

# Create system launch entry
cat < /boot/loader/entries/arch.conf
title Arch Linux (Zen Kernel)
linux /vmlinuz-linux-zen
initrd /amd-ucode.img
initrd /initramfs-linux-zen.img
options cryptdevice=UUID=${DISK_UUID}:cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw quiet loglevel=3
EOF

Exit the chroot, unmount all partitions, and reboot into your fresh install:

exit
umount -R /mnt
reboot

Step 4: Desktop Environment (Hyprland + PipeWire)

Log in with your newly created sysadmin account. Now we can assemble the graphical environment. Hyprland handles window tiling, Waybar gives us a status bar, Rofi launches apps, and Kitty acts as our terminal emulator.

# Install display tools, fonts, and PipeWire sound infrastructure
sudo pacman -S --needed \
    hyprland waybar rofi-wayland kitty \
    pipewire pipewire-pulse pipewire-alsa wireplumber \
    polkit-kde-agent xdg-desktop-portal-hyprland \
    grim slurp wl-clipboard swaylock \
    ttf-jetbrains-mono-nerd noto-fonts

# Enable NetworkManager daemon
sudo systemctl enable --now NetworkManager

# Enable user-level PipeWire audio background services
systemctl --user enable --now pipewire pipewire-pulse wireplumber

Building a Working Hyprland Config File

Create the default configuration file for Hyprland at ~/.config/hypr/hyprland.conf:

mkdir -p ~/.config/hypr

cat < ~/.config/hypr/hyprland.conf
# Display layout setup
monitor=,preferred,auto,1

# Launch essential services automatically
exec-once = /usr/lib/polkit-kde-authentication-agent-1
exec-once = waybar
exec-once = pipewire

# Wayland environment flags
env = XCURSOR_SIZE,24
env = GDK_BACKEND,wayland,x11
env = QT_QPA_PLATFORM,wayland;xcb

# Window layout and borders
general {
    gaps_in = 4
    gaps_out = 8
    border_size = 2
    col.active_border = rgba(33ccffee)
    col.inactive_border = rgba(595959aa)
    layout = dwindle
}

decoration {
    rounding = 6
    blur {
        enabled = true
        size = 3
    }
}

# Main Modifier Key (SUPER / Windows Key)
$mainMod = SUPER

# Quick Application Binds
bind = $mainMod, RETURN, exec, kitty
bind = $mainMod, Q, killactive,
bind = $mainMod, SPACE, exec, rofi -show drun
bind = $mainMod SHIFT, E, exit,

# Focus Window Movements
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d

# Switch Workspaces
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4

# Move active window to workspace
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
EOF

Step 5: System Tweaks & Firewall Hardening

Before using this install for daily work, make a few performance adjustments inside sysctl. This reduces how aggressively the kernel writes active memory to swap, which preserves long-term SSD lifespan.

sudo bash -c 'cat < /etc/sysctl.d/99-performance.conf
# Don't swap memory aggressively unless RAM runs out
vm.swappiness = 10

# Increase maximum file watch limits for modern IDEs
fs.inotify.max_user_watches = 524288
EOF'

# Apply rules immediately
sudo sysctl --system

Finally, set up standard incoming network port block rules using ufw:

sudo pacman -S ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
sudo systemctl enable ufw

Running the System

Type Hyprland directly from your terminal session to launch the desktop window manager. Hit SUPER + RETURN to open a terminal, launch htop, and check system resource consumption.

You now have a clean, hardware-accelerated workstation running on minimal resources. There are no telemetry background tasks running, no unexpected automated system reboots during heavy compilation jobs, and no bloatware eating up your hardware capacity.

Post a Comment

Previous Post Next Post