All notable changes to this project will be documented in this file.
PATH setup in .zshenv, with user binaries taking precedence consistently in login, interactive, and nested shells..zprofile, restrict Fastfetch to top-level terminals, and cap saved command history at 100,000 entries./etc/profile.d in every interactive shell and remove redundant completion, color, path, and editor initialization.mtail to follow multiple files or quoted glob patterns with filename prefixes. It scans for new matches every second and uses tail -F to handle rotation and recreation. Ctrl+C cleans up its followers and temporary files without closing the calling shell.env-hyprland. UWSM now sets the session's XDG_* variables.nm-applet through XDG autostart outside KDE and GNOME.pavucontrol with a right click.multilib repository and each AUR package that fails to install.paru or yay, or offer to build yay-bin as a regular user after installing its official build dependencies.sudo, and multilib setup.fadeIn animation setting for Hyprlock 0.9.6.playerName and use the Nerd Font Firefox glyph.install works when invoked outside the dotfiles directory.pacman, sudo, and credentials before installing packages. If the user declines the AUR helper, skip AUR packages instead of sending their names to pacman._yay completion symlink; ignore them when generated locally.razer-cli option instead of silently treating the device-selection option as a DPI change.localconfig.vdf after writing a durable temporary file, keeping a backup of the previous file and avoiding truncated Steam configuration files after an interrupted save.hosts/PadsTower.lua and hosts/PadsP5560.lua into a new shared hosts/common.lua.hypridle.conf) into a shared is-host.sh helper, reusable by any future host-conditional listener.hyprtoolkit.conf, hyprlock.conf, .config/mako/config, waybar/style.css and .tmux.conf with cross-referencing comments, so future theme edits don't silently drift out of sync.if [ $(command -v x) ] guards now use command -v x &>/dev/null throughout, and mixed function foo {} declarations now use foo() {} consistently across zsh/functions/*.zsh.rehash calls in .zshrc into one, run once after all PATH mutations.gpg --trust-model always in crypt.zsh (kept deliberately; skips the web-of-trust check).set -uo pipefail to bin/diff-cmd and bin/vscodium_ext.sh.single_queue from VKD3D_CONFIG (a hang workaround for older vkd3d-proton releases that serializes GPU queues and costs performance), and remove the untested SDL_VIDEODRIVER=x11 and WINEDLLOVERRIDES entries, which had no observed effect on the current Proton stack._GTA_PROFILE.UserLocalConfigStore → apps VDF path traversal (duplicated across get_app_entry, get_app_entry_safe, and the installer's launch-options reader) into a single get_apps_dict() helper.NotificationCollector's duplicated __init__/start reset logic into a shared _reset().icon parameter (1/0/3/None) on log_msg with an explicit notify boolean.elif chain that silently dropped fragments when several applied at once.bin/ exclusion in .pre-commit-config.yaml to just bin/steam-optimize (pending a dedicated formatting pass); bin/razer_dpi.py is now PEP8/black-compliant and linted.bin/hypr-screenshot.sh, comcut, comskip.sh, diff-cmd and vscodium_ext.sh in the README's Custom Scripts section, and mention dist/*_excludes.txt next to backup.sh.v3.0 release notes to CHANGELOG.md, reconstructed from git log v2.1..v3.0, and correct/clarify which older entries are retrospective summaries.hypridle.conf). The suspend listener had no on-resume, so the monitors stayed off after wake.history alias always falling back to the default format (zsh/init/history.zsh, .zshrc): HIST_STAMPS was exported in .zshrc after init.zsh had already sourced init/history.zsh and built the alias from it, and the exported value (a strftime pattern) never matched the alias's keyword-based case. Export HIST_STAMPS/HISTFILE/HISTSIZE/SAVEHIST before sourcing init.zsh, and support arbitrary strftime patterns via fc -t, removing the now-redundant duplicate history block from .zshrc.http_time into curl_time (zsh/functions/http_checks.zsh, curl.zsh). The two were near-identical CURL_FORMAT timing helpers, and http_time mislabeled curl's %{time_*} values (always seconds) as milliseconds. http_time is now an alias to the corrected curl_time.make screenshot writing a WebP file named hyprland-showcase.png at the repo root instead of dist/hyprland.webp (Makefile). The default SCREENSHOT path didn't match hypr-screenshot.sh's own default output, which always encodes WebP regardless of the given extension.bin/comcut's lockfile handling: the acquire loop was check-then-touch (racy under concurrent invocations) and never released the lock on error or signal, permanently deadlocking future runs after a crash. Acquire the lock atomically (noclobber) and release it via an EXIT trap.bin/comcut silently continuing after a failed comskip/ffmpeg invocation, which could produce a corrupted or partial output with no error reported. The relevant calls now abort the script on failure.bin/comskip.sh forwarding an unset argument to comcut instead of failing with a usage message.bin/razer_dpi.py always exiting 0, even when no compatible mouse was found or every DPI write failed, hiding failures from callers (e.g. a systemd unit). It now exits 1 when nothing succeeded.SIGTERM/SIGHUP handler blocking indefinitely if the game process ignored terminate(); it now falls back to kill() after a 10s timeout.-a/--app-id to force the AppID used for game-profile lookup and log tagging. Non-Steam game shortcuts report a generic SteamAppId (e.g. 480/Spacewar) instead of the real store AppID, silently skipping the matching GAME_PROFILES entry. The override never touches the real SteamAppId env var inherited by the game process: forcing it to either the real store AppID or the shortcut's own internal AppID both crashed a Forza Horizon 6 non-Steam shortcut during CoreCLR startup. Any value other than Steam's own default breaks it, for a reason still unclear. This also means Steam Input can't find the shortcut's controller config, which keys off the same env var and is stuck on Spacewar's empty one; no fix found for that yet.-g/--no-gamescope to skip the Gamescope wrapper entirely, for diagnosing whether a game's issue comes from Gamescope itself. Add a matching per-game no_gamescope profile flag._FORZA_PROFILE. Its crash-on-launch and black-screen-with-audio symptoms had several independent causes, each requiring its own override: a forced VKD3D_CONFIG (FH5's no_upload_hvv, the community enable_experimental_features,descriptor_heap workaround, or AMD_ENV_VARS' global dxr default) crashes FH6 during CoreCLR startup on RADV on every Proton build tested except proton-cachyos; COMMON_ENV_VARS' PROTON_ENABLE_WAYLAND native-Wayland renderer and AMD_ENV_VARS' experimental RADV_PERFTEST/ENABLE_LAYER_MESA_ANTI_LAG each independently produce a black screen with audio still running; Gamescope itself produces the same black screen even with no forced resolution/output, and must be skipped entirely (known tradeoff: the game's own exclusive fullscreen then doesn't render under Hyprland either, so use windowed mode in-game instead); and PROTON_FSR4_*_UPGRADE injects an FSR4 upscaling shim that flickers green pixels on this title (a stale/corrupt ~/.cache/mesa_shader_cache entry turned out to be the real cause of that last one, not the env var). FH6's profile now pops the driver overrides, skips Gamescope, keeps Steam Input on (its 8BitDo XInput translation is required, though it doesn't auto-activate for this shortcut and needs a manual overlay toggle on every launch, likely tied to the same SteamAppId issue), sets only PROTON_SET_GAME_DRIVE=1, and requires proton-cachyos as the compat tool.zsh/functions/rambox.zsh: hardcoded dnf/rpm for Fedora/CentOS, dead on this Arch-based setup.gen_pages.py) linking Home / Changelog / Installation / CI Workflows / GitLab CI, with the current page highlighted and links resolved relatively so the site works under a subpath.gen_pages.py) and homogenize the icon style across all docs (README, changelog, install guide, and both CI READMEs)..github/workflows/README.md documenting the workflows, the shared .ci_bin/ scripts, and the multi-forge (GitHub/GitLab/Gitea) setup, and publish it to the docs site (mirroring its source path) via build_pages.sh..gitlab/README.md documenting the GitLab CI pipeline (stages, jobs, the pages build-vs-deploy rules, and the shared .ci_bin/ scripts), and publish it to the docs site (mirroring its source path) via build_pages.sh. build_pages.sh also writes a .nojekyll marker so GitHub Pages serves the dot-directory pages verbatim.README.md summarising the multi-forge (GitHub/GitLab/Gitea) setup and linking to both CI READMEs.GITHUB_TOKEN, OIDC, CI_JOB_TOKEN) are auto-provided, so no manual secrets are required; note the GitHub Pages / Gitea Actions one-time setup prerequisites.dist/hyprland.webp) as a hero illustration at the top of README.md, and refresh the Neovim feature list (treesitter main/Neovim 0.12, LSP LspAttach keymaps, gitsigns hunk/blame keymaps).hypridle.conf). hypridle has no per-host mechanism, so the listener guards on the hostname; the laptop keeps its lock/DPMS-only behaviour.SUPER + PgUp/PgDn (Home resets), driven via hyprctl eval + hl.config since the Lua parser disables hyprctl keyword, with an animated zoomFactor. Keyboard binds are used because Hyprland scroll binds leak the scroll event to the focused window (#9319).neovim and tree-sitter-cli to the Arch package list (dist/arch/packages/20_apps.txt). neovim was missing from the curated lists, and the nvim-treesitter main branch compiles parsers through the tree-sitter CLI (the master branch built them directly with cc).LspAttach autocmd (lsp.lua): gd/gD/gi (definition/declaration/implementation), <leader>e (diagnostic float) and <leader>lf (format), complementing Neovim 0.11's built-in grn/gra/grr/K. The LSP was previously configured but had no bindings.on_attach (editor.lua): ]c/[c to navigate hunks, <leader>gs/gr/gp/gd to stage/reset/preview/diff, and <leader>gb to toggle inline blame..tmux.conf), aligned with waybar, gruvbox.nvim and hyprtoolkit, replacing the solarized plugin (seebi/tmux-colors-solarized) and a dead powerline include (hardcoded python3.7 path, powerline not installed). Also enable true color (tmux-256color + RGB terminal override).deploy-pages.yml (GitHub) and the pages job (GitLab) by calling the reusable .ci_bin/build_pages.sh script instead of duplicating the gen_pages.py invocations, keeping the page list in a single source of truth. Made build_pages.sh POSIX sh and git-optional so it runs on minimal CI images (GitLab alpine).dist/hyprland.webp README showcase image) into public/, mirroring their source path, so relative src links resolve on both GitHub Pages and GitLab Pages (build_pages.sh)..ci_bin/extract_release_notes.sh script, removing the duplicated sed logic.release.yml forge-agnostic: create the release through the REST API (POST /repos/{owner}/{repo}/releases via jq/curl) instead of the gh CLI, so the same workflow runs on both GitHub and the Gitea runner (which also scans .github/workflows).deploy-pages.yml) and Vim-package (package-vim.yml) workflows with if: github.server_url == 'https://github.com' so they don't run on the Gitea runner.bg-dark, and limit heading dividers to h1/h2 to reduce visual clutter.bin/hypr-screenshot.sh) as a web-optimised WebP (lossy, q80 via WEBP_QUALITY, max compression effort) instead of PNG. grim writes a temporary PNG that is re-encoded with the first available encoder (cwebp/magick/convert/ffmpeg).hyprtoolkit.conf (gtk_theme) instead of hardcoding Materia-dark-compact in config.lua, keeping a single source of truth for theming.spring curve easy) and align the full animation tree with Hyprland's upstream example, adding dedicated layers/fadeLayers animations for layer-shell surfaces (launcher, notifications, Waybar) and a popin effect on windowsIn.bitdepth override on the ASUS XG32WCS monitor (PadsTower), reverting to the default depth.cmd = "Telescope") and gitsigns (event = "VeryLazy") instead of loading them at startup (editor.lua).foldmethod/foldexpr out of the global options.lua into the per-filetype FileType autocmd in treesitter.lua, so folding is only set where a parser is actually started (alongside highlight/indent).mason-org/mason.nvim and mason-org/mason-lspconfig.nvim (the repos moved org), and drop the redundant manual vim.lsp.enable("lua_ls") now that mason-lspconfig's automatic_enable handles it (lsp.lua).current_line_blame to off (toggle via <leader>gb) instead of always-on inline blame (editor.lua).nvim config.hyprland.lua, hyprctl dispatch evaluates its arguments as Lua (hl.dispatch(...)), so the legacy dpms off / workspace e+1 syntax failed with a parse error. hypridle.conf now dispatches hl.dsp.dpms("off"/"on") and waybar/conf/workspaces.json uses hl.dsp.focus({ workspace = "e±1" }).~/.config/* entries by enabling backups and directory creation instead of forcing removal.sed regexes.build_pages_review job so non-default branches build docs without using the special pages deployment job.wlogout reboot/shutdown/logout actions to avoid bypassing application save prompts./tmp paths.headsetcontrol helper referenced by the audio module.bash, and remove shebangs from sourced/non-executable shell files so pre-commit executable checks pass.uwsm startup in .zshrc and avoid running tty from .zshenv for non-interactive shells.git clone … ./install install snippet leaking :::sh). gen_pages.py now extracts every fenced block, dedents it, and renders it with Pygments before Markdown conversion, so in-list code blocks display correctly with highlighting.dracula, scoped to .codehilite) to the generated stylesheet. Code blocks were emitting token spans with no matching CSS, so they rendered monochrome.nav[data-toggle='toc'] but the element is <nav id="toc">, so they are now keyed on #toc.z-index) so it no longer slides over the menu when scrolling.actions/upload-pages-artifact strips .git/.github from the deployed tarball, so the page generated under public/.github/workflows/README.md/ was never published. It is now published under public/github/workflows/README.md/ (leading dot dropped), with the site nav (gen_pages.py) and README updated to match.dist/arch/install.md with languages (sh, text, ini) so they get syntax highlighting, and wrap the previously unfenced shell snippet in the Sound section in a fenced block.README.md) under Neovim 0.12: Decoration provider "start" … attempt to call method 'range' (a nil value). The pinned nvim-treesitter master branch is frozen at Neovim 0.10/0.11 support; migrate treesitter.lua to the main branch (require('nvim-treesitter').install() + vim.treesitter.start() via a FileType autocmd) which supports Neovim 0.12, restoring Markdown highlighting.post-commit hook (via pre-commit) that regenerates the local public/ documentation preview after each commit, backed by a reusable .ci_bin/build_pages.sh script also usable in CI.borderangle animation.logout_dialog only, removing unused swaync entries.hyprlauncher in daemon mode (-d) at autostart for instant toggle via keybind.layout.lua into appearance.lua, inline utils.lua helpers, delete empty workspaces.lua, and remove verbose comment banners across all files (~75% noise reduction).pkill wlogout || wlogout by removing the dead Quickshell (qs/$qsConfig) branch, since Quickshell is not installed.SUPER+SHIFT+F float-toggle binding (kept on SUPER+ALT+Space).node.passive) on echo-cancel module to reduce CPU usage when mic is idle.config.PadsTower, config.PadsP5560). Desktop omits battery, backlight, and Intel temperature modules.custom/weather) configuration.#custom-spotify/#custom-weather CSS selectors.base16-material-darker-256 theme under themes/ and drop the 2 MB base16-alacritty submodule.gtk-application-prefer-dark-theme to true, align icon theme to Papirus-Dark and cursor to Adwaita to match Hyprland settings.colors.css that conflicted with the dark theme.awww.service enablement in default.target.wants (already in graphical-session.target.wants).install.conf.yaml.trap '… show_cursor' EXIT) and drop the obsolete xrdb/.Xresources reload step from apply_live_changes.xdg-dirs/ files to standard .config/ root location for xdg-user-dirs-update compatibility.compinit dump and only rebuild it (with the security audit) once a day, reusing it with -C otherwise to speed up shell startup; remove a duplicate single-ignored completion zstyle.diff-cmd ([ -z "$3" ]) and remove a dead meld comment line.gen_pages.py by removing redundant public/-prefixed branches that duplicated the generic depth-based formula.1140px container; remove a stray non-project comment block from style.css.style.css in gen_pages.py: collapse inter-tag whitespace (preserving <pre>/<code>/<script> content) and strip CSS comments/whitespace (~36% smaller CSS); drop the now-unused shutil import..gitmodules entries left over from the i3/X11 era: zsh-notify, i3blocks-contrib, i3spotifystatus, gruvbox-rofi, and base16-alacritty..Xresources and .screenrc (byobu/screen) leftovers on the all-Wayland setup.hyprpaper.conf (wallpapers are handled by awww).modules/headsetcontrol, modules/spotify, modules/mediaplayer.py). headsetcontrol is superseded by the inline exec in audio.json.network module config from conf/network.json and its CSS: it duplicated the nm-applet tray indicator.hyprlauncher support as the primary desktop application launcher and clipboard history picker..config/hypr/include/ to encapsulate configuration loading (toolkit.lua), host configuration loading (host.lua), and core layout/utility helpers (utils.lua).hyprtoolkit.conf to configure global hyprtoolkit aesthetics matching the Gruvbox colorscheme (using 0xAARRGGBB hex color format).stylua.toml to support local code validation.Shift+Return keyboard binding to send escape sequence for improved terminal compatibility.hyprtoolkit.conf with automatic hex format translation and fallbacks..config/hypr/conf/input.lua, .config/hypr/conf/layout.lua, .config/hypr/conf/appearance.lua) to eliminate duplicate config parameters and structural redundancy..config/hypr/conf/keybindings.lua by lifting hardware keycode allocations out of loops and extending support to a 10th workspace mapped to key 0 and numpad 0.hypridle DPMS commands to use proper hyprctl dispatch dpms on/off syntax instead of invalid Lua dispatch calls.hyprlock comment and playerctlock.sh messages and usage output.vim.loop to vim.uv API, consolidate backup/writebackup options removing redundant swap directory setup, and change nvim-cmp confirm behavior to not auto-select the first completion item.spotify module string comparison, variable quoting, icon, and JSON output (now uses jq); fix headsetcontrol shebang to bash..zshrc with proper variable quoting, remove duplicate compinit call, remove bash-specific HISTCONTROL/HISTIGNORE variables, and fix fastfetch detection using command -v.arch.zsh to improve error handling and command checks.--ozone-platform-hint=auto flag from Chrome/Electron configuration, keeping explicit --ozone-platform=wayland.bash, use $XDG_RUNTIME_DIR for SSH control socket, and change yay -Scc to yay -Sc to preserve non-package caches.comcut, replace eval with safer bash -c in diff-cmd, and simplify DPI logic in razer_dpi.py.SIGTERM/SIGHUP) and atexit cleanup for robust session teardown, propagate game exit code, track mouse DPI changes, add gamescope/game-performance availability checks, factor shared Forza Horizon profile, defer DND activation until after startup, create .bak backups before writing VDF configs, and specify utf-8 encoding on all file operations.install script for improved reliability, safer path expansion, headless TTY checking, and optimized package installation caching..config/wofi) and package installer entries..config/kanshi/config).xautolock.service unit file.hibernate-hover1.png, moon_865813.png, sleep2.png).apply_live_changes) to dynamically rebuild font cache, reload X resources (xrdb), and refresh desktop environments (Mako, Waybar).backup.sh to query loaded keys via ssh-agent rather than relying on hardcoded private key paths, exclude Lutris runner files, prune deprecated .localised exclude pattern, and translate logs from French to English.dist/ubuntu/install.sh) and related documentation.command-not-found shell plugin and its assets from .zshrc and plugin directory.proton-pass-ssh-agent.service systemd user service to manage the Proton Pass SSH agent.pass-cli Zsh autocomplete plugin.zsh/init/ssh-agent.zsh) to automatically detect and export the active SSH socket.ssh-copy-agent-keys function in zsh/functions/ssh.zsh to interactively select public keys loaded in the local ssh-agent and copy them to a remote server while avoiding duplicates.lazy.nvim, Telescope, Treesitter, Lualine) and add native Wayland support configurations for Antigravity IDE.hosts/PadsTower.lua, hosts/PadsP5560.lua), update keybindings, and enable tearing support for low-latency gaming.shelly-notifications user service, migrate Bluetooth configuration to Wireplumber (50-bluez-config.conf), and improve awww service reliability with dynamic Wayland socket checks.gen_pages.py) with table of contents support.steam-optimize from Bash to Python 3 (adding JSON parsing, monitor detection, and Forza Horizon 6 overrides), and refactor awww.sh wallpaper script with robust error handling and array safety..gitconfig structure, migrate global VS Code Lua LSP settings to a project-specific .luarc.json, and remove xml2 dependency from http_crawler.zsh.1password Zsh plugin, including the helper function opswd.~/.xinitrc configuration and its installer symlink.kitty theme configuration files, legacy helper scripts (SystemControl.sh, power-profiles, xrandr.sh), and the precompiled greenclip-v4.2 binary.no_hardware_cursors = true).steam-optimize, and correct QT QPA platform separator format compatibility.11_hyprland.txt and 20_apps.txt..config-archive/, and prune obsolete package lists, old package diffs, screenshots, and Nitrogen setup instructions.--enable-features onto a single line.steam-optimize, and enhance shortcut bindings for screenshots, lock, and session controls.steam-optimize with helper functions..pacnew files..editorconfig settings, enhance pre-commit leak detection, and refine shell alias error checking/validation.Entries from here down to v1.0 are retrospective summaries reconstructed after the fact, not detailed at release time: expect them to be broader and less specific than v5.1.0 onward.