diff --git a/flake.lock b/flake.lock index 0dbd6ab..0da224a 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1771563628, - "narHash": "sha256-zfSyNmV4bB7lbKbOmrBy5+239DnE6rp8xr1tmIpmRbk=", + "lastModified": 1772768709, + "narHash": "sha256-uzeT4oc5MyZaGJ4C1J2FMSfcUJUoMlzf1ZSWIgBrW7A=", "owner": "utensils", "repo": "comfyui-nix", - "rev": "82914911ea9346cb64c132b1be73c77a74f570b0", + "rev": "390747dcc0631621fe43308b3464d2591e11e77d", "type": "github" }, "original": { @@ -97,11 +97,11 @@ ] }, "locked": { - "lastModified": 1771744638, - "narHash": "sha256-EDLi+YAsEEAmMeZe1v6GccuGRbCkpSZp/+A6g+pivR8=", + "lastModified": 1772633058, + "narHash": "sha256-SO7JapRy2HPhgmqiLbfnW1kMx5rakPMKZ9z3wtRLQjI=", "owner": "nix-community", "repo": "home-manager", - "rev": "cb6c151f5c9db4df0b69d06894dc8484de1f16a0", + "rev": "080657a04188aca25f8a6c70a0fb2ea7e37f1865", "type": "github" }, "original": { @@ -118,11 +118,11 @@ ] }, "locked": { - "lastModified": 1771683283, - "narHash": "sha256-WxAEkAbo8dP7qiyPM6VN4ZGAxfuBVlNBNPkrqkrXVEc=", + "lastModified": 1772845525, + "narHash": "sha256-Dp5Ir2u4jJDGCgeMRviHvEQDe+U37hMxp6RSNOoMMPc=", "owner": "nix-community", "repo": "home-manager", - "rev": "c6ed3eab64d23520bcbb858aa53fe2b533725d4a", + "rev": "27b93804fbef1544cb07718d3f0a451f4c4cd6c0", "type": "github" }, "original": { @@ -138,11 +138,11 @@ ] }, "locked": { - "lastModified": 1771520882, - "narHash": "sha256-9SeTZ4Pwr730YfT7V8Azb8GFbwk1ZwiQDAwft3qAD+o=", + "lastModified": 1772379624, + "narHash": "sha256-NG9LLTWlz4YiaTAiRGChbrzbVxBfX+Auq4Ab/SWmk4A=", "owner": "nix-darwin", "repo": "nix-darwin", - "rev": "6a7fdcd5839ec8b135821179eea3b58092171bcf", + "rev": "52d061516108769656a8bd9c6e811c677ec5b462", "type": "github" }, "original": { @@ -174,11 +174,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1771423359, - "narHash": "sha256-yRKJ7gpVmXbX2ZcA8nFi6CMPkJXZGjie2unsiMzj3Ig=", + "lastModified": 1771969195, + "narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "740a22363033e9f1bb6270fbfb5a9574067af15b", + "rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e", "type": "github" }, "original": { @@ -236,11 +236,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1771369470, - "narHash": "sha256-0NBlEBKkN3lufyvFegY4TYv5mCNHbi5OmBDrzihbBMQ=", + "lastModified": 1772773019, + "narHash": "sha256-E1bxHxNKfDoQUuvriG71+f+s/NT0qWkImXsYZNFFfCs=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0182a361324364ae3f436a63005877674cf45efb", + "rev": "aca4d95fce4914b3892661bcb80b8087293536c6", "type": "github" }, "original": { @@ -267,11 +267,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1771574726, - "narHash": "sha256-D1PA3xQv/s4W3lnR9yJFSld8UOLr0a/cBWMQMXS+1Qg=", + "lastModified": 1772822230, + "narHash": "sha256-yf3iYLGbGVlIthlQIk5/4/EQDZNNEmuqKZkQssMljuw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c217913993d6c6f6805c3b1a3bda5e639adfde6d", + "rev": "71caefce12ba78d84fe618cf61644dce01cf3a96", "type": "github" }, "original": { @@ -290,11 +290,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1771135771, - "narHash": "sha256-wyvBIhDuyCRyjB3yPg77qoyxrlgQtBR1rVW3c9knV3E=", + "lastModified": 1772402258, + "narHash": "sha256-3DmCFOdmbkFML1/G9gj8Wb+rCCZFPOQtNoMCpqOF8SA=", "owner": "nix-community", "repo": "nixvim", - "rev": "ed0424f0b08d303a7348f52f7850ad1b2704f9ba", + "rev": "21ae25e13b01d3b4cdc750b5f9e7bad68b150c10", "type": "github" }, "original": { diff --git a/home-manager/commands/commands.nix b/home-manager/commands/commands.nix index 3dd866a..65d5a62 100644 --- a/home-manager/commands/commands.nix +++ b/home-manager/commands/commands.nix @@ -7,6 +7,17 @@ ... }: +let + list-keybinds = pkgs.writeShellScriptBin "list-keybinds" '' + hyprctl binds -j | ${pkgs.jq}/bin/jq -r '.[] | + select(.dispatcher != "") | + "[\(.modmask_str // "NONE")] + \(.key) → \(.dispatcher) \(.arg // "")" + ' | ${pkgs.rofi}/bin/rofi -dmenu \ + -i \ + -p "Keybinds" \ + -theme-str 'window {width: 60%;}' + ''; +in { imports = [ ./direnv.nix @@ -28,9 +39,13 @@ age-plugin-yubikey agedu b3sum + bandwhich bat basalt btop + cpufetch + cpuid + cpu-x curl dig dust @@ -38,15 +53,21 @@ fosrl-olm fzf git-filter-repo + glances + gping graphviz jq kitty lazygit lazyjournal manga-tui + mcat + netop # netscanner nix-du nmap + trippy + tuptime openssl ripgrep s3cmd @@ -60,10 +81,12 @@ yazi yt-dlp zstd + list-keybinds ] # Desktop-specific packages (Linux desktops and macOS) ++ lib.optionals (!(hostTypes.isServer hostname)) (with pkgs; [ claude-code + caligula ocamlPackages.utop # opencode openconnect @@ -131,12 +154,16 @@ programs = { ssh = { enable = true; + enableDefaultConfig = false; matchBlocks = { - global = { - host = "*"; + "*" = { setEnv = { TERM = "xterm-256color"; }; + forwardAgent = false; + forwardX11 = false; + serverAliveInterval = 0; + serverAliveCountMax = 3; }; } // lib.optionalAttrs (hostname == "buildbox") { "192.168.8.109" = { diff --git a/home-manager/commands/fastfetch/fastfetch.nix b/home-manager/commands/fastfetch/fastfetch.nix index 36e2e4b..6945a66 100644 --- a/home-manager/commands/fastfetch/fastfetch.nix +++ b/home-manager/commands/fastfetch/fastfetch.nix @@ -38,8 +38,8 @@ let "kitty" else if termProgram == "WezTerm" || lib.hasInfix "wezterm" term then "wezterm" - else if termProgram == "Ghostty" then - "chafa" # Ghostty doesn't have kitty protocol support + else if termProgram == "ghostty" then + "kitty" # Ghostty doesn't have kitty protocol support else "chafa"; # Default fallback diff --git a/home-manager/programs/ghostty/ghostty.nix b/home-manager/programs/ghostty/ghostty.nix index 1e19bc7..7965c2c 100644 --- a/home-manager/programs/ghostty/ghostty.nix +++ b/home-manager/programs/ghostty/ghostty.nix @@ -13,7 +13,7 @@ theme = "Adwaita Dark"; # Explicitly set color scheme preference to avoid GTK warnings - #gtk-adwaita = true; + gtk-adwaita = true; gtk-single-instance = true; diff --git a/home-manager/programs/hypr/hyprland.nix b/home-manager/programs/hypr/hyprland.nix index ba26b63..348f105 100644 --- a/home-manager/programs/hypr/hyprland.nix +++ b/home-manager/programs/hypr/hyprland.nix @@ -1,10 +1,16 @@ -{ config, configPath, ... }: +{ config, configPath, hostname, ... }: { wayland.windowManager.hyprland = { enable = true; settings = { # === Monitor configuration === - monitor = "eDP-1, 2560x1440@60.03300, 0x0, 1.25"; + monitor = + if hostname == "eva-01" then + "eDP-1, 2560x1440@60.03300, 0x0, 1.25" + else if hostname == "eva-03" then + ", preferred, auto, 1" # Auto-detect for desktop + else + ", preferred, auto, 1"; # === Autostart / Exec commands === exec-once = [ @@ -14,6 +20,7 @@ "swww-daemon" "eww daemon" "swww img ${configPath}/assets/ena/wallpaper.png" + "systemctl --user start hyprpolkitagent" ]; # === Input settings === @@ -75,8 +82,6 @@ # === Gestures === gestures = { - workspace_swipe = true; - workspace_swipe_fingers = 3; workspace_swipe_invert = true; workspace_swipe_distance = 200; workspace_swipe_forever = true; @@ -152,6 +157,8 @@ "$mod SHIFT, H, resizeactive, -10 0" "$mod SHIFT, K, resizeactive, 0 -10" "$mod SHIFT, J, resizeactive, 0 10" + + "$mod, Escape, exec, wlogout" ]; # === Mouse bindings === diff --git a/home-manager/programs/hypr/hyprlock.nix b/home-manager/programs/hypr/hyprlock.nix index fefbcf6..f1056a3 100644 --- a/home-manager/programs/hypr/hyprlock.nix +++ b/home-manager/programs/hypr/hyprlock.nix @@ -9,16 +9,18 @@ hide_cursor = true; no_fade_in = false; }; + background = [ { - path = "${configPath}/assets/ena/wallpaper.png"; + path = "${configPath}/assets/pfp/neonNerv.png"; blur_passes = 3; blur_size = 8; } ]; + image = [ { - path = "${configPath}/assets/pfp.jpg"; + path = "${configPath}/assets/pfp/eva-03.png"; size = 150; border_size = 4; border_color = "rgb(0C96F9)"; @@ -28,6 +30,43 @@ valign = "center"; } ]; + + label = [ + # Clock + { + monitor = ""; + text = ''cmd[update:1000] echo "$(date +"%H:%M")"''; + color = "rgb(CFE6F4)"; + font_size = 64; + font_family = "JetBrainsMono Nerd Font Bold"; + position = "0, 380"; + halign = "center"; + valign = "center"; + } + # Date + { + monitor = ""; + text = ''cmd[update:1000] echo "$(date +"%A, %B %d")"''; + color = "rgba(CFE6F4CC)"; + font_size = 18; + font_family = "JetBrainsMono Nerd Font"; + position = "0, 300"; + halign = "center"; + valign = "center"; + } + # Username + { + monitor = ""; + text = "$USER"; + color = "rgba(CFE6F4CC)"; + font_size = 14; + font_family = "JetBrainsMono Nerd Font"; + position = "0, 100"; + halign = "center"; + valign = "center"; + } + ]; + input-field = [ { size = "200, 50"; @@ -41,6 +80,10 @@ outline_thickness = 5; placeholder_text = "Password..."; shadow_passes = 2; + capslock_color = "rgb(F9A20C)"; + fail_color = "rgb(F93030)"; + fail_text = "$FAIL ($ATTEMPTS)"; + check_color = "rgb(0CF9A2)"; } ]; }; diff --git a/home-manager/programs/hypr/theme.nix b/home-manager/programs/hypr/theme.nix new file mode 100644 index 0000000..1fb8a4f --- /dev/null +++ b/home-manager/programs/hypr/theme.nix @@ -0,0 +1,69 @@ +{ + pkgs, + lib, + config, + ... +}: { + # Install themes/cursors that we reference + home.packages = with pkgs; [ + adwaita-icon-theme + papirus-icon-theme + bibata-cursors + adwaita-qt + ]; + + # GTK dark theme configuration + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + cursorTheme = { + name = "Bibata-Modern-Classic"; + package = pkgs.bibata-cursors; + size = 24; + }; + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = true; + }; + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = true; + }; + }; + + # Qt dark theme + qt = { + enable = true; + platformTheme.name = lib.mkForce "gtk3"; + style.name = lib.mkForce "adwaita-dark"; + }; + + # dconf dark mode + dconf.settings."org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + gtk-theme = "Adwaita-dark"; + icon-theme = "Papirus-Dark"; + cursor-theme = "Bibata-Modern-Classic"; + cursor-size = 24; + }; + + # Cursor for Wayland/X sessions + home.sessionVariables = { + XCURSOR_THEME = "Bibata-Modern-Classic"; + XCURSOR_SIZE = "24"; + QT_QPA_PLATFORMTHEME = "gtk3"; + }; + + # XDG cursor config + home.file.".icons/default/index.theme".text = '' + [Icon Theme] + Name=Default + Comment=Default Cursor Theme + Inherits=Bibata-Modern-Classic + ''; +} \ No newline at end of file diff --git a/home-manager/programs/hypr/waybar.nix b/home-manager/programs/hypr/waybar.nix index df92e48..f1472a5 100644 --- a/home-manager/programs/hypr/waybar.nix +++ b/home-manager/programs/hypr/waybar.nix @@ -1,12 +1,32 @@ { pkgs, lib, - config, + hostname, ... }: let betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)"; clock24h = false; + colors = { + base00 = "0D0E15"; + base01 = "1a1b26"; + base02 = "24283b"; + base03 = "414868"; + base04 = "565f89"; + base05 = "a9b1d6"; + base06 = "cbccd1"; + base07 = "d5d6db"; + base08 = "f7768e"; + base09 = "ff9e64"; + base0A = "e0af68"; + base0B = "9ece6a"; + base0C = "7dcfff"; + base0D = "7aa2f7"; + base0E = "bb9af7"; + base0F = "ff9e64"; + }; + # Laptop hostnames that should show battery + isLaptop = builtins.elem hostname [ "laptop" "thinkpad" "framework" "portable" ]; in with lib; { @@ -18,20 +38,31 @@ with lib; { layer = "top"; position = "top"; + height = 36; + exclusive = true; + passthrough = false; + gtk-layer-shell = true; + modules-center = [ "hyprland/workspaces" ]; modules-left = [ "custom/startmenu" "hyprland/window" "pulseaudio" + "pulseaudio#microphone" "cpu" "memory" + "disk" + "temperature" "idle_inhibitor" + "backlight" ]; modules-right = [ + "network" + "bluetooth" "custom/hyprbindings" "custom/notification" "custom/exit" - "battery" + ] ++ (optionals isLaptop [ "battery" ]) ++ [ "tray" "clock" ]; @@ -39,150 +70,257 @@ with lib; "hyprland/workspaces" = { format = "{name}"; format-icons = { + "1" = "󰲠"; + "2" = "󰲢"; + "3" = "󰲤"; + "4" = "󰲦"; + "5" = "󰲨"; + "6" = "󰲪"; + "7" = "󰲬"; + "8" = "󰲮"; + "9" = "󰲰"; + "10" = "󰿬"; default = " "; active = " "; urgent = " "; }; on-scroll-up = "hyprctl dispatch workspace e+1"; on-scroll-down = "hyprctl dispatch workspace e-1"; - }; - "clock" = { - format = if clock24h == true then '' {:L%H:%M}'' else '' {:L%I:%M %p}''; - tooltip = true; - tooltip-format = "{:%A, %d.%B %Y }\n{calendar}"; - }; - "hyprland/window" = { - max-length = 22; - separate-outputs = false; - rewrite = { - "" = " 🙈 No Windows? "; + persistent-workspaces = { + "*" = 5; }; }; + + "clock" = { + format = if clock24h then " {:L%H:%M}" else " {:L%I:%M %p}"; + tooltip = true; + tooltip-format = "󰃭 {:%A, %d %B %Y}\n{calendar}"; + calendar = { + mode = "year"; + mode-mon-col = 3; + weeks-pos = "right"; + on-scroll = 1; + format = { + months = "{}"; + days = "{}"; + weeks = "W{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + on-click-right = "mode"; + on-scroll-up = "shift_up"; + on-scroll-down = "shift_down"; + }; + }; + + "hyprland/window" = { + max-length = 30; + separate-outputs = true; + rewrite = { + "(.*) - Brave" = "󰖟 $1"; + "(.*) - Firefox" = "󰈹 $1"; + "(.*) - nvim" = " $1"; + "(.*) - fish" = " $1"; + "(.*) - zsh" = " $1"; + "(.*) - bash" = " $1"; + "" = "󰙞 Desktop"; + }; + }; + "memory" = { interval = 5; - format = " {}%"; + format = "󰾆 {percentage}%"; + format-alt = "󰾆 {used}/{total} GiB"; tooltip = true; + tooltip-format = "󰾆 RAM: {used:0.1f}GiB / {total:0.1f}GiB\n󰾉 Swap: {swapUsed:0.1f}GiB / {swapTotal:0.1f}GiB"; + on-click = "sleep 0.1 && kitty --title btop sh -c 'btop'"; }; + "cpu" = { interval = 5; - format = " {usage:2}%"; + format = "󰘚 {usage}%"; + format-alt = "󰘚 {avg_frequency}GHz"; tooltip = true; + tooltip-format = "󰘚 CPU Usage: {usage}%\n {avg_frequency}GHz avg frequency"; + on-click = "sleep 0.1 && kitty --title btop sh -c 'btop'"; }; + + "temperature" = { + interval = 5; + format = "{icon} {temperatureC}°C"; + format-critical = "󰸁 {temperatureC}°C"; + format-icons = [ "" "" "" "" "" ]; + critical-threshold = 80; + tooltip = true; + tooltip-format = " Temperature: {temperatureC}°C\n{temperatureF}°F"; + }; + "disk" = { - format = " {free}"; + interval = 30; + format = "󰋊 {percentage_used}%"; + format-alt = "󰋊 {free} free"; + path = "/"; tooltip = true; + tooltip-format = "󰋊 {path}\n Used: {used} / {total}\n Free: {free} ({percentage_free}%)"; + on-click = "sleep 0.1 && kitty --title yazi sh -c 'yazi'"; }; + "network" = { - format-icons = [ - "󰤯" - "󰤟" - "󰤢" - "󰤥" - "󰤨" - ]; - format-ethernet = " {bandwidthDownOctets}"; - format-wifi = "{icon} {signalStrength}%"; - format-disconnected = "󰤮"; - tooltip = false; + interval = 5; + format-icons = [ "󰤯" "󰤟" "󰤢" "󰤥" "󰤨" ]; + format-ethernet = "󰈀 {bandwidthDownBits} ↓ {bandwidthUpBits} ↑"; + format-wifi = "{icon} {essid} {signalStrength}%"; + format-disconnected = "󰤮 Offline"; + format-linked = "󰈀 {ifname} (No IP)"; + tooltip = true; + tooltip-format = "󰈀 {ifname}\n󰩟 {ipaddr}/{cidr}\n󰕒 Up: {bandwidthUpBits}\n󰇚 Down: {bandwidthDownBits}"; + tooltip-format-wifi = "{icon} {essid}\n󰩟 {ipaddr}/{cidr}\n󰑴 Strength: {signalStrength}%\n󰕒 Up: {bandwidthUpBits}\n󰇚 Down: {bandwidthDownBits}"; + on-click = "sleep 0.1 && kitty --title nmtui sh -c 'nmtui'"; }; + + "bluetooth" = { + format = "󰂯"; + format-disabled = "󰂲"; + format-off = "󰂲"; + format-on = "󰂯"; + format-connected = "󰂱 {device_alias}"; + format-connected-battery = "󰂱 {device_alias} {device_battery_percentage}%"; + tooltip = true; + tooltip-format = "󰂯 Bluetooth: {status}\n󰌌 {num_connections} connected"; + tooltip-format-connected = "󰂯 {device_enumerate}"; + tooltip-format-enumerate-connected = " {device_alias}"; + tooltip-format-enumerate-connected-battery = " {device_alias} 󰁹{device_battery_percentage}%"; + on-click = "sleep 0.1 && blueman-manager"; + }; + "tray" = { - spacing = 12; + icon-size = 18; + spacing = 10; + show-passive-items = true; }; + "pulseaudio" = { - format = "{icon} {volume}% {format_source}"; - format-bluetooth = "{volume}% {icon} {format_source}"; - format-bluetooth-muted = " {icon} {format_source}"; - format-muted = " {format_source}"; - format-source = " {volume}%"; - format-source-muted = ""; + format = "{icon} {volume}%"; + format-bluetooth = "󰂱 {volume}%"; + format-bluetooth-muted = "󰂲 Muted"; + format-muted = "󰖁 Muted"; format-icons = { - headphone = ""; - hands-free = ""; - headset = ""; - phone = ""; - portable = ""; - car = ""; - default = [ - "" - "" - "" - ]; + headphone = "󰋋"; + hands-free = "󰋋"; + headset = "󰋎"; + phone = "󰏲"; + portable = "󰏲"; + car = "󰄋"; + default = [ "󰕿" "󰖀" "󰕾" ]; }; + scroll-step = 5; on-click = "sleep 0.1 && pavucontrol"; + on-click-right = "sleep 0.1 && pactl set-sink-mute @DEFAULT_SINK@ toggle"; + tooltip = true; + tooltip-format = "{icon} {desc}\nVolume: {volume}%"; }; + + "pulseaudio#microphone" = { + format = "{format_source}"; + format-source = "󰍬 {volume}%"; + format-source-muted = "󰍭 Muted"; + on-click = "sleep 0.1 && pavucontrol"; + on-click-right = "sleep 0.1 && pactl set-source-mute @DEFAULT_SOURCE@ toggle"; + scroll-step = 5; + tooltip = true; + tooltip-format = "󰍬 {source_desc}\nVolume: {volume}%"; + }; + + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = "󰒳"; + deactivated = "󰒲"; + }; + tooltip = true; + tooltip-format-activated = "Idle inhibitor: ON"; + tooltip-format-deactivated = "Idle inhibitor: OFF"; + }; + "custom/exit" = { tooltip = false; - format = ""; + format = "󰗼"; on-click = "sleep 0.1 && wlogout"; }; + "custom/startmenu" = { tooltip = false; - format = ""; - # exec = "rofi -show drun"; + format = ""; on-click = "sleep 0.1 && rofi-launcher"; + on-click-right = "sleep 0.1 && rofi -show drun"; }; + "custom/hyprbindings" = { tooltip = false; format = "󱕴"; on-click = "sleep 0.1 && list-keybinds"; }; - "idle_inhibitor" = { - format = "{icon}"; - format-icons = { - activated = ""; - deactivated = ""; - }; - tooltip = "true"; - }; + "custom/notification" = { tooltip = false; - format = "{icon} {}"; + format = "{icon} {count}"; format-icons = { - notification = ""; - none = ""; - dnd-notification = ""; - dnd-none = ""; - inhibited-notification = ""; - inhibited-none = ""; - dnd-inhibited-notification = ""; - dnd-inhibited-none = ""; + notification = "󰅸󰂚"; + none = "󰂚"; + dnd-notification = "󰅸󱏧"; + dnd-none = "󱏧"; + inhibited-notification = "󰅸󰂛"; + inhibited-none = "󰂛"; + dnd-inhibited-notification = "󰅸󰂛"; + dnd-inhibited-none = "󰂛"; }; return-type = "json"; exec-if = "which swaync-client"; exec = "swaync-client -swb"; - on-click = "sleep 0.1 && task-waybar"; + on-click = "sleep 0.1 && swaync-client -t -sw"; + on-click-right = "sleep 0.1 && swaync-client -d -sw"; escape = true; }; + "battery" = { states = { + good = 95; warning = 30; critical = 15; }; format = "{icon} {capacity}%"; format-charging = "󰂄 {capacity}%"; format-plugged = "󱘖 {capacity}%"; - format-icons = [ - "󰁺" - "󰁻" - "󰁼" - "󰁽" - "󰁾" - "󰁿" - "󰂀" - "󰂁" - "󰂂" - "󰁹" - ]; + format-good = "{icon} {capacity}%"; + format-full = "󰁹 Full"; + format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; + tooltip = true; + tooltip-format = "{icon} {capacity}%\n{timeTo}"; on-click = ""; - tooltip = false; + }; + + "backlight" = { + interval = 2; + format = "{icon} {percent}%"; + format-icons = [ "󰃞" "󰃟" "󰃝" "󰃠" ]; + scroll-step = 5; + on-scroll-up = "brightnessctl set 5%+"; + on-scroll-down = "brightnessctl set 5%-"; + on-click = "brightnessctl set 50%"; + tooltip = true; + tooltip-format = "󰃠 Brightness: {percent}%"; + min-length = 6; }; } ]; + style = concatStrings [ '' * { font-family: JetBrainsMono Nerd Font Mono; - font-size: 16px; + font-size: 14px; border-radius: 0px; border: none; min-height: 0px; @@ -190,9 +328,11 @@ with lib; window#waybar { background: rgba(0,0,0,0); } + + /* ===== Workspaces ===== */ #workspaces { - color: #${config.lib.stylix.colors.base00}; - background: #${config.lib.stylix.colors.base01}; + color: #${colors.base00}; + background: #${colors.base01}; margin: 4px 4px; padding: 5px 5px; border-radius: 16px; @@ -202,8 +342,8 @@ with lib; padding: 0px 5px; margin: 0px 3px; border-radius: 16px; - color: #${config.lib.stylix.colors.base00}; - background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + color: #${colors.base00}; + background: linear-gradient(45deg, #${colors.base08}, #${colors.base0D}); opacity: 0.5; transition: ${betterTransition}; } @@ -212,62 +352,181 @@ with lib; padding: 0px 5px; margin: 0px 3px; border-radius: 16px; - color: #${config.lib.stylix.colors.base00}; - background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + color: #${colors.base00}; + background: linear-gradient(45deg, #${colors.base08}, #${colors.base0D}); transition: ${betterTransition}; opacity: 1.0; min-width: 40px; } + #workspaces button.urgent { + background: linear-gradient(45deg, #${colors.base08}, #${colors.base09}); + opacity: 1.0; + animation: blink 1s linear infinite; + } #workspaces button:hover { font-weight: bold; border-radius: 16px; - color: #${config.lib.stylix.colors.base00}; - background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + color: #${colors.base00}; + background: linear-gradient(45deg, #${colors.base08}, #${colors.base0D}); opacity: 0.8; transition: ${betterTransition}; } + + /* ===== Tooltips ===== */ tooltip { - background: #${config.lib.stylix.colors.base00}; - border: 1px solid #${config.lib.stylix.colors.base08}; + background: #${colors.base00}; + border: 1px solid #${colors.base08}; border-radius: 12px; + padding: 5px; } tooltip label { - color: #${config.lib.stylix.colors.base08}; + color: #${colors.base05}; + padding: 2px; } - #window, #pulseaudio, #cpu, #memory, #idle_inhibitor { + + /* ===== Left Modules ===== */ + #window, + #pulseaudio, + #pulseaudio.microphone, + #cpu, + #memory, + #disk, + #temperature, + #idle_inhibitor { font-weight: bold; margin: 4px 0px; margin-left: 7px; - padding: 0px 18px; - background: #${config.lib.stylix.colors.base04}; - color: #${config.lib.stylix.colors.base00}; + padding: 0px 14px; + background: #${colors.base04}; + color: #${colors.base00}; border-radius: 24px 10px 24px 10px; + transition: ${betterTransition}; } + #window:hover, + #pulseaudio:hover, + #pulseaudio.microphone:hover, + #cpu:hover, + #memory:hover, + #disk:hover, + #temperature:hover, + #idle_inhibitor:hover { + background: #${colors.base0D}; + color: #${colors.base00}; + transition: ${betterTransition}; + } + #pulseaudio.muted, + #pulseaudio.microphone.source-muted { + background: #${colors.base03}; + color: #${colors.base05}; + } + #temperature.critical { + background: #${colors.base08}; + animation: blink 1s linear infinite; + } + #idle_inhibitor.activated { + background: #${colors.base0A}; + color: #${colors.base00}; + } + #cpu.warning { + background: #${colors.base0A}; + } + #cpu.critical { + background: #${colors.base08}; + animation: blink 1s linear infinite; + } + #memory.warning { + background: #${colors.base0A}; + } + #memory.critical { + background: #${colors.base08}; + animation: blink 1s linear infinite; + } + + /* ===== Start Menu ===== */ #custom-startmenu { - color: #${config.lib.stylix.colors.base0B}; - background: #${config.lib.stylix.colors.base02}; + color: #${colors.base0B}; + background: #${colors.base02}; font-size: 28px; margin: 0px; padding: 0px 30px 0px 15px; border-radius: 0px 0px 40px 0px; + transition: ${betterTransition}; } - #custom-hyprbindings, #network, #battery, - #custom-notification, #tray, #custom-exit { + #custom-startmenu:hover { + color: #${colors.base0D}; + transition: ${betterTransition}; + } + + /* ===== Right Modules ===== */ + #custom-hyprbindings, + #custom-notification, + #custom-exit, + #network, + #bluetooth, + #battery, + #tray { font-weight: bold; - background: #${config.lib.stylix.colors.base0F}; - color: #${config.lib.stylix.colors.base00}; + background: #${colors.base0F}; + color: #${colors.base00}; margin: 4px 0px; margin-right: 7px; border-radius: 10px 24px 10px 24px; - padding: 0px 18px; + padding: 0px 14px; + transition: ${betterTransition}; } + #custom-hyprbindings:hover, + #custom-notification:hover, + #custom-exit:hover, + #network:hover, + #bluetooth:hover { + background: #${colors.base0E}; + transition: ${betterTransition}; + } + #network.disconnected { + background: #${colors.base08}; + } + #bluetooth.off, + #bluetooth.disabled { + background: #${colors.base03}; + color: #${colors.base05}; + } + #bluetooth.connected { + background: #${colors.base0D}; + color: #${colors.base00}; + } + + /* ===== Battery ===== */ + #battery.good { + background: #${colors.base0B}; + color: #${colors.base00}; + } + #battery.warning { + background: #${colors.base0A}; + color: #${colors.base00}; + } + #battery.critical { + background: #${colors.base08}; + color: #${colors.base00}; + animation: blink 1s linear infinite; + } + #battery.charging { + background: #${colors.base0B}; + color: #${colors.base00}; + } + + /* ===== Clock ===== */ #clock { font-weight: bold; - color: #0D0E15; - background: linear-gradient(90deg, #${config.lib.stylix.colors.base0E}, #${config.lib.stylix.colors.base0C}); + color: #${colors.base00}; + background: linear-gradient(90deg, #${colors.base0E}, #${colors.base0C}); margin: 0px; padding: 0px 15px 0px 30px; border-radius: 0px 0px 0px 40px; + transition: ${betterTransition}; + } + #clock:hover { + background: linear-gradient(90deg, #${colors.base0C}, #${colors.base0E}); + transition: ${betterTransition}; } '' ]; diff --git a/home-manager/programs/hypr/wlogout.nix b/home-manager/programs/hypr/wlogout.nix new file mode 100644 index 0000000..00a19e3 --- /dev/null +++ b/home-manager/programs/hypr/wlogout.nix @@ -0,0 +1,120 @@ +{ pkgs, configPath, ... }: +{ + programs.wlogout = { + enable = true; + layout = [ + { + label = "lock"; + action = "hyprlock"; + text = "Lock"; + keybind = "l"; + } + { + label = "hibernate"; + action = "systemctl hibernate"; + text = "Hibernate"; + keybind = "h"; + } + { + label = "logout"; + action = "hyprctl dispatch exit 0"; + text = "Logout"; + keybind = "e"; + } + { + label = "shutdown"; + action = "systemctl poweroff"; + text = "Shutdown"; + keybind = "s"; + } + { + label = "suspend"; + action = "systemctl suspend"; + text = "Suspend"; + keybind = "u"; + } + { + label = "reboot"; + action = "systemctl reboot"; + text = "Reboot"; + keybind = "r"; + } + ]; + style = '' + * { + font-family: JetBrainsMono Nerd Font; + font-size: 14px; + background-image: none; + } + + window { + background-color: rgba(13, 14, 21, 0.9); + } + + button { + color: #BCADBB; + background-color: rgba(26, 27, 38, 0.9); + border-style: solid; + border-width: 2px; + border-color: #101C2F; + border-radius: 16px; + background-repeat: no-repeat; + background-position: center; + background-size: 35%; + margin: 10px; + transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682); + } + + button:focus, + button:active, + button:hover { + background-color: rgba(16, 28, 47, 0.95); + border-color: #f7768e; + color: #f7768e; + outline-style: none; + } + + #lock { + background-image: url("${configPath}/assets/wlogout/lock.png"); + } + #lock:hover { + background-image: url("${configPath}/assets/wlogout/lock.png"); + } + + #logout { + background-image: url("${configPath}/assets/wlogout/logout.png"); + } + #logout:hover { + background-image: url("${configPath}/assets/wlogout/logout.png"); + } + + #suspend { + background-image: url("${configPath}/assets/wlogout/suspend.png"); + } + #suspend:hover { + background-image: url("${configPath}/assets/wlogout/suspend.png"); + } + + #hibernate { + background-image: url("${configPath}/assets/wlogout/hibernate.png"); + } + #hibernate:hover { + background-image: url("${configPath}/assets/wlogout/hibernate.png"); + } + + #shutdown { + background-image: url("${configPath}/assets/wlogout/shutdown.png"); + } + #shutdown:hover { + background-image: url("${configPath}/assets/wlogout/shutdown.png"); + } + + #reboot { + background-image: url("${configPath}/assets/wlogout/reboot.png"); + } + #reboot:hover { + background-image: url("${configPath}/assets/wlogout/reboot.png"); + } + ''; + }; +} \ No newline at end of file diff --git a/home-manager/programs/programs.nix b/home-manager/programs/programs.nix index 77446ee..6dc4d22 100644 --- a/home-manager/programs/programs.nix +++ b/home-manager/programs/programs.nix @@ -9,21 +9,41 @@ ./hypr/hypridle.nix ./hypr/hyprland.nix ./hypr/hyprlock.nix + ./hypr/theme.nix + ./hypr/waybar.nix + ./hypr/wlogout.nix ] # macOS programs ++ lib.optionals (hostTypes.isMacos hostname) [ ./ghostty/ghostty.nix ]; + gtk = lib.mkIf (hostTypes.isLinuxDesktop hostname) { + enable = true; + gtk3.extraConfig.gtk-application-prefer-dark-theme = true; + gtk4.extraConfig.gtk-application-prefer-dark-theme = true; + }; + + qt = lib.mkIf (hostTypes.isLinuxDesktop hostname) { + enable = true; + platformTheme.name = "kde"; + style.name = "breeze"; + }; + + dconf = lib.mkIf (hostTypes.isLinuxDesktop hostname) { + settings."org/gnome/desktop/interface".color-scheme = "prefer-dark"; + }; + home.packages = # Desktop packages (Linux desktops) lib.optionals (hostTypes.isLinuxDesktop hostname) (with pkgs; [ + brightnessctl bambu-studio blender brave desmume gparted -# jellyfin-media-player + jellyfin-media-player kdePackages.bluedevil kdePackages.bluez-qt kdePackages.kate @@ -61,6 +81,22 @@ vlc wireshark yubikey-agent + swaynotificationcenter + # Hyprland Stuff + hypridle + hyprpolkitagent + pyprland + #uwsm + hyprlang + hyprshot + hyprcursor + mesa + nwg-displays + nwg-look + waypaper + waybar + # waybar-weatherf + hyprland-qt-support # rpi-imager ]) @@ -74,6 +110,14 @@ ]) ++ lib.optionals (hostname == "eva-03") (with pkgs; [ - vscode + pavucontrol + streamcontroller + openrazer-daemon + polychromatic + # vscode ]); + + services.swaync = lib.mkIf (hostTypes.isLinuxDesktop hostname) { + enable = true; + }; } diff --git a/hosts/acheron/configuration.nix b/hosts/acheron/configuration.nix index c976a06..f32fc93 100644 --- a/hosts/acheron/configuration.nix +++ b/hosts/acheron/configuration.nix @@ -49,6 +49,15 @@ virtualisation.docker.enable = true; + # zram + zramSwap = { + enable = true; + priority = 100; + memoryPercent = 30; + swapDevices = 1; + algorithm = "zstd"; + }; + # Set your time zone. time.timeZone = "America/Los_Angeles"; diff --git a/hosts/buildbox/configuration.nix b/hosts/buildbox/configuration.nix index b54c414..d0bfbf8 100644 --- a/hosts/buildbox/configuration.nix +++ b/hosts/buildbox/configuration.nix @@ -44,6 +44,15 @@ virtualisation.docker.enable = true; + # zram + zramSwap = { + enable = true; + priority = 100; + memoryPercent = 30; + swapDevices = 1; + algorithm = "zstd"; + }; + # Set your time zone. time.timeZone = "America/Los_Angeles"; @@ -121,7 +130,6 @@ # Allow unfree packages nixpkgs.config.allowUnfree = true; - security.polkit.enable = true; programs._1password.enable = true; programs._1password-gui = { diff --git a/hosts/ender-ml/configuration.nix b/hosts/ender-ml/configuration.nix index 2742d43..85ac53e 100644 --- a/hosts/ender-ml/configuration.nix +++ b/hosts/ender-ml/configuration.nix @@ -25,7 +25,6 @@ # boot.kernelPackages = pkgs.linuxKernel.packages.linux_zen; boot.kernelPackages = pkgs-unstable.linuxKernel.packages.linux_zen; - # Bootloader. boot.loader.grub.enable = lib.mkDefault true; boot.loader.grub.devices = [ "nodev" ]; @@ -49,6 +48,15 @@ virtualisation.docker.enable = true; + # zram + zramSwap = { + enable = true; + priority = 100; + memoryPercent = 30; + swapDevices = 1; + algorithm = "zstd"; + }; + # Enable OpenGL hardware.graphics = { enable = true; @@ -62,12 +70,6 @@ # Modesetting is required. modesetting.enable = true; - # Use the NVidia open source kernel module (not to be confused with the - # independent third-party "nouveau" open source driver). - # Support is limited to the Turing and later architectures. Full list of - # supported GPUs is at: - # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus - # Only available from driver 515.43.04+ open = false; # Enable the Nvidia settings menu, @@ -249,7 +251,6 @@ pkgs-unstable.stable-diffusion-cpp-cuda (pkgs-unstable.llama-cpp.override { cudaSupport = true; }) - pkgs-unstable.vllm pkgs-unstable.witr pkgs-unstable.comfy-ui-cuda ]; diff --git a/hosts/eva-01/configuration.nix b/hosts/eva-01/configuration.nix index 1f5ebaf..a4acd01 100644 --- a/hosts/eva-01/configuration.nix +++ b/hosts/eva-01/configuration.nix @@ -84,6 +84,15 @@ virtualisation.docker.enable = true; + # zram + zramSwap = { + enable = true; + priority = 100; + memoryPercent = 30; + swapDevices = 1; + algorithm = "zstd"; + }; + # Set your time zone. time.timeZone = "America/Los_Angeles"; @@ -278,6 +287,7 @@ vim wifite2 wirelesstools + swaynotificationcenter #fonts nerd-fonts.hack diff --git a/hosts/eva-03/configuration.nix b/hosts/eva-03/configuration.nix index 6fa8574..d1e865b 100644 --- a/hosts/eva-03/configuration.nix +++ b/hosts/eva-03/configuration.nix @@ -6,6 +6,7 @@ config, configPath, hostname, + hostTypes, inputs, pkgs, pkgs-unstable, @@ -60,9 +61,28 @@ virtualisation.docker.enable = true; + # zram + zramSwap = { + enable = true; + priority = 100; + memoryPercent = 30; + swapDevices = 1; + algorithm = "zstd"; + }; + # Enable OpenGL hardware.graphics = { enable = true; + enable32Bit = true; + extraPackages = with pkgs; [ + libva-vdpau-driver + libvdpau + libvdpau-va-gl + nvidia-vaapi-driver + vdpauinfo + libva + libva-utils + ]; }; # Load nvidia driver for Xorg and Wayland @@ -78,17 +98,6 @@ # up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead # of just the bare essentials. # powerManagement.enable = false; - - # Fine-grained power management. Turns off GPU when not in use. - # Experimental and only works on modern Nvidia GPUs (Turing or newer). - # powerManagement.finegrained = false; - - # Use the NVidia open source kernel module (not to be confused with the - # independent third-party "nouveau" open source driver). - # Support is limited to the Turing and later architectures. Full list of - # supported GPUs is at: - # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus - # Only available from driver 515.43.04+ open = false; # Enable the Nvidia settings menu, @@ -99,10 +108,9 @@ package = config.boot.kernelPackages.nvidiaPackages.stable; }; - - # Set your time zone. - time.timeZone = "America/Los_Angeles"; + # time.timeZone = "America/Los_Angeles"; + services.automatic-timezoned.enable = true; # Select internationalisation properties. i18n.defaultLocale = "en_US.UTF-8"; @@ -145,23 +153,26 @@ package = pkgs-unstable.tailscale; }; + # StreamDeck udev rules + services.udev.extraRules = builtins.readFile (pkgs.fetchurl { + url = "https://raw.githubusercontent.com/StreamController/StreamController/main/udev.rules"; + hash = "sha256-djXiFmR1IEKL8IfNpkhud+UvgfzWKzYvCoYEKlPcg0Y="; + }); + #Enable Ollama daemon #services.ollama.enable = true; # Enable ollama services.ollama = { - enable = false; + enable = true; host = "0.0.0.0"; openFirewall = true; acceleration = "cuda"; - package = pkgs-unstable.ollama; - loadModels = [ - "deepcoder:14b" - "gemma3:12b-it-qat" - "gemma3:27b-it-qat" - ]; + package = pkgs-unstable.ollama-cuda; + environmentVariables = { + CUDA_VISIBLE_DEVICES = "0,1"; + }; }; - services.fprintd.enable = true; services.fprintd.tod.enable = true; @@ -207,11 +218,7 @@ description = "rogueking"; extraGroups = [ "networkmanager" "wheel" "docker" ]; shell = pkgs.zsh; - #packages = [ inputs.home-manager.packages.${pkgs.system}.default ]; packages = with pkgs; [ - #apps - #cli - # thunderbird ]; }; @@ -258,16 +265,14 @@ # $ nix search wget environment.systemPackages = with pkgs; [ #apps - #cider-2 fprintd - guacamole-client - #sddm-astronaut polonium + config.boot.kernelPackages.openrazer #cli tools aircrack-ng android-tools - btop + btop-cuda curl docker dust @@ -294,8 +299,9 @@ wirelesstools #unstable - pkgs-unstable.crush + pkgs-unstable.vscode (pkgs-unstable.llama-cpp.override { cudaSupport = true; }) + pkgs-unstable.witr #fonts nerd-fonts.hack @@ -303,14 +309,16 @@ ]; + + # stylix.image = ../../assets/pfp/neonNerv.png; home-manager = { extraSpecialArgs = { inherit - # config configPath inputs pkgs-unstable hostname + hostTypes ; }; users = { @@ -319,31 +327,6 @@ backupFileExtension = "backup"; }; - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - # programs.mtr.enable = true; - # programs.gnupg.agent = { - # enable = true; - # enableSSHSupport = true; - # }; - - # List services that you want to enable: - - # Enable the OpenSSH daemon. - # services.openssh.enable = true; - - # Open ports in the firewall. - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - # networking.firewall.enable = false; - - # This value determines the NixOS release from which the default - # settings for stateful data, like file locations and database versions - # on your system were taken. It‘s perfectly fine and recommended to leave - # this value at the release version of the first install of this system. - # Before changing this value read the documentation for this option - # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). - system.stateVersion = "25.05"; # Did you read the comment? + system.stateVersion = "25.05"; }