Skip to main content
Vicious Viper Logo

Vicious Viper

Arch Linux Hyprland Zsh Neovim Zen Browser
Last commit Stars Forks Issues License Repo size

A wallpaper-synced Hyprland rice for Arch Linux.
Material You theming · Automated backups · Modular installer · Clean daily workflow.

Table of Contents

🖼 Preview

Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview Desktop Preview

✨ Features

🔮

Material You theming

Matugen derives a full palette from your wallpaper and applies it to every component

💾

Safe installer

Every file that would be overwritten is backed up to a timestamped directory first

🎛

Modular installs

Choose exactly which modules to deploy: configs, scripts, icons, themes, fonts, dotfiles

🪄

Dry-run mode

Preview every single action without touching a single file

🐚

Shell-aware PATH patching

Detects Zsh, Bash, Fish, Ksh, and falls back to POSIX .profile

↩️

One-command undo

Restore all your originals with ./install.sh --uninstall

🔤

Bundled fonts

JetBrains Mono Nerd, Font Awesome, Icomoon Feather, Nerd Symbols — installed and cached

🌐

Zen Browser CSS

Custom userChrome.css and userContent.css tuned to match the Viper aesthetic

📜

33 custom scripts

Automatically marked executable and patched into PATH

🎨

Live theming

Change wallpaper, run matugen, everything recolors instantly

🧩 Stack

Arch Linux Hyprland
Waybar Quickshell Mako Rofi
Kitty Foot Zsh Starship
Zen Browser Nautilus Yazi Neovim
cmus Cava mpv btop aria2 Fastfetch
Matugen awww hyprwat

📝 Neovim

The Neovim config (.config/nvim/) is a modern Lua-based setup:

ComponentTool
Plugin managerlazy.nvim
LSPMason — auto-installs language servers
Completionblink.cmp
Pickerssnacks.nvim — files, grep, buffers, explorer, terminal
TreesitterSyntax highlighting and parsing

System dependencies (--install-nvim-deps): wl-clipboard, python, imagemagick, luarocks, shellcheck, gcc, nodejs, npm.

Note: After first Neovim launch, run :MasonInstallAll to install LSP servers and formatters.

📦 Prerequisites

Important: The installer checks for these and warns about anything missing. It will not block installation unless core system utilities like cp or find are absent.
Tip: If you don't have an AUR helper, install yay first:
sudo pacman -S --needed git base-devel
git clone https://aur.archlinux.org/yay.git /tmp/yay
cd /tmp/yay && makepkg -si

Tested On

🖥 OSArch Linux (latest)
GPUIntel / AMD / NVIDIA (all supported via Hyprland)
🪟 DisplayWayland (Hyprland)
Note: Zsh configs use ZDOTDIR=$HOME/.config/zsh. Set this before first launch:
echo 'export ZDOTDIR="$HOME/.config/zsh"' > ~/.zshenv

Core packages

yay -S hyprland hyprlock hyprpaper waybar foot kitty zsh rofi mako \
        matugen-bin awww-git btop yazi fastfetch neovim starship fontconfig \
        cava cmus mpv nautilus zen-browser-bin aria2 advcpmv \
        quickshell hyprwat

Supporting packages

Click to expand
PackagePurpose
xdg-desktop-portal-hyprlandWayland portal — screenshare, file picker
polkit-gnomeGUI authentication agent
grim + slurp + wl-clipboardScreenshot toolchain
brightnessctlBrightness control
pavucontrolAudio volume GUI
pipewire + pipewire-pulse + pipewire-alsaAudio stack
wireplumberPipeWire session manager
networkmanagerNetworking
bluez + bluez-toolsBluetooth
xorg-xwaylandX11 app compatibility
ezaBetter ls
fdBetter find
batBetter cat
jqJSON parsing (script dependency)
libnotifynotify-send — desktop notifications
playerctlMedia controls (waybar / nowplaying)
bleachbitSystem cleaner script dependency
neomuttTerminal email client (ALT + T)
aercTerminal email client (bundled config)
localsendLocal file sharing (ALT + S)
nsxivImage viewer (used in scripts)
wiremixAudio mixer (ALT SHIFT + P)
adw-gtk3 (AUR)GTK3 theme — referenced but not bundled

