Flake for my NixOS devices

Use UWSM and fix KDE Connect Waybar

bwc9876.dev ff2c3b62 9295a464

verified
+67 -94
+15 -15
flake.lock
··· 7 7 ] 8 8 }, 9 9 "locked": { 10 - "lastModified": 1739094937, 11 - "narHash": "sha256-LemSQ5AZHwl4ZVlirdpAytDWgS96OZsct7Akx/REdGA=", 10 + "lastModified": 1739283129, 11 + "narHash": "sha256-GXJllf1wY7tOF6uei9S3PnSEghFbnJP1vkxM0kkMOoI=", 12 12 "owner": "catppuccin", 13 13 "repo": "nix", 14 - "rev": "aee0cec463e62702751adaeb9f4fc00f2f72879b", 14 + "rev": "d4e258e29075a86a82dacaf4f5e0985935ae4658", 15 15 "type": "github" 16 16 }, 17 17 "original": { ··· 361 361 ] 362 362 }, 363 363 "locked": { 364 - "lastModified": 1739198052, 365 - "narHash": "sha256-fvAgCGK2phagbKv2S4YH4AIM566TKasfWMqYl3c3mPQ=", 364 + "lastModified": 1739571712, 365 + "narHash": "sha256-0UdSDV/TBY+GuxXLbrLq3l2Fq02ciyKCIMy4qmnfJXQ=", 366 366 "owner": "nix-community", 367 367 "repo": "home-manager", 368 - "rev": "b0bd29bb4b8df265b13bbb4a6639afa74faaa831", 368 + "rev": "6d3163aea47fdb1fe19744e91306a2ea4f602292", 369 369 "type": "github" 370 370 }, 371 371 "original": { ··· 500 500 }, 501 501 "nixpkgs": { 502 502 "locked": { 503 - "lastModified": 1739020877, 504 - "narHash": "sha256-mIvECo/NNdJJ/bXjNqIh8yeoSjVLAuDuTUzAo7dzs8Y=", 503 + "lastModified": 1739446958, 504 + "narHash": "sha256-+/bYK3DbPxMIvSL4zArkMX0LQvS7rzBKXnDXLfKyRVc=", 505 505 "owner": "NixOS", 506 506 "repo": "nixpkgs", 507 - "rev": "a79cfe0ebd24952b580b1cf08cd906354996d547", 507 + "rev": "2ff53fe64443980e139eaa286017f53f88336dd0", 508 508 "type": "github" 509 509 }, 510 510 "original": { ··· 547 547 "treefmt-nix": "treefmt-nix" 548 548 }, 549 549 "locked": { 550 - "lastModified": 1739121491, 551 - "narHash": "sha256-BEmyAozR3Pc2qwPtC4rgUglzi3cw4nv4fXEY23NxOrQ=", 550 + "lastModified": 1739627497, 551 + "narHash": "sha256-LqwCCtADkHniSmP5ufoiXNY4GRttwvW/EOTVpgVh0LY=", 552 552 "owner": "nix-community", 553 553 "repo": "nixvim", 554 - "rev": "13341a4c1238b7974e7bad9c7a6d5c51ca3cf81a", 554 + "rev": "d3a25cb97f8e8c4b77949b1e9fcf26b7ded42fbc", 555 555 "type": "github" 556 556 }, 557 557 "original": { ··· 676 676 ] 677 677 }, 678 678 "locked": { 679 - "lastModified": 1739154531, 680 - "narHash": "sha256-QGeN6e0nMJlNLzm3Y2A7P6riXhQXMeCXLZ7yajZYFQM=", 679 + "lastModified": 1739586408, 680 + "narHash": "sha256-UN9hRKRE1eLU8C0cioTZubaCZQTA8NDc8/4vCpS5pS0=", 681 681 "owner": "oxalica", 682 682 "repo": "rust-overlay", 683 - "rev": "035dac86ab7ce5c1e8a4d59dfe85e6911a3526ea", 683 + "rev": "3dbc0ce1c0690b83cfb9a9a51fbe90c3bc8f9916", 684 684 "type": "github" 685 685 }, 686 686 "original": {
+1 -1
nixosModules/dev/nvim.nix
··· 507 507 tailwindcss.enable = true; 508 508 jsonls.enable = true; 509 509 yamlls.enable = true; 510 - pylsp.enable = true; 510 + ruff.enable = true; 511 511 csharp_ls.enable = true; 512 512 svelte.enable = true; 513 513 nil_ls.enable = true;
+2
nixosModules/graphics/apps.nix
··· 152 152 153 153 home-manager.users.bean.services.kdeconnect.enable = true; 154 154 155 + environment.variables.NIXOS_OZONE_WL = "1"; 156 + 155 157 environment.systemPackages = with pkgs; [ 156 158 chromium 157 159 kitty
+3 -31
nixosModules/graphics/audio.nix
··· 19 19 ",XF86AudioPrev,exec,playerctl previous" 20 20 ]; 21 21 bindel = [ 22 - ",XF86AudioRaiseVolume,exec,swayosd-client --output-volume raise" 23 - ",XF86AudioLowerVolume,exec,swayosd-client --output-volume lower" 24 - ",XF86AudioMute,exec,swayosd-client --output-volume mute-toggle" 22 + ",XF86AudioRaiseVolume,exec,uwsm app -- swayosd-client --output-volume raise" 23 + ",XF86AudioLowerVolume,exec,uwsm app -- swayosd-client --output-volume lower" 24 + ",XF86AudioMute,exec,uwsm app -- swayosd-client --output-volume mute-toggle" 25 25 ]; 26 26 }; 27 27 ··· 30 30 alsa = { 31 31 enable = true; 32 32 support32Bit = true; 33 - }; 34 - extraConfig.pipewire = { 35 - "92-low-latency" = { 36 - "context.properties" = { 37 - "default.clock.rate" = 48000; 38 - "default.clock.quantum" = 2048; 39 - "default.clock.min-quantum" = 2048; 40 - "default.clock.max-quantum" = 2048; 41 - }; 42 - }; 43 - }; 44 - extraConfig.pipewire-pulse."92-low-latency" = { 45 - context.modules = [ 46 - { 47 - name = "libpipewire-module-protocol-pulse"; 48 - args = { 49 - pulse.min.req = "1024/48000"; 50 - pulse.default.req = "1024/48000"; 51 - pulse.max.req = "1024/48000"; 52 - pulse.min.quantum = "1024/48000"; 53 - pulse.max.quantum = "1024/48000"; 54 - }; 55 - } 56 - ]; 57 - stream.properties = { 58 - node.latency = "1024/48000"; 59 - resample.quality = 1; 60 - }; 61 33 }; 62 34 }; 63 35 }
+5 -1
nixosModules/graphics/greeter.nix
··· 9 9 settings = { 10 10 default_session = let 11 11 greeting = ''--greeting "Authenticate into ${lib.toUpper config.networking.hostName}"''; 12 - cmd = ''--cmd "systemd-inhibit --what=handle-power-key:handle-lid-switch Hyprland"''; 12 + deCmd = pkgs.writeScript "start-session.sh" '' 13 + #!/usr/bin/env sh 14 + exec uwsm start ${pkgs.hyprland}/share/wayland-sessions/hyprland.desktop 15 + ''; 16 + cmd = ''--cmd "systemd-inhibit --what=handle-power-key:handle-lid-switch ${deCmd}"''; 13 17 in { 14 18 command = "${pkgs.greetd.tuigreet}/bin/tuigreet --remember --time ${greeting} ${cmd}"; 15 19 };
+11 -16
nixosModules/graphics/hypr.nix
··· 1 1 {pkgs, ...}: { 2 - xdg.portal = { 3 - enable = true; 4 - config = { 5 - preferred = { 6 - default = ["hyprland" "gtk"]; 7 - }; 8 - }; 9 - extraPortals = with pkgs; [xdg-desktop-portal-hyprland]; 10 - }; 11 - 12 2 environment = { 13 3 systemPackages = with pkgs; [ 14 4 hyprpicker 5 + uwsm 15 6 ]; 16 - pathsToLink = ["/share/xdg-desktop-portal" "/share/applications"]; 7 + }; 8 + 9 + xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-gtk]; 10 + 11 + programs.hyprland = { 12 + enable = true; 13 + withUWSM = true; 17 14 }; 18 15 19 16 home-manager.users.bean = { 20 17 wayland.windowManager.hyprland = { 18 + systemd.enable = false; 21 19 enable = true; 22 - package = pkgs.hyprland; 23 - systemd.variables = ["--all"]; 24 20 extraConfig = '' 25 21 bind = SUPER,M,submap,passthru 26 22 submap = passthru ··· 82 78 ]; 83 79 submap = "reset"; 84 80 bind = let 85 - openTerminal = "kitty"; 81 + openTerminal = "uwsm app -- kitty.desktop"; 86 82 forEachWorkspace = { 87 83 mod, 88 84 dispatch, ··· 99 95 in 100 96 [ 101 97 "SUPER,M,submap,passthru" 102 - "SUPER,Q,exec,firefox-devedition" 98 + "SUPER,Q,exec,uwsm app -- firefox-devedition.desktop" 103 99 "SUPER,Z,exec,systemctl suspend" 104 100 ",XF86AudioMedia,exec,${openTerminal}" 105 101 "SUPER,T,exec,${openTerminal}" 106 102 "SUPER ALT CTRL SHIFT,L,exec,xdg-open https://linkedin.com" 107 103 "SUPER,C,killactive," 108 - "SUPER SHIFT,D,exec,code" 109 104 "SUPER,P,pseudo," 110 105 "SUPER,R,togglefloating," 111 106 "SUPER,F,fullscreen,1"
+26 -28
nixosModules/graphics/shell.nix
··· 122 122 exec-once = [ 123 123 "systemctl --user start hyprpolkitagent" 124 124 "hypridle" 125 - "dolphin --daemon" 126 - "waybar" 125 + "uwsm app -- dolphin --daemon" 126 + "uwsm app -- waybar" 127 127 "wl-paste --watch bash ${inputs.self}/res/clipboard_middleman.sh" 128 - "swaync" 129 - "swayosd-server" 130 - "nm-applet" 128 + "uwsm app -- swaync" 129 + "uwsm app -- swayosd-server" 130 + "uwsm app -- nm-applet" 131 131 "${pkgs.udiskie}/bin/udiskie -A -f dolphin" 132 132 "${pkgs.nushell}/bin/nu ${inputs.self}/res/battery_notif.nu" 133 133 "playerctld" 134 - "[workspace 3] keepassxc /home/bean/Documents/Database.kdbx" 134 + "[workspace 3] uwsm app -- keepassxc /home/bean/Documents/Database.kdbx" 135 135 ]; 136 136 137 137 bind = let 138 138 powerMenu = "rofi -modi 'p:${pkgs.rofi-power-menu}/bin/rofi-power-menu' -show p --symbols-font \"FiraMono Nerd Font Mono\""; 139 139 screenshot = "${pkgs.nushell}/bin/nu ${inputs.self}/res/screenshot.nu"; 140 140 in [ 141 - "SUPER,S,exec,rofi -show drun -icon-theme \"candy-icons\" -show-icons" 142 - "SUPER SHIFT,E,exec,rofi -modi emoji -show emoji" 143 - "SUPER,Delete,exec,${powerMenu}" 144 - ",XF86PowerOff,exec,${powerMenu}" 145 - "SUPER ALT,C,exec,rofi -show calc -modi calc -no-show-match -no-sort -calc-command \"echo -n '{result}' | wl-copy\"" 146 - "SUPER,I,exec,${pkgs.rofi-pulse-select}/bin/rofi-pulse-select source" 147 - "SUPER,O,exec,${pkgs.rofi-pulse-select}/bin/rofi-pulse-select sink" 148 - "SUPER,B,exec,${pkgs.rofi-bluetooth}/bin/rofi-bluetooth" 149 - "SUPER,Tab,exec,rofi -show window -show-icons" 150 - "SUPER,E,exec,${pkgs.nushell}/bin/nu ${inputs.self}/res/rofi/rofi-places.nu" 151 - "SUPER SHIFT,T,exec,${pkgs.nushell}/bin/nu ${inputs.self}/res/rofi/rofi-zoxide.nu" 152 - "SUPER,N,exec,${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw" 153 - "SUPER,A,exec,pavucontrol --tab 5" 141 + "SUPER,S,exec,uwsm app -- rofi -show drun -icon-theme \"candy-icons\" -show-icons" 142 + "SUPER SHIFT,E,exec,uwsm app -- rofi -modi emoji -show emoji" 143 + "SUPER,Delete,exec,uwsm app -- ${powerMenu}" 144 + ",XF86PowerOff,exec,uwsm app -- ${powerMenu}" 145 + "SUPER ALT,C,exec,uwsm app -- rofi -show calc -modi calc -no-show-match -no-sort -calc-command \"echo -n '{result}' | wl-copy\"" 146 + "SUPER,B,exec,uwsm app -- ${pkgs.rofi-bluetooth}/bin/rofi-bluetooth" 147 + "SUPER,Tab,exec,uwsm app -- rofi -show window -show-icons" 148 + "SUPER,E,exec,uwsm app -- ${pkgs.nushell}/bin/nu ${inputs.self}/res/rofi/rofi-places.nu" 149 + "SUPER SHIFT,T,exec,uwsm app -- ${pkgs.nushell}/bin/nu ${inputs.self}/res/rofi/rofi-zoxide.nu" 150 + "SUPER,N,exec,uwsm app -- ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw" 151 + "SUPER,A,exec,uwsm app -- pavucontrol --tab 5" 154 152 ''SUPER,V,exec,cliphist list | sed -r 's/\[\[ binary data (.* .iB) (.*) (.*) \]\]/ 󰋩 \2 Image (\3, \1)/g' | rofi -dmenu -display-columns 2 -p Clipboard | cliphist decode | wl-copy'' 155 153 "SUPER ALT,V,exec,echo -e \"Yes\\nNo\" | [[ $(rofi -dmenu -mesg \"Clear Clipboard History?\" -p Clear) == \"Yes\" ]] && cliphist wipe" 156 - ",Print,exec,${screenshot}" 157 - "SUPER SHIFT,S,exec,${screenshot}" 158 - "SUPER SHIFT,C,exec,${pkgs.hyprpicker}/bin/hyprpicker -a" 154 + ",Print,exec,uwsm app -- ${screenshot}" 155 + "SUPER SHIFT,S,exec,uwsm app -- ${screenshot}" 156 + "SUPER SHIFT,C,exec,uwsm app -- ${pkgs.hyprpicker}/bin/hyprpicker -a" 159 157 ]; 160 158 bindr = [ 161 - "SUPER SHIFT,R,exec,pkill wf-recorder --signal SIGINT || nu ${inputs.self}/res/screenrec.nu" 162 - "CAPS,Caps_Lock,exec,swayosd-client --caps-lock" 163 - ",Scroll_Lock,exec,swayosd-client --scroll-lock" 164 - ",Num_Lock,exec,swayosd-client --num-lock" 159 + "SUPER SHIFT,R,exec,pkill wf-recorder --signal SIGINT || uwsm app -- nu ${inputs.self}/res/screenrec.nu" 160 + "CAPS,Caps_Lock,exec,uwsm app -- swayosd-client --caps-lock" 161 + ",Scroll_Lock,exec,uwsm app -- swayosd-client --scroll-lock" 162 + ",Num_Lock,exec,uwsm app -- swayosd-client --num-lock" 165 163 ]; 166 164 bindel = [ 167 - ",XF86MonBrightnessUp,exec,swayosd-client --brightness raise" 168 - ",XF86MonBrightnessDown,exec,swayosd-client --brightness lower" 165 + ",XF86MonBrightnessUp,exec,uwsm app -- swayosd-client --brightness raise" 166 + ",XF86MonBrightnessDown,exec,uwsm app -- swayosd-client --brightness lower" 169 167 ]; 170 168 }; 171 169 };
+4 -2
res/custom_waybar_modules/kdeconnect.nu
··· 22 22 get_device_list | each {|it| device_info $it | insert "id" $it} 23 23 } 24 24 25 - def is_reachable [device: record] : bool -> bool { 25 + def is_reachable [device: record] { 26 26 $device.isReachable? | default false 27 27 } 28 28 29 - def supports_battery [device: record] : bool -> bool { 29 + def supports_battery [device: record] { 30 30 let reachable = is_reachable $device; 31 31 let supported = "kdeconnect_battery" in ($device.supportedPlugins? | default []); 32 32 let exists = dbus introspect --session --dest=$BUS_NAME (dev_path $device.id) | get -i children | default [] | any {|it| $it.name == "battery"} ··· 95 95 tooltip: $"($icon) ($name) -($percent)" 96 96 } 97 97 }; 98 + 99 + print $status; 98 100 99 101 let output = { 100 102 text: ($status | get chip | str join " "),