Plasma Desktop Edition · 2025
ARCH LINUX
Post-Install Guide
Everything a modern user needs — drivers, audio, GPU, battery, fingerprint auth, DE tweaks, containers & beyond.

Navigate with ← → keys or buttons below. Click a section to jump.

01 System Foundation
02 Display & GPU
03 Audio
04 Power & Battery
05 Input & Fingerprint
06 Networking
07 Security
08 DE Customization
09 Dev & Containers
10 Maintenance
Automation / Cron
01
System
Foundation
pacman · AUR · mirrors · locale · firmware · kernel
SECTION 1 · System Foundation
First Boot Checklist
1
Update mirrors with reflector
reflector --country Poland,Germany --sort rate --save /etc/pacman.d/mirrorlist
2
Full system update
sudo pacman -Syu
3
Install base-devel + git (for AUR)
sudo pacman -S base-devel git
4
Install yay (AUR helper)
git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si
5
Enable parallel downloads
Edit /etc/pacman.conf → ParallelDownloads = 5
SECTION 1 · System Foundation
Locale, Timezone & Hostname
Locale
Edit /etc/locale.gen
# Uncomment your locale
# e.g. en_US.UTF-8
sudo locale-gen

# /etc/locale.conf:
LANG=en_US.UTF-8
Timezone
sudo timedatectl set-timezone \
  Europe/Warsaw

# Enable NTP sync:
sudo timedatectl \
  set-ntp true
Hostname
sudo hostnamectl \
  set-hostname mymachine

# Edit /etc/hosts:
127.0.1.1  mymachine
  .localdomain mymachine
SECTION 1 · System Foundation
Kernel Selection & CPU Microcode
Available Kernels
linuxStandard — always keep this
linux-ltsLTS — stability over features
linux-zenDesktop-tuned, lower latency
linux-hardenedSecurity-hardened, restrictive
linux-rtReal-time kernel (audio prod.)
⚠ CPU Microcode — CRITICAL
# Intel:
sudo pacman -S intel-ucode
# AMD:
sudo pacman -S amd-ucode
Firmware (fwupd)
sudo pacman -S fwupd
sudo fwupdmgr refresh
sudo fwupdmgr get-updates
sudo fwupdmgr update
02
Display
& GPU
NVIDIA · AMD · Intel · Wayland · multi-monitor
SECTION 2 · Display & GPU
GPU Drivers — The Right Way
NVIDIA
sudo pacman -S nvidia nvidia-utils
nvidia-settings lib32-nvidia-utils
▸ Use nvidia-open for Turing+
▸ Add nvidia_drm.modeset=1 to kernel params
▸ Wayland: KWIN_DRM_USE_EGL_STREAMS=1
▸ Check: nvidia-smi
AMD
sudo pacman -S mesa lib32-mesa
vulkan-radeon lib32-vulkan-radeon
libva-mesa-driver
▸ amdgpu — works out of the box
▸ Wayland native — no quirks needed
▸ ROCm: sudo pacman -S rocm-opencl-runtime
▸ Check: glxinfo | grep renderer
Intel
sudo pacman -S mesa lib32-mesa
vulkan-intel lib32-vulkan-intel
intel-media-driver
▸ Use intel-media-driver (iHD) for Gen8+
▸ AVOID xf86-video-intel — modesetting is better
▸ Wayland works perfectly on recent gens
▸ Check: vainfo
SECTION 2 · Display & GPU
Wayland vs X11 — and Multi-Monitor
FeatureWayland (KWin)X11 (Xorg)
Screen tearing✓ None (composited)⚠ Needs compositing
NVIDIA support⚠ Needs modeset=1✓ Mature
Screen sharing✓ PipeWire/xdg-portal✓ Native
HiDPI / mixed DPI✓ Per-display scaling⚠ Global only
Gaming (Steam)✓ GameScope works✓ Traditional
Remote desktop⚠ RDP/VNC improving✓ Better today
Multi-Monitor Quick Setup
System Settings → Display & Monitor → Arrange displays drag-and-drop
# CLI:
kscreen-doctor output.HDMI-A-1.enable output.HDMI-A-1.mode.1920x1080@60
# X11 autorandr:
sudo pacman -S autorandr && autorandr --save home
03
Audio
PipeWire · ALSA · Bluetooth audio · EQ · Pro Audio
SECTION 3 · Audio
PipeWire — The Modern Audio Stack
Installation
sudo pacman -S pipewire pipewire-alsa \
  pipewire-pulse pipewire-jack wireplumber
