Hyprland desktop setup on Fedora Linux, styled with Catppuccin Mocha. Built for an AMD Ryzen 5 7600X and Radeon RX 6750 XT driving a 144Hz 1440p display.
The Lua migration targets Hyprland 0.56.2 and a pinned user-local Waybar build. It is staged and must pass the build, review, and desktop checks before activation. See Lua migration, Waybar build, and rollback.
Note
Configured for Fedora, but works on any modern Wayland distribution with minor path adjustments. Update wallpaper paths in ~/.config/hypr/scripts/wallpaper.sh to match your local files.
~/dotfiles/
├── .config/
│ ├── btop/
│ │ ├── btop.conf # Resource monitor config
│ │ └── themes/
│ │ └── catppuccin_mocha.theme # Catppuccin Mocha theme
│ ├── fastfetch/
│ │ ├── config.jsonc # System info display
│ │ └── my-logo.txt # Custom ASCII logo
│ ├── hypr/
│ │ ├── conf/ # Ten Lua modules; original .conf files retained
│ │ │ ├── animations.lua # Smooth slidefade transitions
│ │ │ ├── autostart.lua # Background daemons & polkit agent
│ │ │ ├── env.lua # Wayland and toolkit variables
│ │ │ ├── input.lua # Keyboard, mouse, and focus
│ │ │ ├── keybinds.lua # Hotkeys and layout bindings
│ │ │ ├── layouts.lua # Dwindle layout settings
│ │ │ ├── look_and_feel.lua # Gaps, borders, shadows, and blur
│ │ │ ├── monitors.lua # Resolution, refresh rate, and scale
│ │ │ ├── programs.lua # Default terminal, file manager, and launcher
│ │ │ └── windowrules.lua # Floating and window placement
│ │ ├── hypridle.conf # Screen dimming and sleep triggers
│ │ ├── hyprland.lua # Maintained entry point (requires conf/*.lua)
│ │ ├── hyprland.conf # Frozen legacy entry point for rollback
│ │ ├── hyprlock.conf # Lock screen with frosted blur
│ │ └── scripts/
│ │ ├── reload.sh # Reload compositor, bar, and notifications
│ │ └── wallpaper.sh # Per-workspace wallpaper listener
│ ├── kitty/
│ │ └── kitty.conf # GPU terminal with configured redraw delays
│ ├── rofi/
│ │ ├── config.rasi # Application launcher
│ │ ├── scripts/
│ │ │ ├── bluetooth.sh # Bluetooth picker
│ │ │ ├── clipboard_history.sh # Clipboard history (cliphist)
│ │ │ ├── powermenu.sh # Lock, logout, reboot, and shutdown
│ │ │ ├── wallpaper.sh # Wallpaper browser
│ │ │ └── wifi.sh # Network selector
│ │ └── themes/
│ │ ├── clipboard.rasi # Catppuccin Mocha clipboard theme
│ │ └── current.rasi # Catppuccin Mocha menu theme
│ ├── starship.toml # Catppuccin Mocha shell prompt
│ ├── swaync/
│ │ ├── config.json # Notification daemon and control center
│ │ └── style.css # Notification panel styles
│ └── waybar/
│ ├── config.jsonc # Three-island floating status bar
│ ├── style.css # Floating pill styles
│ └── scripts/
│ └── launch.sh # Reload status bar
├── assets/ # Screenshots and demo media
├── scripts/
│ ├── apply-system-optimizations.sh # DNF, tuned profile, and service tweaks
│ ├── build-waybar.sh # Build/test/select the pinned local Waybar
│ └── install-symlinks.sh # Idempotent symlink installer for ~/.config
└── README.md
preview.mp4
Screenshots
| Tool | Role |
|---|---|
| Hyprland | Wayland tiling compositor |
| Waybar | Floating status bar with workspace indicators |
| awww | Wallpaper daemon with transitions configured at 144 FPS |
| SwayNC | Notification center and quick settings |
| hyprlock | Screen locker with screenshot blur |
| hypridle | Idle listener and sleep controller |
| Kitty | Terminal emulator with 6ms repaint and 1ms input delay settings |
| Rofi | App launcher, power menu, and picker scripts |
| Fastfetch | System information summary |
The main modifier key is SUPER.
| Keybind | Action |
|---|---|
SUPER + Return |
Open terminal (Kitty) |
SUPER + Q |
Close active window |
SUPER + D |
Open application launcher (Rofi) |
SUPER + M or SUPER + Escape |
Open power menu (lock, logout, reboot, power off) |
SUPER + F |
Open file manager (Dolphin) |
SUPER + SHIFT + F |
Toggle fullscreen |
SUPER + V or SUPER + Space |
Toggle floating / tiling window mode |
SUPER + P |
Toggle pseudotile |
SUPER + J |
Toggle split direction |
SUPER + W |
Launch Firefox |
SUPER + C |
Launch VS Code |
SUPER + G |
Open Git client (Lazygit, floating) |
SUPER + SHIFT + Escape |
Open system monitor (Btop, floating) |
SUPER + L |
Lock screen (hyprlock) |
SUPER + N |
Open notification panel (SwayNC) |
SUPER + SHIFT + S |
Area screenshot to clipboard and disk (grimblast) |
SUPER + SHIFT + R |
Reload Hyprland, Waybar, and SwayNC |
SUPER + R |
Reload Waybar |
SUPER + A |
Trigger workspace wallpaper refresh |
SUPER + SHIFT + A |
Open wallpaper selector menu |
SUPER + SHIFT + V |
Open clipboard history |
SUPER + SHIFT + W |
Open Wi-Fi network selector |
SUPER + SHIFT + B |
Open Bluetooth device manager |
SUPER + 1-9, 0 |
Switch to workspace 1 to 10 |
SUPER + SHIFT + 1-9, 0 |
Move active window to workspace 1 to 10 |
SUPER + Left / Right / Up / Down |
Move window focus |
SUPER + Left Click + Drag |
Move floating window |
SUPER + Right Click + Drag |
Resize window |
The installer requires python3 and Git 2.30 or later (git config --fixed-value).
The option is documented in Git 2.30's configuration reference.
delta is needed only for the installed Git presentation settings, not to run
the installer. Symlinked .bashrc and .gitconfig files require manual integration;
do not replace those links to run this installer.
To link all configuration directories (hypr, waybar, kitty, rofi, swaync, fastfetch, btop, starship.toml) to ~/.config/:
For the Lua migration, first follow the staged verification and activation procedure in the migration guide. The general installer immediately links this checkout and is not a preview operation.
./scripts/install-symlinks.shExisting conflicting files, directories, and symlinks are preserved in unique backup directories before replacement.
The default script changes only the developer file-watch limit:
sudo ./scripts/apply-system-optimizations.shIt preserves unrelated sysctl settings and higher watch limits, backs up changed files, verifies the kernel value, and restores the previous setting if application fails. It does not install packages, alter power profiles, or disable services. See optional system steps for individually verified changes and rollback. Previously applied system settings are left in place.
Run bash tests/run.sh for shell syntax and isolated regression checks (requires
Python 3, LuaJIT, jq, and Bash). Tests use
mock commands and temporary homes; they do not alter the running desktop.
Lua preservation checks cover all 63 bindings and configuration values. Validate
the actual API separately with Hyprland --verify-config --config "$PWD/.config/hypr/hyprland.lua".
The migration guide includes the Waybar build, CodeRabbit
review gate, and required fresh-login acceptance checks.
The workspace wallpaper listener has one owner per Hyprland session. SUPER+A
runs wallpaper.sh --once to refresh without creating another listener. Workspaces
6–10 retain the last wallpaper. Missing images and daemon failures go to stderr.
Rofi Wi-Fi selection opens Kitty with NetworkManager's nmcli --ask prompt;
saved credentials and authentication remain NetworkManager's responsibility.
Clipboard history supports Enter to copy, Delete to delete the selected entry,
and Ctrl+Delete to clear history after confirmation. Escape leaves the clipboard
and history alone. Wallpaper selection displays relative paths and handles
punctuation and duplicate filenames without regex matching.
The installer links shell/dotfiles.sh into ~/.bashrc.d/ and includes
git/developer.gitconfig from local Git configuration. Shell tools are initialized
only in interactive shells, and missing optional tools are skipped. Local Git
identity, credentials, signing, and differing presentation overrides are preserved.
Migration removes only the exact recognized legacy Bash block and matching Git
presentation settings. It backs up changed startup files and replaces .bashrc
atomically, preserving its mode. Symlink conflicts are saved as BACKUP/original.
Restore the printed backups to undo installation.
The Bash loader check matches literal text without executing .bashrc. If that
text exists only in an unreachable block, manually source the fragment from an
active part of .bashrc. Locally edited legacy blocks may also need manual
integration to avoid duplicate initialization.