Fonts

The .fonts/ directory is bundled and installed automatically:

DirectoryContents
normal-fonts/Comfortaa, IBM Plex Mono, JetBrainsMono, Iosevka
nerd-fonts/JetBrains Mono Nerd, Fira Code Nerd, Hack Nerd, Iosevka
icon-fonts/Material Icons, Icomoon Feather, Nerd Symbols, Typicons

To install manually:

yay -S ttf-jetbrains-mono-nerd ttf-font-awesome nerd-fonts-symbols-only
fc-cache -f

⚡ Installation

Caution: Run --dry-run first on an existing setup. The installer backs up every file it will overwrite, but you should always confirm what it touches before committing.

Quick start

git clone https://github.com/Cybersnake223/Hypr
cd Hypr
chmod +x install.sh
./install.sh --dry-run   # preview first
./install.sh             # install when ready

What happens during install

🟥 🟨 🟢   install.sh
[1] ✅  Verify core system utilities
[2] 🔍  Check Hyprland ecosystem packages
[3] 📦  Check Neovim system dependencies
[4] 💾  Backup all files that will be overwritten
[5] 📁  Copy selected modules into $HOME
[6] 🔑  chmod +x all scripts
[7] 🔤  Rebuild font cache (fc-cache -f)
[8] 🛤  Detect shell, patch PATH
[9] 📋  Print install summary + log path

Backups land here:

~/.local/share/hypr-dotfiles-backups/<YYYYMMDD-HHMMSS>/
Note: The base directory honors $XDG_DATA_HOME if set — e.g. $XDG_DATA_HOME/hypr-dotfiles-backups/.

Each backup contains a .manifest of every installed path — used by --uninstall to restore precisely.

Manual install (no script)

The installer is just a Bash script — review it, then replicate manually:

Warning: The manual steps below skip the home-path substitution the real installer performs (/home/cybersnake/...$HOME/...). Prefer ./install.sh unless you edit the configs yourself.
for dir in .config .icons .themes .fonts; do
  [ -d "$dir" ] && cp -r "$dir" "$HOME/"
done
[ -d .local/bin/scripts ] && cp -r .local/bin/scripts "$HOME/.local/bin/"
for f in .Xresources .gtkrc-2.0; do
  [ -f "$f" ] && cp "$f" "$HOME/"
done

# Copy Quickshell QML configs separately
[ -d .config/quickshell ] && cp -r .config/quickshell "$HOME/.config/"
[ -d .config/matugen ] && cp -r .config/matugen "$HOME/.config/"
[ -f .config/qt5ct/qt5ct.conf ] && mkdir -p "$HOME/.config/qt5ct" \
  && cp .config/qt5ct/qt5ct.conf "$HOME/.config/qt5ct/"

find "$HOME/.local/bin/scripts" -type f -exec chmod +x {} +
fc-cache -f
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

# Start Quickshell panels
~/.config/hypr/scripts/qs_manager.sh &

🚀 Post-Install

After the installer finishes:

  1. Enable system services (if this is a fresh Arch install):
    systemctl --user enable --now pipewire pipewire-pulse wireplumber
    sudo systemctl enable --now bluetooth networkmanager
  2. Set ZDOTDIR (if using Zsh with this config):
    echo 'export ZDOTDIR="$HOME/.config/zsh"' > ~/.zshenv
  3. Reload your shell or log out and back in.
  4. Start Hyprland: run Hyprland from a TTY or select it in your display manager.
  5. Run :MasonInstallAll inside Neovim on first launch to install LSP servers and formatters.
Tip: The installer backs up everything it overwrites. If something goes wrong, run ./install.sh --uninstall to restore your originals.

📂 File Layout

