My Hyprland Setup: Clean, Minimal, and Fast on Arch Linux

Table of Contents
Introduction #
Hyprland is a dynamic tiling window manager built for Wayland — fast, lightweight, and surprisingly smooth. Paired with Arch Linux, it gives me a desktop that feels minimal, responsive, and clean from top to bottom.
This setup didn’t happen overnight. After hopping between i3, Sway, and GNOME, I finally landed on a workflow that just makes sense — simple, fast, and aesthetic without unnecessary clutter.
In this post, I’ll share my full Hyprland setup on Arch Linux: configs, tools, and tweaks that make my daily workflow efficient and satisfying to use.
Why I Switched to Hyprland #
I’ve tried almost every desktop environment out there. GNOME, KDE Plasma, i3, Sway all of them had their strengths, but none really felt like home. I wanted something that looked modern, felt smooth, and still gave me full control over my setup. That’s when I stumbled upon Hyprland.
Hyprland runs on Wayland, and the first thing I noticed was how fluid everything felt. No screen tearing, no lag, just a clean and fast experience. The animations felt natural, the configuration made sense, and the performance blew me away. It felt like the tiling window manager I’d been waiting for.
What I love the most is how flexible it is. You can make it as minimal or as flashy as you want. Once I paired it with Waybar, Rofi, and a few small scripts, it felt perfect — fast, beautiful, and exactly how I wanted my desktop to be.
Moving to Hyprland wasn’t just about speed or aesthetics. It was about finally having a Linux setup that matched how I think and work every day.
My Base System #
- OS: Arch Linux
- WM: Hyprland 0.51.1 (Wayland)
- Shell: zsh 5.9
- Terminal: Alacritty + FiraCode Nerd Font
- Bar: EWW
- Notifications: SwayNC
- Lockscreen: Hyprlock
- CPU: Intel i5-1035G7
- GPU: Intel Iris Plus G7
I’m running Arch Linux as my daily driver because it gives me full control over every part of the system from the kernel to the window manager. Hyprland 0.51.1 runs flawlessly on Wayland, delivering smooth animations and crisp performance even on integrated Intel graphics.
For my workflow, I keep things modular: EWW handles the bar with custom widgets, SwayNC keeps my notifications clean, and Hyprlock gives me a minimal lockscreen that fits perfectly with the overall look. Combined with zsh, Alacritty, and the FiraCode Nerd Font, this setup feels fast, lightweight, and perfectly tuned for everyday use.
My Hyprland Configuration #
Hyprland’s configuration is one of the things that made me fall in love with it. Everything lives inside a single config file, and it’s written in a syntax that’s actually readable. No XML, no JSON — just clean, simple lines that make sense.
I keep my setup modular. The main config handles keybinds, window rules, and layout behavior, while extra files control things like gaps, animations, and workspace rules. This way, I can tweak one part without breaking the rest.
Here’s a small snippet of my current config:
# ~/.config/hypr/hyprland.conf
################
### MONITORS ###
################
# See https://wiki.hypr.land/Configuring/Monitors/
monitor=,1920x1200@60,auto,1
###################
### MY PROGRAMS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
# Set programs that you use
source = ~/.config/hypr/modules/var.conf
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
source = ~/.config/hypr/modules/execute.conf
#############################
### ENVIRONMENT VARIABLES ###
#############################
# See https://wiki.hypr.land/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
env = XDG_CURRENT_DESKTOP,Hyprland
env = XDG_SESSION_TYPE,wayland
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/Configuring/Permissions/
# Please note permission changes here require a Hyprland restart and are not applied on-the-fly
# for security reasons
# ecosystem {
# enforce_permissions = 1
# }
# permission = /usr/(bin|local/bin)/grim, screencopy, allow
# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
#####################
### LOOK AND FEEL ###
#####################
general {
gaps_in = 2
gaps_out = 0
border_size = 1
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(595959cc)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = true
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
source = ~/.config/hypr/modules/decoration.conf
# https://wiki.hypr.land/Configuring/Variables/#animations
source = ~/.config/hypr/modules/animation.conf
dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # You probably want this
}
master {
new_status = master
}
misc {
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
}
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
sensitivity = 0.3 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = true
scroll_factor= 0.2
}
}
source = ~/.config/hypr/modules/gesture.conf
gestures {
workspace_swipe_distance = 7000
}
device {
name = epic-mouse-v1
sensitivity = -0.5
}
# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
source = ~/.config/hypr/modules/binding.conf
windowrule = suppressevent maximize, class:.*
# Fix some dragging issues with XWayland
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
windowrulev2 = float, size:800x600, position:center, class:Alacritty
windowrulev2 = float, size:800x600, position:center, class:org.telegram.desktop
windowrulev2 = float, size:500x500, position:center, class:elecwhat
# windowrulev2 = noborder, class:.*
# ~/.config/hypr/modules/animation.conf
animations {
enabled = yes
# Default animations, see https://wiki.hypr.land/Configuring/Animations/ for more
bezier = macos_smooth, 0.22, 1.00, 0.36, 1.00
bezier = macos_pop, 0.175, 0.885, 0.32, 1.275
bezier = macos_fade, 0.22, 1.00, 0.36, 1.00
bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,1
bezier = almostLinear,0.5,0.5,0.75,1.0
bezier = quick,0.15,0,0.1,1
bezier = overshoot, 0.2, 0.5, 0.1, 1.1
bezier = softbounce, 0.22, 1.0, 0.36, 1.0
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 5, macos_smooth, slide
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.8, macos_fade
animation = fadeOut, 1, 1.4, macos_fade
animation = fade, 1, 2.8, macos_fade
animation = layers, 1, 3.81, macos_smooth,slide
animation = layersIn, 1, 3, macos_pop
animation = layersOut, 1, 3, macos_smooth, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 4, macos_smooth
}
# ~/.config/hypr/modules/binding.conf
bind = $mainMod, Z, exec, $zen
bind = $mainMod, L, exec, $lock
bind = $mainMod, RETURN, exec, $terminal
bind = $mainMod, ESCAPE, killactive
# bind = $mainMod, M, exit,
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating,
bind = $mainMod, SPACE, exec, $menu
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle
# Screenshot
bind = $mainMod, PRINT, exec, hyprshot -m output -o ~/Pictures/Screenshots
bind = $mainMod SHIFT, PRINT, exec, hyprshot -m region -o ~/Pictures/Screenshots
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# Example special workspace (scratchpad)
bind = $mainMod, S, togglespecialworkspace, magic
bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# ~/.config/hypr/modules/decoration.conf
decoration {
rounding = 5
rounding_power = 5
# Change transparency of focused and unfocused windows
active_opacity = 0.9
inactive_opacity = 0.9
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = true
size = 7
passes = 2
vibrancy = 0.9
}
}
# ~/.config/hypr/modules/execute.conf
exec-once = swaync
exec-once = bash -c 'eww open bar_widget && eww update get_vol="$(pamixer --get-volume)" && ~/.config/eww/scripts/getvol.sh'
exec-once = bash -c '~/.config/eww/scripts/workspace.sh'
exec-once = swayidle -w \
timeout 1800 'hyprlock' \
timeout 3600 'systemctl suspend'
exec-once = swww-daemon &
exec-once = sleep 1 && swww img ~/.config/hypr/wallpapers/wp3.jpg
# ~/.config/hypr/modules/gesture.conf
gesture = 3, horizontal, workspace
# ~/.config/hypr/modules/var.conf
$terminal = alacritty
$fileManager = thunar
$menu = rofi -show drun
$zen = zen-browser
$lock = hyprlock
$mainMod = SUPER # Sets "Windows" key as main modifier
My EWW Configuration #
For my bar, I use EWW, based on Mon4sm/monasm-dots. It’s a clean and minimal setup that fits perfectly with Hyprland. I kept most of the structure from the original config but made a few small tweaks — adjusted the padding, changed the font size, and used a softer color palette to match my wallpaper.
EWW gives me full control over how the bar looks and behaves, without any unnecessary bloat. It’s simple, responsive, and blends nicely with the rest of my setup.
UI & Workflow Setup #
My desktop setup focuses on keeping things clean and consistent. The bar from EWW, notifications from SwayNC, and the lockscreen with Hyprlock all share the same minimal design language. I use a soft color palette with muted tones that blend well with both light and dark wallpapers.
Everything on screen serves a purpose — no clutter, no distractions. Shortcuts handle almost everything: launching apps, switching workspaces, controlling music, or taking screenshots. The idea is to make the desktop feel invisible until I need it.
It’s a setup that’s not just fast, but also comfortable to look at all day.
Performance & Daily Usage #
Even with all the customization, this setup stays smooth and responsive. On a clean boot, Hyprland sits around 1GB of RAM (a bit higher than usual because I have quite a few apps installed, but it still feels incredibly fast).
Animations, workspace switching, and multitasking all run flawlessly. Even with several terminals, browsers, and editors open, everything stays fluid without any lag. Hyprland’s performance on Wayland really shines here, especially on my Intel iGPU setup.
Battery life is solid too, and I can comfortably use it for work, writing, and dev stuff all day without issues. This setup might not be the lightest possible Arch build, but it’s the most balanced fast, stable, and a joy to use every day.
Tools & Apps I Use #
Here are the main apps I use daily on my Hyprland setup:
- Browser: Zen Browser
- Editor: Zed & VS Code
- Language: Go (mostly for dev work)
- Terminal: Alacritty
- System Monitor: htop
- Music: Spotify
All of these apps integrate nicely with Wayland and fit the clean, minimal workflow I’m going for. Even though I have quite a few apps installed, the system still feels fast and responsive that a well-optimized Hyprland setup can handle heavy multitasking without breaking a sweat.
The Experience So Far #
After spending some time with this setup, I can honestly say it’s the most comfortable desktop I’ve ever used. Everything feels fast, stable, and clean. I don’t have to think about the system it just works the way I want it to.
Coding in Go feels smooth, multitasking is effortless, and even with all the apps I’ve installed, Hyprland still runs like a champ. The combination of Arch Linux, Hyprland, and EWW just clicks. It’s minimal without feeling empty, and powerful without getting bloated.
I’ll probably tweak things again later that’s just part of the fun but right now, this setup feels complete. It’s simple, fast, and mine.