Vicious Viper

August 2, 2026 · View on GitHub

Header wave
Vicious Viper Logo

Vicious Viper

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


📖 Table of Contents

🖼 Preview · ✨ Features · 🧩 Stack · 📝 Neovim
📦 Prerequisites · ⚡ Installation · 🚀 Post-Install
📂 Layout · 🚩 Flags · ⌨️ Keybinds
🎨 Theming · 🎛 Quickshell · 🌐 Zen
🔄 Updating · 🔧 Troubleshoot · 🔐 Security · 🤝 Contributing · 📄 License


🖼 Preview


✨ Features

🔮💾🎛🪄🐚
Material You theming — Matugen derives a full palette from your wallpaper and applies it to every componentSafe installer — every file that would be overwritten is backed up to a timestamped directory firstModular installs — choose exactly which modules to deploy: configs, scripts, icons, themes, fonts, dotfilesDry-run mode — preview every single action without touching a single fileShell-aware PATH patching — detects Zsh, Bash, Fish, Ksh, and falls back to POSIX .profile
↩️🔤🌐📜🎨
One-command undo — restore all your originals with ./install.sh --uninstallBundled fonts — JetBrains Mono Nerd, Font Awesome, Icomoon Feather, Nerd Symbols — installed and cachedZen Browser CSS — custom userChrome.css and userContent.css tuned to match the Viper aesthetic33 custom scripts — automatically marked executable and patched into PATHLive 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 (script dependency)
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 adw-gtk3-dark — referenced by the GTK configs but not bundled; without it GTK apps fall back to default Adwaita. Installed by --install-all-deps via your AUR helper

Fonts

The .fonts/ directory is bundled and installed automatically. It is organized into three subdirectories:

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 — NOT installed; applied to ~/.zen/chrome manually (see Zen section)
│   ├── 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 (custom CSS copied here manually — see Zen section)
└── 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 — convenient on a personal machine but not
> recommended to copy verbatim. `.config/environment.d/zen.conf` sets
> `MOZ_DISABLE_RDD_SANDBOX=1`, which disables Firefox's media-decoder sandbox to
> allow hardware video decode; a known tradeoff between security and performance.

🚩 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 (pipewire, bluez, grim…)
--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.

The palette is derived live from 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 (Mako handles notifications, Quickshell handles OSD). 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.

Enjoying Vicious Viper? Give it a ⭐!



Crafted with 💜 by Cybersnake


footer