(mirror) personal dotfiles github.com/crescentrose/dotfiles

feat: replace tons of custom config with DMS

Pros:

- It looks better and I don't need to maintain it as much
- It has some features (like more convenient Bluetooth management and
notification history) that I was going to code myself anyway

Cons:

- I need to use the word "dank" when describing what I use as my DE

+117 -987
+47 -108
flake.lock
··· 8 8 "ragenix", 9 9 "nixpkgs" 10 10 ], 11 - "systems": "systems_2" 11 + "systems": "systems" 12 12 }, 13 13 "locked": { 14 14 "lastModified": 1761656077, ··· 62 62 "type": "github" 63 63 } 64 64 }, 65 - "elephant": { 65 + "dms": { 66 66 "inputs": { 67 - "nixpkgs": "nixpkgs", 68 - "systems": "systems" 67 + "nixpkgs": [ 68 + "nixpkgs" 69 + ], 70 + "quickshell": "quickshell" 69 71 }, 70 72 "locked": { 71 - "lastModified": 1767428760, 72 - "narHash": "sha256-crwgIp7kVMNbkziJmSJlmakX5N57fwe1XW1iU/u4Rk4=", 73 - "owner": "abenz1267", 74 - "repo": "elephant", 75 - "rev": "946019db9183593af2c14d56924000d519e1f8d4", 73 + "lastModified": 1768395615, 74 + "narHash": "sha256-OUduJ6EcH91C8A5Jt2ZHgJiZg9k5ZKipKPbuHzbQGaI=", 75 + "owner": "AvengeMedia", 76 + "repo": "DankMaterialShell", 77 + "rev": "1b7dcf56a8040bddff348cb52a96c766b49ef98f", 76 78 "type": "github" 77 79 }, 78 80 "original": { 79 - "owner": "abenz1267", 80 - "repo": "elephant", 81 - "rev": "946019db9183593af2c14d56924000d519e1f8d4", 81 + "owner": "AvengeMedia", 82 + "ref": "stable", 83 + "repo": "DankMaterialShell", 82 84 "type": "github" 83 85 } 84 86 }, 85 87 "flake-utils": { 86 88 "inputs": { 87 - "systems": "systems_3" 89 + "systems": "systems_2" 88 90 }, 89 91 "locked": { 90 92 "lastModified": 1731533236, ··· 107 109 ] 108 110 }, 109 111 "locked": { 110 - "lastModified": 1768068402, 111 - "narHash": "sha256-bAXnnJZKJiF7Xr6eNW6+PhBf1lg2P1aFUO9+xgWkXfA=", 112 + "lastModified": 1768430115, 113 + "narHash": "sha256-/MT3w7pxK8eWhPSqbHZRSPgShLxt1v+oh4jr3uMNNws=", 112 114 "owner": "nix-community", 113 115 "repo": "home-manager", 114 - "rev": "8bc5473b6bc2b6e1529a9c4040411e1199c43b4c", 116 + "rev": "e8e0f530791a71d8adf73b5db392b1bd5ceeb458", 115 117 "type": "github" 116 118 }, 117 119 "original": { ··· 170 172 ] 171 173 }, 172 174 "locked": { 173 - "lastModified": 1767718503, 174 - "narHash": "sha256-V+VkFs0aSG0ca8p/N3gib7FAf4cq9jyr5Gm+ZBrHQpo=", 175 + "lastModified": 1768220509, 176 + "narHash": "sha256-8wMrJP/Xk5Dkm0TxzaERLt3eGFEhHTWaJKUpK3AoL4o=", 175 177 "owner": "nix-darwin", 176 178 "repo": "nix-darwin", 177 - "rev": "9f48ffaca1f44b3e590976b4da8666a9e86e6eb1", 179 + "rev": "7b1d394e7d9112d4060e12ef3271b38a7c43e83b", 178 180 "type": "github" 179 181 }, 180 182 "original": { ··· 186 188 }, 187 189 "nixos-hardware": { 188 190 "locked": { 189 - "lastModified": 1767185284, 190 - "narHash": "sha256-ljDBUDpD1Cg5n3mJI81Hz5qeZAwCGxon4kQW3Ho3+6Q=", 191 + "lastModified": 1768397375, 192 + "narHash": "sha256-7QqbFi3ERvKjEdAzEYPv7iSGwpUKSrQW5wPLMFq45AQ=", 191 193 "owner": "NixOS", 192 194 "repo": "nixos-hardware", 193 - "rev": "40b1a28dce561bea34858287fbb23052c3ee63fe", 195 + "rev": "efe2094529d69a3f54892771b6be8ee4a0ebef0f", 194 196 "type": "github" 195 197 }, 196 198 "original": { ··· 201 203 }, 202 204 "nixpkgs": { 203 205 "locked": { 204 - "lastModified": 1764242076, 205 - "narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=", 206 - "owner": "NixOS", 207 - "repo": "nixpkgs", 208 - "rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4", 209 - "type": "github" 210 - }, 211 - "original": { 212 - "owner": "NixOS", 213 - "ref": "nixos-unstable", 214 - "repo": "nixpkgs", 215 - "type": "github" 216 - } 217 - }, 218 - "nixpkgs_2": { 219 - "locked": { 220 206 "lastModified": 1768127708, 221 207 "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=", 222 208 "owner": "NixOS", ··· 231 217 "type": "github" 232 218 } 233 219 }, 234 - "nixpkgs_3": { 220 + "quickshell": { 221 + "inputs": { 222 + "nixpkgs": [ 223 + "dms", 224 + "nixpkgs" 225 + ] 226 + }, 235 227 "locked": { 236 - "lastModified": 1757068644, 237 - "narHash": "sha256-NOrUtIhTkIIumj1E/Rsv1J37Yi3xGStISEo8tZm3KW4=", 238 - "owner": "NixOS", 239 - "repo": "nixpkgs", 240 - "rev": "8eb28adfa3dc4de28e792e3bf49fcf9007ca8ac9", 241 - "type": "github" 228 + "lastModified": 1766725085, 229 + "narHash": "sha256-O2aMFdDUYJazFrlwL7aSIHbUSEm3ADVZjmf41uBJfHs=", 230 + "ref": "refs/heads/master", 231 + "rev": "41828c4180fb921df7992a5405f5ff05d2ac2fff", 232 + "revCount": 715, 233 + "type": "git", 234 + "url": "https://git.outfoxxed.me/quickshell/quickshell" 242 235 }, 243 236 "original": { 244 - "owner": "NixOS", 245 - "ref": "nixos-unstable", 246 - "repo": "nixpkgs", 247 - "type": "github" 237 + "rev": "41828c4180fb921df7992a5405f5ff05d2ac2fff", 238 + "type": "git", 239 + "url": "https://git.outfoxxed.me/quickshell/quickshell" 248 240 } 249 241 }, 250 242 "ragenix": { ··· 273 265 }, 274 266 "root": { 275 267 "inputs": { 276 - "elephant": "elephant", 268 + "dms": "dms", 277 269 "home-manager": "home-manager", 278 270 "nix-darwin": "nix-darwin", 279 271 "nixos-hardware": "nixos-hardware", 280 - "nixpkgs": "nixpkgs_2", 272 + "nixpkgs": "nixpkgs", 281 273 "ragenix": "ragenix", 282 - "walker": "walker", 283 274 "zen-browser": "zen-browser" 284 275 } 285 276 }, ··· 306 297 }, 307 298 "systems": { 308 299 "locked": { 309 - "lastModified": 1689347949, 310 - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", 311 - "owner": "nix-systems", 312 - "repo": "default-linux", 313 - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", 314 - "type": "github" 315 - }, 316 - "original": { 317 - "owner": "nix-systems", 318 - "repo": "default-linux", 319 - "type": "github" 320 - } 321 - }, 322 - "systems_2": { 323 - "locked": { 324 300 "lastModified": 1681028828, 325 301 "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 326 302 "owner": "nix-systems", ··· 334 310 "type": "github" 335 311 } 336 312 }, 337 - "systems_3": { 313 + "systems_2": { 338 314 "locked": { 339 315 "lastModified": 1681028828, 340 316 "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", ··· 349 325 "type": "github" 350 326 } 351 327 }, 352 - "systems_4": { 353 - "locked": { 354 - "lastModified": 1689347949, 355 - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", 356 - "owner": "nix-systems", 357 - "repo": "default-linux", 358 - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", 359 - "type": "github" 360 - }, 361 - "original": { 362 - "owner": "nix-systems", 363 - "repo": "default-linux", 364 - "type": "github" 365 - } 366 - }, 367 - "walker": { 368 - "inputs": { 369 - "elephant": [ 370 - "elephant" 371 - ], 372 - "nixpkgs": "nixpkgs_3", 373 - "systems": "systems_4" 374 - }, 375 - "locked": { 376 - "lastModified": 1767893373, 377 - "narHash": "sha256-PYqT8GdCAsmCAgJXu88wvOU2n41iugVCph0RV+v2VAc=", 378 - "owner": "abenz1267", 379 - "repo": "walker", 380 - "rev": "3dfc75e90e7a7cbff109ffa6e1af099d4e1f3867", 381 - "type": "github" 382 - }, 383 - "original": { 384 - "owner": "abenz1267", 385 - "repo": "walker", 386 - "type": "github" 387 - } 388 - }, 389 328 "zen-browser": { 390 329 "inputs": { 391 330 "home-manager": "home-manager_3", ··· 394 333 ] 395 334 }, 396 335 "locked": { 397 - "lastModified": 1768183082, 398 - "narHash": "sha256-XsiMOsqRLfmUi+24F7adhb/GAM2dMvplzwaW2Wxg/lo=", 336 + "lastModified": 1768379550, 337 + "narHash": "sha256-z94S29l5V86h11LZbPIMbHTJyksDG63aqISsZkTTuJY=", 399 338 "owner": "0xc000022070", 400 339 "repo": "zen-browser-flake", 401 - "rev": "cdbc300fd89d503a95d1c8564de31a93d7b0a0ae", 340 + "rev": "06f61b4e4f4f6ba8027c96a5611c63dc0db12b90", 402 341 "type": "github" 403 342 }, 404 343 "original": {
+8 -8
flake.nix
··· 16 16 17 17 nixos-hardware.url = "github:NixOS/nixos-hardware"; 18 18 19 - # something broke recently, ignore breakage for now 20 - elephant.url = "github:abenz1267/elephant?rev=946019db9183593af2c14d56924000d519e1f8d4"; 21 - 22 - walker = { 23 - url = "github:abenz1267/walker"; 24 - inputs.elephant.follows = "elephant"; 25 - }; 26 - 27 19 ragenix = { 28 20 url = "github:yaxitech/ragenix"; 29 21 inputs.nixpkgs.follows = "nixpkgs"; ··· 33 25 url = "github:nix-darwin/nix-darwin/master"; 34 26 inputs.nixpkgs.follows = "nixpkgs"; 35 27 }; 28 + 29 + dms = { 30 + url = "github:AvengeMedia/DankMaterialShell/stable"; 31 + inputs.nixpkgs.follows = "nixpkgs"; 32 + }; 36 33 }; 37 34 38 35 outputs = ··· 42 39 nixpkgs, 43 40 ragenix, 44 41 nix-darwin, 42 + dms, 45 43 ... 46 44 }: 47 45 let ··· 74 72 nixosConfigurations = { 75 73 starlight = nixpkgs.lib.nixosSystem { 76 74 system = "x86_64-linux"; 75 + specialArgs = inputs; 77 76 modules = [ 78 77 ./machines/starlight 78 + dms.nixosModules.greeter 79 79 nixos-hardware.nixosModules.common-pc 80 80 nixos-hardware.nixosModules.common-pc-ssd 81 81 nixos-hardware.nixosModules.common-gpu-amd
+5 -2
home/_home.nix
··· 1 - { pkgs, ragenix, ... }: 1 + { 2 + pkgs, 3 + ragenix, 4 + ... 5 + }: 2 6 { 3 7 imports = [ 4 8 ragenix.homeManagerModules.default 5 9 ./base.nix 6 10 ./programs/git.nix 7 11 ./programs/ssh.nix 8 - ./programs/walker.nix 9 12 ./programs/mpd.nix 10 13 ./programs/discord.nix 11 14 ./programs/ghostty.nix
-22
home/desktop/bar.nix
··· 1 - { lib, pkgs, ... }: 2 - { 3 - xdg.configFile."waybar".source = ../../resources/waybar; 4 - 5 - systemd.user.services.waybar = { 6 - Unit = { 7 - Description = "Waybar"; 8 - PartOf = "graphical-session.target"; 9 - After = "graphical-session.target"; 10 - Requisite = "graphical-session.target"; 11 - }; 12 - Install = { 13 - WantedBy = [ "graphical-session.target" ]; 14 - }; 15 - Service = { 16 - Environment = "$PATH:${lib.makeBinPath [ pkgs.imagemagick ]}"; 17 - ExecStart = "${pkgs.waybar}/bin/waybar"; 18 - ExecReload = "${pkgs.coreutils}/bin/kill -SIGUSR2 $MAINPID"; 19 - Restart = "on-failure"; 20 - }; 21 - }; 22 - }
+18 -6
home/desktop/default.nix
··· 1 - { pkgs, ... }: 1 + { pkgs, dms, ... }: 2 2 { 3 3 # Contains stuff pertaining to the Year of the Linux Desktop 4 4 imports = [ 5 + dms.homeModules.dank-material-shell 5 6 ./audio.nix 6 7 ./apps.nix 7 - ./bar.nix 8 8 ./fonts.nix 9 - ./idle.nix 10 9 ./gtk.nix 11 - ./notifications.nix 12 10 ./portal.nix 13 - ./wallpaper.nix 14 11 ./window-manager.nix 15 12 ]; 16 13 14 + programs.dank-material-shell = { 15 + enable = true; 16 + systemd = { 17 + enable = true; # Systemd service for auto-start 18 + restartIfChanged = true; # Auto-restart dms.service when dank-material-shell changes 19 + }; 20 + 21 + # Core features 22 + enableSystemMonitoring = true; # System monitoring widgets (dgop) 23 + enableVPN = true; # VPN management widget 24 + enableDynamicTheming = true; # Wallpaper-based theming (matugen) 25 + enableAudioWavelength = true; # Audio visualizer (cava) 26 + enableCalendarEvents = true; # Calendar integration (khal) 27 + enableClipboardPaste = true; # Pasting items from the clipboard (wtype) 28 + }; 29 + 17 30 # Enable system authentication for unprivileged apps 18 31 services.polkit-gnome.enable = true; 19 32 ··· 24 37 wl-clipboard # copy and paste 25 38 wtype # automate writing (for inserting emojis) 26 39 xwayland-satellite # xwayland outside wayland 27 - blueberry # bluetooth settings 28 40 v4l-utils # webcam settings 29 41 libnotify # for notify-send 30 42
+1
home/desktop/gtk.nix
··· 1 1 { pkgs, ... }: 2 2 { 3 + # Manage through DMS 3 4 home.pointerCursor = { 4 5 gtk.enable = true; 5 6 x11.enable = true;
-162
home/desktop/idle.nix
··· 1 - { 2 - # TODO: replace this 3 - programs.hyprlock = { 4 - enable = true; 5 - 6 - settings = { 7 - "$primaryMonitor" = "DP-1"; 8 - "$inputColor" = "rgb(1e2030)"; 9 - "$fallbackColor" = "rgb(24273a)"; 10 - "$borderColor" = "rgb(1e2030)"; 11 - "$textColor" = "rgb(cad3f5)"; 12 - "$fontFamily" = "Departure Mono"; 13 - "$checkColor" = "rgb(91d7e3)"; 14 - "$failColor" = "rgb(f0c6c6)"; 15 - "$shadowColor" = "rgb(363a4f)"; 16 - "$shadow" = "0.8"; 17 - 18 - "$fontSizeSmall" = 10; 19 - "$fontSizeNormal" = 12; 20 - "$fontSizeLarge" = 18; 21 - 22 - general = { 23 - grace = 5; 24 - }; 25 - 26 - background = { 27 - path = "~/.cache/hyprlock_wallpaper.jpg"; 28 - blur_size = 5; 29 - blur_passes = 2; 30 - noise = 0.05; 31 - brightness = 0.65; 32 - vibrancy = 0.5; 33 - color = "$fallbackColor"; 34 - }; 35 - 36 - label = [ 37 - # Date 38 - { 39 - monitor = "$primaryMonitor"; 40 - text = ''cmd[update:18000000] echo "$(date +'%A, %-d %B %Y')"''; 41 - color = "$textColor"; 42 - font_size = "$fontSizeNormal"; 43 - font_family = "$fontFamily"; 44 - 45 - position = "0, 250"; 46 - halign = "center"; 47 - valign = "center"; 48 - 49 - shadow_passes = 1; 50 - shadow_color = "$shadowColor"; 51 - shadow_boost = "$shadow"; 52 - } 53 - 54 - # Time 55 - { 56 - monitor = "$primaryMonitor"; 57 - text = ''cmd[update:1000] echo "$(date +'%H:%M')"''; # 24H 58 - color = "$textColor"; 59 - font_size = "$fontSizeLarge"; 60 - font_family = "$fontFamily"; 61 - 62 - position = "0, 200"; 63 - halign = "center"; 64 - valign = "center"; 65 - 66 - shadow_passes = 1; 67 - shadow_color = "$shadowColor"; 68 - shadow_boost = "$shadow"; 69 - } 70 - 71 - # Greeting 72 - { 73 - monitor = "$primaryMonitor"; 74 - text = "Enter password"; 75 - color = "$textColor"; 76 - font_size = "$fontSizeNormal"; 77 - font_family = "$fontFamily"; 78 - 79 - position = "0, 260"; 80 - halign = "center"; 81 - valign = "bottom"; 82 - shadow_passes = 1; 83 - shadow_color = "$shadowColor"; 84 - shadow_boost = "$shadow"; 85 - } 86 - # Notification count 87 - # { 88 - # monitor = "$primaryMonitor"; 89 - # text = "cmd[update:4000] ~/bin/lockscreen-status"; 90 - # text_align = "center"; 91 - # color = "$textColor"; 92 - # font_size = "$fontSizeNormal"; 93 - # font_family = "$fontFamily"; 94 - 95 - # position = "0, 40"; 96 - # halign = "center"; 97 - # valign = "bottom"; 98 - # shadow_passes = 1; 99 - # shadow_color = "$shadowColor"; 100 - # shadow_boost = "$shadow"; 101 - # } 102 - ]; 103 - 104 - # Password field 105 - input-field = [ 106 - { 107 - monitor = "$primaryMonitor"; 108 - size = "400, 35"; 109 - rounding = 15; 110 - position = "0, 200"; 111 - halign = "center"; 112 - valign = "bottom"; 113 - 114 - outline_thickness = 1; 115 - inner_color = "$inputColor"; 116 - font_family = "$fontFamily"; 117 - font_color = "$textColor"; 118 - outer_color = "$borderColor"; 119 - fail_color = "$failColor"; 120 - check_color = "$checkColor"; 121 - placeholder_text = ""; 122 - fail_text = "nope!"; 123 - dots_rounding = 0; 124 - dots_spacing = 0; 125 - dots_text_format = "░░"; 126 - #dots_text_format = ▒░▓█ 127 - 128 - fade_on_empty = false; 129 - shadow_passes = 1; 130 - shadow_color = "$shadowColor"; 131 - shadow_boost = "$shadow"; 132 - } 133 - ]; 134 - }; 135 - }; 136 - 137 - services.hypridle = { 138 - enable = true; 139 - settings = { 140 - general = { 141 - lock_cmd = "~/.local/share/scripts/bin/screen-lock lock"; 142 - unlock_cmd = "~/.local/share/scripts/bin/screen-lock unlock"; 143 - 144 - before_sleep_cmd = "~/.local/share/scripts/bin/screen-lock lock"; 145 - }; 146 - 147 - listener = [ 148 - { 149 - timeout = 300; 150 - on-timeout = "loginctl lock-session"; 151 - } 152 - 153 - { 154 - timeout = 900; 155 - on-timeout = "systemctl suspend"; 156 - } 157 - ]; 158 - 159 - }; 160 - systemdTarget = "graphical-session.target"; 161 - }; 162 - }
-40
home/desktop/notifications.nix
··· 1 - { 2 - services.mako = { 3 - enable = true; 4 - 5 - settings = { 6 - font = "Iosevka 12px"; 7 - max-icon-size = 32; 8 - 9 - format = "%s"; 10 - background-color = "#24273a"; 11 - text-color = "#cad3f5"; 12 - border-color = "#1e2030"; 13 - 14 - layer = "overlay"; 15 - group-by = "app-name"; 16 - 17 - default-timeout = 5000; 18 - 19 - history = 1; 20 - max-history = 20; 21 - 22 - # If the notification has a body, separate the body and the summary with a line. 23 - "body~=.+" = { 24 - format = "%s\\n──\\n%b"; 25 - }; 26 - 27 - # If `do-not-disturb` mode is enabled, hide all notifications 28 - "mode=do-not-disturb" = { 29 - invisible = 1; 30 - }; 31 - 32 - # If `locked` mode is enabled, do not expire notifications. Keep them all in "limbo". 33 - "mode=locked" = { 34 - ignore-timeout = 1; 35 - default-timeout = 0; 36 - invisible = 1; 37 - }; 38 - }; 39 - }; 40 - }
-3
home/desktop/wallpaper.nix
··· 1 - { 2 - services.swww.enable = true; 3 - }
+1 -4
home/desktop/window-manager.nix
··· 1 - { pkgs, ... }: 2 1 { 3 - home.packages = [ pkgs.niri ]; 4 - 5 - xdg.configFile.niri.source = ../../resources/niri; 2 + xdg.configFile."niri/config.kdl".source = ../../resources/niri/config.kdl; 6 3 }
+1
home/programs/ghostty.nix
··· 10 10 font-family = "Iosevka"; 11 11 font-size = 12; 12 12 command = "/usr/bin/env nu"; 13 + app-notifications = "no-clipboard-copy,no-config-reload"; 13 14 }; 14 15 }; 15 16 }
-61
home/programs/walker.nix
··· 1 - { walker, ... }: 2 - { 3 - imports = [ 4 - walker.homeManagerModules.default 5 - ]; 6 - 7 - programs.walker = { 8 - enable = true; 9 - runAsService = true; 10 - config = { 11 - providers = { 12 - default = [ 13 - "desktopapplications" 14 - "calc" 15 - "websearch" 16 - "bookmarks" 17 - "todo" 18 - ]; 19 - 20 - prefixes = [ 21 - { 22 - prefix = ";"; 23 - provider = "providerlist"; 24 - } 25 - { 26 - prefix = ">"; 27 - provider = "runner"; 28 - } 29 - { 30 - prefix = "."; 31 - provider = "symbols"; 32 - } 33 - { 34 - prefix = "!"; 35 - provider = "todo"; 36 - } 37 - { 38 - prefix = "%"; 39 - provider = "bookmarks"; 40 - } 41 - { 42 - prefix = "@"; 43 - provider = "websearch"; 44 - } 45 - { 46 - prefix = ":"; 47 - provider = "clipboard"; 48 - } 49 - { 50 - prefix = "$"; 51 - provider = "windows"; 52 - } 53 - { 54 - prefix = "'"; 55 - provider = "nirisessions"; 56 - } 57 - ]; 58 - }; 59 - }; 60 - }; 61 - }
+19 -50
machines/starlight/default.nix
··· 1 - { config, pkgs, ... }: 1 + { 2 + config, 3 + pkgs, 4 + dms, 5 + ... 6 + }: 2 7 let 3 - # TODO: move this elsewhere, it makes no sense to keep this at the top of the file 4 - greetConfig = pkgs.writeText "greetd-sway-config" '' 5 - exec "${pkgs.gtkgreet}/bin/gtkgreet -l -s /etc/greetd/gtkgreet.css; swaymsg exit" 6 - bindsym Mod4+shift+e exec swaynag \ 7 - -t warning \ 8 - -m 'What do you want to do?' \ 9 - -b 'Poweroff' 'systemctl poweroff' \ 10 - -b 'Reboot' 'systemctl reboot' 11 - ''; 12 8 plymouthCat = pkgs.callPackage ../../packages/plymouth-cat/package.nix { }; 13 9 kernel = config.boot.kernelPackages; 14 10 zenpower5 = kernel.callPackage ../../packages/zenpower5/package.nix { }; ··· 99 95 "wheel" 100 96 "kvm" 101 97 "docker" 98 + "greeter" 102 99 ]; 103 100 shell = pkgs.zsh; 104 101 packages = [ ]; ··· 167 164 ]; 168 165 169 166 # Use nano as the default editor (if we do not have something user-specific) 170 - environment.variables.EDITOR = "nano"; 167 + environment.variables.eDITOR = "nano"; 171 168 172 169 # Set up dconf 173 170 programs.dconf.enable = true; 171 + 172 + # Set up AccountsService 173 + services.accounts-daemon.enable = true; 174 + 175 + # Use Niri as the default compositor 176 + programs.niri.enable = true; 174 177 175 178 # Enable video 176 179 hardware.graphics.enable = true; ··· 209 212 }; 210 213 211 214 # Set up greeter 212 - services.greetd = { 215 + # TODO: this also requires some symlinks and ACLs, which is currently manual. 216 + # see: https://danklinux.com/docs/dankgreeter/configuration#manual-sync 217 + programs.dank-material-shell.greeter = { 213 218 enable = true; 214 - settings = { 215 - default_session = { 216 - command = "${pkgs.sway}/bin/sway --config ${greetConfig}"; 217 - }; 218 - }; 219 + compositor.name = "niri"; 220 + configHome = "/home/ivan"; 219 221 }; 220 222 221 223 # Set up SSH access ··· 231 233 PermitRootLogin = "no"; 232 234 }; 233 235 }; 234 - 235 - environment.etc."greetd/environments".text = '' 236 - niri-session 237 - zsh 238 - ''; 239 - 240 - # Show a nice background instead of a flashbang 241 - environment.etc."greetd/gtkgreet.css".text = '' 242 - window { 243 - background-image: url("file://${pkgs.nixos-artwork.wallpapers.simple-dark-gray-bottom}/share/backgrounds/nixos/nix-wallpaper-simple-dark-gray_bottom.png"); 244 - background-size: cover; 245 - background-position: center; 246 - } 247 - 248 - box#body { 249 - background-color: #ffffff; 250 - color: black; 251 - border-radius: 10px; 252 - padding: 50px; 253 - } 254 - ''; 255 236 256 237 # Allow Zen browser to use 1Password 257 238 environment.etc."1password/custom_allowed_browsers" = { ··· 366 347 "root" 367 348 "ivan" 368 349 ]; 369 - 370 - # # Additional binary caches 371 - # # Disabled temporarily because it gets queried for everything which is 372 - # # not necessarily what I want 373 - # extra-substituters = [ 374 - # "https://walker.cachix.org" 375 - # "https://walker-git.cachix.org" 376 - # ]; 377 - # extra-trusted-public-keys = [ 378 - # "walker.cachix.org-1:fG8q+uAaMqhsMxWjwvk0IMb4mFPFLqHjuvfwQxE4oJM=" 379 - # "walker-git.cachix.org-1:vmC0ocfPWh0S/vRAQGtChuiZBTAe4wiKDeyyXM0/7pM=" 380 - # ]; 381 350 }; 382 351 383 352 # Maybe?
resources/icon+bg.png

This is a binary file and will not be displayed.

+17 -71
resources/niri/config.kdl
··· 20 20 } 21 21 } 22 22 23 - output "DP-1" { 24 - mode "3440x1440@180.000" 25 - position x=0 y=0 26 - variable-refresh-rate on-demand=true 27 - } 28 23 29 24 layout { 30 25 gaps 10 ··· 77 72 // - CSS named colors: "red" 78 73 // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" 79 74 // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. 80 - 81 - active-color "#c6a0f6" 82 - inactive-color "#181926" 83 - 84 - // You can also use gradients. They take precedence over solid colors. 85 - // Gradients are rendered the same as CSS linear-gradient(angle, from, to). 86 - // The angle is the same as in linear-gradient, and is optional, 87 - // defaulting to 180 (top-to-bottom gradient). 88 - // You can use any CSS linear-gradient tool on the web to set these up. 89 - // Changing the color space is also supported, check the wiki for more info. 90 - // 91 - // active-gradient from="#80c8ff" to="#bbddff" angle=45 92 - 93 - // You can also color the gradient relative to the entire view 94 - // of the workspace, rather than relative to just the window itself. 95 - // To do that, set relative-to="workspace-view". 96 - // 97 - // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" 98 75 } 99 76 100 77 // You can enable drop shadows for windows. ··· 129 106 130 107 // Offset moves the shadow relative to the window. 131 108 offset x=0 y=5 132 - 133 - // You can also change the shadow color and opacity. 134 - color "#0005" 135 109 } 136 110 137 111 // Struts shrink the area occupied by windows, similarly to layer-shell panels. ··· 141 115 // layer-shell panels and regular gaps. 142 116 struts { 143 117 // Match the waybar setup 144 - left 15 145 - right 15 118 + left 5 119 + right 5 146 120 top 0 147 121 bottom 0 148 122 } ··· 164 138 slowdown 0.8 165 139 } 166 140 167 - // Give all windows round corners. 168 - window-rule { 169 - geometry-corner-radius 8 170 - clip-to-geometry true 171 - } 172 - 173 - // Give all floating windows a shadow 174 - window-rule { 175 - match is-floating=true 176 - shadow { 177 - on 178 - softness 30 179 - spread 5 180 - offset x=5 y=10 181 - color "#18192680" 182 - } 183 - } 184 - 185 - // Open the Firefox picture-in-picture player as floating by default. 186 - window-rule { 187 - match app-id=r#"firefox$"# title="^Picture-in-Picture$" 188 - open-floating true 189 - } 190 - 191 - // Give Waybar a tasteful shadow 192 - layer-rule { 193 - match namespace="^waybar$" 194 - 195 - shadow { 196 - on 197 - softness 40 198 - spread 5 199 - draw-behind-window true 200 - color "#3332" 201 - } 202 - } 203 - 204 141 // Skip the hotkey overlay at startup. 205 142 hotkey-overlay { 206 143 skip-at-startup ··· 232 169 233 170 // Suggested binds for running programs: terminal, app launcher, screen locker. 234 171 Mod+Return hotkey-overlay-title="Open terminal window" repeat=false { spawn "ghostty"; } 235 - Mod+Space hotkey-overlay-title="App launcher" repeat=false { spawn "walker"; } 172 + Mod+Space hotkey-overlay-title="App launcher" repeat=false { spawn "dms" "ipc" "call" "spotlight" "toggle"; } 236 173 237 174 Mod+Ctrl+q hotkey-overlay-title="Lock screen" repeat=false { spawn "loginctl" "lock-session"; } 175 + 176 + // DMS keybinds 177 + Mod+Shift+period hotkey-overlay-title="Open a notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; } 178 + Ctrl+Alt+Delete hotkey-overlay-title="Open the power menu" { spawn "dms" "ipc" "call" "powermenu" "open"; } 238 179 239 180 // Example volume keys mappings for PipeWire & WirePlumber. 240 181 // The allow-when-locked=true property makes them work even when the session is locked. ··· 434 375 // Toggle tabbed column display mode. 435 376 // Windows in this column will appear as vertical tabs, 436 377 // rather than stacked on top of each other. 437 - Mod+W { toggle-column-tabbed-display; } 378 + Mod+Shift+W { toggle-column-tabbed-display; } 438 379 439 380 // Actions to switch layouts. 440 381 // Note: if you uncomment these, make sure you do NOT have ··· 457 398 // which ensures niri always processes them, even when an inhibitor is active. 458 399 Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } 459 400 460 - // The quit action will show a confirmation dialog to avoid accidental exits. 461 - Mod+Shift+E { quit; } 462 - Ctrl+Alt+Delete { quit; } 463 - 464 401 // Powers off the monitors. To turn them back on, do any input like 465 402 // moving the mouse or pressing any other key. 466 403 Mod+Shift+P { power-off-monitors; } 467 404 } 468 405 406 + // Automatically generated by DMS. Overrides existing settings. 407 + include "dms/cursor.kdl" 408 + include "dms/colors.kdl" 409 + include "dms/outputs.kdl" 410 + include "dms/layout.kdl" 411 + include "dms/binds.kdl" 412 + include "dms/alttab.kdl" 413 + 414 + // do not override cursor settings, they barely work as-is 469 415 cursor { 470 416 xcursor-theme "Bibata-Modern-Classic" 471 417 }
-82
resources/waybar/base.css
··· 1 - window#waybar { 2 - color: @text; 3 - background-color: transparent; 4 - font-family: "Inter", "Symbols Nerd Font Mono", FontAwesome; 5 - font-size: 12px; 6 - font-weight: 500; 7 - } 8 - 9 - window#waybar.empty #window { 10 - background-color: transparent; 11 - } 12 - 13 - .modules-left { 14 - margin-left: 10px; 15 - /* match gaps */ 16 - } 17 - 18 - .modules-right { 19 - margin-right: 5px; 20 - } 21 - 22 - .module { 23 - border-radius: 15px; 24 - background-color: @base; 25 - margin-right: 5px; 26 - padding: 0 10px; 27 - } 28 - 29 - #workspaces { 30 - padding: 0; 31 - } 32 - 33 - /* order is important here - last takes precedent */ 34 - #workspaces button { 35 - border-radius: 15px; 36 - background-color: @base; 37 - color: @flamingo; 38 - } 39 - 40 - #workspaces button.empty { 41 - color: @subtext1; 42 - } 43 - 44 - #workspaces button.focused { 45 - background-color: @pink; 46 - color: @base; 47 - } 48 - 49 - #clock { 50 - color: @lavender; 51 - } 52 - 53 - #wireplumber { 54 - color: @pink; 55 - } 56 - 57 - #wireplumber.muted { 58 - color: @red; 59 - } 60 - 61 - #custom-power { 62 - padding: 0 10px; 63 - } 64 - 65 - #custom-colorscheme { 66 - background-color: @base; 67 - color: @text; 68 - } 69 - 70 - #mpris.playing, 71 - #mpris.paused { 72 - color: @flamingo; 73 - } 74 - 75 - tooltip { 76 - background: @mantle; 77 - border: 1px solid @teal; 78 - } 79 - 80 - tooltip label { 81 - color: @text; 82 - }
-93
resources/waybar/config.jsonc
··· 1 - // -*- mode: jsonc -*- 2 - { 3 - "height": 34, 4 - "margin-top": 5, 5 - "margin-left": 15, 6 - "margin-right": 15, 7 - // Draw Waybar on top of the compositor, so that it's visible in the Niri overview 8 - "layer": "top", 9 - // General settings 10 - // Support Sway IPC for showing and hiding the bar 11 - "ipc": true, 12 - // Module order 13 - "modules-left": [ 14 - "custom/power", 15 - "niri/workspaces", 16 - "niri/window" 17 - ], 18 - "modules-center": [], 19 - "modules-right": [ 20 - "mpris", 21 - "wireplumber", 22 - "tray", 23 - "custom/colorscheme", 24 - "niri/language", 25 - "clock" 26 - ], 27 - "niri/workspaces": {}, 28 - "niri/window": { 29 - "separate-outputs": true, 30 - "format": " {title}" 31 - }, 32 - "niri/language": { 33 - "format-nl": "🇳🇱", 34 - "format-hr": "🇭🇷", 35 - "on-click": "niri msg action switch-layout next" 36 - }, 37 - "custom/colorscheme": { 38 - "exec": "$HOME/.local/share/scripts/bin/color-scheme waybar", 39 - "return-type": "json", 40 - "interval": "once", 41 - "exec-on-event": true, 42 - "on-click": "$HOME/.local/share/scripts/bin/color-scheme toggle", 43 - "format": "{}" 44 - }, 45 - "mpris": { 46 - "format": "{status_icon} {artist} - {title} {player_icon}", 47 - "format-stopped": "", 48 - "interval": 5, 49 - "random-icons": { 50 - "off": "", 51 - "on": " " 52 - }, 53 - "artist-len": 20, 54 - "title-len": 30, 55 - "repeat-icons": { 56 - "on": " " 57 - }, 58 - "player-icons": { 59 - "default": "", 60 - "mpd": "", 61 - "firefox": "" 62 - }, 63 - "status-icons": { 64 - "paused": "", 65 - "playing": "" 66 - } 67 - }, 68 - "tray": { 69 - "spacing": 10 70 - }, 71 - "clock": { 72 - "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", 73 - "format-alt": "{:%Y-%m-%d}" 74 - }, 75 - "wireplumber": { 76 - // "scroll-step": 1, // %, can be a float 77 - "format": "{volume}% ", 78 - "format-muted": "󰝟" 79 - }, 80 - "custom/power": { 81 - "format": "󰄛", 82 - "tooltip": false, 83 - "menu": "on-click", 84 - "menu-file": "$HOME/.config/waybar/power_menu.xml", 85 - "menu-actions": { 86 - "lock": "loginctl lock-screen", 87 - "shutdown": "systemctl poweroff", 88 - "reboot": "systemctl reboot", 89 - "suspend": "systemctl suspend", 90 - "logout": "niri msg action quit" 91 - } 92 - } 93 - }
-38
resources/waybar/power_menu.xml
··· 1 - <?xml version="1.0" encoding="UTF-8"?> 2 - <interface> 3 - <object class="GtkMenu" id="menu"> 4 - <child> 5 - <object class="GtkSeparatorMenuItem" id="delimiter0"/> 6 - </child> 7 - <child> 8 - <object class="GtkMenuItem" id="lock"> 9 - <property name="label">Lock</property> 10 - </object> 11 - </child> 12 - <child> 13 - <object class="GtkMenuItem" id="logout"> 14 - <property name="label">Log out</property> 15 - </object> 16 - </child> 17 - <child> 18 - <object class="GtkSeparatorMenuItem" id="delimiter1"/> 19 - </child> 20 - <child> 21 - <object class="GtkMenuItem" id="suspend"> 22 - <property name="label">Suspend</property> 23 - </object> 24 - </child> 25 - <child> 26 - <object class="GtkMenuItem" id="reboot"> 27 - <property name="label">Reboot</property> 28 - </object> 29 - </child> 30 - <child> 31 - <object class="GtkMenuItem" id="shutdown"> 32 - <property name="label">Shutdown</property> 33 - </object> 34 - </child> 35 - </object> 36 - </interface> 37 - 38 -
-28
resources/waybar/style-dark.css
··· 1 - @define-color rosewater #f4dbd6; 2 - @define-color flamingo #f0c6c6; 3 - @define-color pink #f5bde6; 4 - @define-color mauve #c6a0f6; 5 - @define-color red #ed8796; 6 - @define-color maroon #ee99a0; 7 - @define-color peach #f5a97f; 8 - @define-color yellow #eed49f; 9 - @define-color green #a6da95; 10 - @define-color teal #8bd5ca; 11 - @define-color sky #91d7e3; 12 - @define-color sapphire #7dc4e4; 13 - @define-color blue #8aadf4; 14 - @define-color lavender #b7bdf8; 15 - @define-color text #cad3f5; 16 - @define-color subtext1 #b8c0e0; 17 - @define-color subtext0 #a5adcb; 18 - @define-color overlay2 #939ab7; 19 - @define-color overlay1 #8087a2; 20 - @define-color overlay0 #6e738d; 21 - @define-color surface2 #5b6078; 22 - @define-color surface1 #494d64; 23 - @define-color surface0 #363a4f; 24 - @define-color base #24273a; 25 - @define-color mantle #1e2030; 26 - @define-color crust #181926; 27 - 28 - @import "base.css";
-28
resources/waybar/style-light.css
··· 1 - @define-color rosewater #dc8a78; 2 - @define-color flamingo #dd7878; 3 - @define-color pink #ea76cb; 4 - @define-color mauve #8839ef; 5 - @define-color red #d20f39; 6 - @define-color maroon #e64553; 7 - @define-color peach #fe640b; 8 - @define-color yellow #df8e1d; 9 - @define-color green #40a02b; 10 - @define-color teal #179299; 11 - @define-color sky #04a5e5; 12 - @define-color sapphire #209fb5; 13 - @define-color blue #1e66f5; 14 - @define-color lavender #7287fd; 15 - @define-color text #4c4f69; 16 - @define-color subtext1 #5c5f77; 17 - @define-color subtext0 #6c6f85; 18 - @define-color overlay2 #7c7f93; 19 - @define-color overlay1 #8c8fa1; 20 - @define-color overlay0 #9ca0b0; 21 - @define-color surface2 #acb0be; 22 - @define-color surface1 #bcc0cc; 23 - @define-color surface0 #ccd0da; 24 - @define-color base #eff1f5; 25 - @define-color mantle #e6e9ef; 26 - @define-color crust #dce0e8; 27 - 28 - @import "base.css";
-88
scripts/bin/change-wallpaper
··· 1 - #!/usr/bin/env nu 2 - 3 - use ../lib/vlog 4 - 5 - let WALLPAPER_LOCATION = $"($env.HOME)/.cache/current_wallpaper" 6 - let LOCK_WALLPAPER_LOCATION = $"($env.HOME)/.cache/hyprlock_wallpaper.jpg" 7 - let BLUR_WALLPAPER_LOCATION = $"($env.HOME)/.cache/blurred_wallpaper.jpg" 8 - let WALLPAPER_FOLDER = $"($env.HOME)/Wallpapers" 9 - 10 - # Links the new wallpaper to the wallpaper cache, converts it to JPG for the lock screen if 11 - # necessary, and cleans up previous wallpaper if needed. 12 - def prepare-wallpaper [path: string] { 13 - # Clean up existing links/caches 14 - if ($LOCK_WALLPAPER_LOCATION | path exists) { 15 - vlog debug $"󰒜 Removing lock-screen wallpaper from ($LOCK_WALLPAPER_LOCATION)..." 16 - rm $LOCK_WALLPAPER_LOCATION 17 - } 18 - 19 - if ($BLUR_WALLPAPER_LOCATION | path exists) { 20 - vlog debug $"󰒜 Removing blurred wallpaper from ($BLUR_WALLPAPER_LOCATION)..." 21 - rm $BLUR_WALLPAPER_LOCATION 22 - } 23 - 24 - if ($WALLPAPER_LOCATION | path exists) { 25 - vlog debug $"󰒜 Removing wallpaper link from ($WALLPAPER_LOCATION)..." 26 - rm $WALLPAPER_LOCATION 27 - } 28 - 29 - # Determine if we have to use the "first frame" when converting to JPEG or not 30 - let wallpaperFileType = file --brief --dereference --mime $path 31 - if ($wallpaperFileType | str index-of 'image/gif') != -1 { 32 - # "index into" first frame of the GIF 33 - vlog debug $"🎥 Converting GIF to JPG..." 34 - magick $"($path)[0]" $LOCK_WALLPAPER_LOCATION 35 - } else { 36 - vlog debug $"👨‍🎨 Converting image to JPG..." 37 - magick $"($path)" $LOCK_WALLPAPER_LOCATION 38 - } 39 - 40 - # Link to new location 41 - vlog debug $"🔗 Linking new wallpaper..." 42 - ln -fs $path $WALLPAPER_LOCATION 43 - } 44 - 45 - # Switches the wallpaper to the prepared wallpaper. 46 - def switch-wallpaper [--transition-type (-t): string = "random", --filter (-f): string = "Nearest"] { 47 - vlog info "🌆 Transitioning wallpaper..." 48 - let params = [ 49 - "img", 50 - $"--transition-type=($transition_type)", 51 - $"--filter=($filter)", 52 - $WALLPAPER_LOCATION 53 - ] 54 - vlog debug $"Params: ($params | to json -r)" 55 - swww ...$params 56 - } 57 - 58 - # Returns a random file from the directory. 59 - def random-file [dir: string] { 60 - vlog info "🎲 Selecting random wallpaper..." 61 - let files = ls $dir 62 - let idx = random int 0..(($files | length) - 1) 63 - 64 - $files | get $idx 65 - } 66 - 67 - def set-wallpaper [path: string, --filter (-f): string = "Nearest"] { 68 - prepare-wallpaper $path 69 - switch-wallpaper --filter=($filter) 70 - } 71 - 72 - def "main set" [path: string, --filter (-f): string = "Nearest"] { 73 - vlog timed "Wallpaper change" { 74 - set-wallpaper $path 75 - } 76 - } 77 - 78 - def "main random" [] { 79 - vlog timed "Random wallpaper" { 80 - let wallpaper = random-file $WALLPAPER_FOLDER 81 - vlog debug $"Selected ($wallpaper.name) for new wallpaper." 82 - set-wallpaper $wallpaper.name 83 - } 84 - } 85 - 86 - def main [] { 87 - help main 88 - }
-58
scripts/bin/color-scheme
··· 1 - #!/usr/bin/env nu 2 - 3 - const dconf_path = "/org/gnome/desktop/interface/color-scheme" 4 - const prefer_light = "'prefer-light'" 5 - const prefer_dark = "'prefer-dark'" 6 - 7 - def set-scheme [scheme] { 8 - if $env.XDG_CURRENT_DESKTOP == "niri" { 9 - niri msg action do-screen-transition --delay-ms 250 10 - } 11 - 12 - dconf write $dconf_path $scheme 13 - } 14 - 15 - def get-current-scheme [] { 16 - dconf read $dconf_path 17 - } 18 - 19 - # Toggle color scheme. 20 - def "main toggle" [] { 21 - let old_scheme = get-current-scheme 22 - let new_scheme = if ($old_scheme == $prefer_light) { 23 - $prefer_dark 24 - } else { 25 - $prefer_light 26 - } 27 - 28 - set-scheme $new_scheme 29 - } 30 - 31 - # Set color scheme to dark. 32 - def "main dark" [] { 33 - set-scheme $prefer_dark 34 - } 35 - 36 - # Set color scheme to light. 37 - def "main light" [] { 38 - set-scheme $prefer_light 39 - } 40 - 41 - # Return a Waybar module. 42 - def "main waybar" [] { 43 - # work around Wayland bug https://github.com/Alexays/Waybar/pull/1784 44 - # I'm not sending signals, what fucking year is this? 45 - sleep 0.5sec 46 - 47 - let current_scheme = get-current-scheme 48 - 49 - if ($current_scheme == $prefer_light) { 50 - { text: "󰖨", class: "colorscheme-light" } | to json -r 51 - } else { 52 - { text: "󰽧", class: "colorscheme-dark" } | to json -r 53 - } 54 - } 55 - 56 - def main [] { 57 - help main 58 - }
-35
scripts/bin/screen-lock
··· 1 - #!/usr/bin/env nu 2 - 3 - use ../lib/vlog 4 - 5 - def lock [] { 6 - if (pidof hyprlock | complete).exit_code == 0 { 7 - vlog warn "🔒 Screen already locked; exiting." 8 - return # we are already running hyprlock 9 - } 10 - $env.LC_TIME = "en_GB.UTF8" # don't localize date names... 11 - makoctl mode -a locked 12 - 13 - hyprlock # Block until we unlock 14 - 15 - after-unlock 16 - } 17 - 18 - def after-unlock [] { 19 - makoctl mode -r locked 20 - vlog info "🔓 After-unlock triggered." 21 - } 22 - 23 - # Lock the screen, if it is not already locked. 24 - def "main lock" [] { 25 - lock 26 - } 27 - 28 - # Send a signal to unlock the screen. 29 - def "main unlock" [] { 30 - pkill -SIGUSR1 "hyprlock" 31 - } 32 - 33 - def main [] { 34 - help main 35 - }