- Lua 34.1%
- CSS 23.2%
- Python 21.8%
- Markdown 10.1%
- Shell 8.3%
- XML 2.5%
Dennis' CachyOS / Hyprland Dotfiles
A daily-driver Wayland setup that's dark, opinionated, and occasionally clever.
Running CachyOS with Hyprland because X11 is a museum exhibit and GNOME is a lifestyle choice I'm not ready to make. This repo is the entire home directory — clone it over a fresh install and you're 90% of the way to my desktop. The other 10% is questionable taste in wallpapers.
The Stack
| Layer | Choice | Why |
|---|---|---|
| OS | CachyOS | Arch, but someone actually tuned it |
| Compositor | Hyprland (Lua config) | Tiling + eye candy without the i3 regret |
| Shell | Fish | Autocomplete so good it feels like cheating |
| Terminal | Alacritty | GPU-accelerated, zero config needed |
| Bar | Waybar | Spotify album art in the tooltip, because why not |
| Notifications | swaync | Notification center that doesn't get in the way |
| Launcher | Wofi | Rofi's Wayland cousin, styled to match everything |
| Lock Screen | hyprlock + hypridle | Blurred wallpaper + big clock. Simple. |
| Wallpaper | hyprpaper + waypaper | Sensible |
| Screenshots | grim + slurp | Region, monitor, window, full — all piped to clipboard |
| Clipboard | cliphist | History that actually works on Wayland |
| Color Picker | hyprpicker | Click a pixel, get a hex code. That's it. |
Custom Tools
Battery Charge Limiter (~/.config/hypr/tools/battery-limit.py)
A GTK4 / libadwaita GUI for TLP's charge thresholds. Slider-based UI with presets (60% longevity, 80% balanced, 100% full), writes to /etc/tlp.conf via pkexec, and reloads TLP. Because editing config files to save your battery is ironic.
Spotify Integration (~/.config/waybar/scripts/playerctl.sh)
The Waybar media module follows Spotify via playerctl --follow, injects album art into Waybar's CSS as a tooltip background image, and fires desktop notifications with the album cover as the icon. It caches art URLs to avoid re-downloading on every poll. The album art CSS is dynamically written to album_art.css and Waybar reloads its style on change.
It's a Rube Goldberg machine for showing what song you're playing in your status bar. And it's beautiful.
Design Language
Black everything. The bar, the notification center, the launcher — all #000000 backgrounds with rgba(255,255,255,0.02) module pills. The accent is a coral-red gradient (#c9545d → #e06b75) used for active workspace buttons, close buttons, DnD toggles, and selected launcher entries.
Font: MesloLGS NF everywhere — Waybar, swaync, Wofi. Consistent Nerd Font glyphs across every surface.
Borders: Hyprland active borders use a rgba(33ccffee) → rgba(00ff99ee) gradient at 45 degrees. Inactive borders are a muted rgba(595959aa). Subtle enough to not scream, visible enough to know where you are.
Multi-Host Monitor Config
monitors.lua reads the hostname and picks the right display config:
| Hostname | Output | Resolution | Notes |
|---|---|---|---|
chptto | eDP-1 | 2880x1800@120 | Laptop, 1.25x scale, 10-bit |
tchndrm | HDMI-A-3 | 3440x1440@120 | Desktop ultrawide, 10-bit |
* | eDP-1 | 1920x1080@60 | Safe fallback |
No manual switching. The config figures out where it is and adapts.
Workspace Rules
Apps auto-assign to workspaces so muscle memory does the rest:
| Workspace | Apps |
|---|---|
| 1 | Firefox, Chrome, Chromium |
| 2 | VS Code, VSCodium, JetBrains IDEs |
| 9 | Vesktop (Discord) |
| 10 | Spotify |
KeePassXC floats with dim-around because password managers deserve their own moment.
Smart gaps: Single-window workspaces get zero gaps and zero borders. The moment you split, gaps come back. Less visual noise, more focus.
Keybindings (The Good Ones)
| Binding | Action |
|---|---|
Super + Q | Terminal |
Super + R | App launcher |
Super + V | Clipboard history |
Super + C | Color picker |
Super + N | Notification center |
Super + S | Scratchpad (special workspace) |
Super + G | Toggle window grouping |
Super + Alt + V | Toggle floating |
Super + F | Toggle fullscreen |
Super + Ctrl + P | Pin window to all workspaces |
Super + Shift + R | Reload Hyprland + restart Waybar |
Print | Screenshot region to clipboard + file |
Shift + Print | Screenshot full screen |
Super + Print | Screenshot current monitor |
Super + Shift + Print | Screenshot active window |
Ctrl + Alt + L | Lock screen |
Plus the usual: Super + [1-0] for workspaces, Super + arrows for focus, Super + Shift + arrows for move/resize.
Shell Setup
Fish is the primary shell, Bash is kept in sync for compatibility. Both share the same philosophy: aliases for everything you type more than twice.
Highlights:
cpisrsync -ah --progress(progress bars on copies, because waiting blind is anxiety)rmistrash-put -i(undo-able deletes, with confirmation)catisbat --style=auto(syntax highlighting in your cat)../.../..../.....(the ladder of regret — go up 1-4 directories)gitc "msg"isgit add -A && git commit -m "msg"(lazy commits)gitcp "msg"is commit + push in one command- Auto-
lsafter everycd(because you always type it anyway) up Nis go up N directorieswhatsmyipis internal + external IP in one shot
Idle and Power
hypridle handles the power cascade:
- 4.5 min — dim screen to 10%
- 5 min — lock screen
- 5.5 min — displays off
- 30 min — suspend
Wakes on mouse movement or keypress. Lock screen shows a blurred wallpaper with a big clock and date.
Installation
git clone <this-repo> ~
That's it. The .gitignore is * (ignore everything) and files are force-added, so only tracked dotfiles are managed. Your ~/Downloads and ~/Documents are safe.
You'll want these packages (CachyOS ships most of them):
hyprland waybar wofi swaync alacritty dolphin hyprpaper hyprlock hypridle grim slurp cliphist hyprpicker playerctl brightnessctl wl-clipboard bat trash-cli rsync fish
For the custom tools: python-gobject + libadwaita (battery limiter), tlp (charge thresholds).
Works great, for me.