$HOME
├── .config/
│   ├── hypr/             ← Hyprland (Lua config; hyprlock, hypridle, hyprpaper)
│   ├── waybar/           ← Status bar
│   ├── quickshell/       ← QML panels, launcher, OSD, lock screen
│   ├── rofi/             ← App launcher
│   ├── nvim/             ← Neovim (Lua, lazy.nvim)
│   ├── zsh/              ← Zsh (uses $ZDOTDIR)
│   ├── kitty/            ← Kitty terminal
│   ├── foot/             ← Foot terminal
│   ├── mako/             ← Notifications
│   ├── yazi/             ← TUI file manager
│   ├── mpv/              ← Media player
│   ├── btop/             ← System monitor
│   ├── matugen/          ← Matugen config + 28 color templates
│   ├── fastfetch/        ← System info
│   ├── starship.toml     ← Prompt
│   ├── cava/             ← Audio visualizer
│   ├── anyrun/           ← Alternative launcher (Rust)
│   ├── bat/              ← Cat replacement
│   ├── aerc/             ← Terminal email client (bundled config)
│   ├── cmus/             ← Music player
│   ├── environment.d/    ← Environment variables
│   ├── fsh/              ← fast-syntax-highlighting theme (Zsh, via fast-theme)
│   ├── gtk-2.0/          ← GTK2 theme
│   ├── gtk-3.0/          ← GTK3 CSS (Matugen-recolored)
│   ├── gtk-4.0/          ← GTK4 CSS (Matugen-recolored)
│   ├── hyprwat/          ← Wallpaper picker GUI
│   ├── Kvantum/          ← Qt theme engine
│   ├── qt5ct/            ← Qt5 settings
│   ├── qt6ct/            ← Qt6 settings
│   ├── zen/              ← Zen Browser CSS
│   ├── xsettingsd/       ← X settings daemon (GTK theming bridge)
│   ├── yay/              ← AUR helper config
│   └── ...
├── .local/bin/scripts/   ← 33 custom shell scripts
├── .fonts/               ← Bundled fonts
├── .icons/               ← Icon theme
├── .themes/              ← GTK/Qt themes
├── .Xresources
├── .gtkrc-2.0
├── .zen/                 ← Zen Browser profile
└── assets/               ← Screenshots and logo

/etc/ (system-level — not installed, apply manually):
├── auto-cpufreq.conf    ← CPU governor tuning
├── pacman.conf          ← Pacman parallel downloads + eye candy
└── pacman.d/
Security notes: etc/pacman.conf sets SigLevel = Optional TrustAll, which disables package signature verification. .config/environment.d/zen.conf sets MOZ_DISABLE_RDD_SANDBOX=1, which disables Firefox's media-decoder sandbox.

🚩 Installer Flags

FlagWhat it does
--dry-run🔍 Preview every action — zero changes made
--yes✅ Skip all confirmation prompts
--select🎛 Interactively pick which modules to install
--no-backup⚠️ Skip backup — also disables --uninstall
--uninstall↩️ Restore originals from the most recent backup
--list-backups📋 Show all backups with timestamps and sizes
--install-deps📦 Auto-install missing Hyprland ecosystem deps
--install-all-deps📦 Ecosystem + supporting packages
--install-nvim-deps📦 Auto-install Neovim system dependencies
--skip-deps🚀 Skip the ecosystem dependency check
--versionℹ️ Show version and exit
-h / --help📖 Show usage
# Full install with all dependencies (recommended for first-timers)
./install.sh --install-all-deps --yes

# First-timer recommended flow (preview before committing)
./install.sh --dry-run

# Standard install
./install.sh

# Non-interactive (CI / scripted)
./install.sh --yes --skip-deps

# Pick only what you want
./install.sh --select

# Undo the last install
./install.sh --uninstall

# See all saved backups
./install.sh --list-backups

# Show installer version
./install.sh --version
Note: --install-deps, --install-all-deps, and --install-nvim-deps all install the Neovim system dependencies when the ecosystem dependency check is not skipped.

--select module picker

[✓]  1  .config       Application configs (hypr, waybar, rofi, nvim, zsh…)
[✓]  2  scripts       Custom scripts → ~/.local/bin/scripts
[ ]  3  .icons        Icon theme
[✓]  4  .themes       GTK/Qt themes
[✓]  5  .fonts        Custom fonts (triggers fc-cache rebuild)
[✓]  6  dotfiles      Root dotfiles (.Xresources, .gtkrc-2.0)

