{ config, pkgs, lib, inputs, ... }: let wallpaperDir = "${config.home.homeDirectory}/.config/wallpapers"; defaultWallpaper = "${wallpaperDir}/even-in-arcadia.png"; # Thin wrapper so niri keybinds can call noctalia msg # without hard-coding the nix-store path. noctaliaIpc = pkgs.writeShellScriptBin "noctalia-ipc" '' set -eu exec noctalia msg "$@" ''; in { imports = [ inputs.noctalia.homeModules.default ]; home.username = "duynguyen"; home.homeDirectory = "/home/duynguyen"; home.stateVersion = "26.05"; # home-manager's fontconfig module references removed nodePackages; # NixOS manages fontconfig at the system level anyway fonts.fontconfig.enable = false; home.packages = with pkgs; [ noctaliaIpc # Browsers zen-browser claude-desktop # Terminals ghostty kitty foot # Niri supporting tools xwayland-satellite # X11 app support in Niri xdg-utils # xdg-open, file associations inotify-tools # filesystem event tools # Polkit agent for Niri session (graphical auth dialogs) kdePackages.polkit-kde-agent-1 # Editor vscodium # Daily apps mpv imv gimp obs-studio zathura thunar xfce.thunar-archive-plugin xfce.tumbler ffmpegthumbnailer xarchiver grim slurp swappy libreoffice telegram-desktop pavucontrol blueman # Clipboard cliphist wl-clipboard # CLI tools vim neovim tmux fastfetch btop ripgrep fd fzf eza bat dust jq yq shellcheck ffmpeg imagemagick unzip p7zip wiremix # System control brightnessctl playerctl # Dev tools gh ]; # Required for Electron apps (VSCodium, Zen Browser, etc.) to use # Wayland natively and work correctly with fcitx5 input home.sessionVariables.NIXOS_OZONE_WL = "1"; # Wallpapers folder — add images to home/duynguyen/wallpapers/ in the repo # and rebuild; noctalia reads from ~/.config/wallpapers xdg.configFile."wallpapers".source = ./wallpapers; # Polkit agent as a systemd user service so it starts with the Niri session systemd.user.services.polkit-kde-agent = { Unit = { Description = "KDE Polkit Authentication Agent"; PartOf = [ "graphical-session.target" ]; After = [ "graphical-session.target" ]; }; Service = { ExecStart = "${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-authentication-agent-1"; Restart = "on-failure"; RestartSec = 1; }; Install.WantedBy = [ "graphical-session.target" ]; }; # ── Noctalia ────────────────────────────────────────────────────────────── # Replaces: waybar, walker, swaylock, swaybg, swayidle, mako programs.noctalia = { enable = true; settings = { bar.default = { start = [ "launcher" "clipboard" "cpu" "network" "ram" ]; center = [ "clock" ]; end = [ "notifications" "volume" "brightness" "battery" "control-center" "session" ]; thickness = 40; padding = 10; radius = 0; margin_edge = 0; margin_ends = 0; widget_spacing = 8; }; idle = { behavior_order = [ "lock" "screen-off" ]; behavior = { lock = { action = "lock"; enabled = true; timeout = 600; # 10 min }; screen-off = { action = "screen_off"; enabled = true; timeout = 660; }; }; }; lockscreen.wallpaper = defaultWallpaper; nightlight.enabled = true; osd.position = "top_right"; shell = { font_family = "JetBrainsMono Nerd Font"; polkit_agent = true; corner_radius_scale = 0.0; animation.speed = 1.5; panel = { clipboard_placement = "attached"; launcher_placement = "attached"; launcher_session_search = true; }; shadow.alpha = 0.5; }; theme.builtin = "Kanagawa"; wallpaper = { enabled = true; directory = wallpaperDir; default.path = defaultWallpaper; }; }; }; # ── Shell ───────────────────────────────────────────────────────────────── programs.zsh = { enable = true; autosuggestion.enable = true; syntaxHighlighting.enable = true; }; programs.kitty = { enable = true; settings.wheel_scroll_multiplier = 10; }; programs.zoxide = { enable = true; enableZshIntegration = true; }; programs.starship.enable = true; programs.git = { enable = true; settings.user = { name = "duynguyen"; email = "huonghaiduynhim@gmail.com"; }; }; # ── KDE Plasma (for the Plasma session; dark theme + touchpad) ──────────── programs.plasma = { enable = true; workspace.lookAndFeel = "org.kde.breezedark.desktop"; input.touchpads = [ { name = "SynPS/2 Synaptics TouchPad"; vendorId = "2"; productId = "7"; naturalScroll = true; pointerSpeed = 0.4; scrollSpeed = 0.75; } ]; }; # ── Zen Browser scroll speed ────────────────────────────────────────────── home.activation.zenBrowserUserJs = lib.hm.dag.entryAfter [ "writeBoundary" ] '' for profile in "$HOME/.config/zen/"*.*/; do [[ -d "$profile" ]] || continue echo 'user_pref("mousewheel.default.delta_multiplier_y", 50);' > "$profile/user.js" done ''; # ── Niri config ─────────────────────────────────────────────────────────── xdg.configFile."niri/config.kdl".source = pkgs.runCommand "niri-config-checked" { nativeBuildInputs = [ pkgs.niri ]; } '' niri validate -c ${./config/niri/config.kdl} cp ${./config/niri/config.kdl} $out ''; programs.home-manager.enable = true; }