systemctl --user enable --now pipewire
systemctl --user enable --now pipewire-pulse
systemctl --user enable --now wireplumber
Bluetooth Audio
sudo pacman -S bluez bluez-utils
systemctl enable --now bluetooth
# /etc/bluetooth/main.conf:
# AutoEnable=true
# Enable=Source,Sink,Media,Socket
Why PipeWire?

▸ Replaces PulseAudio AND JACK simultaneously

▸ Ultra-low latency — pro audio ready

▸ Bluetooth aptX-HD / LDAC support

▸ Screen audio capture in Wayland

Essential GUI Tools
pavucontrol — Volume control per app
easyeffects — Parametric EQ, compressor, noise suppressor
helvum — PipeWire patchbay (visual routing)
04
Power &
Battery
TLP · power-profiles-daemon · thermald · hibernate
SECTION 4 · Power & Battery
Battery Life & Thermal Management
TLP — Battery Optimizer
sudo pacman -S tlp tlp-rdw
sudo systemctl enable --now tlp
# ThinkPads also:
sudo pacman -S tp_smapi acpi_call
# Check: sudo tlp-stat -b
thermald — Intel Thermal Control
sudo pacman -S thermald
sudo systemctl enable --now thermald
⚠ power-profiles-daemon (KDE native)

Use either TLP OR power-profiles-daemon — not both! KDE Plasma uses PPD by default. TLP gives finer control for laptops.

powerprofilesctl list

Hibernate / Suspend-then-Hibernate

1. Create swap file ≥ RAM size
2. Add resume=UUID=... to kernel params
3. Add resume hook to mkinitcpio.conf
4. Run mkinitcpio -P
5. systemctl edit systemd-suspend-then-hibernate.serviceHibernateDelaySec=30min

05
Input &
Fingerprint
fprintd · libinput · gestures · keyboard layouts · IME
SECTION 5 · Input & Fingerprint
Fingerprint Authentication with fprintd
1
Install fprintd
sudo pacman -S fprintd libfprint
2
Enroll fingerprint
fprintd-enroll  # scan 5 times
fprintd-verify  # test it
3
Configure PAM (sudo)
# /etc/pam.d/sudo — add at top:
auth sufficient pam_fprintd.so
4
Configure PAM (SDDM login)
# /etc/pam.d/sddm — add at top:
auth sufficient pam_fprintd.so
5
Configure PAM (polkit)
# /etc/pam.d/polkit-1 — add at top:
auth sufficient pam_fprintd.so
✓ TIP: For KDE Wallet auto-unlock with fingerprint, install kwallet-pam and add pam_kwallet5.so to PAM stack.
SECTION 5 · Input & Fingerprint
Touchpad Gestures & Keyboard Magic
Touchpad Gestures (libinput-gestures)
yay -S libinput-gestures
libinput-gestures-setup install
libinput-gestures-setup autostart

# ~/.config/libinput-gestures.conf:
gesture swipe up 3 xdotool key super
gesture swipe left 3 xdotool key alt+Right
Keyboard Layout & Input Method
Add layout: System Settings → Input Devices → Keyboard
CLI permanent: localectl set-x11-keymap pl
Caps→Ctrl: setxkbmap -option ctrl:nocaps
CJK IME: sudo pacman -S fcitx5 fcitx5-qt fcitx5-gtk
Gaming Mice & Special Peripherals