Toggle a number, press Enter to confirm.

Shell-aware PATH patching

ShellLine addedFile patched
zshpath=(~/.local/bin $path)~/.zshrc
bashexport PATH="$HOME/.local/bin:$PATH"~/.bashrc
fishfish_add_path $HOME/.local/bin~/.config/fish/conf.d/hypr_path.fish
ksh / mkshexport PATH="$HOME/.local/bin:$PATH"~/.kshrc
Otherexport PATH="$HOME/.local/bin:$PATH"~/.profile

⌨️ Keybinds

Note: ALT is the primary modifier across the entire setup.
🔧 System
KeybindAction
F1Toggle mute (speakers)
F2 / F3Volume −/+ 10%
F4Toggle mute (mic)
F7Toggle Wi-Fi
F9Lock screen
F11 / F12Brightness −/+ 10%
PrintScreenshot
SUPER + SHIFT + RReload Hyprland config
🚀 Apps & Launchers
KeybindAction
ALT + EnterTerminal (Kitty)
ALT + DApp launcher (Quickshell)
ALT + RYazi (TUI file manager)
ALT + NNotifications panel
ALT + IToggle Dynamic Island
ALT + Hbtop
ALT + Tneomutt (email)
ALT + EEmoji picker
ALT + XPower menu
ALT + BBluetooth menu
ALT + LAirPods TUI
ALT + YYouTube downloader
ALT + VClipboard history
ALT + WChange wallpaper
ALT + KKill window
ALT + CToggle calendar
ALT + SHIFT + TNautilus (GUI files)
ALT + SHIFT + XClear notifications
ALT + SHIFT + PAudio mixer (wiremix)
ALT + SHIFT + VWatch video
ALT + SHIFT + SUniversal snip (QuickShell)
ALT + SHIFT + KSystem cleaner
ALT + SHIFT + Daria2 downloader
ALT + SHIFT + CScript editor
ALT + SHIFT + EConfig editor
ALT + SHIFT + NWi-Fi menu
🌐 Web shortcuts (personal — edit before use)
Note: These open personal bookmarks hardcoded in the Hyprland config. Edit them before adopting this setup — they're in .config/hypr/modules/keybinds.lua.
KeybindAction
ALT + SHIFT + BZen Browser
ALT + SHIFT + IZen private window
ALT + GGitHub
ALT + SHIFT + YYouTube
ALT + SHIFT + GPerplexity
ALT + SHIFT + WWallhaven
ALT + SHIFT + OChatGPT
ALT + SHIFT + RReddit
🪟 Window management
KeybindAction
ALT + QClose window
ALT + FToggle fullscreen
ALT + PToggle floating
ALT + Move focus
ALT + SHIFT + Swap window
ALT + CTRL + Resize window
ALT + LMB dragMove window
ALT + RMB dragResize window
🗂 Workspaces
KeybindAction
ALT + 1–0Switch to workspace 1–10
ALT + SHIFT + 1–0Move window to workspace 1–10
ALT + Scroll up/downCycle workspaces
ALT + graveToggle scratchpad
ALT + SHIFT + graveMove window to scratchpad

🎨 Theming

Every color, everywhere — driven by your wallpaper.

background surface_container surface_variant secondary_container primary_container surface_tint primary tertiary_container source_color

This setup uses Matugen — a Material You color extraction engine. Change your wallpaper, run Matugen, and Waybar, Rofi, Mako, GTK apps, and the terminal all recolor automatically.

Use hyprwat for a GUI wallpaper picker that triggers Matugen recolor on selection.

# Set wallpaper and regenerate palette
aww set /path/to/wallpaper.jpg
matugen image /path/to/wallpaper.jpg
# Force a refresh from the cached wallpaper
matugen image ~/.config/hypr/wallpaper/current.png
Note: Matugen templates live in .config/matugen/. Edit them to control exactly how color tokens map to each app's config format.

Templates are provided for these components:

