A template-based multi-theme hub for 24+ apps. Sharp corners, no rounded anything. One set of configs, any number of color schemes. Includes a themed login screen (greetd + regreet) that boots straight into Hyprland.
New to Linux? This runs on Arch Linux with the Hyprland Wayland compositor. If you're coming from Windows or macOS, archinstall makes getting started much easier than the manual install process.
FoxML Classic (dark)
Dark theme with earthy, muted tones — warm peach, dusty rose, sage, and wheat on a deep plum background.
| Role | Color | |
|---|---|---|
| Background | #1a1214 | Warm dark |
| Foreground | #d5c4b0 | Warm cream |
| Primary | #c4956e | Peach |
| Secondary | #b8967a | Dusty rose |
| Accent | #8a9a7a | Sage |
| Surface | #3a414b | Slate |
- Arch Linux (the installer uses
pacmanfor dependencies) - Hyprland (Wayland compositor)
- greetd + regreet (login screen — optional but included)
bash,git,sed- Apps you want themed should already be installed, or use
--depsto install them
| Package | Purpose |
|---|---|
hyprland | Wayland compositor |
greetd, greetd-regreet | Login manager + graphical greeter |
kitty | Terminal emulator |
waybar | Status bar |
rofi-wayland | App launcher |
hyprpaper | Wallpaper manager |
hypridle, hyprlock | Idle/lock screen |
mako or dunst | Notifications |
zsh, oh-my-zsh | Shell |
neovim | Editor (with 30+ plugins) |
Run ./install.sh --deps to install most of these automatically.
git clone https://github.com/Jennyfirrr/Linux_Theme.git cd Linux_Theme # Install a theme (interactive — shows available themes) ./install.sh # Install a specific theme ./install.sh FoxML_Classic # Install with system dependencies (Arch packages, Oh My Zsh, zsh plugins) ./install.sh FoxML_Classic --deps # Switch between themes (shows color previews) ./swap.sh # Pull live system config edits back into templates # (replaces rendered colors with {{PLACEHOLDER}} tokens so your changes are preserved across themes) ./update.shConfigs live as templates with {{COLOR}} placeholders. Each theme is just a palette.sh file defining ~60 color variables. At install time, the render engine fills in the placeholders and copies the result to your system.
templates/ <- config files with {{PLACEHOLDER}} tokens kitty/kitty.conf background #{{BG}}, foreground #{{PRIMARY}}, ... nvim/init.lua style = "{{NVIM_STYLE}}", colors with #{{RED}}, ... waybar/style.css @define-color bg #{{BG}}, rgba({{PRIMARY_R}}, ...), ... zsh/.zshrc %F{{{ANSI_ACCENT1}}}, fg=#{{ZSH_SUGGEST}}, ... hyprlock/hyprlock.conf rgb({{PRIMARY_R}}, {{PRIMARY_G}}, {{PRIMARY_B}}), ... regreet/regreet.css background rgba({{BG_R}}, ...), color #{{PRIMARY}}, ... ... (30+ files across 22+ app directories) themes/ FoxML_Classic/ palette.sh <- defines all colors for Classic theme.conf <- name, type=dark, description shared/ <- non-color files copied as-is (keybinds, scripts, etc.) render.sh <- template engine (hex, RGB, ANSI, metadata substitution) mappings.sh <- source -> destination file routing + special handlers install.sh <- renders templates + copies to system update.sh <- reverse-renders system configs back into templates swap.sh <- interactive theme switcher with color previews Adding a new theme = writing one palette.sh file. All 23+ app configs are generated from templates.
Editing a config = edit the template, it applies to all themes. Run ./update.sh to pull changes from your live system back into templates.
Every one of these gets its colors from the active theme's palette.sh:
| App | Template | Installs To |
|---|---|---|
| Hyprland | templates/hyprland/theme.conf | ~/.config/hypr/modules/theme.conf |
| Hyprlock | templates/hyprlock/hyprlock.conf | ~/.config/hypr/hyprlock.conf |
| Neovim | templates/nvim/init.lua | ~/.config/nvim/init.lua |
| Kitty | templates/kitty/kitty.conf | ~/.config/kitty/kitty.conf |
| Waybar | templates/waybar/style.css | ~/.config/waybar/style.css |
| Tmux | templates/tmux/.tmux.conf | ~/.tmux.conf |
| Zsh | templates/zsh/ (7 files) | ~/.zshrc + ~/.config/zsh/ + caramel prompt |
| Rofi | templates/rofi/glass.rasi | ~/.config/rofi/glass.rasi |
| Dunst | templates/dunst/dunstrc | ~/.config/dunst/dunstrc |
| Mako | templates/mako/config | ~/.config/mako/config |
| Fastfetch | templates/fastfetch/config.jsonc | ~/.config/fastfetch/config.jsonc |
| GTK 3 | templates/gtk-3.0/gtk.css | ~/.config/gtk-3.0/gtk.css |
| GTK 4 | templates/gtk-4.0/gtk.css | ~/.config/gtk-4.0/gtk.css |
| btop | templates/btop/foxml.theme | ~/.config/btop/themes/foxml.theme |
| Yazi | templates/yazi/theme.toml | ~/.config/yazi/theme.toml |
| Zathura | templates/zathura/zathurarc | ~/.config/zathura/zathurarc |
| Spicetify | templates/spicetify/ (2 files) | ~/.config/spicetify/Themes/FoxML/ |
| Firefox | templates/firefox/ (2 files) | <profile>/chrome/userChrome.css |
| Cursor/VS Code | templates/cursor/ | ~/.cursor/extensions/foxml-theme/ |
| Discord (Vencord) | templates/vencord/foxml.css | ~/.config/Vencord/themes/foxml.css |
| Bat | templates/bat/foxml.tmTheme | ~/.config/bat/themes/Fox ML.tmTheme |
| ReGreet (login) | templates/regreet/regreet.css | /etc/greetd/regreet.css (via sudo) |
These are copied as-is regardless of theme — keybinds, scripts, layout configs:
| File | Description |
|---|---|
shared/hyprland_modules/ | 12 Hyprland modules (keybinds, rules, monitors, scratchpads, etc.) |
shared/hyprland_scripts/ | 8 helper scripts (lock, startup, yazi, theme switching, etc.) |
shared/launchers/ | Toggle scripts for btop, ncspot, spotify, yazi |
shared/wallpapers/ | Wallpaper files |
shared/hyprpaper.conf | Hyprpaper config |
shared/nvim_lazy-lock.json | Neovim plugin lock file |
shared/nvim_ftplugin/ | Neovim filetype plugins |
shared/rofi_config.rasi | Rofi layout config |
shared/waybar_config | Waybar module/layout config |
shared/gtk-{3,4}.0_settings.ini | GTK settings (font, icon theme) |
shared/zsh_aliases.zsh | Shell aliases |
shared/zsh_paths.zsh | PATH setup |
shared/zsh_conda.zsh | Conda/mamba init |
shared/regreet.toml | ReGreet greeter config (font, cursor, clock, env vars) |
shared/greetd_hyprland.conf | Minimal Hyprland config for the greeter session |
Templates in templates/zsh/ include the full shell setup:
| File | Description |
|---|---|
.zshrc | Main config — Oh My Zsh, completions, fzf, tmux auto-attach |
caramel.zsh-theme | Custom prompt with gradient path, git, conda/venv, elapsed time |
colors.zsh | LS_COLORS and zsh-syntax-highlighting |
welcome.zsh | Terminal splash with system info and todo list |
prompt.zsh | Fallback PS1 prompt |
gradient.zsh | Pastel rainbow text colorizer |
async.zsh | Async prompt helpers |
Requires: Oh My Zsh, zsh-syntax-highlighting, zsh-autosuggestions, eza, bat
See shared/nvim_NVIM-KEYBINDS.md for the complete keybind reference.
AI integration:
- copilot.lua — inline ghost-text completions + copilot-cmp source (toggle with
<Space>Ci) - avante.nvim — Cursor-style AI chat panel using Copilot provider (Claude Sonnet 4)
- claudecode.nvim — Claude Code terminal integration (
<Space>Cttoggle,<Space>Cssend selection)
Highlights: LSP via mason, DAP debugging, cmake-tools, neotest, lazygit, telescope, harpoon, neo-tree, treesitter, zen-mode
The login screen is themed via regreet (a GTK4 greeter for greetd) running inside a minimal Hyprland session — no cage, no TTY flash.
After running ./install.sh, deploy the login theme:
# Copy themed files to greetd sudo cp ~/.config/regreet/regreet.{css,toml} /etc/greetd/ sudo cp ~/.config/regreet/hyprland.conf /etc/greetd/hyprland.conf sudo cp ~/.wallpapers/foxml_earthy.jpg /usr/share/wallpapers/ # Set greetd to use Hyprland as the greeter compositor sudo tee /etc/greetd/config.toml << 'EOF' [terminal] vt = 1 [default_session] command = "Hyprland -c /etc/greetd/hyprland.conf" user = "greeter" EOF # Enable greetd sudo systemctl enable greetdOn first login, select your Hyprland session from the Session dropdown — regreet remembers it for next time.
- Copy an existing palette:
cp themes/FoxML_Classic/palette.sh themes/My_Theme/palette.sh - Edit the colors in your new
palette.sh - Create
themes/My_Theme/theme.confwith name/type/description - Run
./install.sh My_Theme
The palette defines ~60 variables across several categories:
- Core colors — BG, FG, PRIMARY, SECONDARY, ACCENT, SURFACE + variants
- ANSI colors — RED, GREEN, YELLOW, BLUE, CYAN + bright variants
- ANSI 256 codes — terminal color indices for zsh prompts
- Tmux colors —
colour216-style tmux palette - App overrides — per-app background tweaks (dunst, spicetify, vencord)
- Font —
FONT_FAMILYsets the font across all templated apps (default:Hack Nerd Font) - Metadata — NVIM_STYLE, KITTY_BG_OPACITY, VSCODE_UI_THEME, etc.
Set FONT_FAMILY in your theme's palette.sh to any installed Nerd Font:
FONT_FAMILY="Hack Nerd Font" # default — blocky, sturdy FONT_FAMILY="JetBrainsMono Nerd Font" # clean, rounded FONT_FAMILY="IBM Plex Mono Nerd Font" # industrial, wideThis updates all templated configs (kitty, waybar, rofi, dunst, mako, hyprlock, regreet CSS, spicetify, zathura). Shared configs (GTK settings, regreet.toml, hyprland general) use the font directly — update those manually if switching fonts.
See themes/FoxML_Classic/palette.sh for the full variable list.
hyprctl reload- Restart terminals/apps
spicetify apply- Firefox: enable
toolkit.legacyUserProfileCustomizations.stylesheetsinabout:config - Cursor: Select "Fox ML" in color theme picker
- Discord: Enable theme in Settings > Vencord > Themes
- Login screen:
sudo cp ~/.config/regreet/regreet.{css,toml} /etc/greetd/
Do whatever you want with it.