Logitech: yay -S piper + sudo systemctl enable ratbagd  |  Razer: yay -S openrazer-meta polychromatic  |  Corsair: yay -S ckb-next

06
Networking
NetworkManager · VPN · Firewall · DNS-over-HTTPS · SSH
SECTION 6 · Networking
NetworkManager, VPN & Firewall
NetworkManager
sudo pacman -S networkmanager nm-applet
sudo systemctl enable --now NetworkManager
# CLI:
nmcli device wifi list
nmcli device wifi connect "SSID" password "pw"
Firewall — UFW
sudo pacman -S ufw gufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw enable
sudo systemctl enable ufw
VPN
# WireGuard:
sudo pacman -S wireguard-tools
# OpenVPN:
sudo pacman -S openvpn networkmanager-openvpn
# Import .ovpn:
nmcli connection import type openvpn file my.ovpn
DNS-over-TLS
# /etc/systemd/resolved.conf:
[Resolve]
DNS=9.9.9.9
DNSOverTLS=yes
FallbackDNS=1.1.1.1
07
Security
disk encryption · SSH hardening · AppArmor · Yubikey · audit
SECTION 7 · Security
System Hardening Essentials
SSH Hardening (/etc/ssh/sshd_config)
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222
AllowUsers yourusername
LUKS Header Backup — CRITICAL
sudo cryptsetup luksAddKey /dev/sdXn
sudo cryptsetup luksHeaderBackup /dev/sdXn \
  --header-backup-file luks-header.img
AppArmor (MAC security)
sudo pacman -S apparmor
# kernel param: lsm=landlock,lockdown,
#   yama,integrity,apparmor,bpf
sudo systemctl enable --now apparmor
aa-status
Yubikey / Hardware Token
sudo pacman -S yubikey-manager pam-u2f
mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys
# /etc/pam.d/sudo:
auth required pam_u2f.so
08
Plasma DE
Customization
themes · fonts · KWin effects · SDDM · widgets · Konsole
SECTION 8 · Plasma DE Customization
KDE Plasma — Deep Tuning
Fonts & Rendering
1
sudo pacman -S ttf-jetbrains-mono nerd-fonts-jetbrains-mono
2
sudo pacman -S noto-fonts noto-fonts-emoji noto-fonts-cjk
3
/etc/fonts/local.conf → enable subpixel hinting
4
KDE Settings → Fonts → Force DPI: 96 (or 192 HiDPI)
KWin Effects & Performance
1
System Settings → Desktop Effects → enable Blur, Wobbly
2
KWin tiling: yay -S kwin-bismuth
3
Toggle compositor: Alt+Shift+F12
4
kwriteconfig5 --file kwinrc --group Compositing --key LatencyPolicy low
SDDM Theme

yay -S sddm-theme-sugar-candy-git/etc/sddm.conf.d/sddm.conf[Theme] Current=sugar-candy

SECTION 8 · Plasma DE Customization
Shell, Terminal & Essential Tools
ZSH + Oh-My-Zsh + Powerlevel10k
sudo pacman -S zsh
chsh -s /bin/zsh

# Oh-My-Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# Powerlevel10k:
yay -S zsh-theme-powerlevel10k
Must-Have ZSH Plugins
zsh-autosuggestions — Fish-like autocomplete
zsh-syntax-highlighting — Color-coded commands
fzf — Fuzzy finder for everything
zoxide — Smart cd replacement
thefuck — Fix mistyped commands
CLI Power Tools
sudo pacman -S bat eza fd ripgrep btop tmux neovim
yay -S yakuake  # F12 drop-down terminal
09
Dev &
Containers
Docker · Podman · Flatpak · Distrobox · Virt-Manager
SECTION 9 · Dev & Containers
Docker, Podman, Distrobox & KVM
Docker
sudo pacman -S docker docker-compose
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# Log out and back in!
docker run hello-world
Distrobox — Any distro inside Arch
sudo pacman -S distrobox
distrobox create --name ubuntu \
  --image ubuntu:24.04