AppAppApp
WaybarRofiHyprland
MakoAnyrunbtop
ZathuraYaziGTK3
GTK4Kvantumhyprwat
KittySwayNCSwayOSD
Zen BrowserMPVCava
NeovimFootqt5ct
qt6ctQuickshellSway
aercopencode
Note: SwayNC, SwayOSD, and Zathura templates are bundled, but those apps are not part of the default stack. Install them yourself if you want to use those templates.

🎛 Quickshell Panels & OSD

This setup uses Quickshell as the core UI framework, providing a QML-based desktop shell that powers several visual components:

ComponentRole
TopBarDesktop panel with workspaces, clock, tray
DynamicIslandNotification-style OSD overlays
App LauncherApplication launcher (triggered via ALT+D)
Lock ScreenScreen lock with clock and media controls
ClipboardViewerClipboard history manager
OSDVolume/brightness on-screen display

Quickshell processes are auto-started by qs_manager.sh on Hyprland startup. The config files live under .config/quickshell/.

Note: Quickshell is in the official Arch repos (quickshell). The installer will check for it.

🌐 Zen Browser

Custom styling for Zen Browser is included under .config/zen/ to match the Viper aesthetic.

FilePurpose
.config/zen/chrome/userChrome.cssBrowser chrome — sidebar, tab bar, toolbar
.config/zen/chrome/userContent.cssInternal pages — new tab, about: pages
.config/zen/chrome/zen-logo-mocha.svgCustom logo asset
.config/zen/user.jsBrowser preferences
Important: The installer copies .config/zen/ to ~/.config/zen/, but that location is inert — Zen Browser reads its styles from your profile directory. Apply it manually:
cp -r .config/zen/chrome "$HOME/.zen/chrome"

Then enable custom CSS in about:config:

toolkit.legacyUserProfileCustomizations.stylesheets = true

Restart Zen. If your profile is not at ~/.zen/ (e.g. Flatpak installs use ~/.var/app/), find the correct path via about:support → Profile Directory.

🔄 Updating

git pull
./install.sh --dry-run   # preview what changed
./install.sh             # apply

Each run creates a fresh backup. To roll back after an update:

./install.sh --uninstall      # restore most recent backup
./install.sh --list-backups   # or inspect all available backups

🔧 Troubleshooting

Waybar / Rofi / Mako not launching
./install.sh --dry-run
which hyprland waybar rofi mako matugen kitty foot zsh
Scripts fail with command not found
# Zsh
echo 'path=(~/.local/bin $path)' >> ~/.zshrc
source ~/.zshrc

# Bash / others
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
GTK 2 theme broken after nwg-look
cp /path/to/Hypr/.gtkrc-2.0 ~/.gtkrc-2.0
Colors didn't update after wallpaper change
matugen image /path/to/your/wallpaper
Quickshell panels / launcher not showing
# Check if quickshell is installed
which quickshell

# Verify qs_manager.sh is running
pgrep -f "qs_manager" || ~/.config/hypr/scripts/qs_manager.sh

# Check the install log for errors
tail -30 /tmp/hypr-install-*.log 2>/dev/null

Make sure quickshell is installed.

Icon glyphs showing as boxes
yay -S ttf-font-awesome nerd-fonts-symbols-only
fc-cache -f
--uninstall says "No install manifest found"

The installer was never run, or the backup directory was deleted. Restore files manually from the repo tree.

Screen sharing / portals not working
# Make sure xdg-desktop-portal-hyprland is installed
yay -S xdg-desktop-portal-hyprland

# Restart the portal service
systemctl --user restart xdg-desktop-portal-hyprland

# Check service status
systemctl --user status xdg-desktop-portal-hyprland
Something went wrong mid-install
# Show the last 50 lines of the most recent install log
tail -50 /tmp/hypr-install-*.log 2>/dev/null

🔐 Security

Do not open a public GitHub issue for vulnerabilities. See SECURITY.md for responsible disclosure.

🤝 Contributing

PRs are welcome for fixes, improvements, and documentation updates. Include screenshots when UI is affected.

Getting Help

Need help or have questions? Start a discussion:

For bugs and issues, use the Issue Tracker.

📄 License

MIT — see LICENSE for details.