You might be here looking for (Linux) rice reference or to (full?) replicate my personal configuration of my favorite Window Managers and several apps as well. โ
HorneroConfig is your artisanal toolkit for crafting the perfect digital workspace. Named after the industrious hornero bird, renowned for its skillful nest-building, our framework empowers you to construct a robust, functional, and personalized computing environment.
Perfectly suited for a wide array of Desktop Environments and Window Managers, HorneroConfig thrives across different platforms including GitHub Codespaces, Gitpod, VS Code Remote - Containers, or even Linux distributions that are not Arch Linux.
Backed by the versatile Chezmoi, HorneroConfig stands out as a dotfiles manager that adapts flexibly to your needs, streamlining machine setup and ensuring consistency across devices. Embrace the spirit of the hornero, and let HorneroConfig transform your configurations into a harmonious blend of elegance and efficiency.
Most were written from scratch. Core stack:
dots-wallpaper-set





HorneroConfig automatically configures the Chaotic-AUR repository during installation. This provides:
The repository is configured automatically by the chezmoi script at:
home/.chezmoiscripts/linux/run_onchange_before_install-000-chaotic-aur.sh.tmpl
For more information, visit the Chaotic-AUR documentation.
This repository is designed to be a starting point for your personalized dotfiles setup. Youโre encouraged to fork it, adapt it to your needs, and maintain your own GitHub repository with your custom configurations.
[!TIP] The dotfiles use Chezmoi to manage, edit, and apply configuration changes across multiple machines โ securely and efficiently.
Create your own version of the dotfiles:
git clone https://github.com/<your-username>/dotfiles.git ~/.dotfiles[!IMPORTANT] This dotfiles setup includes references to my personal LastPass vault for storing sensitive information (like tokens or secrets).
If you plan to use or adapt these configs, make sure to replace or remove any references to LastPass and configure your own preferred secret management method โ such as Bitwarden, 1Password,pass,gopass, orchezmoi's built-in encrypted secrets.
Double-check any scripts or encrypted templates (*.tmpl) before applying changes.
Link your forked dotfiles directory with chezmoi:
chezmoi init --source ~/.dotfilesUse chezmoiโs built-in editing command:
chezmoi edit --source ~/.dotfilesMake the changes that suit your preferences:
Once you're ready:
chezmoi apply --source ~/.dotfilesAll changes will be synced to your system.
dots) and workflow helpers[!TIP] Use
chezmoi diffto preview your changes before applying.
The dotfiles include an intelligent color system that automatically optimizes colors for any theme:
Learn more: Smart Colors System
One of the biggest advantages of using Chezmoi is portable configuration. You can sync your setup across multiple machines using a private or public GitHub repository.
Just run:
chezmoi init git@github.com:<your-username>/dotfiles.git chezmoi apply
And your personalized setup will be ready!
Go ahead โ personalize everything. Make your desktop, terminal, and tooling truly yours! ๐
The rice system is now managed through the Quickshell-first appearance workflow.
dots appearance list dots appearance current dots appearance apply neon-city dots appearance set-variant vibrant dots appearance set-mode dark dots appearance set-wallpaper /path/to/wallpaper.jpg
dots rice ... is retained as compatibility naming, but dots appearance ... is the canonical interface.
Appearance changes done from the control center can be previewed first, then committed with Apply/Save.
flowchart LR
user[UserSelectsAppearance] --> preview[QuickshellPreview]
preview --> apply[ApplyOrSave]
apply --> cli[dots-appearanceApply]
cli --> palette[dots-smart-colorsAndScheme]
palette --> shell[QuickshellReload]Rices live under:
~/.local/share/dots/rices/<rice-name>/
Typical files:
config.shexecutable_apply.shbackgrounds/preview.*Smart Colors generates semantic colors and Material Design 3 palettes from the current wallpaper, then keeps Quickshell synchronized.
~/.cache/dots/smart-colors/scheme.json.dots-wal-reload and dots-wallpaper-set trigger palette refresh and Quickshell IPC reload.wpg -s <image> -> wpg.conf runs dots-wal-reload and refreshes shell colors.wpg and global reload orchestration.The direct pipeline could desynchronize ~/.config/wpg/.current from shell/runtime state and miss some app reloads that are centralized in dots-wal-reload.
dots-wallpaper-set as the single entrypoint for wallpaper changes from shell UI/actions.wpg is available, dots-wallpaper-set delegates to wpg -s so wpgtk remains source-compatible.~/.local/state/dots/wallpaper/path (canonical persistent pointer; respects DOTS_STATE_DIR / XDG_STATE_HOME)~/.cache/wal/wal (pywal)~/.config/wpg/.current (optional, when using wpgtk)dots-smart-colors --generate --m3 dots-smart-colors --analyze dots-smart-colors --concept=error dots-wal-reload
All generated files are written to ~/.cache/dots/smart-colors/.
Core files:
scheme.json (Quickshell M3 palette)colors.sh (shell variables for scripts)colors.env (export-friendly environment file)colors-hyprlock.env (lockscreen integration)colors-kitty.conf (terminal integration)colors.css (generic CSS variables)Compatibility files may exist for external tooling, but they are not part of the primary UX contract.
flowchart LR
wallpaper[WallpaperChange] --> set[dots-wallpaper-set]
set --> wal[dots-wal-reload]
wal --> smart[dots-smart-colorsGenerate]
smart --> scheme[schemeJson]
scheme --> colours[QuickshellColoursService]
colours --> ui[QuickshellUIUpdated]# Rebuild smart-colors cache
dots-smart-colors --generate --m3
# Confirm cache files exist
ls -la ~/.cache/dots/smart-colors/
# Force shell-side reload path
dots-quickshell ipc colours reloadThis guide provides an overview of how to customize Hyprland, the dynamic tiling Wayland compositor used in this dotfiles setup.
[!TIP] Everything is fully customizable โ from layout and keybindings to appearance and startup behavior. All configurations are version-controlled using
chezmoi, making it easy to manage and sync.
The general process is:
chezmoi editchezmoi apply๐ Config Path: ~/.config/hypr
The Hyprland configuration controls:
To edit:
chezmoi edit ~/.config/hypr/hyprland.conf chezmoi apply
For more info, check the Hyprland documentation.
dots-quickshell ipc ...chezmoi diff to preview config changesIf you run into issues or want to go deeper:
Customizing your compositor is one of the best ways to boost your productivity and tailor your desktop to your style โ make it yours! ๐จ
Complete reference for all keybindings in HorneroConfig's Hyprland setup.
| Keybinding | Function |
|---|---|
Super+Return |
Terminal (Kitty) |
Super+D |
Application launcher (Quickshell) |
Alt+Ctrl+C |
Clipboard manager (dots-clipboard) |
Super+? or Super+/ |
Keyboard shortcuts help overlay (dots-keyboard-help) |
Super+Ctrl+Space |
AI assistant (sgpt via IBus) |
Super+Shift+Tab |
Task switcher (dots-snappy-switcher prev) |
Super+E |
File manager (Thunar) |
Super+Shift+S |
Screenshot tool (grimblast/grim) |
Print |
Screenshot (area selection) |
| Keybinding | Function |
|---|---|
Super+Q |
Close focused window |
Super+Shift+Q |
Kill focused window (force) |
Super+F |
Toggle fullscreen |
Super+Shift+F |
Smart floating (toggle + center + resize) |
Super+Shift+Space |
Focus toggle (floating โ tiled) |
Super+Ctrl+C |
Center floating window |
Super+Space |
Toggle tiling/floating |
Super+P |
Focus parent (group) |
Super+C |
Focus child (group) |
Super+U |
Promote focused window to its own column (scrolling layout) |
Super+' |
Toggle focus fit mode (center โ fit) |
Super+Ctrl+W |
Toggle layout profile (scrolling โ dwindle) |
Super+Ctrl+Shift+W |
Force scrolling profile |
Super+Ctrl+Alt+W |
Force dwindle profile |
| Keybinding | Function |
|---|---|
Super+H / Super+Left |
Focus window left |
Super+J / Super+Down |
Focus window down |
Super+K / Super+Up |
Focus window up |
Super+L / Super+Right |
Focus window right |
| Keybinding | Function |
|---|---|
Super+Shift+H / Super+Shift+Left |
Move window left |
Super+Shift+J / Super+Shift+Down |
Move window down |
Super+Shift+K / Super+Shift+Up |
Move window up |
Super+Shift+L / Super+Shift+Right |
Move window right |
| Keybinding | Function |
|---|---|
Super+R |
Enter resize mode |
Super+Ctrl+H |
Resize shrink width |
Super+Ctrl+J |
Resize grow height |
Super+Ctrl+K |
Resize shrink height |
Super+Ctrl+L |
Resize grow width |
| Keybinding | Function |
|---|---|
Super+1-9,0 |
Switch to workspace 1-10 |
Super+KP_1-9,0 |
Switch to workspace 1-10 (numpad) |
Super+Alt+Left |
Previous active workspace |
Super+Alt+Right |
Next active workspace |
Super+Ctrl+Left |
Previous existing workspace |
Super+Ctrl+Right |
Next existing workspace |
Super+Tab |
Cycle through workspaces |
| Keybinding | Function |
|---|---|
Super+Shift+1-9,0 |
Move window to workspace 1-10 |
Super+Shift+KP_1-9,0 |
Move window to workspace 1-10 (numpad) |
| Keybinding | Function |
|---|---|
Super+Z |
Toggle scratchpad visibility |
Super+Shift+Z |
Move window to scratchpad |
| Keybinding | Function |
|---|---|
Super+Alt+H |
Move layout viewport one column to the left |
Super+Alt+L |
Move layout viewport one column to the right |
Super+Alt+, |
Swap active column with left neighbor |
Super+Alt+. |
Swap active column with right neighbor |
Super+Alt+- / Super+Alt+= |
Decrease/increase column width preset |
Super+Alt+Shift+- / Super+Alt+Shift+= |
Fine resize column width |
Super+Alt+F |
Fit active column into view |
Super+Alt+Shift+F |
Fit visible columns into view |
| Keybinding | Function |
|---|---|
Super+G, + |
Increase gaps |
Super+G, - |
Decrease gaps |
Super+G, 0 |
Reset gaps to default |
Super+G, Shift+0 |
Remove all gaps |
| Keybinding | Function |
|---|---|
Super+Ctrl+P |
Toggle Bar (Quickshell) |
Super+Ctrl+M |
Toggle Notification Center (Quickshell) |
Super+Shift+R |
Reload Hyprland configuration |
Super+Shift+E |
Exit Hyprland |
Super+X |
System power menu (Quickshell) |
Super+L |
Lock screen (Hyprlock) |
| Keybinding | Function |
|---|---|
XF86AudioPlay |
Play/pause media |
XF86AudioPause |
Pause media |
XF86AudioNext |
Next track |
XF86AudioPrev |
Previous track |
XF86AudioStop |
Stop playback |
| Keybinding | Function |
|---|---|
XF86AudioRaiseVolume |
Increase volume (+1%) |
XF86AudioLowerVolume |
Decrease volume (-1%) |
XF86AudioMute |
Toggle mute |
XF86AudioMicMute |
Toggle microphone mute |
| Keybinding | Function |
|---|---|
XF86MonBrightnessUp |
Increase brightness |
XF86MonBrightnessDown |
Decrease brightness |
| Action | Function |
|---|---|
Super+Left Click |
Move window |
Super+Right Click |
Resize window |
Super+Middle Click |
Toggle floating |
Super+R)Once in resize mode:
H / Left - Shrink widthJ / Down - Grow heightK / Up - Shrink heightL / Right - Grow widthEscape / Return - Exit resize modeSuper+G)Interactive gaps adjustment:
+ / = - Increase gaps- - Decrease gaps0 - Reset to defaultShift+0 - Remove all gapsEscape / Return - Exit gaps modeKeybindings are organized in:
~/.config/hypr/hyprland.conf.d/
โโโ keybindings.conf # Core keybindings
โโโ keybindings-media.conf # Media and volume controls
โโโ keybindings-custom.conf # User customizationsTo add custom keybindings, edit:
~/.config/hypr/hyprland.conf.d/keybindings-custom.conf
Example:
# Custom application launcher
bind = $Mod, B, exec, firefox
# Custom window manipulation
bind = $Mod SHIFT, M, togglesplitSuper (Windows key) is the primary modifierH J K L for directional movementWayland-native lockscreen management with hyprlock
Alternative to betterlockscreen for Wayland/Hyprland environments
dots-lockscreen provides a Wayland-compatible lockscreen solution using hyprlock. It processes wallpapers with various visual effects and integrates with the dots ecosystem's smart color system.
The lockscreen system is automatically installed when you apply the dotfiles with chezmoi. The installation script is located at:
home/.chezmoiscripts/linux/run_onchange_before_install-hyprland.sh.tmpl
It installs:
yay -S --noconfirm --needed hyprlock hypridle
Generate lockscreen images from a wallpaper:
dots lockscreen --update=/path/to/wallpaper.png
With custom effects parameters:
dots lockscreen --update=/path/to/wallpaper.png --dim=50 --blur=7 --pixel=15
Lock with default blur effect:
dots lockscreen --lock dots lockscreen -l
Lock with specific effect:
dots lockscreen --lock --lock-effect=dim dots lockscreen --lock --lock-effect=blur dots lockscreen --lock --lock-effect=dimblur dots lockscreen --lock --lock-effect=pixel
The lockscreen is automatically updated when you change wallpapers using:
dots wal-reload
Darkens the wallpaper by a specified percentage (default: 40%)
dots lockscreen --update=wallpaper.png --dim=60
Applies Gaussian blur to the wallpaper (default level: 5)
dots lockscreen --update=wallpaper.png --blur=7
Combines dimming and blurring for a professional look
dots lockscreen --update=wallpaper.png --dim=40 --blur=5
Creates a pixelated/mosaic effect (default scale: 10)
dots lockscreen --update=wallpaper.png --pixel=15
Lockscreen images are stored in:
~/.cache/dots-lockscreen/current/ โโโ lock_resize.png # Base resized image โโโ lock_dim.png # Dimmed version โโโ lock_blur.png # Blurred version โโโ lock_dimblur.png # Dim + blur version โโโ lock_pixel.png # Pixelated version
The lockscreen automatically uses colors from:
~/.cache/dots/smart-colors/current.env
Colors used:
SMART_BG: Background colorSMART_FG: Foreground/text colorSMART_PRIMARY: Ring colorSMART_ACCENT: Accent colorSMART_SUCCESS: Correct password indicatorSMART_ERROR: Wrong password indicatorThe lockscreen is integrated into the EWW powermenu:
(defwidget lock []
(box :class "genwin" :vexpand "false" :hexpand "false"
(button :class "btn_lock"
:onclick "~/.local/bin/dots-power-menu --mode=minimal; dots-lockscreen -l blur"
"")))Automatically updates lockscreen when changing themes:
dots wal-reload # Updates wallpaper and lockscreenRice themes can trigger lockscreen updates in their apply.sh:
if command -v dots-lockscreen &>/dev/null; then
dots-lockscreen --update="$wallpaper"
fiThe script dynamically generates a hyprlock configuration with these features:
background {
path = <effect-image>
blur_passes = 3
blur_size = 7
contrast = 0.8916
brightness = 0.8172
vibrancy = 0.1696
}
input-field {
size = 300, 60
outline_thickness = 2
outer_color = rgba(<primary-color>)
inner_color = rgba(<bg-color>)
font_color = rgba(<fg-color>)
fail_color = rgba(<error-color>)
# ... and more
}The lockscreen automatically adapts its layout based on your current rice's RICE_STYLE. This provides a cohesive aesthetic experience across your entire desktop.
| Layout | Rice Styles | Description |
|---|---|---|
| Default | Any unlisted style | Clean, centered layout with standard typography |
| Cyberpunk | cyberpunk, neon, futuristic | Glowing neon elements, tech-inspired fonts |
| Cozy | cozy, kawaii, cute, warm | Soft, rounded elements with pastel accents |
| Vaporwave | vaporwave, retro, synthwave | Gradient effects, 80s-inspired typography |
| Minimal | minimal, clean, productive | Ultra-clean with minimal UI elements |
RICE_STYLE from your current rice's config.shTo enable style-aware layouts, add RICE_STYLE to your rice's config.sh:
# Example for cyberpunk rice
RICE_STYLE="Cyberpunk"
# Example for cozy rice
RICE_STYLE="Cozy"The style matching is case-insensitive and supports partial matches (e.g., "cozy warm" matches the Cozy layout).
| Feature | betterlockscreen | dots-lockscreen |
|---|---|---|
| Platform | X11 (i3lock) | Wayland (hyprlock) |
| Effects | 6 effects | 4 core effects |
| Multi-monitor | Native support | Via hyprlock |
| Color integration | Manual config | Smart-colors system |
| Dependencies | i3lock-color, imagemagick | hyprlock, imagemagick |
| Login box | Custom rendering | Hyprlock built-in |
Ensure smart-colors cache exists:
dots smart-colors analyze dots wal-reload
Check ImageMagick installation:
magick --version
# or
convert --versionInstall hyprlock:
yay -S hyprlock
Generate lockscreen images first:
dots lockscreen --update=~/.local/state/dots/wallpaper/pathhyprlock (required)imagemagick (required)jq (for resolution detection)hyprctl (for Hyprland display info)~/.local/bin/dots-lockscreen~/.cache/dots-lockscreen/current/~/.local/state/dots/wallpaper/path~/.cache/dots/smart-colors/current.envQuickshell is the unified desktop shell for HorneroConfig, built with QML/QtQuick. It provides a cohesive, themeable, and extensible desktop experience.
[!TIP] Quickshell integrates with Material Design 3 theming, automatically adapting all UI elements to your wallpaper's color palette.
Quickshell provides all desktop shell functionality through modular QML components:
| Module | Description |
|---|---|
| Left Rail Bar | Vertical/horizontal rail with workspaces, clock, status icons, power |
| Launcher | App search, calculator, wallpaper browser, appearance selector |
| Dashboard | Tabbed system overview, media, performance, weather |
| Notifications | Popup notifications and notification center sidebar |
| Session Rail | Right-edge quick actions menu (logout, power, session controls) |
| Lock | PAM-authenticated lock screen |
| OSD Notch | Right-edge sliders for volume/brightness feedback |
| AI Chat | Multi-provider AI assistant sidebar |
| Background | Desktop wallpaper with optional audio visualizer |
| AreaPicker | Screenshot region selector |
| Utilities | Quick toggles panel (WiFi, Bluetooth, DND, etc.) |
Use the dots-quickshell script to manage the shell:
dots quickshell start # Start Quickshell
dots quickshell stop # Stop Quickshell
dots quickshell restart # Restart Quickshell
dots quickshell status # Check if running
dots quickshell preset list # List shell presets
dots quickshell preset apply <name> # Apply shell preset
dots quickshell config get bar.positiondots-quickshell ipc colours reload # Reload color scheme
dots-quickshell ipc bar toggle # Toggle bar visibility
dots-quickshell ipc dashboard toggle # Toggle dashboard
dots-quickshell ipc launcher toggle # Toggle launcher
dots-quickshell ipc session toggle # Toggle session/power menu
dots-quickshell ipc sidebar toggle # Toggle notification sidebarNote: drawer toggles are routed through Quickshell's drawers IPC target internally by dots-quickshell, so the commands above are the stable public interface you should keep using.
Quickshell uses Material Design 3 (M3) color palettes generated from your wallpaper:
dots-smart-colors --m3generate-m3-colors.py extracts M3 palette using python-materialyoucolor~/.cache/dots/smart-colors/scheme.jsonColours service watches the file and reloads automaticallyEach appearance (rice) can configure its M3 scheme via config.sh:
SCHEME_TYPE="vibrant" # tonalSpot, vibrant, expressive, neutral, monochrome, fidelity
DARK_MODE="true" # true/false
ACCENT_COLOR="" # Optional hex color override
BAR_POSITION="top" # top/bottomdots appearance list dots appearance current dots appearance apply machines dots appearance set-variant tonalspot dots appearance set-mode light
The active shell now follows a unified drawers architecture inspired by reference/shell:
modules/drawers/Drawers.qml) owns interaction orchestration.modules/drawers/Exclusions.qml) reserve space in Hyprland.modules/drawers/BorderFrame.qml) provides shell chrome.modules/bar/BarContent.qmlmodules/bar/BarWrapper.qmlmodules/drawers/Interactions.qml) handles hover/wheel behavior.QML singletons providing system integration:
| Service | Purpose |
|---|---|
Colours |
M3 theming, transparency, wallpaper luminance |
Hypr |
Hyprland IPC (workspaces, monitors, keyboard) |
Audio |
PipeWire audio, Cava visualization, beat detection |
Players |
MPRIS media player control |
Brightness |
Screen brightness (brightnessctl, ddcutil) |
Network |
WiFi/Ethernet management (nmcli) |
SystemUsage |
CPU, GPU, memory, disk monitoring |
Weather |
Open-Meteo weather data |
Wallpapers |
Wallpaper browsing and selection |
Notifs |
Notification server (replaces Mako) |
Time |
System clock and date |
Visibilities |
Panel visibility state management |
Ai |
Multi-provider AI with function calling |
Performance-critical components built with CMake:
Shell behavior is configured via ~/.config/hornero/shell.json:
{
"border": { "thickness": 2, "rounding": 24 },
"bar": {
"position": "left",
"showOnHover": false,
"sizes": { "innerWidth": 48 }
},
"appearance": {
"animations": {
"duration": 200,
"durations": { "small": 160, "normal": 220, "large": 320 }
}
}
}dots-* integrations, rice selector mode in launcher, AI chat module.| Keybinding | Action |
|---|---|
Super+D |
Toggle launcher |
Super+X |
Toggle session/power menu |
Super+Ctrl+B |
Toggle bar |
Super+? or Super+/ |
Keyboard shortcuts help |
~/.config/quickshell/
โโโ shell.qml # Main entry point
โโโ config/
โ โโโ Config.qml # Configuration singleton
โโโ services/ # System integration singletons
โ โโโ Colours.qml # M3 theming
โ โโโ Hypr.qml # Hyprland IPC
โ โโโ Audio.qml # Audio management
โ โโโ ...
โโโ modules/ # UI components
โ โโโ bar/ # Status bar
โ โโโ launcher/ # App launcher
โ โโโ dashboard/ # System dashboard
โ โโโ notifications/ # Notification system
โ โโโ session/ # Power menu
โ โโโ lock/ # Lock screen
โ โโโ osd/ # On-screen display
โ โโโ aichat/ # AI assistant
โ โโโ sidebar/ # Notification sidebar
โ โโโ background/ # Desktop background
โ โโโ areapicker/ # Screenshot selector
โ โโโ utilities/ # Quick toggles
โโโ utils/ # Shared utilities
โ โโโ Paths.qml
โ โโโ Icons.qml
โ โโโ SysInfo.qml
โ โโโ Strings.qml
โโโ plugin/ # C++ plugin (built by Chezmoi)
โโโ CMakeLists.txt
โโโ src/Hornero/# Check if already running
dots-quickshell status
# Check for errors
quickshell 2>&1 | head -50
# Ensure plugin is built
ls ~/.local/lib/quickshell/qml/Hornero/# Regenerate M3 palette
dots-smart-colors --m3
# Check scheme.json exists
cat ~/.cache/dots/smart-colors/scheme.json | head
# Force reload
dots-quickshell ipc colours reload# Ensure build deps are installed
yay -S --needed cmake ninja qt6-base qt6-declarative aubio cava pipewire
# Rebuild manually
cd ~/.config/quickshell/plugin
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
cmake --install build --prefix ~/.local/lib/quickshellUse this checklist after each substantial shell change.
cd ~/.dotfiles
chezmoi apply --source=. --force
dots-quickshell restartdots-quickshell ipc launcher toggle opens/closes launcher.dots-quickshell ipc dashboard toggle toggles top control center.dots-quickshell ipc session toggle opens right quick actions rail.dots-smart-colors --m3 regenerates ~/.cache/dots/smart-colors/scheme.json.dots-quickshell ipc colours reload updates shell palette live.~/.local/state/dots/wallpaper/path.ddcutil, etc.).The Thunar side panel (GTK bookmarks) is managed directly via a versioned template in this repository. No generation script is used: what you see in the template is what gets deployed.
Runtime location: ~/.config/gtk-3.0/bookmarks
Source template: home/dot_config/gtk-3.0/bookmarks.tmpl
Inside the template there is a clearly delimited block:
## BEGIN MANAGED SECTION ... lines ... ## END MANAGED SECTION
Edit that block in the template only (not in-place after deployment) to keep changes tracked. Anything you add BELOW the END marker (in your local deployed file) will persist across future template edits, because chezmoi will treat local modifications outside the managed lines as user changes unless you force overwrite. If you want fully reproducible state, keep all bookmarks inside the managed block and re-apply.
Add personal, machineโspecific bookmarks below the managed section directly in ~/.config/gtk-3.0/bookmarks. Example lines:
file:///mnt/storage ๐ Storage smb://nas.local/share ๐ NAS Share
If you prefer a minimalist look, edit the template and delete the emoji / icon column (they are just literal characters). Re-apply with:
chezmoi apply --force --include=files
The template includes: Home, Projects, Dev, Downloads, Documents, Pictures, Music, Videos, .config, LocalShare, Rices, Wallpapers, Bin. Remove or reorder directly in the template to reflect your workflow.
If a specific rice needs additional paths (e.g. a theme assets folder), just append them manually after switching rice. Since we removed automation, we intentionally keep this lightweight. If automation becomes desirable again, a simple helper script or a chezmoi data-driven conditional can be reintroduced later.
If a bookmarked directory no longer exists, Thunar will still show it (but inaccessible). Periodically prune obsolete lines manually. You can safely create missing directories with:
mkdir -p ~/Projects ~/Dev ~/.local/share/dots/rices ~/.local/share/wallpapersAccidentally broke the file? Just re-apply:
chezmoi apply --force --include=files
If emojis appear as empty squares, install a font with emoji coverage (e.g. Noto Color Emoji or a Nerd Font variant) or remove the symbols.
.directory filesFor now the approach stays intentionally simple: a single, explicit source of truth under version control.
Yazi is a blazing-fast terminal file manager written in Rust, with async I/O and native Kitty image previews. It replaces ranger in HorneroConfig with better performance, simpler theming, and built-in archive/media support.
# Open yazi in current directory
dots yazi
# Open yazi and cd to last directory on exit
dots yazi --last-dir
# Or use the shell alias
ycd
# Show keybinding cheatsheet
dots yazi --cheatsheet
# Check preview dependencies
dots yazi --fix-previewsAll config lives in ~/.config/yazi/:
| File | Purpose |
|---|---|
yazi.toml |
General settings, openers, preview config |
keymap.toml |
Custom keybindings (layered on defaults) |
theme.toml |
Color scheme / flavor selection |
init.lua |
Lua plugin hooks |
ratio = [2, 4, 4] (parent, current, preview)show_hidden = truesort_by = "natural", directories firstFiles open with xdg-open by default. Directories can also open in Thunar. Text files open in $EDITOR.
| Key | Action |
|---|---|
h / l |
Parent / Enter directory |
j / k |
Move down / up |
~ |
Go home |
. |
Toggle hidden files |
| Key | Directory |
|---|---|
gh |
Home |
gp |
~/Projects |
gd |
~/Downloads |
gD |
~/Documents |
gP |
~/Pictures |
gm |
~/Music |
gv |
~/Videos |
gc |
~/.config |
gl |
~/.local |
gr |
Rices directory |
gw |
Current rice wallpapers |
gb |
~/.local/bin (scripts) |
gt |
/tmp |
| Key | Action |
|---|---|
Space |
Toggle select |
y |
Copy (yank) |
x |
Cut |
p |
Paste |
a |
Create file/dir |
r |
Rename |
d |
Trash |
DD |
Safe trash (confirm) |
yp |
Yank path to clipboard |
yd |
Yank directory to clipboard |
yn |
Yank filename to clipboard |
| Key | Action |
|---|---|
f |
Filter files |
/ |
Search |
z |
Jump with zoxide |
Z |
Jump with fzf |
C |
Compress selection |
X |
Extract archive |
Alt-t |
Open in Thunar |
s |
Shell command |
| Key | Sort by |
|---|---|
on |
Name |
os |
Size |
om |
Modified |
ot |
Type |
oe |
Extension |
or |
Reverse |
Yazi inherits terminal colors via escape sequences. When you switch rice themes:
dots-wal-reload regenerates pywal colorsNo custom colorscheme file is needed (unlike ranger). The theme.toml uses Catppuccin flavors as a base, with terminal colors taking priority.
Yazi uses native Kitty image protocol for previews. Requirements:
Run dots yazi --fix-previews to check all dependencies.
The ycd alias (defined in .zsh_aliases) launches yazi and changes your shell directory to wherever you navigated when you quit:
ycd # launch yazi, cd on exit
ycd ~/Projects # start in specific directoryThe Super+E keybinding in Hyprland opens yazi in a floating popup window.
dots-yazi (or dots yazi)Super+E opens yazi popupdots yazi --fix-previews
Check that you are running inside Kitty terminal. Other terminals may need ueberzugpp.
Ensure pywal/smart-colors are generating terminal colors:
dots-wal-reload
ya pkg install # Install all locked plugins
ya pkg upgrade # Upgrade pluginsCopyQ is a powerful clipboard manager integrated with HorneroConfig's smart-colors system, providing theme-adaptive styling that automatically matches your current color scheme.
[!TIP] CopyQ automatically adapts to your current theme colors when you change wallpapers via
wpgor rundots-wal-reload.
CopyQ's appearance is automatically themed using the smart-colors system:
The CopyQ theme follows HorneroConfig's visual guidelines:
~/.config/copyq/copyq.conf (managed by chezmoi)~/.config/copyq/themes/hornero-smart-colors.ini (auto-generated)~/.cache/dots/smart-colors/colors-copyq.ini (source file)The CopyQ theme file (.ini format) is automatically generated when you:
wpgdots-wal-reloaddots-smart-colors --generateThe generated theme file is cached in ~/.cache/dots/smart-colors/colors-copyq.ini and symlinked to ~/.config/copyq/themes/hornero-smart-colors.ini.
To use the smart-colors theme in CopyQ:
To customize CopyQ's appearance:
Regenerate the theme:
dots-smart-colors --generate
Edit the theme file (if needed):
$EDITOR ~/.config/copyq/themes/hornero-smart-colors.iniReload CopyQ:
copyq exit && copyq &The theme file uses these smart-colors placeholders:
bg - Primary background colorfg - Primary foreground/text coloralt_bg - Alternative background coloralt_fg - Alternative foreground colorsel_bg - Selection background color (uses accent color)sel_fg - Selection foreground coloredit_bg, edit_fg - Editor colorsfind_bg, find_fg - Search bar colorsnotes_bg, notes_fg - Notes editor colorsnum_fg - Number colorCopyQ uses CSS files from /usr/share/copyq/themes/ (or ~/.config/copyq/themes/ for overrides). The CSS files use placeholders like ${bg}, ${fg}, etc. that are defined in the .ini theme file.
To customize CSS:
Copy the CSS file you want to modify:
cp /usr/share/copyq/themes/items.css ~/.config/copyq/themes/
Edit the CSS file (it will use placeholders from the theme .ini)
Reload CopyQ to apply changes
# Show CopyQ window
copyq show
# Hide CopyQ window
copyq hide
# Toggle visibility
copyq toggle
# Open context menu
copyq menu
# Exit CopyQ server
copyq exitCopyQ is integrated with the dots-clipboard script:
# Launch clipboard manager (auto-detects CopyQ)
dots-clipboard
# Force CopyQ backend
dots-clipboard --backend=copyqCopyQ's theme automatically updates when:
wpg or changing wallpapers triggers dots-wal-reloaddots-wal-reload manuallydots-smart-colors --generateThe CSS is regenerated from the template with current theme colors and symlinked to CopyQ's config directory.
If CopyQ's theme doesn't update:
Check theme file exists:
ls -la ~/.config/copyq/themes/hornero-smart-colors.ini
Regenerate theme:
dots-smart-colors --generate
Select theme in CopyQ:
Restart CopyQ (if needed):
copyq exit
copyq &If colors don't match your current theme:
Regenerate smart colors:
dots-smart-colors --generate
Check theme file:
cat ~/.cache/dots/smart-colors/colors-copyq.ini
Reload theme in CopyQ:
CopyQ's theme aligns with HorneroConfig's design principles:
.ini files that define color placeholders${bg}, ${fg}, etc. that reference the theme .inidots-smart-colors --generate with current smart-colors~/.cache/dots/smart-colors/ and symlinked to CopyQ's themes directory.ini format with placeholders for colors, fonts, and CSS customizationsKitty is a modern, GPU-accelerated terminal emulator built for speed, flexibility, and customization. Itโs ideal for developers, power users, and anyone who wants a fast, scriptable terminal experience.
[!TIP] Like everything in this setup, Kitty is fully customizable. You can tweak appearance, behavior, keybindings, and even integrate with your theme manager.
Kitty's configuration file is located at:
~/.config/kitty/kitty.conf
To edit it with chezmoi:
chezmoi edit ~/.config/kitty/kitty.conf chezmoi apply
This file controls appearance, behavior, fonts, shortcuts, and more.
Kitty supports full theme customization using its config system.
kitty-themesWe recommend using kitty-themes for easier management of community-curated themes.
git clone https://github.com/dexpota/kitty-themes ~/.config/kitty/themesTo list and apply a theme:
cd ~/.config/kitty/themes
./theme_launcher.sh # Follow the promptsThis tool automatically updates your Kitty config with the selected theme.
Your Kitty terminal automatically integrates with the smart colors system:
wpgpywal workflowsThe terminal colors are automatically updated through the wal-reload script, ensuring perfect theme coordination across your entire desktop environment.
background_opacity for transparencyExample snippet:
font_family Hack Nerd Font Mono font_size 11 background_opacity 0.95 enable_audio_bell no
Use pywal to generate a dynamic color scheme based on your wallpaper, and source the kitty.conf colors dynamically.
wal -i path/to/wallpaper.jpg
Kitty will use the updated colors from your
~/.cache/wal/colors-kitty.conffile.
Kitty gives you the performance of a modern terminal with the aesthetic and control of a true power tool. Make it yours! ๐ฑ๐ป
Zsh (Z Shell) is a powerful, interactive shell that offers advanced features, extensive customization, and a vibrant ecosystem of plugins and themes.
[!TIP] Everything in this setup is fully customizable. From themes, prompts, plugins, to aliases and functions โ youโre in control. All configuration lives in your dotfiles and is managed through chezmoi.
Zsh is configured using a modular structure inside:
~/.zsh/config.d/
Every .zsh file inside this folder is automatically sourced on shell startup.
To edit files using chezmoi:
chezmoi edit ~/.zsh/config.d/yourfile.zsh --source ~/.dotfilesApply changes with:
chezmoi apply
[!TIP] Use separate files for aliases, plugins, and theme settings for better organization.
To use Powerlevel10k:
chezmoi edit ~/.zsh/config.d/p10k.zsh
source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme
[ ! -f ~/.p10k.zsh ] || source ~/.p10k.zshRun p10k configure to customize your prompt interactively.
Antigen allows you to load and manage plugins easily:
curl -L git.io/antigen > ~/.antigen.zsh
# ~/.zsh/config.d/antigen.zsh
source "$HOME/.antigen.zsh"
antigen applyInstall with:
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/main/tools/install.sh)"Configure in:
# ~/.zsh/config.d/oh-my-zsh.zsh
export ZSH="/your/oh-my-zsh/path"
source "$ZSH/oh-my-zsh.sh"We recommend keeping your customizations modular:
aliases.zsh: command shortcutsfunctions.zsh: reusable shell functionstheme.zsh: your theme settingsplugins.zsh: plugin manager logicThis keeps your configuration clean and easy to maintain.
After editing your configuration:
source ~/.zshrcOr simply open a new terminal tab/session.
[!TIP] Use
zsh -xto debug issues during shell startup.
Zsh is not just a shell โ itโs a productivity tool. Customize it to reflect your style and workflow! โก
dots is the unified entrypoint for Hornero scripts.
dots --help
dots --list
dots <script> [options]dots-quickshell ipc launcher toggledots launcher dots launcher --backend=quickshell
dots-quickshell ipc utilities togglecliphist terminal pickercopyqdots clipboard dots clipboard --backend=copyq dots clipboard --backend=cliphist
dots-quickshell ipc session toggledots power-menu dots power-menu --mode=quickshell dots power-menu --mode=minimal
utilitiesdots settings-gui
less)dots keyboard-help dots keyboard-help --search=workspace
dots appearance list dots appearance current dots appearance apply neon-city dots appearance set-variant vibrant dots appearance set-mode dark
scheme.json~/.cache/dots/smart-colors/dots smart-colors --generate --m3 dots smart-colors --concept=error
dots wal-reload
wpg -s when availabledots wallpaper-set /path/to/wallpaper.jpg
dots rice remains available as legacy-compatible naming; dots appearance is the canonical contract.dots-* scripts remain modular and can be called directly.The dots backup utility provides comprehensive backup and restoration capabilities for your dotfiles configuration. This tool helps you create snapshots, manage backup schedules, and restore previous configurations when needed.
[!TIP] Regular backups are essential for maintaining system stability and recovering from configuration issues. The backup tool integrates seamlessly with chezmoi and your dotfiles workflow.
# Create a backup with default settings
dots backup
# List all available backups
dots backup --list
# Restore from a specific backup
dots backup --rollback
# Set up automated backups with cron
dots backup --register-cron
# Remove automated backups
dots backup --unregister-cron# Custom backup location
dots backup --backup-dir=/path/to/custom/location
# Custom backup name
dots backup --backup-name=my-custom-backup
# Custom dotfiles directory (if not using default ~/.dotfiles)
dots backup --dotfiles-dir=/path/to/dotfiles
# Custom log file location
dots backup --log-file=/path/to/custom.logThe backup tool creates comprehensive snapshots including:
~/.dotfiles directory~/.config.zshrc, .bashrc, .profile, etc.~/.ssh directory (with permission preservation).gitconfig and related files~/.local/bin contents# Register daily backups at 2 AM
dots backup --register-cron
# This creates a cron job that runs:
# 0 2 * * * /home/user/.local/bin/dots-backup --backup-name=daily_$(date +\%Y\%m\%d)# View current cron jobs
crontab -l
# Remove automated backups
dots backup --unregister-cron
# Check backup logs
tail -f ~/.cache/dots/backup.logdots backup --list
This shows:
# Interactive restoration (shows available backups)
dots backup --rollback
# The restore process:
# 1. Lists available backups with timestamps
# 2. Allows you to select which backup to restore
# 3. Creates a pre-restore backup of current state
# 4. Restores selected backup
# 5. Runs chezmoi apply to sync changesDefault backup location: ~/.dotfiles/backup/
backup/ โโโ dotfiles_backup_20250109_143022/ โ โโโ dotfiles/ # Complete .dotfiles directory โ โโโ configs/ # Applied configurations โ โโโ ssh/ # SSH configurations (encrypted) โ โโโ scripts/ # Custom scripts โ โโโ metadata.json # Backup metadata and checksums โโโ dotfiles_backup_20250108_140000/ โโโ ...
# Backup with GPG encryption (if gpg is configured)
dots backup --encrypt
# Restore encrypted backup
dots backup --rollback --decryptThe backup tool uses these defaults:
~/.dotfiles/backupdotfiles_backup_$(date)/tmp/dots_backup_log_$(date).txtYou can modify the backup script to:
# Edit the backup script
chezmoi edit ~/.local/bin/executable_dots-backup
chezmoi apply# Ensure proper permissions for backup directory
chmod 755 ~/.dotfiles/backup# Exclude large files or directories by editing the script
# Add exclusions for cache directories, logs, etc.# Check backup integrity
dots backup --verify backup_name
# Manual restoration
cp -r ~/.dotfiles/backup/backup_name/dotfiles ~/.dotfiles-restoredIf something goes wrong:
chezmoi diff to see what changedchezmoi apply --dry-run to preview changeschezmoi archive - Create chezmoi-specific archivesdots config-manager - Manage configuration snapshotsdots security-audit - Audit backup securityThe backup system works hand-in-hand with chezmoi to provide comprehensive configuration management and disaster recovery capabilities.
While Chezmoi is a powerful and recommended tool for managing dotfiles across multiple systems, we understand that some users may prefer to maintain their own independent distribution.
[!TIP] This guide helps you eject from chezmoi and take full manual control of your dotfiles โ useful for advanced users or custom workflows.
Chezmoi offers:
But if you no longer wish to use chezmoi, you can safely eject.
Follow the official guide here: ๐ Migrate away from chezmoi
The process includes:
Applying all changes to your home directory:
chezmoi apply
Copying the real files to a new git-tracked directory:
mkdir ~/my-dotfiles
chezmoi managed --include=all | xargs -I {} cp --parents {} ~/my-dotfiles/
cd ~/my-dotfiles && git initRemoving chezmoi from your workflow:
sudo pacman -Rns chezmoi # or appropriate command for your distroNow you're managing your dotfiles fully manually or with your own tooling.
If the answer is โnoโ or โyou want full control,โ ejecting is a valid next step.
Whether you stay with chezmoi or go fully manual, the goal is the same: dotfiles that reflect your ideal workflow. Choose the path that works best for you. ๐ ๏ธ
This section covers the audio production stack installed by HorneroConfig, including DAW, guitar amp simulation, plugins, and Windows VST bridge support.
[!TIP] The full studio stack is installed automatically via chezmoi on Arch Linux. The install script lives at:
home/.chezmoiscripts/linux/run_onchange_before_install-studio.sh.tmpl
The following REAPER files are tracked by chezmoi under home/dot_config/REAPER/:
| File | Description |
|---|---|
reaper-fxtags.ini |
FX plugin tags โ user-curated organization of all plugins |
ProjectTemplates/Basic Vocal Tracking - Linux Scarlett.RPP |
Project template for vocal recording with Scarlett interface |
Everything else in ~/.config/REAPER/ (plugin scan caches, window positions, recent files, license info) is intentionally excluded โ it is either machine-specific, auto-generated, or sensitive.
PipeWire is the foundation of the audio stack. It replaces PulseAudio and JACK while maintaining compatibility with both.
| Package | Role |
|---|---|
pipewire |
Core audio/video server |
pipewire-alsa |
ALSA compatibility layer |
pipewire-pulse |
PulseAudio compatibility layer |
pipewire-jack |
JACK compatibility layer (low-latency audio) |
wireplumber |
Session/policy manager for PipeWire |
pavucontrol |
GTK volume control GUI |
sudo pacman -S pipewire pipewire-alsa pipewire-pulse pipewire-jack wireplumber pavucontrol
systemctl --user enable --now pipewire pipewire-pulse wireplumber[!NOTE] On a fresh install, chezmoi handles package installation but you may need to log out and back in for PipeWire to fully replace PulseAudio.
After logging back in, confirm that PipeWire is serving as the PulseAudio backend:
pactl info
Look for this line in the output:
Server Name: PulseAudio (on PipeWire)If you see PulseAudio (on PipeWire), everything is wired up correctly. Any other value (e.g., plain PulseAudio) means PipeWire is not active โ check that pipewire-pulse is installed and wireplumber is running:
systemctl --user status pipewire pipewire-pulse wireplumber
REAPER is a professional, lightweight, and highly customizable Digital Audio Workstation.
sudo pacman -S reaper
Options โ Preferences โ Audio โ Device.Guitarix is a virtual guitar amplifier running through the JACK audio system.
| Package | Role |
|---|---|
guitarix |
Virtual guitar amp |
gxplugins.lv2 |
Guitarix LV2 plugin set |
sudo pacman -S guitarix gxplugins.lv2
Guitarix connects to the JACK graph. With PipeWire-JACK active, simply launch:
guitarix
Use qpwgraph or helvum to visualize and patch audio connections in the PipeWire graph.
A curated set of open-source LV2 plugins is installed for mixing, mastering, and effects.
| Package | Description |
|---|---|
calf |
Studio-quality LV2 effects (EQ, reverb, compressor, chorusโฆ) |
lsp-plugins |
Linux Studio Plugins โ professional mixing/mastering suite |
lsp-plugins-docs |
Documentation for LSP Plugins |
x42-plugins |
Collection of LV2 plugins by Robin Gareus (meters, MIDI toolsโฆ) |
sudo pacman -S calf lsp-plugins lsp-plugins-docs x42-plugins
yabridge lets you run Windows VST2/VST3 plugins natively in Linux via Wine.
| Package | Role |
|---|---|
yabridge |
Wine-based VST bridge |
yabridgectl |
CLI tool to manage yabridge plugin installations |
yay -S yabridge yabridgectl
Add plugin directories to yabridgectl:
yabridgectl add "$HOME/.wine/drive_c/Program Files/Steinberg/VstPlugins"Sync to generate bridge files:
yabridgectl sync
Verify the setup:
yabridgectl status
[!TIP] Use
yabridgectl sync --pruneto remove bridges for plugins you've uninstalled.
All packages installed by the studio chezmoi script:
# Audio server
sudo pacman -S pipewire pipewire-alsa pipewire-pulse pipewire-jack wireplumber pavucontrol
# DAW + Guitar amp + LV2 plugins
sudo pacman -S guitarix gxplugins.lv2 reaper calf lsp-plugins lsp-plugins-docs x42-plugins
# Windows VST bridge (AUR)
yay -S yabridge yabridgectlWhile these dotfiles are designed to provide a beautiful and personalized setup, privacy and security are just as important. This is an evolving journey โ not a one-time setup โ and weโre always open to suggestions.
[!TIP] You can tailor the security tools and settings to your preferences. All configurations can be automated or versioned using chezmoi where applicable.
Hereโs a list of tools and practices currently in place or under consideration:
yay -Syyu # [I use Arch, btw](https://wiki.archlinux.org/title/Arch_Linux)[!TIP] Consider automating this process with a cron job or alias.
sudo freshclam # Update database
clamscan -r /home/yourusersudo ufw enable
sudo ufw default deny incoming
sudo ufw allow outsudo systemctl enable --now fail2banCheck logs:
sudo fail2ban-client status
If self-hosting or CLI usage is preferred, Bitwarden offers Bitwarden CLI.
[!WARNING] Only recommended if you know your use cases won't be impacted.
sudo nmap -sS -p- 192.168.1.1 rustscan -a 192.168.1.1
Use for auditing your local network or spotting unknown open ports.
# Run complete security audit
dots security-audit
# Run specific checks
dots security-audit --permissions # Check file permissions only
dots security-audit --secrets # Scan for exposed secrets only
# Apply automatic security fixes
dots security-audit --fix
# Generate detailed security report
dots security-audit --reportWhat it checks:
[!TIP] Run
dots security-auditmonthly or after major configuration changes to maintain good security hygiene.
update-all)Security is an ongoing practice โ start with the basics, stay informed, and evolve over time ๐
This section contains documentation related to hardware configuration and troubleshooting in your dotfiles setup.
This section will be expanded to include documentation for:
If you have experience with specific hardware configurations or troubleshooting steps, please consider contributing to this documentation. See the Contributing Guide for more information.
This guide provides comprehensive troubleshooting steps for NVIDIA-related issues on Arch Linux, including driver installation, hybrid GPU setups, and solutions for common problems such as black screens or GPU conflicts.
The open-source nouveau driver can conflict with the proprietary NVIDIA driver. To disable it:
Create a modprobe blacklist file:
sudo nano /etc/modprobe.d/blacklist-nouveau.conf
Add the following lines:
blacklist nouveau
options nouveau modeset=0Regenerate the initramfs:
sudo mkinitcpio -P
Reboot:
sudo reboot
nvidia and nvidia-dkms| Package | Description | Use When... |
|---|---|---|
nvidia |
Precompiled for stock Arch kernel | You're using the standard linux kernel |
nvidia-dkms |
Builds driver per installed kernel (via DKMS) | You're using linux-lts, zen, or custom kernels |
Installation examples:
# For standard kernel
sudo pacman -S nvidia
# For DKMS version
sudo pacman -S nvidia-dkmsCheck NVIDIA modules:
lsmod | grep nvidia
Check Xorg logs:
cat /var/log/Xorg.0.log | grep nvidiaConfirm kernel parameters:
cat /proc/cmdline
Ensure nvidia-drm.modeset=1 is passed:
/etc/default/grub and run sudo grub-mkconfig -o /boot/grub/grub.cfg--cmdline 'nvidia-drm.modeset=1' in your mkinitcpio.presetCheck current outputs:
xrandr
Try enabling the internal panel:
xrandr --output eDP-1 --auto
Open NVIDIA Settings GUI:
nvidia-settings
[!TIP] This usually happens if the internal display is wired through the Intel iGPU and
i915was blacklisted.
Check OpenGL status:
glxinfo | grep "OpenGL renderer"Ensure nvidia-utils and mesa are installed.
Configure Hyprland for optimal NVIDIA performance
Check:
nvidia-smi lsmod | grep nvidia journalctl -b | grep -i nvidia
Ensure nvidia-persistenced is running if needed:
systemctl status nvidia-persistenced
# Check which GPUs are present
lspci -k | grep -A 2 -E "(VGA|3D)"
# Verify modules
lsmod | grep -E 'nvidia|nouveau|i915'
# GPU renderer info
glxinfo | grep "OpenGL renderer"
# Display detection
xrandr
# NVIDIA status
nvidia-smi
nvidia-settings
# Kernel log
journalctl -b | grep -i nvidiaIf your laptop uses both an integrated Intel GPU and a dedicated NVIDIA GPU:
Install required packages:
sudo pacman -S nvidia nvidia-utils nvidia-settings xf86-video-intel mesa
Create /etc/modprobe.d/nvidia.conf:
options nvidia-drm modeset=1For GRUB: edit /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="quiet nvidia-drm.modeset=1" sudo grub-mkconfig -o /boot/grub/grub.cfg
For systemd-boot with UKI:
--cmdline 'nvidia-drm.modeset=1' to your preset in /etc/mkinitcpio.d/linux.presetThen regenerate:
sudo mkinitcpio -p linux
Optional Xorg config:
sudo nano /etc/X11/xorg.conf.d/10-hybrid.conf
Section "Device"
Identifier "Intel Graphics"
Driver "modesetting"
BusID "PCI:0:2:0"
Option "TearFree" "true"
EndSection
Section "Device"
Identifier "NVIDIA"
Driver "nvidia"
BusID "PCI:1:0:0"
Option "AllowEmptyInitialConfiguration"
EndSectionIf you're stuck on a black screen or SDDM doesn't appear:
# Switch to TTY
Ctrl + Alt + F2
# Check for blacklisted Intel
ls /etc/modprobe.d/
# Remove i915 blacklist if present
sudo rm /etc/modprobe.d/blacklist-intel.conf
# Rebuild initramfs
sudo mkinitcpio -P
# Reboot
sudo rebootWhen your external monitor is connected directly to the NVIDIA HDMI port, it creates a Reverse PRIME situation:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ โ Intel iGPU (renders everything) โ โ โ โ โ โโโโบ eDP-1 (laptop) โ Direct โ โ โ โ โ โโโโบ [Frame Copy] โโโบ NVIDIA dGPU โ โ โ โ โ โโโโบ HDMI-A-5 โ โ (external) โ โ โ โ Overhead: ~5-15ms latency per frame copy โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Advantages:
prime-runDisadvantages:
When to use:
Change to have NVIDIA render everything (including compositor).
Required configuration:
# In environment.conf, change to:
env = LIBVA_DRIVER_NAME,nvidia
env = GBM_BACKEND,nvidia-drm
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = WLR_NO_HARDWARE_CURSORS,1
# Remove:
# env = __NV_PRIME_RENDER_OFFLOAD,1Advantages:
Disadvantages:
When to use:
Use different profiles depending on usage:
# Already configured - uses Intel for compositor
hyprctl reload# Script to temporarily switch to NVIDIA primary
prime-run hyprland # Or configure separate Hyprland sessionYour system is configured for Option 1 (Optimized Reverse PRIME):
environment.conf__NV_PRIME_RENDER_OFFLOAD variables activemonitors.conf# See active GPU for Hyprland
hyprctl systeminfo | grep -i "gpu"
# Or verify processes:
nvidia-smi # Check if Hyprland appears here# On external monitor, move windows quickly
# Feel if there's noticeable lag vs laptop screen# See power consumption
cat /sys/class/power_supply/BAT*/power_now
# Lower number = better (values in ยตW)
# See NVIDIA GPU usage
nvidia-smi dmon# Uncomment in environment.conf:
env = WLR_NO_HARDWARE_CURSORS,1prime-run or launch games with NVIDIA variablesSolution: Switch to NVIDIA primary (Option 2)
Solution: Enable WLR_NO_HARDWARE_CURSORS,1
Solution:
# Kill persistent NVIDIA processes
sudo systemctl restart display-managerSolution:
# In hyprland.conf, verify:
misc {
vrr = 1 # Variable Refresh Rate
no_direct_scanout = false
}# See active GPUs
lspci | grep -E "VGA|3D"
# See processes using NVIDIA
nvidia-smi
# See monitors in Hyprland
hyprctl monitors
# See DRM outputs
drm_info | grep -A5 "Connector"
# See which GPU a specific window uses
hyprctl clients | grep -A10 "class:"
# Launch specific app on NVIDIA
prime-run <app>
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia <app>NVIDIA GPUs have different performance states (P-states):
| P-State | Mode | Power Usage | Use Case |
|---|---|---|---|
| P0 | Maximum Performance | ~50-55W | Gaming, Heavy Compute |
| P2 | Balanced | ~20-30W | Video Editing |
| P5 | Low Power | ~5-10W | Display Output Only |
| P8 | Idle (not achievable with display) | ~1-2W | No display connected |
In Reverse PRIME mode with external monitor, NVIDIA stays at P5 (5W) minimum.
Use prime-run to force full NVIDIA:
prime-run steam prime-run lutris prime-run godot
Create profile switching scripts for different scenarios:
~/.local/bin/dots-gpu-mode-battery#!/usr/bin/env bash
# Switch to battery-optimized mode (Intel primary)
# Copy environment.conf with Intel settings
# Reload Hyprland
hyprctl reload
notify-send "GPU Mode" "Switched to Battery Mode (Intel primary)"~/.local/bin/dots-gpu-mode-performance#!/usr/bin/env bash
# Switch to performance mode (NVIDIA primary)
# Copy environment.conf with NVIDIA settings
# Reload Hyprland
hyprctl reload
notify-send "GPU Mode" "Switched to Performance Mode (NVIDIA primary)"This section provides guidance for managing and configuring your network setup using NetworkManager, with custom dotfiles support.
[!TIP] Like everything else in this setup, the Network Manager integration is fully customizable. You can configure connections, UI tools, and even define shortcuts or scripts โ all managed through your dotfiles and
chezmoi.
Depending on your preference, you can use either graphical or terminal-based tools for managing networks:
nmtui โ TUI interface (Text-based User Interface)nmtui
Use this for:
nmcli โ Command-line Interfacenmcli device wifi list nmcli device wifi connect <SSID> password <password>
Use this for scripting, automating, or managing networks programmatically.
network-manager-applet โ GUI tray iconIf you're running a system tray (e.g., via Waybar), you can use the applet to manage Wi-Fi and VPNs.
Install:
sudo pacman -S network-manager-applet # Arch-basedWhile network configurations aren't typically stored directly in the dotfiles, you can:
You can version any helper script or autostart command using chezmoi:
chezmoi edit ~/.config/autostart/network-helper.sh
Hereโs an example nmcli script that you can store in ~/.local/bin/connect-home-wifi.sh:
#!/bin/bash
nmcli device wifi connect "HomeWiFi" password "yourpassword"Make it executable:
chmod +x ~/.local/bin/connect-home-wifi.shAdd it to your chezmoi config or call it from a keybinding.
Useful nmcli commands:
nmcli general status nmcli device nmcli connection show journalctl -u NetworkManager.service
Take control of your network configuration with tools that match your workflow โ whether it's terminal, GUI, or automation! ๐ก
Thank you for considering contributing to Dotfiles! We appreciate your interest in improving the project. To ensure a smooth and collaborative contribution process, please review the following guidelines.
Before making any changes or submitting a pull request, we recommend discussing your proposed changes with the repository owners. This can be done through creating an issue, sending an email, or any other method of communication that suits you. Engaging in a discussion beforehand helps ensure that your contributions align with the project's goals and guidelines.
Please note that Dotfiles has a Code of Conduct that we expect all contributors to adhere to. Kindly follow the code of conduct in all your interactions within the project community.
You can contribute to Dotfiles in various ways, including:
To contribute through a pull request, please follow these steps:
It's essential to separate new features or improvements into separate feature branches and submit a pull request for each branch. This allows us to review and merge new contributions individually, ensuring better visibility and management of changes.
When writing code for Dotfiles, please adhere to the following guidelines:
"${variable}") instead of bare variables ($variable).UPPER_CASE for constants and global variables, and lower_case for other variables.[ condition ]) for conditionals, such as in 'if' statements.setup-<function> without file extensions..sh extension for libraries and exclude the shebang line.shellcheck.Thank you for considering these guidelines when contributing to Dotfiles. Your efforts contribute to the project's quality and overall success. Happy coding!
Whether you're looking to contribute to the Dotfiles project or simply want to preview how everything looks before applying it to your system โ we've got you covered with dedicated testing environments.
[!TIP] The testing setup allows you to experiment safely without affecting your real configuration. Itโs a perfect playground for customizing themes, scripts, and behaviors.
To learn how to set up the test environments, check out the official Testing Docs.
These docs include:
You can try out:
๐ Use this environment as a sandbox โ test safely and iterate freely.
chezmoi apply --dry-run to simulate changes before applyingContributing or customizing just got easier. Jump into the testing environment, play around, and see how everything fits your workflow โ worry-free!
This page documents all major improvements, new features, and updates to the HorneroConfig dotfiles framework throughout 2025.
The biggest update to the smart colors system since its inception! The system now automatically detects whether your theme is light or dark and adapts ALL colors accordingly.
New Features:
Color Adaptation Examples:
# Dark Theme (background: #011936)
info: #00dddd # Bright cyan for better contrast
success: #55dd55 # Bright green for visibility
warning: #ffaa00 # Bright orange for attention
# Light Theme (background: #f0f0f0)
info: #0066cc # Deep blue for readability
success: #008800 # Dark green for comfort
warning: #cc6600 # Dark orange for subtletyAdded background and foreground variants for better UI consistency:
background: Primary background colorbackground-alt: Secondary/accent background (usually color1)foreground: Primary text color (theme-optimized)foreground-alt: Secondary text color (usually color5)Usage:
# Get new concepts
dots-smart-colors --concept=background-alt
dots-smart-colors --concept=foreground-alt
# All available in generated files
~/.cache/dots/smart-colors/colors.sh
~/.cache/dots/smart-colors/colors-waybar.cssUpdated --analyze and --colors commands now show the new concepts:
dots-smart-colors --analyze --colors
New Output Sections:
# Smart floating script integration
```confHyprland Floating Window Configuration:
# Hyprland floating window rules are configured in hyprland.conf# Global floating window constraints floating_minimum_size 400 x 300 floating_maximum_size 1400 x 900
# Automatically calculates optimal dimensions
width = screen_width ร 70%
height = screen_height ร 65%
# Examples:
1920ร1080 โ 1344ร702 floating window
2560ร1440 โ 1400ร900 (limited by max constraint)
1366ร768 โ 956ร499 floating windowUse Cases:
All smart color files now include the new background/foreground variants:
Updated Files:
~/.cache/dots/smart-colors/colors.sh - Shell variables~/.cache/dots/smart-colors/colors.env - Environment exports~/.cache/dots/smart-colors/colors-polybar.conf - Polybar integration~/.cache/dots/smart-colors/colors-eww.scss - EWW widgets~/.cache/dots/smart-colors/colors-i3.conf - i3 window managerNew Wiki Pages:
Updated Wiki Pages:
Better Developer Experience:
Enhanced User Experience:
Smart Colors System:
Window Management:
Overall Framework:
This changelog represents the continuous evolution of HorneroConfig, focusing on intelligent automation, visual excellence, and enhanced user experience. Each update builds upon the hornero bird philosophy: creating robust, functional, and beautiful environments. ๐ โจ
You might be here looking for (Linux) rice reference or to (full?) replicate my personal configuration of my favorite Window Managers and several apps as well. โ
HorneroConfig is your artisanal toolkit for crafting the perfect digital workspace. Named after the industrious hornero bird, renowned for its skillful nest-building, our framework empowers you to construct a robust, functional, and personalized computing environment.
Perfectly suited for a wide array of Desktop Environments and Window Managers, HorneroConfig thrives across different platforms including GitHub Codespaces, Gitpod, VS Code Remote - Containers, or even Linux distributions that are not Arch Linux.
Backed by the versatile Chezmoi, HorneroConfig stands out as a dotfiles manager that adapts flexibly to your needs, streamlining machine setup and ensuring consistency across devices. Embrace the spirit of the hornero, and let HorneroConfig transform your configurations into a harmonious blend of elegance and efficiency.
Most were written from scratch. Core stack:
dots-wallpaper-set





HorneroConfig automatically configures the Chaotic-AUR repository during installation. This provides:
The repository is configured automatically by the chezmoi script at:
home/.chezmoiscripts/linux/run_onchange_before_install-000-chaotic-aur.sh.tmpl
For more information, visit the Chaotic-AUR documentation.
dots is the unified entrypoint for Hornero scripts.
dots --help
dots --list
dots <script> [options]dots-quickshell ipc launcher toggledots launcher dots launcher --backend=quickshell
dots-quickshell ipc utilities togglecliphist terminal pickercopyqdots clipboard dots clipboard --backend=copyq dots clipboard --backend=cliphist
dots-quickshell ipc session toggledots power-menu dots power-menu --mode=quickshell dots power-menu --mode=minimal
utilitiesdots settings-gui
less)dots keyboard-help dots keyboard-help --search=workspace
dots appearance list dots appearance current dots appearance apply neon-city dots appearance set-variant vibrant dots appearance set-mode dark
scheme.json~/.cache/dots/smart-colors/dots smart-colors --generate --m3 dots smart-colors --concept=error
dots wal-reload
wpg -s when availabledots wallpaper-set /path/to/wallpaper.jpg
dots rice remains available as legacy-compatible naming; dots appearance is the canonical contract.dots-* scripts remain modular and can be called directly.The rice system is now managed through the Quickshell-first appearance workflow.
dots appearance list dots appearance current dots appearance apply neon-city dots appearance set-variant vibrant dots appearance set-mode dark dots appearance set-wallpaper /path/to/wallpaper.jpg
dots rice ... is retained as compatibility naming, but dots appearance ... is the canonical interface.
Appearance changes done from the control center can be previewed first, then committed with Apply/Save.
flowchart LR
user[UserSelectsAppearance] --> preview[QuickshellPreview]
preview --> apply[ApplyOrSave]
apply --> cli[dots-appearanceApply]
cli --> palette[dots-smart-colorsAndScheme]
palette --> shell[QuickshellReload]Rices live under:
~/.local/share/dots/rices/<rice-name>/
Typical files:
config.shexecutable_apply.shbackgrounds/preview.*Smart Colors generates semantic colors and Material Design 3 palettes from the current wallpaper, then keeps Quickshell synchronized.
~/.cache/dots/smart-colors/scheme.json.dots-wal-reload and dots-wallpaper-set trigger palette refresh and Quickshell IPC reload.wpg -s <image> -> wpg.conf runs dots-wal-reload and refreshes shell colors.wpg and global reload orchestration.The direct pipeline could desynchronize ~/.config/wpg/.current from shell/runtime state and miss some app reloads that are centralized in dots-wal-reload.
dots-wallpaper-set as the single entrypoint for wallpaper changes from shell UI/actions.wpg is available, dots-wallpaper-set delegates to wpg -s so wpgtk remains source-compatible.~/.local/state/dots/wallpaper/path (canonical persistent pointer; respects DOTS_STATE_DIR / XDG_STATE_HOME)~/.cache/wal/wal (pywal)~/.config/wpg/.current (optional, when using wpgtk)dots-smart-colors --generate --m3 dots-smart-colors --analyze dots-smart-colors --concept=error dots-wal-reload
All generated files are written to ~/.cache/dots/smart-colors/.
Core files:
scheme.json (Quickshell M3 palette)colors.sh (shell variables for scripts)colors.env (export-friendly environment file)colors-hyprlock.env (lockscreen integration)colors-kitty.conf (terminal integration)colors.css (generic CSS variables)Compatibility files may exist for external tooling, but they are not part of the primary UX contract.
flowchart LR
wallpaper[WallpaperChange] --> set[dots-wallpaper-set]
set --> wal[dots-wal-reload]
wal --> smart[dots-smart-colorsGenerate]
smart --> scheme[schemeJson]
scheme --> colours[QuickshellColoursService]
colours --> ui[QuickshellUIUpdated]# Rebuild smart-colors cache
dots-smart-colors --generate --m3
# Confirm cache files exist
ls -la ~/.cache/dots/smart-colors/
# Force shell-side reload path
dots-quickshell ipc colours reload