distrobox enter ubuntu
# Apps appear in KDE launcher!
Podman (rootless Docker alt)
sudo pacman -S podman podman-compose
# Rootless by default, no daemon
alias docker=podman
KVM / QEMU (full VMs)
sudo pacman -S qemu-full virt-manager \
  libvirt dnsmasq
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
# Nested VT-x/AMD-V:
echo 'options kvm_intel nested=1' | \
  sudo tee /etc/modprobe.d/kvm.conf
SECTION 9 · Dev & Containers
Flatpak, Snap & Application Ecosystem
Flatpak Setup
sudo pacman -S flatpak
flatpak remote-add --if-not-exists flathub \
  https://dl.flathub.org/repo/flathub.flatpakrepo
# Install example:
flatpak install flathub com.spotify.Client
Bottles — Run Windows .exe (Wine wrapper)
Flatseal — Manage Flatpak permissions
Heroic Games Launcher — Epic Games + GOG on Linux
Signal Desktop — Secure messaging
Gaming: Steam + Proton
# Enable multilib first in /etc/pacman.conf!
sudo pacman -S steam
# Steam → Settings → Compatibility →
#   Enable Steam Play → Proton Experimental
sudo pacman -S gamemode lib32-gamemode
# Launch option: gamemoderun %command%
yay -S proton-ge-custom
10
System
Maintenance
backups · pacman orphans · journal · crash recovery · snapper
SECTION 10 · System Maintenance
Backups, Snapshots & System Health
Snapper / BTRFS Snapshots
sudo pacman -S snapper snap-pac
snapper -c root create-config /
# GUI: yay -S snapper-gui
Restic — Encrypted Backups
sudo pacman -S restic
restic -r /mnt/backup backup /home/user
restic -r /mnt/backup snapshots
Pacman Maintenance
# Remove orphans:
sudo pacman -Rns $(pacman -Qdtq)
# Clean cache (keep 2 versions):
sudo paccache -rk2
# Update mirrors:
sudo reflector --save /etc/pacman.d/mirrorlist
System Logs & Journal
sudo journalctl --vacuum-size=500M
# /etc/systemd/journald.conf:
SystemMaxUse=500M
# Real-time errors:
journalctl -f -p err
SECTION 10 · System Maintenance
When Things Go Wrong — Recovery Guide
⚠ System won't boot / broken after update? Here's your survival kit.
1. Boot from Arch ISO → chroot
mount /dev/sdXn /mnt
mount /dev/sdXp /mnt/boot  # if separate
arch-chroot /mnt
2. Downgrade a broken package
sudo pacman -U /var/cache/pacman/pkg/\
  package-old-version.pkg.tar.zst
# Or: yay -S downgrade && downgrade pkg
3. Regenerate initramfs
mkinitcpio -P
# After kernel/hooks changes → reboot
4. Reinstall GRUB
grub-install /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg
✓ Before ANY major update: snapper create --description 'pre-update' — Subscribe to archlinux.org/news RSS!
BONUS · Peripherals & Misc
Printing, Scanning & Other Peripherals
Printing (CUPS)
sudo pacman -S cups cups-pdf system-config-printer
sudo systemctl enable --now cups
# Access: http://localhost:631
# HP: sudo pacman -S hplip
# Brother: yay -S brlaser
Scanning (SANE)
sudo pacman -S sane
yay -S simple-scan  # GUI
scanimage -L        # find scanner
sudo pacman -S sane-airscan  # network
KDE Connect
sudo pacman -S kdeconnect
# Sync Android notifications, clipboard,
# files, battery — no cable needed
Night Light / f.lux alternative
# KDE built-in:
# System Settings → Display → Night Color
# Set 3200K at night

# Or redshift:
sudo pacman -S redshift
redshift -l 52.2:21.0 -t 6500:3200
QUICK REFERENCE · Commands Cheat Sheet
Essential Commands — Keep This Handy
Full updatesudo pacman -Syu && yay -Syu
Enable servicesudo systemctl enable --now <svc>
Install pkgsudo pacman -S <pkg> / yay -S <pkg>
Service statussystemctl status <svc>
Search pkgpacman -Ss <term> / yay -Ss <term>
Live logsjournalctl -f
Remove + depssudo pacman -Rns <pkg>
Boot errorsjournalctl -b -p err
Remove orphanssudo pacman -Rns $(pacman -Qdtq)
Disk usagedf -h / du -sh * / ncdu
List installedpacman -Q / pacman -Qe (explicit)
Check RAMfree -h / vmstat 1
File ownerpacman -Qo /path/to/file
CPU infolscpu / cat /proc/cpuinfo
Pkg infopacman -Qi <pkg>
GPU infoglxinfo | grep renderer / vainfo
You're Done.
Now Break Things.
(And fix them — that's how you actually learn Arch.)
BONUS · Automation & Cron
Cron Automation — Set It and Forget It
Weekly Full System Backup (Restic)
0 3 * * 0 # Every Sunday at 3:00 AM
#!/bin/bash
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic -r /mnt/backup/system backup \
  /home /etc /root \
  --exclude=/home/*/.cache \
  --tag weekly-auto
restic -r /mnt/backup/system forget \
  --keep-weekly 4 --keep-monthly 6 --prune
restic -r /mnt/backup/system check
Daily pacman Cache Cleanup
30 4 * * * # Every day at 4:30 AM
#!/bin/bash
# Keep last 2 versions of each package
/usr/bin/paccache -rk2
# Remove all uninstalled packages
/usr/bin/paccache -ruk0
echo "$(date): cache cleaned" >> /var/log/paccache.log
BTRFS Snapshot (weekly)
# snap-pac handles pre/post pacman automatically
#!/bin/bash
DESC="weekly-auto-$(date +%Y%m%d)"
snapper -c root create \
  --description "$DESC" \
  --cleanup-algorithm number
snapper -c root cleanup number
Mirror Update (monthly)
0 5 1 * * # 1st of every month at 5 AM
#!/bin/bash
reflector --country Poland,Germany,Czech \
  --sort rate --latest 20 \
  --save /etc/pacman.d/mirrorlist
echo "$(date): mirrors updated" >> /var/log/reflector.log
BONUS · Automation & Cron
How to Set Up Cron — and systemd Timers
cronie — Cron Daemon Setup
sudo pacman -S cronie
sudo systemctl enable --now cronie

crontab -e       # user-level crontab
sudo crontab -e  # root crontab

# System drop-in directories:
/etc/cron.hourly/    # every hour
/etc/cron.daily/     # daily ~midnight
/etc/cron.weekly/    # every week
/etc/cron.monthly/   # every month

# Cron syntax: MIN HOUR DOM MON DOW CMD
#  0   3   *   *   0  /scripts/backup.sh

# Always test first:
bash -x /etc/cron.weekly/my-script.sh
systemd Timers — Modern Alternative
# /etc/systemd/system/mybackup.timer
[Timer]
OnCalendar=Sun 03:00
Persistent=true
[Install]
WantedBy=timers.target

sudo systemctl enable --now mybackup.timer
systemctl list-timers
More Useful Automations
Orphan cleanup: pacman -Rns $(pacman -Qdtq) --noconfirm
Journal vacuum: journalctl --vacuum-size=500M
TRIM SSD: systemctl enable fstrim.timer # built-in!
fwupd check: fwupdmgr refresh && fwupdmgr get-updates
← → keys to navigate