this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial

Ben C 16a3dc86

+5161
+28
base/nix.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + nix = { 7 + channel.enable = false; 8 + registry.p.flake = inputs.self; 9 + package = pkgs.lix; 10 + settings = { 11 + nix-path = "nixpkgs=${inputs.nixpkgs}"; 12 + experimental-features = [ 13 + "nix-command" 14 + "flakes" 15 + ]; 16 + auto-optimise-store = true; 17 + }; 18 + gc = { 19 + automatic = true; 20 + dates = "weekly"; 21 + }; 22 + }; 23 + 24 + system.switch = { 25 + enable = false; 26 + enableNg = true; 27 + }; 28 + }
+85
base/nushell.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + lib, 5 + ... 6 + }: let 7 + init-starship = pkgs.runCommand "starship-init" {} '' 8 + ${pkgs.starship}/bin/starship init nu > $out 9 + ''; 10 + in { 11 + home-manager.users.bean = with lib; { 12 + programs.nushell = { 13 + enable = true; 14 + shellAliases = { 15 + cd = "z"; 16 + sw = "zi"; 17 + py = "python"; 18 + cat = "bat"; 19 + pcat = "prettybat"; 20 + pbat = "prettybat"; 21 + man = "__batman"; 22 + bgrep = "batgrep"; 23 + neofetch = "hyfetch"; 24 + code = "codium"; 25 + screensaver = "pipes-rs -k curved -p 10 --fps 30"; 26 + }; 27 + configFile.text = '' 28 + let fish_completer = {|spans| 29 + ${pkgs.fish}/bin/fish --command $'complete "--do-complete=($spans | str join " ")"' 30 + | $"value(char tab)description(char newline)" + $in 31 + | from tsv --flexible --no-infer 32 + } 33 + let zoxide_completer = {|spans| 34 + let query = $spans | skip 1 35 + let z_results = $query | zoxide query -l ...$in | lines | where {|x| $x != $env.PWD} 36 + let l_results = ls -a | where type != "file" | where (($it.name | str downcase) | str starts-with ($query | get 0 | str downcase)) | get name 37 + $l_results | append $z_results 38 + } 39 + let multiple_completers = {|spans| 40 + # if the current command is an alias, get it's expansion 41 + let expanded_alias = (scope aliases | where name == $spans.0 | get -i 0 | get -i expansion) 42 + 43 + # overwrite 44 + 45 + let spans = (if $expanded_alias != null { 46 + # put the first word of the expanded alias first in the span 47 + $spans | skip 1 | prepend ($expanded_alias | split row " ") 48 + } else { $spans }) 49 + 50 + match $spans.0 { 51 + z => $zoxide_completer 52 + zi => $zoxide_completer 53 + __zoxide_z => $zoxide_completer 54 + __zoxide_zi => $zoxide_completer 55 + _ => $fish_completer 56 + } | do $in $spans 57 + } 58 + 59 + let command_not_found = ${fileContents "${inputs.self}/res/command_not_found.nu"} 60 + 61 + def --env __batman [...rest:string] { 62 + BAT_THEME="Monokai Extended" batman ...$rest 63 + } 64 + 65 + $env.config = { 66 + show_banner: false 67 + completions: { 68 + external: { 69 + enable: true 70 + completer: $multiple_completers 71 + } 72 + } 73 + hooks: { 74 + command_not_found: $command_not_found 75 + } 76 + } 77 + 78 + source ${init-starship} 79 + 80 + plugin add ${pkgs.callPackage "${inputs.self}/pkgs/nu_plugin_dbus.nix" {}}/bin/nu_plugin_dbus 81 + 82 + ''; 83 + }; 84 + }; 85 + }
+24
base/personal.nix
··· 1 + { 2 + pkgs, 3 + edition, 4 + inputs, 5 + ... 6 + }: { 7 + users.users.bean = { 8 + isNormalUser = true; 9 + description = "Benjamin Crocker"; 10 + password = "asdf"; # TODO: TESTING: DELETE 11 + autoSubUidGidRange = true; 12 + extraGroups = ["libvirtd" "networkmanager" "wheel" "video" "lpadmin" "wireshark"]; # TODO: Break up groups across files? 13 + }; 14 + 15 + home-manager.users.bean = { 16 + imports = [inputs.nix-index-db.hmModules.nix-index]; 17 + home = { 18 + username = "bean"; 19 + homeDirectory = "/home/bean"; 20 + file.".face".source = ../res/pictures/cow.png; 21 + stateVersion = edition; 22 + }; 23 + }; 24 + }
+65
base/shell.nix
··· 1 + { 2 + pkgs, 3 + lib, 4 + ... 5 + }: { 6 + users.users.bean.shell = pkgs.nushell; 7 + programs.fish.enable = true; 8 + documentation.man.generateCaches = false; 9 + environment = { 10 + shells = with pkgs; [nushell fish]; 11 + variables.EDITOR = "nvim"; 12 + 13 + systemPackages = with pkgs; [ 14 + nushell 15 + comma-with-db 16 + file 17 + screen 18 + util-linux 19 + inetutils 20 + just 21 + nix-output-monitor 22 + man-pages 23 + ]; 24 + }; 25 + 26 + programs.starship = { 27 + enable = true; 28 + settings = fromTOML (lib.fileContents ../res/starship.toml); 29 + }; 30 + 31 + programs.git.enable = true; 32 + 33 + programs.neovim = { 34 + enable = true; 35 + viAlias = true; 36 + vimAlias = true; 37 + }; 38 + 39 + home-manager.users.bean = { 40 + programs = { 41 + command-not-found.enable = false; 42 + nix-index.enable = true; 43 + zoxide.enable = true; 44 + ripgrep.enable = true; 45 + bat = { 46 + enable = true; 47 + config = { 48 + theme = "OneHalfDark"; 49 + }; 50 + extraPackages = with pkgs.bat-extras; [prettybat batman batgrep batwatch]; 51 + }; 52 + starship = { 53 + enable = true; 54 + settings = fromTOML (lib.fileContents ../res/starship.toml); 55 + }; 56 + neovim = { 57 + enable = true; 58 + defaultEditor = true; 59 + plugins = with pkgs; [ 60 + vimPlugins.transparent-nvim 61 + ]; 62 + }; 63 + }; 64 + }; 65 + }
+334
flake.lock
··· 1 + { 2 + "nodes": { 3 + "crane": { 4 + "locked": { 5 + "lastModified": 1730652660, 6 + "narHash": "sha256-+XVYfmVXAiYA0FZT7ijHf555dxCe+AoAT5A6RU+6vSo=", 7 + "owner": "ipetkov", 8 + "repo": "crane", 9 + "rev": "a4ca93905455c07cb7e3aca95d4faf7601cba458", 10 + "type": "github" 11 + }, 12 + "original": { 13 + "owner": "ipetkov", 14 + "repo": "crane", 15 + "type": "github" 16 + } 17 + }, 18 + "flake-compat": { 19 + "flake": false, 20 + "locked": { 21 + "lastModified": 1696426674, 22 + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", 23 + "owner": "edolstra", 24 + "repo": "flake-compat", 25 + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", 26 + "type": "github" 27 + }, 28 + "original": { 29 + "owner": "edolstra", 30 + "repo": "flake-compat", 31 + "type": "github" 32 + } 33 + }, 34 + "flake-parts": { 35 + "inputs": { 36 + "nixpkgs-lib": [ 37 + "lanzaboote", 38 + "nixpkgs" 39 + ] 40 + }, 41 + "locked": { 42 + "lastModified": 1730504689, 43 + "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=", 44 + "owner": "hercules-ci", 45 + "repo": "flake-parts", 46 + "rev": "506278e768c2a08bec68eb62932193e341f55c90", 47 + "type": "github" 48 + }, 49 + "original": { 50 + "owner": "hercules-ci", 51 + "repo": "flake-parts", 52 + "type": "github" 53 + } 54 + }, 55 + "gh-grader-preview": { 56 + "inputs": { 57 + "nixpkgs": [ 58 + "nixpkgs" 59 + ] 60 + }, 61 + "locked": { 62 + "lastModified": 1707583719, 63 + "narHash": "sha256-KARiQihK1riA0qIp788iH/sem4oLUvu0UHkqLZ/k5zk=", 64 + "owner": "Bwc9876", 65 + "repo": "gh-grader-preview", 66 + "rev": "10ffee561c1e8bf046c6f3d4b438a8cb31387b23", 67 + "type": "github" 68 + }, 69 + "original": { 70 + "owner": "Bwc9876", 71 + "repo": "gh-grader-preview", 72 + "type": "github" 73 + } 74 + }, 75 + "gitignore": { 76 + "inputs": { 77 + "nixpkgs": [ 78 + "lanzaboote", 79 + "pre-commit-hooks-nix", 80 + "nixpkgs" 81 + ] 82 + }, 83 + "locked": { 84 + "lastModified": 1709087332, 85 + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", 86 + "owner": "hercules-ci", 87 + "repo": "gitignore.nix", 88 + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 89 + "type": "github" 90 + }, 91 + "original": { 92 + "owner": "hercules-ci", 93 + "repo": "gitignore.nix", 94 + "type": "github" 95 + } 96 + }, 97 + "hm": { 98 + "inputs": { 99 + "nixpkgs": [ 100 + "nixpkgs" 101 + ] 102 + }, 103 + "locked": { 104 + "lastModified": 1732025103, 105 + "narHash": "sha256-qjEI64RKvDxRyEarY0jTzrZMa8ebezh2DEZmJJrpVdo=", 106 + "owner": "nix-community", 107 + "repo": "home-manager", 108 + "rev": "a46e702093a5c46e192243edbd977d5749e7f294", 109 + "type": "github" 110 + }, 111 + "original": { 112 + "owner": "nix-community", 113 + "repo": "home-manager", 114 + "type": "github" 115 + } 116 + }, 117 + "lanzaboote": { 118 + "inputs": { 119 + "crane": "crane", 120 + "flake-compat": "flake-compat", 121 + "flake-parts": "flake-parts", 122 + "nixpkgs": [ 123 + "nixpkgs" 124 + ], 125 + "pre-commit-hooks-nix": "pre-commit-hooks-nix", 126 + "rust-overlay": "rust-overlay" 127 + }, 128 + "locked": { 129 + "lastModified": 1731941836, 130 + "narHash": "sha256-zpmAzrvK8KdssBSwiIwwRxaUJ77oWORbW0XFvgCFpTE=", 131 + "owner": "nix-community", 132 + "repo": "lanzaboote", 133 + "rev": "2f48272f34174fd2a5ab3df4d8a46919247be879", 134 + "type": "github" 135 + }, 136 + "original": { 137 + "owner": "nix-community", 138 + "repo": "lanzaboote", 139 + "type": "github" 140 + } 141 + }, 142 + "nix-index-db": { 143 + "inputs": { 144 + "nixpkgs": [ 145 + "nixpkgs" 146 + ] 147 + }, 148 + "locked": { 149 + "lastModified": 1731814505, 150 + "narHash": "sha256-l9ryrx1Twh08a+gxrMGM9O/aZKEimZfa6sZVyPCImgI=", 151 + "owner": "Mic92", 152 + "repo": "nix-index-database", 153 + "rev": "bdba246946fb079b87b4cada4df9b1cdf1c06132", 154 + "type": "github" 155 + }, 156 + "original": { 157 + "owner": "Mic92", 158 + "repo": "nix-index-database", 159 + "type": "github" 160 + } 161 + }, 162 + "nixos-hardware": { 163 + "locked": { 164 + "lastModified": 1731797098, 165 + "narHash": "sha256-UhWmEZhwJZmVZ1jfHZFzCg+ZLO9Tb/v3Y6LC0UNyeTo=", 166 + "owner": "NixOS", 167 + "repo": "nixos-hardware", 168 + "rev": "672ac2ac86f7dff2f6f3406405bddecf960e0db6", 169 + "type": "github" 170 + }, 171 + "original": { 172 + "owner": "NixOS", 173 + "ref": "master", 174 + "repo": "nixos-hardware", 175 + "type": "github" 176 + } 177 + }, 178 + "nixpkgs": { 179 + "locked": { 180 + "lastModified": 1732014248, 181 + "narHash": "sha256-y/MEyuJ5oBWrWAic/14LaIr/u5E0wRVzyYsouYY3W6w=", 182 + "owner": "NixOS", 183 + "repo": "nixpkgs", 184 + "rev": "23e89b7da85c3640bbc2173fe04f4bd114342367", 185 + "type": "github" 186 + }, 187 + "original": { 188 + "owner": "NixOS", 189 + "ref": "nixos-unstable", 190 + "repo": "nixpkgs", 191 + "type": "github" 192 + } 193 + }, 194 + "nixpkgs-stable": { 195 + "locked": { 196 + "lastModified": 1720386169, 197 + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", 198 + "owner": "NixOS", 199 + "repo": "nixpkgs", 200 + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", 201 + "type": "github" 202 + }, 203 + "original": { 204 + "owner": "NixOS", 205 + "ref": "nixos-24.05", 206 + "repo": "nixpkgs", 207 + "type": "github" 208 + } 209 + }, 210 + "ow-mod-man": { 211 + "inputs": { 212 + "nixpkgs": [ 213 + "nixpkgs" 214 + ] 215 + }, 216 + "locked": { 217 + "lastModified": 1731291284, 218 + "narHash": "sha256-aA/g5IrsfMwF6K0OHrtxMv1g/bOh/tslh/ZUSXIUgJY=", 219 + "owner": "ow-mods", 220 + "repo": "ow-mod-man", 221 + "rev": "173b03c259428ed066a6e0ea40c573763b2c89d0", 222 + "type": "github" 223 + }, 224 + "original": { 225 + "owner": "ow-mods", 226 + "repo": "ow-mod-man", 227 + "type": "github" 228 + } 229 + }, 230 + "pre-commit-hooks-nix": { 231 + "inputs": { 232 + "flake-compat": [ 233 + "lanzaboote", 234 + "flake-compat" 235 + ], 236 + "gitignore": "gitignore", 237 + "nixpkgs": [ 238 + "lanzaboote", 239 + "nixpkgs" 240 + ], 241 + "nixpkgs-stable": "nixpkgs-stable" 242 + }, 243 + "locked": { 244 + "lastModified": 1730302582, 245 + "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=", 246 + "owner": "cachix", 247 + "repo": "pre-commit-hooks.nix", 248 + "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf", 249 + "type": "github" 250 + }, 251 + "original": { 252 + "owner": "cachix", 253 + "repo": "pre-commit-hooks.nix", 254 + "type": "github" 255 + } 256 + }, 257 + "root": { 258 + "inputs": { 259 + "gh-grader-preview": "gh-grader-preview", 260 + "hm": "hm", 261 + "lanzaboote": "lanzaboote", 262 + "nix-index-db": "nix-index-db", 263 + "nixos-hardware": "nixos-hardware", 264 + "nixpkgs": "nixpkgs", 265 + "ow-mod-man": "ow-mod-man", 266 + "rust-overlay": "rust-overlay_2", 267 + "wayland-mpris-idle-inhibit": "wayland-mpris-idle-inhibit" 268 + } 269 + }, 270 + "rust-overlay": { 271 + "inputs": { 272 + "nixpkgs": [ 273 + "lanzaboote", 274 + "nixpkgs" 275 + ] 276 + }, 277 + "locked": { 278 + "lastModified": 1730601085, 279 + "narHash": "sha256-Sgax33jGuvVHTjl1P78IwzlhAGyOxtx5Q26inKja8S4=", 280 + "owner": "oxalica", 281 + "repo": "rust-overlay", 282 + "rev": "8d1b40f8dfd7539aaa3de56e207e22b3cc451825", 283 + "type": "github" 284 + }, 285 + "original": { 286 + "owner": "oxalica", 287 + "repo": "rust-overlay", 288 + "type": "github" 289 + } 290 + }, 291 + "rust-overlay_2": { 292 + "inputs": { 293 + "nixpkgs": [ 294 + "nixpkgs" 295 + ] 296 + }, 297 + "locked": { 298 + "lastModified": 1732242723, 299 + "narHash": "sha256-NWI8csIK0ujFlFuEXKnoc+7hWoCiEtINK9r48LUUMeU=", 300 + "owner": "oxalica", 301 + "repo": "rust-overlay", 302 + "rev": "a229311fcb45b88a95fdfa5cecd8349c809a272a", 303 + "type": "github" 304 + }, 305 + "original": { 306 + "owner": "oxalica", 307 + "repo": "rust-overlay", 308 + "type": "github" 309 + } 310 + }, 311 + "wayland-mpris-idle-inhibit": { 312 + "inputs": { 313 + "nixpkgs": [ 314 + "nixpkgs" 315 + ] 316 + }, 317 + "locked": { 318 + "lastModified": 1715354337, 319 + "narHash": "sha256-5SnbsGN0TXOqILGdDqvWaY0s66cmt6Y+py/prZWoyrw=", 320 + "owner": "Bwc9876", 321 + "repo": "wayland-mpris-idle-inhibit", 322 + "rev": "c211735d40e6a485b01b30e232de4de7d71a8318", 323 + "type": "github" 324 + }, 325 + "original": { 326 + "owner": "Bwc9876", 327 + "repo": "wayland-mpris-idle-inhibit", 328 + "type": "github" 329 + } 330 + } 331 + }, 332 + "root": "root", 333 + "version": 7 334 + }
+73
flake.nix
··· 1 + { 2 + description = "A very basic flake"; 3 + 4 + inputs = { 5 + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 6 + nix-index-db.url = "github:Mic92/nix-index-database"; 7 + nix-index-db.inputs.nixpkgs.follows = "nixpkgs"; 8 + hm.url = "github:nix-community/home-manager"; 9 + hm.inputs.nixpkgs.follows = "nixpkgs"; 10 + nixos-hardware.url = "github:NixOS/nixos-hardware/master"; 11 + lanzaboote.url = "github:nix-community/lanzaboote"; 12 + lanzaboote.inputs.nixpkgs.follows = "nixpkgs"; 13 + ow-mod-man.url = "github:ow-mods/ow-mod-man"; 14 + ow-mod-man.inputs.nixpkgs.follows = "nixpkgs"; 15 + gh-grader-preview.url = "github:Bwc9876/gh-grader-preview"; 16 + gh-grader-preview.inputs.nixpkgs.follows = "nixpkgs"; 17 + wayland-mpris-idle-inhibit.url = "github:Bwc9876/wayland-mpris-idle-inhibit"; 18 + wayland-mpris-idle-inhibit.inputs.nixpkgs.follows = "nixpkgs"; 19 + rust-overlay.url = "github:oxalica/rust-overlay"; 20 + rust-overlay.inputs.nixpkgs.follows = "nixpkgs"; 21 + }; 22 + 23 + outputs = inputs @ { 24 + self, 25 + nixpkgs, 26 + nix-index-db, 27 + hm, 28 + nixos-hardware, 29 + lanzaboote, 30 + ow-mod-man, 31 + gh-grader-preview, 32 + wayland-mpris-idle-inhibit, 33 + rust-overlay, 34 + }: let 35 + lib = (import ./lib.nix) nixpkgs.lib; 36 + pkgsForWithOverlays = system: overlays: 37 + import nixpkgs { 38 + inherit system; 39 + config.allowUnfree = true; 40 + overlays = 41 + [ 42 + ow-mod-man.overlays.default 43 + rust-overlay.overlays.default 44 + nix-index-db.overlays.nix-index 45 + ] 46 + ++ overlays; 47 + }; 48 + pkgsFor = system: pkgsForWithOverlays system []; 49 + baseMods = builtins.map (name: "${self}/base/${name}") (builtins.attrNames (builtins.readDir ./base)); 50 + availableRoles = lib.getRoles ./roles; 51 + mkSystem = lib.mkmkSystem { 52 + inherit baseMods availableRoles; 53 + specialArgs = { 54 + inherit inputs; 55 + }; 56 + }; 57 + in { 58 + inherit lib; 59 + legacyPackages = lib.forAllSystems pkgsFor; 60 + formatter = lib.forAllSystems (system: (pkgsFor system).alejandra); 61 + nixosConfigurations = builtins.mapAttrs (name: value: let 62 + pkgs = pkgsForWithOverlays value.target value.extraOverlays; 63 + sys = value.eval { 64 + inherit inputs pkgs; 65 + }; 66 + in 67 + mkSystem (sys 68 + // { 69 + target = value.target; 70 + inherit name pkgs; 71 + })) (lib.parseAllFiles ./systems); 72 + }; 73 + }
+72
lib.nix
··· 1 + lib: rec { 2 + parseAllFiles = folder: 3 + lib.mapAttrs' (fileName: _: let 4 + parsed = import (folder + "/${fileName}"); 5 + in { 6 + name = builtins.head (lib.splitString "." fileName); 7 + value = parsed; 8 + }) 9 + (builtins.readDir 10 + folder); 11 + getRoles = folder: 12 + lib.mapAttrs' ( 13 + nodeName: nodeType: let 14 + c = 15 + if nodeType == "regular" 16 + then builtins.map (x: x) [(folder + "/${nodeName}")] 17 + else builtins.map (name: (folder + "/${nodeName}/${name}")) (builtins.attrNames (builtins.readDir "${folder}/${nodeName}")); 18 + in { 19 + name = builtins.head (lib.splitString "." nodeName); 20 + value = c; 21 + } 22 + ) (builtins.readDir folder); 23 + forAllSystems = lib.genAttrs lib.systems.flakeExposed; 24 + roleActive = role: selected: builtins.all (r: builtins.elem r selected) (lib.splitString "+" role); 25 + filterRoles = availableRoles: roles: 26 + lib.attrsets.filterAttrs ( 27 + name: _: roleActive name roles 28 + ) 29 + availableRoles; 30 + mkmkSystem = { 31 + baseMods, 32 + specialArgs, 33 + availableRoles, 34 + }: { 35 + name, 36 + description, 37 + target, 38 + edition, 39 + roles, 40 + extraModules, 41 + includeBaseMods, 42 + pkgs, 43 + }: 44 + lib.nixosSystem { 45 + inherit pkgs; 46 + system = target; 47 + specialArgs = {inherit edition target;} // specialArgs; 48 + 49 + modules = 50 + [ 51 + specialArgs.inputs.hm.nixosModules.default 52 + specialArgs.inputs.nix-index-db.nixosModules.nix-index 53 + { 54 + networking.hostName = name; 55 + environment.etc."flake-src".source = specialArgs.inputs.self; 56 + home-manager.extraSpecialArgs = specialArgs; 57 + home-manager.useGlobalPkgs = true; 58 + home-manager.useUserPackages = true; 59 + system.stateVersion = edition; 60 + } 61 + ] 62 + ++ ( 63 + if includeBaseMods 64 + then baseMods 65 + else [] 66 + ) 67 + ++ lib.flatten (builtins.attrValues ( 68 + filterRoles availableRoles roles 69 + )) 70 + ++ extraModules; 71 + }; 72 + }
+39
pkgs/nu_plugin_dbus.nix
··· 1 + { 2 + rustPlatform, 3 + dbus, 4 + nushell, 5 + pkg-config, 6 + fetchFromGitHub, 7 + lib, 8 + }: 9 + rustPlatform.buildRustPackage rec { 10 + pname = "nu_plugin_dbus"; 11 + version = 12 + if nushell.version == nu_version 13 + then "0.13.0" 14 + else abort "Nushell Version mismatch\nPlugin: ${nu_version}\tnixpkgs: ${nushell.version}"; 15 + nu_version = "0.100.0"; 16 + 17 + src = fetchFromGitHub { 18 + owner = "devyn"; 19 + repo = "nu_plugin_dbus"; 20 + rev = version; 21 + sha256 = "sha256-w+0H0A+wQa4BUzKx9G2isn29IicoZsLlWCDnC3YSzek="; 22 + }; 23 + 24 + cargoHash = "sha256-NuWwPfAo3qYer4eUNDQ+VR9R+uLp5WAT2mhnr/zayEI="; 25 + 26 + nativeBuildInputs = [ 27 + pkg-config 28 + ]; 29 + 30 + buildInputs = [ 31 + dbus 32 + ]; 33 + 34 + meta = with lib; { 35 + description = "A nushell plugin for interacting with dbus"; 36 + license = licenses.mit; 37 + homepage = "https://github.com/devyn/nu_plugin_dbus"; 38 + }; 39 + }
+54
pkgs/themes.nix
··· 1 + { 2 + gtk3, 3 + runCommand, 4 + fetchFromGitHub, 5 + inputs, 6 + }: let 7 + src = fetchFromGitHub { 8 + owner = "EliverLara"; 9 + repo = "Sweet"; 10 + rev = "051ee62cf998c8c95bd0b391eb3996d09d94dbcd"; # Ambar-Blue: https://github.com/EliverLara/Sweet/commits/Ambar-Blue/ 11 + hash = "sha256-laFBNuXUGw2wKregIyU4r/PMP/zLC3bATDl3eqvWy3o="; 12 + }; 13 + icons-src = fetchFromGitHub { 14 + owner = "EliverLara"; 15 + repo = "candy-icons"; 16 + rev = "6f6eb3d7dbdb4fb9aab31ec5aebeb7155225f0ab"; # master: https://github.com/EliverLara/candy-icons/commits/master/ 17 + hash = "sha256-VOUFs45n+5zQqk3pPsiQeL6aCWEUUje90PGt2ni7Bgg="; 18 + }; 19 + cursor-src = "${inputs.self}/res/cursors/Sweet-cursors.tar.xz"; 20 + hypr-cursor-src = "${inputs.self}/res/cursors/Sweet-cursors-hypr.tar.xz"; 21 + in 22 + runCommand "sweet-ambar-blue" {} '' 23 + 24 + # Candy Icons 25 + mkdir -p $out/share/icons/candy-icons 26 + cp -r ${icons-src}/* $out/share/icons/candy-icons 27 + chmod +w $out/share/icons/candy-icons/apps/scalable 28 + ln -s -T $out/share/icons/candy-icons/apps/scalable/firefox-developer.svg $out/share/icons/candy-icons/apps/scalable/firefox-devedition.svg 29 + ln -s -T $out/share/icons/candy-icons/apps/scalable/rss_indicator.svg $out/share/icons/candy-icons/apps/scalable/newsboat.svg 30 + ln -s -T $out/share/icons/candy-icons/apps/scalable/discord.svg $out/share/icons/candy-icons/apps/scalable/vesktop.svg 31 + ln -s -T $out/share/icons/candy-icons/apps/scalable/screengrab.svg $out/share/icons/candy-icons/apps/scalable/swappy.svg 32 + 33 + rm $out/share/icons/candy-icons/apps/scalable/vscodium.svg 34 + ln -s -T $out/share/icons/candy-icons/apps/scalable/code.svg $out/share/icons/candy-icons/apps/scalable/vscodium.svg 35 + 36 + # Cursor Theme 37 + tar -xf ${cursor-src} -C $out/share/icons 38 + tar -xf ${hypr-cursor-src} -C $out/share/icons 39 + 40 + # Kvantum 41 + mkdir -p $out/share/Kvantum 42 + cp -r ${src}/kde/kvantum/Sweet-Ambar-Blue $out/share/Kvantum 43 + 44 + # GTK Themes 45 + mkdir -p $out/share/themes/Sweet-Ambar-Blue 46 + cp -r ${src}/gtk-2.0 $out/share/themes/Sweet-Ambar-Blue 47 + cp -r ${src}/gtk-3.0 $out/share/themes/Sweet-Ambar-Blue 48 + cp -r ${src}/gtk-4.0 $out/share/themes/Sweet-Ambar-Blue 49 + cp -r ${src}/assets $out/share/themes/Sweet-Ambar-Blue 50 + cp -r ${src}/index.theme $out/share/themes/Sweet-Ambar-Blue 51 + 52 + ${gtk3}/bin/gtk-update-icon-cache -f -t $out/share/icons/candy-icons 53 + ${gtk3}/bin/gtk-update-icon-cache -f -t $out/share/icons/Sweet-cursors 54 + ''
+46
res/bat_display.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let icons = { 4 + "charging": [ 5 + "󰢜", 6 + "󰂆", 7 + "󰂇", 8 + "󰂈", 9 + "󰢝", 10 + "󰂉", 11 + "󰢞", 12 + "󰂊", 13 + "󰂋", 14 + "󰂅" 15 + ], 16 + "default": [ 17 + "󰁺", 18 + "󰁻", 19 + "󰁼", 20 + "󰁽", 21 + "󰁾", 22 + "󰁿", 23 + "󰂀", 24 + "󰂁", 25 + "󰂂", 26 + "󰁹" 27 + ] 28 + } 29 + 30 + let percent = open /sys/class/power_supply/BAT1/capacity | into int 31 + 32 + let status = open /sys/class/power_supply/BAT1/status | str trim 33 + 34 + let idx = if $percent == 100 { 35 + 9 36 + } else { 37 + ($percent / 10) | into int 38 + } 39 + 40 + let icon = if $status == "Charging" or $status == "Full" { 41 + ($icons | get "charging" | get $idx) + " " 42 + } else { 43 + $icons | get "default" | get $idx 44 + } 45 + 46 + echo $"($icon) ($percent)󰏰"
+96
res/battery_notif.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + const BUS_NAME = "org.freedesktop.UPower"; 4 + const PATH_PREFIX = "/org/freedesktop/UPower"; 5 + 6 + def list_all_devices [] { 7 + dbus call --system --dest=$BUS_NAME $PATH_PREFIX org.freedesktop.UPower EnumerateDevices 8 + } 9 + 10 + def device_info [name: string] { 11 + dbus get-all --system --dest=$BUS_NAME $"($PATH_PREFIX)/devices/($name)" $"($BUS_NAME).Device" 12 + } 13 + 14 + def should_consider [device: record] -> bool { 15 + match $device.Type { 16 + 2 => $device.PowerSupply, # Battery, we want to make sure PowerSupply is true to ensure it's a laptop battery 17 + 17 => true # Bluetooth Headset 18 + _ => false # Assume false otherwise, more device types in the future maybe 19 + } 20 + } 21 + 22 + 23 + def get_name [device: record] -> string { 24 + 25 + let fallback = "(" + ($device.upower_path | path basename) + ")"; 26 + 27 + match $device.Type { 28 + 2 => { 29 + # Battery, we want to make sure PowerSupply is true 30 + # as that signifies it's an internal laptop battery 31 + if $device.PowerSupply { 32 + $"Internal Battery \(($device.NativePath)\)" 33 + } else { 34 + $"Unknown Battery ($fallback)" 35 + } 36 + } 37 + 17 => { 38 + # Bluetooth Headset 39 + # Take the Model property (bluez sets this to the name) if available, else fallback 40 + ($device.Model? | default $"Bluetooth Headset ($fallback)") 41 + } 42 + _ => { 43 + $"Unknown Device ($fallback)" 44 + } 45 + } 46 + } 47 + 48 + def list_devices [] { 49 + let devices = list_all_devices; 50 + $devices | each {|it| device_info ($it | path basename) | insert "upower_path" $it} | each {|it| $it | insert "friendly_name" (get_name $it)} | where {|it| should_consider $it} 51 + } 52 + 53 + def should_display_notif [device: record] -> bool { 54 + 55 + let charging = match ($device.State? | default 0) { 56 + 1 | 4 | 5 => true, # Charging or Fully Charged or Pending Charge 57 + _ => false 58 + } 59 + 60 + ($device.Percentage? | default 100) < 10.0 and not $charging 61 + } 62 + 63 + def main [poll_interval: duration = 1min] { 64 + 65 + mut shown_notifs = [{}]; 66 + 67 + loop { 68 + 69 + let devices = list_devices; 70 + 71 + print "===========" "Device List" ($devices | select friendly_name upower_path Type) "-----------"; 72 + 73 + for dev in $devices { 74 + if (($shown_notifs | get -i $dev.upower_path | get -i 0) == null) { 75 + $shown_notifs = ($shown_notifs | insert $dev.upower_path false); 76 + } 77 + 78 + let has_shown_notif = $shown_notifs | get -i $dev.upower_path | get -i 0; 79 + 80 + if ((should_display_notif $dev) and not $has_shown_notif) { 81 + #print $"Device ($dev.friendly_name) is below 10% charge, showing notification"; 82 + notify-send --icon="battery-caution-symbolic" --app-name="battery-notif" --urgency="critical" $"Battery Low" $"Device (get_name $dev) is below 10% charge"; 83 + $shown_notifs = ($shown_notifs | update $dev.upower_path true); 84 + } else if ($has_shown_notif) { 85 + #print $"Device ($dev.friendly_name) is now above 10% charge, removing notification shown"; 86 + $shown_notifs = ($shown_notifs | update $dev.upower_path false); 87 + } 88 + } 89 + 90 + #print "==========="; 91 + 92 + sleep $poll_interval; 93 + 94 + } 95 + 96 + }
+1
res/clipboard_middleman.sh
··· 1 + [ $CLIPBOARD_STATE != "sensitive" ] && cliphist store
+12
res/command_not_found.nu
··· 1 + {|cmd_name| 2 + try { 3 + let attrs = (nix-locate --minimal --no-group --type x --type s --top-level --whole-name --at-root $"/bin/($cmd_name)") 4 + let len = (echo $attrs | split row "\n" | length) 5 + 6 + if $len == 0 { 7 + return null 8 + } else { 9 + return $"\nThe program ($cmd_name) is not installed, but available from the following location\(s\):\n\n($attrs | str replace ".out" "")" 10 + } 11 + } 12 + }
res/cursors/Sweet-cursors-hypr.tar.xz

This is a binary file and will not be displayed.

res/cursors/Sweet-cursors.tar.xz

This is a binary file and will not be displayed.

+15
res/hyfetch.json
··· 1 + { 2 + "preset": "rainbow", 3 + "mode": "rgb", 4 + "light_dark": "dark", 5 + "lightness": 0.65, 6 + "color_align": { 7 + "mode": "horizontal", 8 + "custom_colors": [], 9 + "fore_back": null 10 + }, 11 + "backend": "neofetch", 12 + "distro": null, 13 + "pride_month_shown": [], 14 + "pride_month_disable": false 15 + }
+40
res/news-open.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + const YT_REGEX = "(?:https?:\\/\\/)?(?:www\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|playlist\\?|watch\\?v=|watch\\?.+(?:&|&#38;);v=))([a-zA-Z0-9\\-_]{11})?(?:(?:\\?|&|&#38;)index=((?:\\d){1,3}))?(?:(?:\\?|&|&#38;)?list=([a-zA-Z\\-_0-9]{34}))?(?:\\S+)?" 4 + 5 + def main [ 6 + url: string; 7 + ] { 8 + print $"Opening ($url)..."; 9 + let type = try { 10 + http head $url | where $it.name == "content-type" | first | get value 11 + } catch { 12 + "?/?" 13 + } 14 + 15 + if ($type == "image/svg+xml") { 16 + xdg-open $url 17 + } else if ($type | str starts-with "image/") { 18 + http get $url | img2sixel 19 + input "Press enter to close the image viewer" 20 + } else if ($type | str starts-with "video/") or ($url =~ $YT_REGEX) { 21 + qmplay2 --open $url 22 + } else if ($type | str starts-with "text/html") { 23 + let w3m_opts = $"-sixel -no-cookie -o confirm_qq=FALSE -o display_link_number=TRUE -o extbrowser=($env.CURRENT_FILE)"; 24 + let w3m_cmd = $"w3m ($w3m_opts)"; 25 + let s = (term size).columns; 26 + stty cols 90; 27 + try { 28 + rdrview "-B" $w3m_cmd $url 29 + } catch { 30 + bash -c $"($w3m_cmd) ($url)" 31 + } 32 + stty cols $s 33 + } else if ($type | str starts-with "text/") { 34 + let txt = http get $url; 35 + let filename = $url | split row "/" | last | split row "?" | first; 36 + $txt | bat "--paging" "always" "--file-name" $filename 37 + } else { 38 + xdg-open $url 39 + } 40 + }
res/pictures/background.jpg

This is a binary file and will not be displayed.

res/pictures/background.png

This is a binary file and will not be displayed.

res/pictures/cow.png

This is a binary file and will not be displayed.

+20
res/rofi/rofi-code.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let paths = ls ~/.config/Code/User/workspaceStorage/*/workspace.json 4 + | get name 5 + | each {|it| open $it | get folder | str substring 7..}; 6 + 7 + let paths_display = $paths | each {|it| $it | str replace $"/home/($env.USER)" "󰋜" | str replace "󰋜/Documents/GitHub" "󰊤"}; 8 + 9 + let res = $paths_display | str join "\n" | rofi -dmenu -i -p "VSCode" | complete; 10 + 11 + if $res.exit_code == 1 { 12 + echo "Cancelled" 13 + } else { 14 + let choice = $res.stdout | str trim; 15 + let idx = $paths_display | enumerate | where {|it| $it.item == $choice} | first | get index; 16 + let path = $paths | get $idx; 17 + echo $"Opening ($path)" 18 + codium $path 19 + } 20 +
+32
res/rofi/rofi-places.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let contents = open ~/.local/share/user-places.xbel 4 + 5 + let hash = $contents | hash md5 6 + 7 + let cache = ['~' '.cache' 'rofi-places' $hash] | path join | path expand 8 + let dataPath = [$cache "data.nuon"] | path join 9 + 10 + let display_loc = {|it| (if ($it | str starts-with "file://") { $it | str substring 7.. } else { $it } | str replace $"/home/($env.USER)" "~")} 11 + 12 + let places = if ($dataPath | path exists) { 13 + open $dataPath 14 + } else { 15 + let places = $contents | lines | skip 2 | str join "\n" | from xml | get content | where tag == "bookmark" | where attributes.href != "" | each {|it| {loc: $it.attributes.href, disp_loc: ($it.attributes.href | each $display_loc), name: ($it.content | where tag == "title" | get content.0.content.0), icon: ($it.content | where tag == "info" | get content.0.content.0 | where tag == "icon" | get attributes.name.0 )} } 16 + mkdir $cache 17 + $places | to nuon | save $dataPath 18 + $places 19 + } 20 + 21 + let menu = $places | each {|it| $"($it.name) <span color=\"#A2A2A2\"><i><small>\(($it.disp_loc)\)</small></i></span> \u{0}icon\u{1f}($it.icon)" } | str join "\n" 22 + 23 + let res = ($menu | rofi -dmenu -i -markup-rows -show-icons -p "Dolphin" | complete) 24 + 25 + if $res.exit_code == 1 { 26 + echo "Cancelled" 27 + } else { 28 + let name = $res.stdout | split row " <span color=\"#A2A2A2\">" | get 0 29 + let loc = $places | where name == $name | get 0.loc 30 + echo $"Opening ($loc)" 31 + dolphin --new-window $loc 32 + }
+96
res/rofi/rofi-style.rasi
··· 1 + * { 2 + bg0: #212121F2; 3 + bg1: #2A2A2A; 4 + bg2: #3D3D3D80; 5 + bg3: #4CAF50F2; 6 + fg0: #E6E6E6; 7 + fg1: #FFFFFF; 8 + fg2: #969696; 9 + fg3: #3D3D3D; 10 + } 11 + 12 + * { 13 + background-color: transparent; 14 + text-color: @fg0; 15 + 16 + margin: 0px; 17 + padding: 0px; 18 + spacing: 0px; 19 + } 20 + 21 + window { 22 + location: center; 23 + width: 480; 24 + border-radius: 24px; 25 + 26 + background-color: @bg0; 27 + } 28 + 29 + mainbox { 30 + padding: 12px; 31 + } 32 + 33 + inputbar { 34 + background-color: @bg1; 35 + border-color: @bg3; 36 + 37 + border: 2px; 38 + border-radius: 16px; 39 + 40 + padding: 8px 16px; 41 + spacing: 8px; 42 + children: [ prompt, entry ]; 43 + } 44 + 45 + prompt { 46 + text-color: @fg2; 47 + } 48 + 49 + entry { 50 + placeholder: "Search"; 51 + placeholder-color: @fg3; 52 + } 53 + 54 + message { 55 + margin: 12px 0 0; 56 + border-radius: 16px; 57 + border-color: @bg2; 58 + background-color: @bg2; 59 + } 60 + 61 + textbox { 62 + padding: 8px 24px; 63 + } 64 + 65 + listview { 66 + background-color: transparent; 67 + 68 + margin: 12px 0 0; 69 + lines: 8; 70 + columns: 1; 71 + 72 + fixed-height: false; 73 + } 74 + 75 + element { 76 + padding: 8px 16px; 77 + spacing: 8px; 78 + border-radius: 16px; 79 + } 80 + 81 + element normal active { 82 + text-color: @bg3; 83 + } 84 + 85 + element selected normal, element selected active { 86 + background-color: @bg3; 87 + } 88 + 89 + element-icon { 90 + size: 1em; 91 + vertical-align: 0.5; 92 + } 93 + 94 + element-text { 95 + text-color: inherit; 96 + }
+14
res/rofi/rofi-zoxide.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let dirs = zoxide query -l "" | lines 4 + 5 + let menu = $dirs | each {|it| $"($it | split row "/" | last) <span color=\"#A2A2A2\"><i><small>\(($it | str replace $"/home/($env.USER)" "~")\)</small></i></span>" } | str join "\n" 6 + 7 + let res = ($menu | rofi -dmenu -i -markup-rows -p "Zoxide" | complete) 8 + 9 + if $res.exit_code == 1 { 10 + echo "Cancelled" 11 + } else { 12 + let dir = $res.stdout | split row " <span color=\"#A2A2A2\"><i><small>(" | get 1 | split row ")</small>" | get 0 13 + foot -D ($dir | str replace "~" $"/home/($env.USER)") 14 + }
+38
res/screenrec.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let date_format = "%Y-%m-%d_%H-%M-%S" 4 + 5 + let captures_folder = $"($env.HOME)/Videos/Captures" 6 + 7 + if not ($captures_folder | path exists) { 8 + mkdir $captures_folder 9 + } 10 + 11 + let out_name = date now | format date $"($captures_folder)/($date_format).mp4" 12 + 13 + let workspaces = hyprctl monitors -j | from json | get activeWorkspace.id 14 + let windows = hyprctl clients -j | from json | where workspace.id in $workspaces 15 + let geom = $windows | each { |w| $"($w.at.0),($w.at.1) ($w.size.0)x($w.size.1)" } | str join "\n" 16 + 17 + let stat = do { echo $geom | slurp -d } | complete 18 + 19 + if $stat.exit_code == 1 { 20 + echo "No selection made" 21 + exit 22 + } 23 + 24 + wf-recorder -g ($stat.stdout) -F fps=30 -f $out_name 25 + 26 + let action = notify-send --app-name=simplescreenrecorder --icon=simplescreenrecorder -t 7500 --action=open=Open --action=folder="Show In Folder" --action=delete=Delete "Recording finished" $"File saved to ($out_name)" 27 + 28 + match $action { 29 + "open" => { 30 + xdg-open $out_name 31 + } 32 + "folder" => { 33 + xdg-open $captures_folder 34 + } 35 + "delete" => { 36 + rm $out_name 37 + } 38 + }
+24
res/screenshot.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let file_path = grimblast --freeze copysave area 4 + 5 + if $file_path == "" { 6 + exit 1; 7 + } 8 + 9 + let choice = notify-send --app-name=screengrab -i $file_path -t 7500 --action=open=Open --action=folder="Show In Folder" --action=edit=Edit --action=delete=Delete "Screenshot taken" $"Screenshot saved to ($file_path) and copied to clipboard" 10 + 11 + match $choice { 12 + "open" => { 13 + xdg-open $file_path 14 + } 15 + "folder" => { 16 + xdg-open ($file_path | path dirname) 17 + } 18 + "edit" => { 19 + swappy -f $file_path 20 + } 21 + "delete" => { 22 + rm $file_path 23 + } 24 + }
+153
res/starship.toml
··· 1 + # Get editor completions based on the config schema 2 + "$schema" = 'https://starship.rs/config-schema.json' 3 + 4 + format = """ 5 + [░▒▓](grey)[ \ 6 + $os\ 7 + $hostname\ 8 + [](bg:grey #999999)\ 9 + $shell\ 10 + $username\ 11 + [](bg:grey #999999)\ 12 + $directory\ 13 + ([](bg:grey #999999)\ 14 + $git_branch\ 15 + $git_commit\ 16 + $git_state)\ 17 + ([](bg:grey #999999)\ 18 + $nodejs\ 19 + $python\ 20 + $rust\ 21 + $nix_shell)](bg:grey)\ 22 + [ ](grey)""" 23 + 24 + right_format = """ 25 + [ ](grey) 26 + ($character$status[](bg:grey #999999)) 27 + ($cmd_duration[](bg:grey #999999))\ 28 + $time\ 29 + [▓▒░](grey) 30 + """ 31 + 32 + palette = "main" 33 + add_newline = false 34 + 35 + [palettes.main] 36 + grey = "#303030" 37 + lightgrey = "#e5e5e5" 38 + header = "blue" 39 + footer = "green" 40 + 41 + [line_break] 42 + disabled = true 43 + 44 + [hostname] 45 + format = "[$hostname( $ssh_symbol) ]($style)" 46 + ssh_only = false 47 + ssh_symbol = "" 48 + style = "bold header bg:grey" 49 + 50 + [username] 51 + format = "[$user ]($style)" 52 + style_user = "header bg:grey" 53 + style_root = "bold red bg:grey" 54 + show_always = true 55 + 56 + [os] 57 + style = "bg:grey bold lightgrey" 58 + disabled = false 59 + format = "[$symbol ]($style)" 60 + 61 + [os.symbols] 62 + Raspbian = "" 63 + Debian = "" 64 + Macos = "" 65 + Linux = "" 66 + Windows = "" 67 + Ubuntu = "" 68 + Manjaro = "" 69 + Android = "" 70 + NixOS = "󱄅" 71 + 72 + [directory] 73 + truncation_length = 10 74 + truncate_to_repo = true 75 + home_symbol = "󰋜" 76 + read_only = "󰌾" 77 + style = "bold footer bg:grey" 78 + format = "[ ($read_only )$path ]($style)" 79 + 80 + [git_branch] 81 + symbol = "󰘬" 82 + style = "bg:grey footer" 83 + format = '[ $symbol ($branch )]($style)' 84 + 85 + [git_status] 86 + conflicted = "󰀦" 87 + modified = "󰏫" 88 + style = "bg:grey footer" 89 + format = '[$all_status $ahead_behind ]($style)' 90 + 91 + [git_state] 92 + revert = "󰕍" 93 + rebase = "󱗬" 94 + merge = "󰘭" 95 + style = "bg:grey footer yellow" 96 + format = '\([$state( $progress_current/$progress_total)]($style)\)' 97 + 98 + [nodejs] 99 + symbol = "󰎙" 100 + style = "bg:grey footer" 101 + not_capable_style = "bg:grey footer bold red" 102 + format = '[ $symbol ($version) ]($style)' 103 + 104 + [python] 105 + symbol = "󰌠" 106 + style = "bg:grey footer" 107 + format = '[ $symbol ($version) ]($style)' 108 + 109 + [rust] 110 + symbol = "󱘗" 111 + style = "bg:grey footer" 112 + format = '[ $symbol ($version) ]($style)' 113 + 114 + [nix_shell] 115 + impure_msg = '[󱄅 impure](bold red bg:grey)' 116 + pure_msg = '[󱄅](bold green bg:grey)' 117 + unknown_msg = '[󱄅 unknown](bold yellow bg:grey)' 118 + style = "bg:grey footer" 119 + format = '[ $state ](bold blue bg:grey) ' 120 + 121 + [character] 122 + disabled = false 123 + success_symbol = "[󰗠](bold footer bg:grey)" 124 + error_symbol = "[󰀨](bold red bg:grey)" 125 + format = "[ $symbol ](bg:grey)" 126 + 127 + [status] 128 + disabled = false 129 + style = "bg:grey red" 130 + format = "[$status ]($style)" 131 + 132 + [cmd_duration] 133 + disabled = false 134 + min_time = 2000 135 + style = "bg:grey header" 136 + format = "[ 󱎫 $duration ]($style)" 137 + 138 + [time] 139 + disabled = false 140 + use_12hr = true 141 + time_format = "%a %b %d %I:%M %p 󰥔" 142 + style = "bg:grey bold header" 143 + format = "[ $time ]($style)" 144 + 145 + [shell] 146 + fish_indicator = '󰈺' 147 + powershell_indicator = '󰨊' 148 + nu_indicator = '󰨊' 149 + bash_indicator = "󱆃" 150 + unknown_indicator = '󰋗' 151 + style = 'bg:grey header' 152 + format = '[ $indicator ]($style)' 153 + disabled = false
+10
res/swappy
··· 1 + [Default] 2 + save_dir=$HOME/Pictures/Screenshots 3 + save_filename_format=%Y-%m-%dT%H:%M:%S-edited.png 4 + show_panel=true 5 + line_size=5 6 + text_size=20 7 + text_font=monospace 8 + paint_mode=brush 9 + early_exit=false 10 + fill_shape=false
+46
res/swaync/config.json
··· 1 + { 2 + "positionX": "center", 3 + "positionY": "top", 4 + "control-center-margin-top": 0, 5 + "control-center-margin-bottom": 10, 6 + "control-center-margin-right": 10, 7 + "control-center-margin-left": 10, 8 + "control-center-exclusive-zone": false, 9 + "notification-icon-size": 64, 10 + "notification-body-image-height": 100, 11 + "notification-body-image-width": 200, 12 + "timeout": 10, 13 + "timeout-low": 5, 14 + "timeout-critical": 0, 15 + "fit-to-screen": false, 16 + "control-center-width": 800, 17 + "control-center-height": 1025, 18 + "notification-window-width": 500, 19 + "keyboard-shortcuts": true, 20 + "image-visibility": "when-available", 21 + "transition-time": 200, 22 + "hide-on-clear": false, 23 + "hide-on-action": true, 24 + "script-fail-notify": true, 25 + "scripts": { 26 + "all": { 27 + "exec": "nu ~/.config/swaync/notification.nu", 28 + "urgency": ".*" 29 + } 30 + }, 31 + "widgets": ["title", "dnd", "notifications"], 32 + "widget-config": { 33 + "title": { 34 + "text": "Notification Center", 35 + "clear-all-button": true, 36 + "button-text": "Clear All" 37 + }, 38 + "dnd": { 39 + "text": "Do Not Disturb" 40 + }, 41 + "label": { 42 + "max-lines": 1, 43 + "text": "Notification Center" 44 + } 45 + } 46 + }
+33
res/swaync/notification.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + const SILENCED_APP_NAMES = [ 4 + "vesktop", 5 + "discord", 6 + "thunderbird", 7 + "newsboat" 8 + ] 9 + 10 + const APP_SOUNDS = { 11 + "simplescreenrecorder": "camera-click", 12 + "screengrab": "camera-click", 13 + "battery-notif": "critical", 14 + "kde connect": "pixel-notif", 15 + "DEFAULT": "notif", 16 + } 17 + 18 + let name = $env.SWAYNC_APP_NAME? | default "" | str downcase 19 + 20 + # let LOG_FILE = $"($env.HOME)/.sawync-app-log.txt"; 21 + 22 + # let log = if ($LOG_FILE | path exists) { 23 + # (open $LOG_FILE) | lines 24 + # } else { 25 + # [] 26 + # }; 27 + 28 + # $log | append $name | str join "\n" | save -f $LOG_FILE 29 + 30 + if ($name not-in $SILENCED_APP_NAMES) { 31 + let sound = $APP_SOUNDS | get -i $name | default $APP_SOUNDS.DEFAULT; 32 + aplay $"($env.HOME)/.config/swaync/sounds/($sound).wav" 33 + }
res/swaync/sounds/camera-click.wav

This is a binary file and will not be displayed.

res/swaync/sounds/critical.wav

This is a binary file and will not be displayed.

res/swaync/sounds/notif.wav

This is a binary file and will not be displayed.

res/swaync/sounds/pixel-notif.wav

This is a binary file and will not be displayed.

+265
res/swaync/style.css
··· 1 + /* 2 + * vim: ft=less 3 + */ 4 + 5 + @define-color cc-bg rgba(0, 0, 0, 0.8); 6 + 7 + @define-color noti-border-color rgba(255, 255, 255, 0.15); 8 + @define-color noti-bg-darker rgba(50, 50, 50, 0.9); 9 + @define-color noti-bg-focus rgba(68, 68, 68, 0.6); 10 + @define-color noti-close-bg rgba(255, 255, 255, 0.1); 11 + @define-color noti-close-bg-hover rgba(255, 255, 255, 0.15); 12 + 13 + @define-color text-color rgb(255, 255, 255); 14 + @define-color text-color-disabled rgb(150, 150, 150); 15 + 16 + @define-color bg-selected rgb(0, 128, 255); 17 + 18 + .notification-row { 19 + outline: none; 20 + background: rgba(0, 0, 0, 0) 21 + } 22 + 23 + .notification-row:hover { 24 + background: rgba(0, 0, 0, 0) 25 + } 26 + 27 + .notification { 28 + border-radius: 12px; 29 + margin: 6px 12px; 30 + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), 0 1px 3px 1px rgba(0, 0, 0, 0.7), 31 + 0 2px 6px 2px rgba(0, 0, 0, 0.3); 32 + padding: 0; 33 + } 34 + 35 + .notification-content { 36 + background: transparent; 37 + padding: 6px; 38 + border-radius: 12px; 39 + } 40 + 41 + .close-button { 42 + background: linear-gradient(180deg, rgb(220, 66, 0) 0%, rgb(110, 0, 0) 100%); 43 + color: @text-color; 44 + text-shadow: none; 45 + padding: 0; 46 + border-radius: 100%; 47 + margin-top: 10px; 48 + margin-right: 16px; 49 + box-shadow: none; 50 + border: none; 51 + min-width: 24px; 52 + min-height: 24px; 53 + } 54 + 55 + .close-button:hover { 56 + box-shadow: none; 57 + background: linear-gradient(180deg, rgb(255, 77, 1) 0%, rgb(151, 0, 0) 100%); 58 + transition: all 0.15s ease-in-out; 59 + border: none; 60 + } 61 + 62 + .notification-default-action, 63 + .notification-action { 64 + padding: 4px; 65 + margin: 0; 66 + box-shadow: none; 67 + background: linear-gradient( 68 + 180deg, 69 + rgba(34, 34, 34, 1) 0%, 70 + rgba(5, 5, 5, 0.9) 100% 71 + ); 72 + border: 1px solid @noti-border-color; 73 + color: @text-color; 74 + transition: all 0.15s ease-in-out; 75 + } 76 + 77 + .notification-default-action:hover, 78 + .notification-action:hover { 79 + -gtk-icon-effect: none; 80 + background: linear-gradient( 81 + 180deg, 82 + rgb(50, 50, 50) 0%, 83 + rgba(28, 28, 28, 0.9) 100% 84 + ); 85 + } 86 + 87 + .notification-default-action { 88 + border-radius: 12px; 89 + } 90 + 91 + /* When alternative actions are visible */ 92 + .notification-default-action:not(:only-child) { 93 + border-bottom-left-radius: 0px; 94 + border-bottom-right-radius: 0px; 95 + } 96 + 97 + .notification-action { 98 + border-radius: 0px; 99 + border-top: none; 100 + border-right: none; 101 + } 102 + 103 + /* add bottom border radius to eliminate clipping */ 104 + .notification-action:first-child { 105 + border-bottom-left-radius: 10px; 106 + } 107 + 108 + .notification-action:last-child { 109 + border-bottom-right-radius: 10px; 110 + border-right: 1px solid @noti-border-color; 111 + } 112 + 113 + .inline-reply { 114 + margin-top: 8px; 115 + } 116 + .inline-reply-entry { 117 + background: @noti-bg-darker; 118 + color: @text-color; 119 + caret-color: @text-color; 120 + border: 1px solid @noti-border-color; 121 + border-radius: 12px; 122 + } 123 + .inline-reply-button { 124 + margin-left: 4px; 125 + background: linear-gradient( 126 + 180deg, 127 + rgba(34, 34, 34, 1) 0%, 128 + rgba(5, 5, 5, 0.9) 100% 129 + ); 130 + border: 1px solid @noti-border-color; 131 + border-radius: 12px; 132 + color: @text-color; 133 + } 134 + .inline-reply-button:disabled { 135 + background: initial; 136 + color: @text-color-disabled; 137 + border: 1px solid transparent; 138 + } 139 + .inline-reply-button:hover { 140 + background: linear-gradient( 141 + 180deg, 142 + rgba(34, 34, 34, 1) 0%, 143 + rgba(5, 5, 5, 0.9) 100% 144 + ); 145 + } 146 + 147 + .body-image { 148 + margin-top: 6px; 149 + background-color: white; 150 + border-radius: 12px; 151 + } 152 + 153 + .summary { 154 + font-size: 16px; 155 + font-weight: bold; 156 + background: transparent; 157 + color: @text-color; 158 + text-shadow: none; 159 + } 160 + 161 + .time { 162 + font-size: 16px; 163 + font-weight: bold; 164 + background: transparent; 165 + color: @text-color; 166 + text-shadow: none; 167 + margin-right: 18px; 168 + } 169 + 170 + .body { 171 + font-size: 15px; 172 + font-weight: normal; 173 + background: transparent; 174 + color: @text-color; 175 + text-shadow: none; 176 + } 177 + 178 + .control-center { 179 + background: @cc-bg; 180 + } 181 + 182 + .control-center-list { 183 + background: transparent; 184 + } 185 + 186 + .control-center-list-placeholder { 187 + opacity: 0.5; 188 + } 189 + 190 + .floating-notifications { 191 + background: transparent; 192 + } 193 + 194 + /* Window behind control center and on all other monitors */ 195 + .blank-window { 196 + background: alpha(black, 0.25); 197 + } 198 + 199 + /*** Widgets ***/ 200 + 201 + /* Title widget */ 202 + .widget-title { 203 + margin: 8px; 204 + font-size: 1.5rem; 205 + } 206 + .widget-title > button { 207 + font-size: initial; 208 + color: @text-color; 209 + text-shadow: none; 210 + background: linear-gradient( 211 + 180deg, 212 + rgba(34, 34, 34, 1) 0%, 213 + rgba(5, 5, 5, 0.9) 100% 214 + ); 215 + border: 1px solid @noti-border-color; 216 + box-shadow: none; 217 + border-radius: 12px; 218 + } 219 + .widget-title > button:hover { 220 + background: linear-gradient( 221 + 180deg, 222 + rgba(34, 34, 34, 1) 0%, 223 + rgba(5, 5, 5, 0.9) 100% 224 + ); 225 + } 226 + 227 + /* DND widget */ 228 + .widget-dnd { 229 + margin: 8px; 230 + font-size: 1.1rem; 231 + } 232 + .widget-dnd > switch { 233 + font-size: initial; 234 + border-radius: 12px; 235 + background: linear-gradient( 236 + 180deg, 237 + rgb(55, 55, 55) 0%, 238 + rgba(20, 20, 20, 0.9) 100% 239 + ); 240 + border: 1px solid @noti-border-color; 241 + box-shadow: none; 242 + } 243 + .widget-dnd > switch:checked { 244 + background: linear-gradient( 245 + 180deg, 246 + rgb(0, 209, 209) 0%, 247 + rgb(0, 60, 164) 100% 248 + ); 249 + } 250 + .widget-dnd > switch slider { 251 + background: linear-gradient( 252 + 180deg, 253 + rgb(199, 199, 199) 0%, 254 + rgba(153, 153, 153, 0.9) 100% 255 + ); 256 + border-radius: 12px; 257 + } 258 + 259 + /* Label widget */ 260 + .widget-label { 261 + margin: 8px; 262 + } 263 + .widget-label > label { 264 + font-size: 1.1rem; 265 + }
+7
res/swayosd.css
··· 1 + window#osd { 2 + border-radius: 5rem; 3 + } 4 + 5 + #container { 6 + padding: 5px 10px; 7 + }
+72
res/theming/dolphinrc
··· 1 + [$Version] 2 + update_info=dolphin_detailsmodesettings.upd:rename-leading-padding,dolphin_detailsmodesettings.upd:move-content-display 3 + 4 + [Baloo KEditCommentDialog] 5 + 2 screens: Height=252 6 + 2 screens: Width=276 7 + 8 + [ContextMenu] 9 + ShowCopyMoveMenu=true 10 + 11 + [CreateDialog] 12 + LastMimeType=application/x-compressed-tar 13 + 14 + [ExtractDialog] 15 + DVI-D-1 HDMI-A-1 Height 1920x1080 HDMI-A-1=560 16 + DVI-D-1 HDMI-A-1 Width 1920x1080 HDMI-A-1=1280 17 + DirHistory[$e]=$HOME/Downloads/ 18 + DirHistory\x5b$e\x5d=$HOME/Downloads/ 19 + 20 + [General] 21 + ConfirmClosingMultipleTabs=false 22 + OpenNewTabAfterLastTab=true 23 + RememberOpenedTabs=false 24 + Version=202 25 + ViewPropsTimestamp=2022,12,10,8,9,33.602 26 + 27 + [IconsMode] 28 + IconSize=48 29 + PreviewSize=96 30 + 31 + [InformationPanel] 32 + previewsShown=false 33 + 34 + [KFileDialog Settings] 35 + Places Icons Auto-resize=false 36 + Places Icons Static Size=22 37 + Recent Files[$e]=file:$HOME,file:$HOME 38 + Recent URLs[$e]=file:$HOME/Downloads/ 39 + detailViewIconSize=16 40 + 41 + [KPropertiesDialog] 42 + 1600x1200 screen: Height=598 43 + 1600x1200 screen: Width=512 44 + 2 screens: Height=644 45 + 2 screens: Width=498 46 + 2256x1504 screen: Height=458 47 + 2256x1504 screen: Width=427 48 + 2256x1504 screen: Window-Maximized=true 49 + DVI-D-0 HDMI-0 Height 1920x1080 DVI-D-0=479 50 + DVI-D-0 HDMI-0 Height 1920x1080 HDMI-0=479 51 + DVI-D-0 HDMI-0 Width 1920x1080 DVI-D-0=419 52 + DVI-D-0 HDMI-0 Width 1920x1080 HDMI-0=423 53 + DVI-D-1 HDMI-1 Height 1920x1080 DVI-D-1=464 54 + DVI-D-1 HDMI-1 Height 1920x1080 HDMI-1=588 55 + DVI-D-1 HDMI-1 Width 1920x1080 DVI-D-1=403 56 + DVI-D-1 HDMI-1 Width 1920x1080 HDMI-1=469 57 + DVI-D-1 HDMI-A-1 Height 1920x1080 DVI-D-1=464 58 + DVI-D-1 HDMI-A-1 Width 1920x1080 DVI-D-1=390 59 + 60 + [MainWindow] 61 + MenuBar=Disabled 62 + ToolBarsMovable=Disabled 63 + 64 + [Notification Messages] 65 + ConfirmDelete=true 66 + 67 + [Open-with settings] 68 + CompletionMode=1 69 + History= 70 + 71 + [PreviewSettings] 72 + Plugins=audiothumbnail,blenderthumbnail,comicbookthumbnail,cursorthumbnail,djvuthumbnail,ebookthumbnail,exrthumbnail,directorythumbnail,imagethumbnail,jpegthumbnail,kraorathumbnail,windowsexethumbnail,windowsimagethumbnail,mltpreview,mobithumbnail,opendocumentthumbnail,gsthumbnail,rawthumbnail,svgthumbnail
+15
res/theming/gtk/.gtkrc-2.0
··· 1 + gtk-theme-name="Sweet-Ambar-Blue" 2 + gtk-icon-theme-name="candy-icons" 3 + gtk-font-name="Serif 12" 4 + gtk-cursor-theme-name="Sweet-cursors" 5 + gtk-cursor-theme-size=24 6 + gtk-toolbar-style=3 7 + gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR 8 + gtk-button-images=0 9 + gtk-menu-images=0 10 + gtk-enable-event-sounds=1 11 + gtk-enable-input-feedback-sounds=0 12 + gtk-xft-antialias=1 13 + gtk-xft-hinting=1 14 + gtk-xft-hintstyle="hintslight" 15 + gtk-xft-rgba="rgb"
+23
res/theming/gtk/settings.ini
··· 1 + [Settings] 2 + gtk-theme-name=Sweet-Ambar-Blue 3 + gtk-icon-theme-name=candy-icons 4 + gtk-font-name=Serif 12 5 + gtk-cursor-theme-name=Sweet-cursors 6 + gtk-cursor-theme-size=24 7 + gtk-toolbar-style=3 8 + gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR 9 + gtk-button-images=0 10 + gtk-menu-images=0 11 + gtk-enable-event-sounds=1 12 + gtk-enable-input-feedback-sounds=0 13 + gtk-xft-antialias=1 14 + gtk-xft-hinting=1 15 + gtk-xft-hintstyle=hintslight 16 + gtk-xft-rgba=rgb 17 + gtk-application-prefer-dark-theme=1 18 + gtk-decoration-layout = icon:minimize,maximize,close 19 + gtk-enable-animations = true 20 + gtk-modules = colorreload-gtk-module:window-decorations-gtk-module:appmenu-gtk-module 21 + gtk-primary-button-warps-slider = false 22 + gtk-shell-shows-menubar = 1 23 + gtk-xft-dpi = 98304
+28
res/theming/kdeglobals
··· 1 + [KDE] 2 + ShowDeleteCommand=false 3 + 4 + [General] 5 + TerminalApplication=foot 6 + 7 + [KFileDialog Settings] 8 + Allow Expansion=false 9 + Automatically select filename extension=true 10 + Breadcrumb Navigation=true 11 + Decoration position=2 12 + LocationCombo Completionmode=5 13 + PathCombo Completionmode=5 14 + Show Bookmarks=false 15 + Show Full Path=false 16 + Show Inline Previews=true 17 + Show Preview=false 18 + Show Speedbar=true 19 + Show hidden files=false 20 + Sort by=Name 21 + Sort directories first=true 22 + Sort hidden files last=false 23 + Sort reversed=false 24 + Speedbar Width=196 25 + View Style=DetailTree 26 + 27 + [PreviewSettings] 28 + MaximumRemoteSize=0
+28
res/theming/qt5ct.conf
··· 1 + [Appearance] 2 + custom_palette=false 3 + icon_theme=candy-icons 4 + standard_dialogs=xdgdesktopportal 5 + style=kvantum-dark 6 + 7 + [Fonts] 8 + fixed="FiraMono Nerd Font Mono,12,-1,5,50,0,0,0,0,0" 9 + general="FiraMono Nerd Font,12,-1,5,50,0,0,0,0,0,Regular" 10 + 11 + [Interface] 12 + activate_item_on_single_click=1 13 + buttonbox_layout=2 14 + cursor_flash_time=1000 15 + dialog_buttons_have_icons=2 16 + double_click_interval=400 17 + gui_effects=General, AnimateMenu, AnimateCombo, AnimateTooltip, AnimateToolBox 18 + keyboard_scheme=2 19 + menus_have_icons=true 20 + show_shortcuts_in_context_menus=true 21 + stylesheets=@Invalid() 22 + toolbutton_style=4 23 + underline_shortcut=1 24 + wheel_scroll_lines=3 25 + 26 + [Troubleshooting] 27 + force_raster_widgets=1 28 + ignored_applications=@Invalid()
+31
res/theming/qt6ct.conf
··· 1 + [Appearance] 2 + custom_palette=false 3 + icon_theme=candy-icons 4 + standard_dialogs=xdgdesktopportal 5 + style=kvantum 6 + 7 + [Fonts] 8 + fixed="FiraMono Nerd Font Mono,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" 9 + general="FiraMono Nerd Font,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" 10 + 11 + [Interface] 12 + activate_item_on_single_click=0 13 + buttonbox_layout=2 14 + cursor_flash_time=1000 15 + dialog_buttons_have_icons=2 16 + double_click_interval=400 17 + gui_effects=General, FadeMenu, AnimateCombo, AnimateTooltip, AnimateToolBox 18 + keyboard_scheme=2 19 + menus_have_icons=true 20 + show_shortcuts_in_context_menus=true 21 + stylesheets=@Invalid() 22 + toolbutton_style=4 23 + underline_shortcut=1 24 + wheel_scroll_lines=3 25 + 26 + [SettingsWindow] 27 + geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4J\0\0\x5\t\0\0\0\0\0\0\0\0\0\0\x4g\0\0\x5\x35\0\0\0\0\x2\0\0\0\b\xd0\0\0\0\0\0\0\0\0\0\0\x4J\0\0\x5\t) 28 + 29 + [Troubleshooting] 30 + force_raster_widgets=1 31 + ignored_applications=@Invalid()
+66
res/vencord/settings/quickCss.css
··· 1 + body { 2 + /* zoom: 150% !important; /* I like big UI :) */ 3 + } 4 + 5 + :root { 6 + /* amount of spacing and padding */ 7 + --spacing: 12px; 8 + /* radius of round corners */ 9 + --roundness: 16px; 10 + 11 + --hue-main: 130; 12 + --saturation: 70%; 13 + 14 + /* font, change to 'gg sans' for default discord font*/ 15 + --font: "gg sans"; 16 + 17 + /* color of green online dot, change to #23a55a for default green */ 18 + --online-indicator: var(--accent-2); 19 + 20 + /* color of links */ 21 + --accent-1: hsl(var(--hue-main), var(--saturation), 60%); 22 + /* color of unread dividers and some indicators */ 23 + --accent-2: hsl(var(--hue-main), var(--saturation), 48%); 24 + /* color of accented buttons */ 25 + --accent-3: hsl(var(--hue-main), var(--saturation), 42%); 26 + /* color of accented buttons when hovered */ 27 + --accent-4: hsl(var(--hue-main), var(--saturation), 36%); 28 + /* color of accented buttons when clicked */ 29 + --accent-5: hsl(var(--hue-main), var(--saturation), 30%); 30 + 31 + /* color of mentions and messages that mention you */ 32 + --mention: hsla(var(--hue-main), var(--saturation), 52%, 0.1); 33 + /* color of mentions and messages that mention you when hovered */ 34 + --mention-hover: hsla(var(--hue-main), var(--saturation), 52%, 0.05); 35 + 36 + /* color of bright text on colored buttons */ 37 + --text-1: hsl(220, 40%, 90%); 38 + /* color of headings and important text */ 39 + --text-2: hsl(220, 25%, 70%); 40 + /* color of normal text */ 41 + --text-3: hsl(220, 15%, 60%); 42 + /* color of icon buttons and channels */ 43 + --text-4: hsl(220, 15%, 40%); 44 + /* color of muted channels/chats and timestamps */ 45 + --text-5: hsl(220, 15%, 25%); 46 + 47 + /* color of dark buttons when clicked */ 48 + --bg-1: hsl(220, 15%, 20%); 49 + /* color of dark buttons */ 50 + --bg-2: hsl(220, 15%, 16%); 51 + /* color of spacing around panels and secondary elements */ 52 + --bg-3: hsl(220, 15%, 13%); 53 + /* main background color */ 54 + --bg-4: hsl(220, 15%, 10%); 55 + 56 + /* color of channels and icon buttons when hovered */ 57 + --hover: hsla(230, 20%, 40%, 0.1); 58 + /* color of channels and icon buttons when clicked or selected */ 59 + --active: hsla(220, 20%, 40%, 0.2); 60 + /* color of messages when hovered */ 61 + --message-hover: hsla(220, 0%, 0%, 0.1); 62 + 63 + /* top left icon */ 64 + --moon-icon: none; /* change to 'none' to hide moon icon */ 65 + --discord-icon: block; /* change to 'block' to show default discord icon */ 66 + }
+614
res/vencord/settings/settings.json
··· 1 + { 2 + "notifyAboutUpdates": false, 3 + "autoUpdate": false, 4 + "autoUpdateNotification": false, 5 + "useQuickCss": true, 6 + "themeLinks": [ 7 + "https://raw.githubusercontent.com/refact0r/midnight-discord/master/midnight.css" 8 + ], 9 + "enabledThemes": [], 10 + "enableReactDevtools": false, 11 + "frameless": false, 12 + "transparent": false, 13 + "winCtrlQ": false, 14 + "macosTranslucency": false, 15 + "disableMinSize": false, 16 + "winNativeTitleBar": false, 17 + "plugins": { 18 + "BadgeAPI": { 19 + "enabled": true 20 + }, 21 + "CommandsAPI": { 22 + "enabled": true 23 + }, 24 + "ContextMenuAPI": { 25 + "enabled": true 26 + }, 27 + "MemberListDecoratorsAPI": { 28 + "enabled": true 29 + }, 30 + "MessageAccessoriesAPI": { 31 + "enabled": true 32 + }, 33 + "MessageDecorationsAPI": { 34 + "enabled": true 35 + }, 36 + "MessageEventsAPI": { 37 + "enabled": true 38 + }, 39 + "MessagePopoverAPI": { 40 + "enabled": false 41 + }, 42 + "NoticesAPI": { 43 + "enabled": true 44 + }, 45 + "ServerListAPI": { 46 + "enabled": false 47 + }, 48 + "NoTrack": { 49 + "enabled": true, 50 + "disableAnalytics": true 51 + }, 52 + "Settings": { 53 + "enabled": true, 54 + "settingsLocation": "aboveActivity" 55 + }, 56 + "SupportHelper": { 57 + "enabled": true 58 + }, 59 + "AlwaysAnimate": { 60 + "enabled": false 61 + }, 62 + "AlwaysTrust": { 63 + "enabled": true, 64 + "domain": true, 65 + "file": true 66 + }, 67 + "AnonymiseFileNames": { 68 + "enabled": true, 69 + "anonymiseByDefault": true, 70 + "method": 0, 71 + "randomisedLength": 7 72 + }, 73 + "BANger": { 74 + "enabled": false 75 + }, 76 + "BetterFolders": { 77 + "enabled": false 78 + }, 79 + "BetterGifAltText": { 80 + "enabled": true 81 + }, 82 + "BetterNotesBox": { 83 + "enabled": false 84 + }, 85 + "BetterRoleDot": { 86 + "enabled": false 87 + }, 88 + "BetterUploadButton": { 89 + "enabled": false 90 + }, 91 + "BiggerStreamPreview": { 92 + "enabled": false 93 + }, 94 + "BlurNSFW": { 95 + "enabled": false 96 + }, 97 + "CallTimer": { 98 + "enabled": false 99 + }, 100 + "ClearURLs": { 101 + "enabled": true 102 + }, 103 + "ColorSighted": { 104 + "enabled": false 105 + }, 106 + "ConsoleShortcuts": { 107 + "enabled": false 108 + }, 109 + "CopyUserURLs": { 110 + "enabled": true 111 + }, 112 + "CrashHandler": { 113 + "enabled": true 114 + }, 115 + "CustomRPC": { 116 + "enabled": false 117 + }, 118 + "Dearrow": { 119 + "enabled": false, 120 + "hideButton": false, 121 + "replaceElements": 0 122 + }, 123 + "EmoteCloner": { 124 + "enabled": false 125 + }, 126 + "Experiments": { 127 + "enabled": true, 128 + "toolbarDevMenu": false 129 + }, 130 + "F8Break": { 131 + "enabled": false 132 + }, 133 + "FakeNitro": { 134 + "enabled": false 135 + }, 136 + "FakeProfileThemes": { 137 + "enabled": false 138 + }, 139 + "FavoriteEmojiFirst": { 140 + "enabled": false 141 + }, 142 + "FavoriteGifSearch": { 143 + "enabled": false 144 + }, 145 + "FixSpotifyEmbeds": { 146 + "enabled": false 147 + }, 148 + "ForceOwnerCrown": { 149 + "enabled": false 150 + }, 151 + "FriendInvites": { 152 + "enabled": false 153 + }, 154 + "GameActivityToggle": { 155 + "enabled": false 156 + }, 157 + "GifPaste": { 158 + "enabled": false 159 + }, 160 + "GreetStickerPicker": { 161 + "enabled": false 162 + }, 163 + "HideAttachments": { 164 + "enabled": false 165 + }, 166 + "iLoveSpam": { 167 + "enabled": false 168 + }, 169 + "IgnoreActivities": { 170 + "enabled": false 171 + }, 172 + "ImageZoom": { 173 + "enabled": false 174 + }, 175 + "InvisibleChat": { 176 + "enabled": false 177 + }, 178 + "KeepCurrentChannel": { 179 + "enabled": false 180 + }, 181 + "LastFMRichPresence": { 182 + "enabled": false 183 + }, 184 + "LoadingQuotes": { 185 + "enabled": false 186 + }, 187 + "MemberCount": { 188 + "enabled": true, 189 + "memberList": true, 190 + "toolTip": true 191 + }, 192 + "MessageClickActions": { 193 + "enabled": false 194 + }, 195 + "MessageLinkEmbeds": { 196 + "enabled": false 197 + }, 198 + "MessageLogger": { 199 + "enabled": true 200 + }, 201 + "MessageTags": { 202 + "enabled": false 203 + }, 204 + "MoreCommands": { 205 + "enabled": false 206 + }, 207 + "MoreKaomoji": { 208 + "enabled": false 209 + }, 210 + "MoreUserTags": { 211 + "enabled": false 212 + }, 213 + "Moyai": { 214 + "enabled": false 215 + }, 216 + "MutualGroupDMs": { 217 + "enabled": false 218 + }, 219 + "NoBlockedMessages": { 220 + "enabled": false 221 + }, 222 + "NoDevtoolsWarning": { 223 + "enabled": false 224 + }, 225 + "NoF1": { 226 + "enabled": false 227 + }, 228 + "NoMosaic": { 229 + "enabled": false 230 + }, 231 + "NoPendingCount": { 232 + "enabled": true, 233 + "hideFriendRequestsCount": true, 234 + "hideMessageRequestsCount": false, 235 + "hidePremiumOffersCount": true 236 + }, 237 + "NoProfileThemes": { 238 + "enabled": true 239 + }, 240 + "NoRPC": { 241 + "enabled": false 242 + }, 243 + "NoReplyMention": { 244 + "enabled": true, 245 + "userList": "1234567890123445,1234567890123445", 246 + "shouldPingListed": true, 247 + "inverseShiftReply": false 248 + }, 249 + "NoScreensharePreview": { 250 + "enabled": false 251 + }, 252 + "NoSystemBadge": { 253 + "enabled": false 254 + }, 255 + "NoTypingAnimation": { 256 + "enabled": false 257 + }, 258 + "NoUnblockToJump": { 259 + "enabled": false 260 + }, 261 + "NormalizeMessageLinks": { 262 + "enabled": false 263 + }, 264 + "NSFWGateBypass": { 265 + "enabled": false 266 + }, 267 + "OnePingPerDM": { 268 + "enabled": false 269 + }, 270 + "oneko": { 271 + "enabled": false 272 + }, 273 + "OpenInApp": { 274 + "enabled": true, 275 + "spotify": true, 276 + "steam": true, 277 + "epic": true, 278 + "tidal": true 279 + }, 280 + "PermissionFreeWill": { 281 + "enabled": false 282 + }, 283 + "PermissionsViewer": { 284 + "enabled": false 285 + }, 286 + "petpet": { 287 + "enabled": false 288 + }, 289 + "PictureInPicture": { 290 + "enabled": true 291 + }, 292 + "PinDMs": { 293 + "enabled": false 294 + }, 295 + "PlainFolderIcon": { 296 + "enabled": false 297 + }, 298 + "PlatformIndicators": { 299 + "enabled": true, 300 + "colorMobileIndicator": true, 301 + "list": true, 302 + "badges": true, 303 + "messages": true 304 + }, 305 + "PreviewMessage": { 306 + "enabled": false 307 + }, 308 + "PronounDB": { 309 + "enabled": false 310 + }, 311 + "QuickMention": { 312 + "enabled": false 313 + }, 314 + "QuickReply": { 315 + "enabled": false 316 + }, 317 + "ReactErrorDecoder": { 318 + "enabled": false 319 + }, 320 + "ReadAllNotificationsButton": { 321 + "enabled": false 322 + }, 323 + "RelationshipNotifier": { 324 + "enabled": false 325 + }, 326 + "RevealAllSpoilers": { 327 + "enabled": false 328 + }, 329 + "ReverseImageSearch": { 330 + "enabled": false 331 + }, 332 + "RoleColorEverywhere": { 333 + "enabled": false 334 + }, 335 + "SearchReply": { 336 + "enabled": false 337 + }, 338 + "SecretRingToneEnabler": { 339 + "enabled": false 340 + }, 341 + "SendTimestamps": { 342 + "enabled": false 343 + }, 344 + "ServerListIndicators": { 345 + "enabled": false 346 + }, 347 + "ShikiCodeblocks": { 348 + "enabled": true, 349 + "useDevIcon": "GREYSCALE", 350 + "theme": "https://raw.githubusercontent.com/shikijs/shiki/0b28ad8ccfbf2615f2d9d38ea8255416b8ac3043/packages/shiki/themes/dark-plus.json" 351 + }, 352 + "ShowAllMessageButtons": { 353 + "enabled": false 354 + }, 355 + "ShowConnections": { 356 + "enabled": false 357 + }, 358 + "ShowHiddenChannels": { 359 + "enabled": false 360 + }, 361 + "ShowMeYourName": { 362 + "enabled": false 363 + }, 364 + "SilentMessageToggle": { 365 + "enabled": false 366 + }, 367 + "SilentTyping": { 368 + "enabled": false 369 + }, 370 + "SortFriendRequests": { 371 + "enabled": false 372 + }, 373 + "SpotifyControls": { 374 + "enabled": false 375 + }, 376 + "SpotifyCrack": { 377 + "enabled": false 378 + }, 379 + "SpotifyShareCommands": { 380 + "enabled": false 381 + }, 382 + "StartupTimings": { 383 + "enabled": false 384 + }, 385 + "TextReplace": { 386 + "enabled": false 387 + }, 388 + "ThemeAttributes": { 389 + "enabled": false 390 + }, 391 + "TimeBarAllActivities": { 392 + "enabled": false 393 + }, 394 + "Translate": { 395 + "enabled": false 396 + }, 397 + "TypingIndicator": { 398 + "enabled": false 399 + }, 400 + "TypingTweaks": { 401 + "enabled": true 402 + }, 403 + "Unindent": { 404 + "enabled": false 405 + }, 406 + "UnsuppressEmbeds": { 407 + "enabled": false 408 + }, 409 + "UrbanDictionary": { 410 + "enabled": false 411 + }, 412 + "UserVoiceShow": { 413 + "enabled": false 414 + }, 415 + "USRBG": { 416 + "enabled": false 417 + }, 418 + "ValidUser": { 419 + "enabled": false 420 + }, 421 + "VoiceChatDoubleClick": { 422 + "enabled": true 423 + }, 424 + "VcNarrator": { 425 + "enabled": false 426 + }, 427 + "VencordToolbox": { 428 + "enabled": false 429 + }, 430 + "ViewIcons": { 431 + "enabled": false 432 + }, 433 + "ViewRaw": { 434 + "enabled": false 435 + }, 436 + "VoiceMessages": { 437 + "enabled": false 438 + }, 439 + "VolumeBooster": { 440 + "enabled": false 441 + }, 442 + "WhoReacted": { 443 + "enabled": true 444 + }, 445 + "Wikisearch": { 446 + "enabled": false 447 + }, 448 + "DisableCallIdle": { 449 + "enabled": false 450 + }, 451 + "NewGuildSettings": { 452 + "enabled": false 453 + }, 454 + "PartyMode": { 455 + "enabled": false 456 + }, 457 + "ServerInfo": { 458 + "enabled": false 459 + }, 460 + "ShowHiddenThings": { 461 + "enabled": false 462 + }, 463 + "ChatInputButtonAPI": { 464 + "enabled": false 465 + }, 466 + "MessageUpdaterAPI": { 467 + "enabled": false 468 + }, 469 + "UserSettingsAPI": { 470 + "enabled": true 471 + }, 472 + "AppleMusicRichPresence": { 473 + "enabled": false 474 + }, 475 + "WebRichPresence (arRPC)": { 476 + "enabled": false 477 + }, 478 + "AutomodContext": { 479 + "enabled": true 480 + }, 481 + "BetterGifPicker": { 482 + "enabled": false 483 + }, 484 + "BetterRoleContext": { 485 + "enabled": false 486 + }, 487 + "BetterSessions": { 488 + "enabled": false 489 + }, 490 + "BetterSettings": { 491 + "enabled": false, 492 + "disableFade": true, 493 + "organizeMenu": true, 494 + "eagerLoad": true 495 + }, 496 + "ClientTheme": { 497 + "enabled": false 498 + }, 499 + "CopyEmojiMarkdown": { 500 + "enabled": false 501 + }, 502 + "CtrlEnterSend": { 503 + "enabled": false 504 + }, 505 + "CustomIdle": { 506 + "enabled": false 507 + }, 508 + "Decor": { 509 + "enabled": false 510 + }, 511 + "DontRoundMyTimestamps": { 512 + "enabled": false 513 + }, 514 + "FixCodeblockGap": { 515 + "enabled": false 516 + }, 517 + "FixYoutubeEmbeds": { 518 + "enabled": true 519 + }, 520 + "FriendsSince": { 521 + "enabled": true 522 + }, 523 + "ImageLink": { 524 + "enabled": false 525 + }, 526 + "ImplicitRelationships": { 527 + "enabled": false 528 + }, 529 + "MaskedLinkPaste": { 530 + "enabled": false 531 + }, 532 + "MessageLatency": { 533 + "enabled": false 534 + }, 535 + "NoDefaultHangStatus": { 536 + "enabled": false 537 + }, 538 + "NoOnboardingDelay": { 539 + "enabled": false 540 + }, 541 + "NoServerEmojis": { 542 + "enabled": false, 543 + "shownEmojis": "onlyUnicode" 544 + }, 545 + "NotificationVolume": { 546 + "enabled": false 547 + }, 548 + "OverrideForumDefaults": { 549 + "enabled": false 550 + }, 551 + "PauseInvitesForever": { 552 + "enabled": false 553 + }, 554 + "ReplaceGoogleSearch": { 555 + "enabled": false 556 + }, 557 + "ReplyTimestamp": { 558 + "enabled": false 559 + }, 560 + "ReviewDB": { 561 + "enabled": true 562 + }, 563 + "Summaries": { 564 + "enabled": false, 565 + "summaryExpiryThresholdDays": 3 566 + }, 567 + "ShowTimeoutDuration": { 568 + "enabled": false 569 + }, 570 + "StreamerModeOnStream": { 571 + "enabled": false 572 + }, 573 + "SuperReactionTweaks": { 574 + "enabled": false 575 + }, 576 + "UnlockedAvatarZoom": { 577 + "enabled": false 578 + }, 579 + "ValidReply": { 580 + "enabled": false 581 + }, 582 + "VoiceDownload": { 583 + "enabled": true 584 + }, 585 + "WatchTogetherAdblock": { 586 + "enabled": true 587 + }, 588 + "WebKeybinds": { 589 + "enabled": false 590 + }, 591 + "WebScreenShareFixes": { 592 + "enabled": false 593 + }, 594 + "XSOverlay": { 595 + "enabled": false 596 + }, 597 + "WebContextMenus": { 598 + "enabled": false, 599 + "addBack": true 600 + } 601 + }, 602 + "notifications": { 603 + "timeout": 5000, 604 + "position": "bottom-right", 605 + "useNative": "always", 606 + "logLimit": 50 607 + }, 608 + "cloud": { 609 + "authenticated": false, 610 + "url": "https://api.vencord.dev/", 611 + "settingsSync": false, 612 + "settingsSyncVersion": 1719252668865 613 + } 614 + }
res/vencord/themes/.gitkeep

This is a binary file and will not be displayed.

+254
res/waybar/config.jsonc
··· 1 + // -*- mode: json -*- 2 + [ 3 + { 4 + "layer": "top", 5 + "position": "top", 6 + "modules-left": [ 7 + "user", 8 + "clock#1", 9 + "clock#2", 10 + "custom/news", 11 + // "custom/weather", - Broken 12 + "mpris" 13 + ], 14 + "modules-center": [], 15 + "modules-right": [ 16 + "network", 17 + "battery", 18 + "bluetooth", 19 + "pulseaudio", 20 + "custom/kde-connect", 21 + "idle_inhibitor", 22 + "custom/notification", 23 + "privacy", 24 + "tray" 25 + ], 26 + "user": { 27 + "format": " {user}", 28 + "icon": true 29 + }, 30 + "clock#1": { 31 + "format": "󰃭 {:%A, %B %Od}", 32 + "tooltip-format": "<tt><small>{calendar}</small></tt>", 33 + "calendar": { 34 + "mode": "month", 35 + "mode-mon-col": 3, 36 + "weeks-pos": "right", 37 + "on-scroll": 1, 38 + "format": { 39 + "months": "<span color='#ffead3'><b>{}</b></span>", 40 + "days": "<span color='#ecc6d9'><b>{}</b></span>", 41 + "weeks": "<span color='#99ffdd'><b>W{}</b></span>", 42 + "weekdays": "<span color='#ffcc66'><b>{}</b></span>", 43 + "today": "<span color='#ff6699'><b><u>{}</u></b></span>" 44 + } 45 + }, 46 + "actions": { 47 + "on-click": "shift_up", 48 + "on-click-right": "shift_down", 49 + "on-click-middle": "mode" 50 + } 51 + }, 52 + "clock#2": { 53 + "format": "󰥔 {:%I:%M %p}", 54 + "tooltip-format": "{:%F at %T in %Z (UTC%Ez)}" 55 + }, 56 + "mpris": { 57 + "status-icons": { 58 + "paused": "󰏤", 59 + "stopped": "󰓛" 60 + }, 61 + "player-icons": { 62 + "default": "󰎆", 63 + "kdeconnect": "", 64 + "spotify": "󰓇", 65 + "firefox": "󰈹", 66 + "firefox-devedition": "󰈹", 67 + "QMPlay2": "󰐌" 68 + }, 69 + "dynamic-order": ["title", "artist", "album", "position", "length"], 70 + "dynamic-importance-order": [ 71 + "title", 72 + "position", 73 + "length", 74 + "artist", 75 + "album" 76 + ], 77 + "title-len": 35, 78 + "artist-len": 25, 79 + "album-len": 20, 80 + "dynamic-len": 50, 81 + "format": "{player_icon} {dynamic}", 82 + "format-paused": "{status_icon} {dynamic}" 83 + }, 84 + "network": { 85 + "format": "{ifname}", 86 + "format-wifi": "{icon} {essid}", 87 + "format-icons": ["󰤟", "󰤢", "󰤥", "󰤨"], 88 + "format-ethernet": "󱎔 {ifname}", 89 + "format-linked": "󰌷 {ifname}", 90 + "format-disconnected": "󰪎", 91 + "tooltip-format": "{ifname} via {gwaddr}", 92 + "tooltip-format-wifi": "Connected to {essid} ({signalStrength}󰏰 Strength) over {ifname} via {gwaddr}", 93 + "tooltip-format-ethernet": "󱎔 {ifname}", 94 + "tooltip-disconnected": "Disconnected" 95 + }, 96 + "pulseaudio": { 97 + "format": "{icon} {volume:2}󰏰", 98 + "format-bluetooth": "{icon} {volume}󰏰", 99 + "format-muted": "󰝟", 100 + "format-icons": { 101 + "headphone": "󰋋", 102 + "hands-free": "󰋋", 103 + "headset": "󰋋", 104 + "phone": "", 105 + "portable": "", 106 + "car": "", 107 + "default": ["󰖀", "󰕾"] 108 + }, 109 + "scroll-step": 5, 110 + "on-click": "pamixer -t", 111 + "on-click-right": "pavucontrol" 112 + }, 113 + "bluetooth": { 114 + "format": "󰂯", 115 + "format-disabled": "󰂲", 116 + "format-off": "󰂲", 117 + "format-connected": "󰂱", 118 + "format-connected-battery": "󰂱 {device_battery_percentage}󰏰", 119 + "tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected", 120 + "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}", 121 + "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", 122 + "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%", 123 + "on-click": "rofi-bluetooth", 124 + "on-click-right": "rfkill toggle bluetooth" 125 + }, 126 + "idle_inhibitor": { 127 + "format": "{icon}", 128 + "format-icons": { 129 + "activated": "󰒳", 130 + "deactivated": "󰒲" 131 + } 132 + }, 133 + "battery": { 134 + "states": { 135 + "warning": 30, 136 + "critical": 15 137 + }, 138 + "format": "{icon} {capacity}󰏰", 139 + "format-charging": "{icon} {capacity}󰏰", 140 + "format-icons": { 141 + "charging": ["󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"], 142 + "default": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"] 143 + } 144 + }, 145 + "tray": { 146 + "icon-size": 25, 147 + "spacing": 5, 148 + "show-passive-items": true 149 + }, 150 + "privacy": { 151 + "icon-spacing": 4, 152 + "icon-size": 20, 153 + "transition-duration": 200, 154 + "modules": [ 155 + { 156 + "type": "screenshare", 157 + "tooltip": true, 158 + "tooltip-icon-size": 24 159 + }, 160 + { 161 + "type": "audio-in", 162 + "tooltip": true, 163 + "tooltip-icon-size": 24 164 + } 165 + ] 166 + }, 167 + "custom/notification": { 168 + "tooltip": false, 169 + "format": "{icon}", 170 + "format-icons": { 171 + "notification": "󱅫", 172 + "none": "󰂚", 173 + "dnd-notification": "󰂛<sup></sup>", 174 + "dnd-none": "󰂛", 175 + "inhibited-notification": "󰂠<sup></sup>", 176 + "inhibited-none": "󰂠", 177 + "dnd-inhibited-notification": "󰂛<sup></sup>", 178 + "dnd-inhibited-none": "󰂛" 179 + }, 180 + "max-length": 3, 181 + "return-type": "json", 182 + "exec-if": "which swaync-client", 183 + "exec": "swaync-client -swb", 184 + "on-click": "sleep 0.2 && swaync-client -t -sw", 185 + "on-click-right": "sleep 0.2 && swaync-client -d -sw", 186 + "on-click-middle": "sleep 0.2 && swaync-client -C -sw", 187 + "escape": true 188 + }, 189 + "custom/kde-connect": { 190 + "exec": "nu ~/.config/waybar/custom_modules/kdeconnect.nu", 191 + "format": "{}", 192 + "return-type": "json", 193 + "on-click": "kdeconnect-settings", 194 + "interval": 30 195 + }, 196 + "custom/weather": { 197 + "exec": "nu ~/.config/waybar/custom_modules/weather.nu", 198 + "on-click": "xdg-open https://duckduckgo.com/?q=weather", 199 + "return-type": "json", 200 + "format": "{}", 201 + "interval": 600 202 + }, 203 + "custom/news": { 204 + "exec": "nu ~/.config/waybar/custom_modules/newsboat.nu", 205 + "exec-on-event": true, 206 + "signal": 6, 207 + "on-click": "pidof -q newsboat && hyprctl dispatch focuswindow newsboat || foot --title=\"Newsboat\" --app-id=\"newsboat\" newsboat; pkill -SIGRTMIN+6 waybar", 208 + "on-click-right": "pkill waybar -SIGRTMIN+6", 209 + "return-type": "json", 210 + "format": "{}", 211 + "restart-interval": 1800 212 + } 213 + }, 214 + { 215 + "layer": "top", 216 + "position": "bottom", 217 + "modules-left": ["hyprland/workspaces"], 218 + "modules-center": ["wlr/taskbar"], 219 + "modules-right": ["temperature", "cpu", "memory"], 220 + "wlr/taskbar": { 221 + "icon-theme": "candy-icons", 222 + "format": "{icon}", 223 + "icon-size": 35, 224 + "on-click": "activate" 225 + }, 226 + "hyprland/workspaces": { 227 + "disable-scroll": true, 228 + "format": "{name}" 229 + }, 230 + "temperature": { 231 + "thermal-zone": 10, 232 + "critical-threshold": 90, 233 + "format-icons": ["󱃃", "󰔏", "󱃂"], 234 + "format-critical": "{icon}! {temperatureC} °C", 235 + "format": "{icon} {temperatureC} °C" 236 + }, 237 + "cpu": { 238 + "on-click": "foot --title=\"Htop\" --app-id=\"htop\" htop --sort-key=PERCENT_CPU", 239 + "states": { 240 + "warning": 80, 241 + "critical": 95 242 + }, 243 + "format": "󰍛 {usage}󰏰" 244 + }, 245 + "memory": { 246 + "on-click": "foot --title=\"Htop\" --app-id=\"htop\" htop --sort-key=PERCENT_MEM", 247 + "states": { 248 + "warning": 70, 249 + "critical": 90 250 + }, 251 + "format": " {}󰏰 ({used:0.1f}/{total:0.1f} GiB)" 252 + } 253 + } 254 + ]
+107
res/waybar/custom_modules/kdeconnect.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + const BUS_NAME = "org.kde.kdeconnect"; 4 + const PATH_PREFIX = "/modules/kdeconnect"; 5 + const DEVICE_INTERFACE = "org.kde.kdeconnect.device"; 6 + const DAEMON_INTERFACE = "org.kde.kdeconnect.daemon"; 7 + 8 + def dev_path [name: string] { 9 + $"($PATH_PREFIX)/devices/($name)" 10 + } 11 + 12 + def get_device_list [] { 13 + # org.kde.kdeconnect.daemon.devices (bool onlyReachable, bool onlyPaired) 14 + dbus call --session --dest=$BUS_NAME --no-introspect $PATH_PREFIX $DAEMON_INTERFACE devices false true --signature=bb 15 + } 16 + 17 + def device_info [id: string] { 18 + dbus get-all --session --dest=$BUS_NAME (dev_path $id) $DEVICE_INTERFACE 19 + } 20 + 21 + def get_devices [] { 22 + get_device_list | each {|it| device_info $it | insert "id" $it} 23 + } 24 + 25 + def is_reachable [device: record] -> bool { 26 + $device.isReachable? | default false 27 + } 28 + 29 + def supports_battery [device: record] -> bool { 30 + let reachable = is_reachable $device; 31 + let supported = "kdeconnect_battery" in ($device.supportedPlugins? | default []); 32 + let exists = dbus introspect --session --dest=$BUS_NAME (dev_path $device.id) | get -i children | default [] | any {|it| $it.name == "battery"} 33 + 34 + $reachable and $supported and $exists 35 + } 36 + 37 + def get_battery_info [device: record] { 38 + if not (supports_battery $device) { 39 + return null 40 + } 41 + 42 + dbus get-all --session --dest=$BUS_NAME $"(dev_path $device.id)/battery" $"($DEVICE_INTERFACE).battery" 43 + } 44 + 45 + # Everything except phone is a guess here, I don't know 46 + # what the other types are and I can't find any documentation 47 + # on it, we'll just assume laptop for now 48 + const icon_ref = { 49 + phone: [ 50 + "󰄜", 51 + "󱎗", 52 + "󰥍", 53 + ], 54 + desktop: [ 55 + "󰌢", 56 + "󰌢󱐋", 57 + "󰛧", 58 + ], 59 + laptop: [ 60 + "󰌢", 61 + "󰌢󱐋", 62 + "󰛧", 63 + ], 64 + }; 65 + 66 + def main [] { 67 + let devices = get_devices; 68 + 69 + let status = $devices | each {|it| 70 + 71 + let name = $it.name? | default "Unknown Device"; 72 + 73 + let reachable = is_reachable $it; 74 + 75 + let icons = $icon_ref | get -i ($it.type? | default "") | default $icon_ref.phone; 76 + 77 + let battery_info = get_battery_info $it | default { isCharging: false }; 78 + 79 + let icon = $icons | get (if (not $reachable) { 80 + 2 81 + } else { 82 + if ($battery_info.isCharging? | default false) { 83 + 1 84 + } else { 85 + 0 86 + } 87 + }); 88 + 89 + let percent = if $battery_info.charge? != null and $battery_info.charge != -1 { 90 + $" ($battery_info.charge)󰏰" 91 + } else { "" }; 92 + 93 + { 94 + chip: $"($icon)($percent)" 95 + tooltip: $"($icon) ($name) -($percent)" 96 + } 97 + }; 98 + 99 + let output = { 100 + text: ($status | get chip | str join " "), 101 + tooltip: ($status | get tooltip | str join "\n"), 102 + class: "kdeconnect", 103 + }; 104 + 105 + print ($output | to json -r); 106 + } 107 +
+28
res/waybar/custom_modules/newsboat.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + let NB_DB = $"($env.HOME)/.local/share/newsboat/cache.db"; 4 + 5 + let nb_running = (pidof "newsboat" | complete).exit_code == 0; 6 + 7 + let need_cooldown = ((date now) - (ls $NB_DB | first | get modified)) < 1min; 8 + 9 + if (not $need_cooldown and not $nb_running) { 10 + let refreshing = { 11 + text: "󰎕 ", 12 + tooltip: "Newsboat - refreshing", 13 + class: "refreshing", 14 + }; 15 + print ($refreshing | to json -r); 16 + newsboat -x reload | ignore; 17 + } 18 + 19 + # Otherwise newsboat will complain about the database being locked 20 + let unread = open $NB_DB | get rss_item | where unread == 1 | length 21 + 22 + let output = { 23 + text: (if $unread != 0 { $"󰎕 ($unread)" } else { "󰎕" }), 24 + tooltip: $"Newsboat - ($unread) unread (if $unread == 1 { "entry" } else { "entries" })", 25 + class: (if $unread > 0 { "unread" } else { "utd" }), 26 + }; 27 + 28 + print ($output | to json -r);
+185
res/waybar/custom_modules/weather.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + # const WMO_CODE = { 4 + # 0: "Sunny", 5 + # 1: "PartlyCloudy", 6 + # 2: "Cloudy", 7 + # 3: "VeryCloudy", 8 + 9 + # } 10 + 11 + def match_wmo_code [code: int] { 12 + match $code { 13 + 0 => "Sunny", 14 + 1 => "PartlyCloudy", 15 + 2 => "Cloudy", 16 + 3 => "VeryCloudy", 17 + 45 | 48 => "Fog", 18 + 51 | 53 | 61 | 63 => "LightRain", 19 + 55 | 65 => "HeavyRain" 20 + 56 | 66 => "LightSleet", 21 + 57 | 67 => "HeavySleet", 22 + 71 | 73 | 77 => "LightSnow", 23 + 75 => "HeavySnow", 24 + 80 | 81 => "LightShowers", 25 + 82 => "HeavyShowers", 26 + 85 => "LightSnowShowers", 27 + 86 => "HeavySnowShowers", 28 + 95 | 96 | 99 => "ThunderyShowers", 29 + _ => "Unknown" 30 + } 31 + } 32 + 33 + const WWO_CODE = { 34 + "113": "Sunny", 35 + "116": "PartlyCloudy", 36 + "119": "Cloudy", 37 + "122": "VeryCloudy", 38 + "143": "Fog", 39 + "176": "LightShowers", 40 + "179": "LightSleetShowers", 41 + "182": "LightSleet", 42 + "185": "LightSleet", 43 + "200": "ThunderyShowers", 44 + "227": "LightSnow", 45 + "230": "HeavySnow", 46 + "248": "Fog", 47 + "260": "Fog", 48 + "263": "LightShowers", 49 + "266": "LightRain", 50 + "281": "LightSleet", 51 + "284": "LightSleet", 52 + "293": "LightRain", 53 + "296": "LightRain", 54 + "299": "HeavyShowers", 55 + "302": "HeavyRain", 56 + "305": "HeavyShowers", 57 + "308": "HeavyRain", 58 + "311": "LightSleet", 59 + "314": "LightSleet", 60 + "317": "LightSleet", 61 + "320": "LightSnow", 62 + "323": "LightSnowShowers", 63 + "326": "LightSnowShowers", 64 + "329": "HeavySnow", 65 + "332": "HeavySnow", 66 + "335": "HeavySnowShowers", 67 + "338": "HeavySnow", 68 + "350": "LightSleet", 69 + "353": "LightShowers", 70 + "356": "HeavyShowers", 71 + "359": "HeavyRain", 72 + "362": "LightSleetShowers", 73 + "365": "LightSleetShowers", 74 + "368": "LightSnowShowers", 75 + "371": "HeavySnowShowers", 76 + "374": "LightSleetShowers", 77 + "377": "LightSleet", 78 + "386": "ThunderyShowers", 79 + "389": "ThunderyHeavyRain", 80 + "392": "ThunderySnowShowers", 81 + "395": "HeavySnowShowers", 82 + } 83 + 84 + const WEATHER_ICONS = { 85 + "Unknown": "󰨹", 86 + "Cloudy": "󰖐", 87 + "Fog": "󰖑", 88 + "HeavyRain": "󰖖", 89 + "HeavyShowers": "󰖖", 90 + "HeavySnow": "󰼶", 91 + "HeavySnowShowers": "󰙿", 92 + "LightRain": "󰖗", 93 + "LightShowers": "󰖗", 94 + "LightSleet": "󰖒", 95 + "LightSleetShowers": "󰖒", 96 + "LightSnow": "󰖘", 97 + "LightSnowShowers": "󰖘", 98 + "PartlyCloudy": "󰖕", 99 + "Sunny": "󰖙", 100 + "ThunderyHeavyRain": "󰙾", 101 + "ThunderyShowers": "󰙾", 102 + "ThunderySnowShowers": "󰙾", 103 + "VeryCloudy": "󰖐󰖐", 104 + } 105 + 106 + const NIGHT_MAP = {"󰖙": "󰖔", "󰖕": "󰼱"} 107 + 108 + def is_night [astronomy: record] { 109 + let now_utc = date now 110 + 111 + let sunrise = $astronomy.sunrise | into datetime 112 + let sunset = $astronomy.sunset | into datetime 113 + 114 + $now_utc > $sunset or $now_utc < $sunrise 115 + } 116 + 117 + def get_icon [condition: string, is_night: bool] { 118 + let icon = $WEATHER_ICONS | get -i $condition | default $WEATHER_ICONS.Unknown; 119 + 120 + if $is_night { 121 + $NIGHT_MAP | get -i $icon | default $icon 122 + } else { 123 + $icon 124 + } 125 + } 126 + 127 + def error-exit [msg: string] { 128 + let out = { 129 + text: "󰧠", 130 + tooltip: $"Failed to fetch weather:\n($msg)", 131 + class: ["Unknown"] 132 + }; 133 + print ($out | to json -r) 134 + exit 135 + } 136 + 137 + def main [] { 138 + 139 + let raw = try { 140 + http get https://wttr.in/?format=j1&lang=us 141 + } catch { |err| 142 + error-exit $err.msg; 143 + } 144 + 145 + if ($raw | str starts-with "Unknown location;") { 146 + error-exit $raw; 147 + } 148 + 149 + let current_condition = $raw.current_condition.0 150 + let weather = $raw.weather.0 151 + let astronomy = $weather.astronomy.0 152 + let area = $raw.nearest_area.0 153 + 154 + let condition = $WWO_CODE | get -i $current_condition.weatherCode | default "Unknown" 155 + 156 + let night = is_night $astronomy 157 + 158 + let icon = get_icon $condition $night 159 + 160 + let text = $"($icon) ($current_condition.temp_F) °F" 161 + let tooltip = [ 162 + $condition, 163 + $"Temperature: ($current_condition.temp_F) °F", 164 + $"Feels like ($current_condition.FeelsLikeF) °F", 165 + $"High of ($weather.maxtempF) °F / Low of ($weather.mintempF) °F", 166 + $"($current_condition.humidity)% Humidity", 167 + $"($current_condition.pressure) in. Pressure", 168 + $"($current_condition.uvIndex) UV Index", 169 + $"($current_condition.precipInches) in. Precipitation", 170 + $"($current_condition.visibilityMiles) mi. Visibility", 171 + $"($current_condition.windspeedMiles) mph Wind, Going ($current_condition.winddir16Point)", 172 + $"Sunrise: ($astronomy.sunrise) / Sunset: ($astronomy.sunset)", 173 + $"Location: ($area.areaName.0.value), ($area.region.0.value), ($area.country.0.value)", 174 + "Fetched from https://wttr.in" 175 + ] | str join "\n" 176 + 177 + let out = { 178 + text: $text, 179 + tooltip: $tooltip, 180 + class: [$condition, (if $night { "night" } else { "day" })] 181 + } 182 + 183 + print ($out | to json -r) 184 + 185 + }
+283
res/waybar/style.css
··· 1 + * { 2 + font-family: Noto Sans, FiraCode Nerd Font Mono; 3 + } 4 + 5 + window#waybar { 6 + background: rgba(252, 116, 150, 0); 7 + color: #fdf6e3; 8 + } 9 + 10 + .modules-left > * > *, 11 + .modules-right > * > * { 12 + font-size: 1.5rem; 13 + background: rgb(241, 213, 213); 14 + background: linear-gradient( 15 + 180deg, 16 + rgba(34, 34, 34, 0.8) 0%, 17 + rgba(5, 5, 5, 0.7) 100% 18 + ); 19 + border-radius: 5rem; 20 + padding: 5px 15px; 21 + margin: 5px 2px; 22 + } 23 + 24 + #idle_inhibitor, 25 + #custom-notification, 26 + #pulseaudio.muted, 27 + #custom-power-menu, 28 + #custom-kde-connect.disconnected, 29 + #bluetooth.disconnected, 30 + #bluetooth.off, 31 + #bluetooth.disabled { 32 + font-size: 30px; 33 + } 34 + 35 + #waybar .modules-left > *:first-child > * { 36 + margin-left: 25px; 37 + } 38 + 39 + #waybar .modules-right > *:last-child > * { 40 + margin-right: 25px; 41 + } 42 + 43 + #waybar .modules-left, 44 + #waybar .modules-right { 45 + margin-top: 10px; 46 + } 47 + 48 + #waybar .modules-center { 49 + margin-bottom: 10px; 50 + } 51 + 52 + #battery.warning { 53 + background: linear-gradient( 54 + 180deg, 55 + rgb(137, 137, 0) 0%, 56 + rgb(131, 102, 0) 100% 57 + ); 58 + } 59 + 60 + #battery.critical { 61 + background: linear-gradient(180deg, rgb(220, 66, 0) 0%, rgb(110, 0, 0) 100%); 62 + } 63 + 64 + * > #battery.charging { 65 + background: linear-gradient(180deg, rgb(0, 209, 31) 0%, rgb(0, 90, 15) 100%); 66 + } 67 + 68 + #taskbar, 69 + #workspaces { 70 + padding: 10px; 71 + border-radius: 5rem; 72 + background: linear-gradient( 73 + 180deg, 74 + rgba(85, 85, 85, 0.8) 0%, 75 + rgba(60, 60, 60, 0.7) 100% 76 + ); 77 + } 78 + 79 + #workspaces { 80 + margin-bottom: 15px; 81 + } 82 + 83 + #taskbar button, 84 + #workspaces button { 85 + color: #fdf6e3; 86 + border-radius: 5rem; 87 + padding: 10px 15px; 88 + margin: 0 5px; 89 + background: linear-gradient( 90 + 180deg, 91 + rgba(34, 34, 34, 0.8) 0%, 92 + rgba(5, 5, 5, 0.7) 100% 93 + ); 94 + } 95 + 96 + #workspaces button { 97 + font-size: 1.5rem; 98 + } 99 + 100 + #cpu, 101 + #memory, 102 + #temperature { 103 + font-size: 1.5rem; 104 + padding: 5px 25px; 105 + margin-bottom: 25px; 106 + } 107 + 108 + #cpu.warning, 109 + #memory.warning { 110 + background: linear-gradient( 111 + 180deg, 112 + rgb(137, 137, 0) 0%, 113 + rgb(131, 102, 0) 100% 114 + ); 115 + } 116 + 117 + #cpu.critical, 118 + #memory.critical, 119 + #temperature.critical { 120 + background: linear-gradient( 121 + 180deg, 122 + rgb(220, 66, 0) 0%, 123 + rgb(110, 0, 0) 100% 124 + ); 125 + } 126 + 127 + #workspaces button.active { 128 + background: linear-gradient( 129 + 180deg, 130 + rgb(0, 209, 209) 0%, 131 + rgb(0, 60, 164) 100% 132 + ); 133 + } 134 + 135 + #taskbar button.active { 136 + border: 2px solid rgb(0, 209, 209); 137 + } 138 + 139 + #idle_inhibitor.activated { 140 + background: linear-gradient( 141 + 180deg, 142 + rgb(202, 0, 209) 0%, 143 + rgb(131, 0, 164) 100% 144 + ); 145 + } 146 + 147 + #custom-notification.notification { 148 + background: linear-gradient( 149 + 180deg, 150 + rgb(0, 209, 209) 0%, 151 + rgb(0, 60, 164) 100% 152 + ); 153 + } 154 + 155 + #custom-notification.dnd-none, 156 + #custom-notification.dnd-notification, 157 + #custom-notification.dnd-inhibited-none, 158 + #custom-notification.dnd-inhibited-notification { 159 + background: linear-gradient(180deg, rgb(220, 66, 0) 0%, rgb(110, 0, 0) 100%); 160 + } 161 + 162 + #custom-notification.inhibited-none, 163 + #custom-notification.inhibited-notification { 164 + background: linear-gradient( 165 + 180deg, 166 + rgb(202, 0, 209) 0%, 167 + rgb(110, 0, 138) 100% 168 + ); 169 + } 170 + 171 + #network.disconnected { 172 + background: linear-gradient(180deg, rgb(220, 66, 0) 0%, rgb(110, 0, 0) 100%); 173 + } 174 + 175 + #privacy { 176 + background: none; 177 + margin: 0; 178 + padding: 0; 179 + } 180 + 181 + #privacy-item { 182 + font-size: 1.5rem; 183 + border-radius: 5rem; 184 + padding: 5px 15px; 185 + margin: 5px 2px; 186 + background: linear-gradient(180deg, rgb(220, 66, 0) 0%, rgb(110, 0, 0) 100%); 187 + } 188 + 189 + #custom-weather.VeryCloudy, 190 + #custom-weather.Cloudy, 191 + #custom-weather.Fog { 192 + background: linear-gradient( 193 + 180deg, 194 + rgb(110, 110, 110) 0%, 195 + rgb(62, 62, 62) 100% 196 + ); 197 + } 198 + 199 + #custom-weather.HeavyRain, 200 + #custom-weather.ThunderyHeavyRain, 201 + #custom-weather.ThunderyRain, 202 + #custom-weather.ThunderyShowers, 203 + #custom-weather.HeavyShowers, 204 + #custom-weather.LightRain, 205 + #custom-weather.LightShowers { 206 + background: linear-gradient( 207 + 180deg, 208 + rgb(0, 209, 209) 0%, 209 + rgb(129, 157, 207) 100% 210 + ); 211 + } 212 + 213 + #custom-weather.HeavySnow, 214 + #custom-weather.LightSnow, 215 + #custom-weather.Sleet, 216 + #custom-weather.Snow, 217 + #custom-weather.LightSnowShowers, 218 + #custom-weather.LightSleetShowers { 219 + background: linear-gradient( 220 + 180deg, 221 + rgb(255, 255, 255) 0%, 222 + rgb(160, 160, 160) 100% 223 + ); 224 + color: #242424; 225 + } 226 + 227 + #custom-weather.Clear, 228 + #custom-weather.Sunny { 229 + background: linear-gradient( 230 + 180deg, 231 + rgb(187, 187, 0) 0%, 232 + rgb(158, 124, 0) 100% 233 + ); 234 + } 235 + 236 + #custom-weather.Clear.night, 237 + #custom-weather.Sunny.night { 238 + background: linear-gradient( 239 + 180deg, 240 + rgb(103, 52, 131) 0%, 241 + rgb(58, 29, 74) 100% 242 + ); 243 + } 244 + 245 + #custom-weather.PartlyCloudy { 246 + background: linear-gradient( 247 + 180deg, 248 + rgb(130, 128, 92) 0%, 249 + rgb(77, 75, 53) 100% 250 + ); 251 + } 252 + 253 + #custom-weather.PartlyCloudy.night { 254 + background: linear-gradient( 255 + 180deg, 256 + rgb(117, 95, 129) 0%, 257 + rgb(72, 58, 79) 100% 258 + ); 259 + } 260 + 261 + #custom-news.utd { 262 + font-size: 1.5rem; 263 + } 264 + 265 + #custom-news.unread { 266 + background: linear-gradient( 267 + 180deg, 268 + rgb(0, 209, 209) 0%, 269 + rgb(0, 60, 164) 100% 270 + ); 271 + } 272 + 273 + #mpris.playing { 274 + background: linear-gradient( 275 + 180deg, 276 + rgb(0, 209, 209) 0%, 277 + rgb(0, 60, 164) 100% 278 + ); 279 + } 280 + 281 + #mpris.paused.kdeconnect { 282 + opacity: 0; 283 + }
+1
result
··· 1 + /nix/store/b1cqrb31h6lrp57c9xc1pj1mhipwd9zh-nixos-sd-image-25.05.20241119.23e89b7-aarch64-linux.img
+136
roles/dev+graphics/code.nix
··· 1 + {pkgs, ...}: { 2 + home-manager.users.bean.programs.vscode = { 3 + enable = true; 4 + enableUpdateCheck = false; 5 + enableExtensionUpdateCheck = false; 6 + mutableExtensionsDir = false; 7 + package = pkgs.vscodium; 8 + 9 + extensions = with pkgs.vscode-extensions; [ 10 + # Theme 11 + zhuangtongfa.material-theme 12 + pkief.material-icon-theme 13 + 14 + # Nix 15 + bbenoist.nix 16 + kamadorueda.alejandra 17 + 18 + # Markdown 19 + yzhang.markdown-all-in-one 20 + bierner.markdown-mermaid 21 + davidanson.vscode-markdownlint 22 + 23 + # Rust 24 + rust-lang.rust-analyzer 25 + tamasfe.even-better-toml 26 + 27 + # C / C++ 28 + ms-vscode.cpptools 29 + twxs.cmake 30 + 31 + # Java 32 + redhat.java 33 + 34 + # Typescript / Javascript 35 + denoland.vscode-deno 36 + yoavbls.pretty-ts-errors 37 + dbaeumer.vscode-eslint 38 + esbenp.prettier-vscode 39 + 40 + # Astro 41 + astro-build.astro-vscode 42 + unifiedjs.vscode-mdx 43 + 44 + # Misc. Web 45 + bradlc.vscode-tailwindcss 46 + 47 + # .NET 48 + ms-dotnettools.csharp 49 + ms-dotnettools.vscode-dotnet-runtime 50 + 51 + # Python 52 + ms-python.python 53 + ms-python.vscode-pylance 54 + ms-python.black-formatter 55 + wholroyd.jinja 56 + 57 + # XML 58 + redhat.vscode-xml 59 + 60 + # Spelling / Grammar 61 + yzhang.dictionary-completion 62 + tekumara.typos-vscode 63 + 64 + # GitHub 65 + github.vscode-pull-request-github 66 + github.vscode-github-actions 67 + 68 + # Misc. 69 + skellock.just 70 + thenuprojectcontributors.vscode-nushell-lang 71 + fill-labs.dependi 72 + zhwu95.riscv 73 + redhat.vscode-yaml 74 + ms-vsliveshare.vsliveshare 75 + leonardssh.vscord 76 + ]; 77 + 78 + userSettings = { 79 + "window.zoomLevel" = 2; 80 + "telemetry.telemetryLevel" = "off"; 81 + "update.mode" = "manual"; 82 + "update.showReleaseNotes" = false; 83 + "editor.fontFamily" = "monospace"; 84 + "editor.detectIndentation" = true; 85 + "editor.multiCursorModifier" = "ctrlCmd"; 86 + "editor.minimap.enabled" = false; 87 + "editor.fontSize" = 16; 88 + "terminal.integrated.fontSize" = 16; 89 + "workbench.colorTheme" = "One Dark Pro Darker"; 90 + "workbench.startupEditor" = "none"; 91 + "workbench.welcomePage.walkthroughs.openOnInstall" = false; 92 + "workbench.iconTheme" = "material-icon-theme"; 93 + "terminal.integrated.fontFamily" = "monospace"; 94 + "terminal.integrated.smoothScrolling" = true; 95 + "explorer.compactFolders" = false; 96 + "explorer.confirmDelete" = false; 97 + "explorer.confirmDragAndDrop" = false; 98 + "git.openRepositoryInParentFolders" = "never"; 99 + "extensions.autoUpdate" = false; 100 + "extensions.ignoreRecommendations" = true; 101 + "javascript.updateImportsOnFileMove.enabled" = "always"; 102 + "typescript.updateImportsOnFileMove.enabled" = "always"; 103 + "githubPullRequests.pullBranch" = "never"; 104 + "vscord.app.name" = "Visual Studio Code"; 105 + "vscord.status.idle.disconnectOnIdle" = true; 106 + "vscord.behaviour.suppressNotifications" = true; 107 + "material-icon-theme.folders.color" = "#546E7B"; 108 + "redhat.telemetry.enabled" = false; 109 + "rust-analyzer.server.path" = "${pkgs.rust-analyzer}/bin/rust-analyzer"; 110 + "prettier.prettierPath" = "${pkgs.nodePackages.prettier}/lib/node_modules/prettier"; 111 + "rust-analyzer.cargo.allTargets" = false; 112 + "rust-analyzer.hover.actions.references.enable" = true; 113 + "dotnetAcquisitionExtension.enableTelemetry" = false; 114 + 115 + "[json][yaml][javascript][typescript][javascriptreact][typescriptreact][css][scss][less][tailwindcss][html][astro]" = { 116 + "editor.defaultFormatter" = "esbenp.prettier-vscode"; 117 + }; 118 + 119 + "[python]" = { 120 + "editor.defaultFormatter" = "ms-python.black-formatter"; 121 + }; 122 + 123 + "[rust]" = { 124 + "editor.defaultFormatter" = "rust-lang.rust-analyzer"; 125 + }; 126 + 127 + "[nix]" = { 128 + "editor.defaultFormatter" = "kamadorueda.alejandra"; 129 + }; 130 + 131 + "[markdown]" = { 132 + "editor.defaultFormatter" = "DavidAnson.vscode-markdownlint"; 133 + }; 134 + }; 135 + }; 136 + }
+5
roles/dev+graphics/misc.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + github-desktop 4 + ]; 5 + }
+8
roles/dev/dotnet.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + dotnet-sdk 4 + dotnet-runtime 5 + dotnetPackages.Nuget 6 + mono 7 + ]; 8 + }
+18
roles/dev/git.nix
··· 1 + {pkgs, ...}: { 2 + programs.git = { 3 + enable = true; 4 + config = { 5 + init.defaultBranch = "main"; 6 + commit.gpgSign = true; 7 + user = { 8 + email = "bwc9876@gmail.com"; 9 + name = "Ben C"; 10 + signingKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKsVzdJra+x5aEuwTjL1FBOiMh9bftvs8QwsM1xyEbdd"; 11 + }; 12 + advice = { 13 + addIgnoredFile = false; 14 + }; 15 + gpg.format = "ssh"; 16 + }; 17 + }; 18 + }
+8
roles/dev/js.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + nodejs 4 + nodePackages.pnpm 5 + yarn 6 + deno 7 + ]; 8 + }
+27
roles/dev/misc.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + # Build Tools 4 + pkg-config 5 + gnumake 6 + 7 + # Java 8 + jdk 9 + 10 + # Math 11 + libqalculate 12 + 13 + # C/C++ 14 + gcc 15 + 16 + # Android 17 + android-tools 18 + 19 + # Debug 20 + wev 21 + ]; 22 + 23 + programs.wireshark = { 24 + enable = true; 25 + package = pkgs.wireshark; 26 + }; 27 + }
+5
roles/dev/nix.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + alejandra 4 + ]; 5 + }
+9
roles/dev/python.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + python3 4 + python311Packages.django 5 + poetry 6 + pipenv 7 + black 8 + ]; 9 + }
+20
roles/dev/rust.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + (rust-bin.selectLatestNightlyWith (toolchain: 4 + toolchain.default.override { 5 + targets = ["wasm32-unknown-unknown"]; 6 + })) 7 + cargo-tauri 8 + mprocs 9 + evcxr 10 + ]; 11 + 12 + # Use mold for linking Rust code 13 + home-manager.users.bean.home.file.".cargo/config.toml".text = '' 14 + [target.x86_64-unknown-linux-gnu] 15 + linker = "${pkgs.clang}/bin/clang" 16 + rustflags = [ 17 + "-C", "link-arg=--ld-path=${pkgs.mold}/bin/mold", 18 + ] 19 + ''; 20 + }
+12
roles/fun+graphics.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + xcowsay 4 + tuxpaint 5 + ]; 6 + 7 + home-manager.users.bean.home.file."tuxpaintrc".text = '' 8 + fullscreen=native 9 + startblank=yes 10 + autosave=yes 11 + ''; 12 + }
+16
roles/fun.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + environment.systemPackages = with pkgs; [ 7 + hyfetch 8 + lolcat 9 + cowsay 10 + toilet 11 + gay 12 + pipes-rs 13 + ]; 14 + 15 + home-manager.users.bean.xdg.configFile."hyfetch.json".source = "${inputs.self}/res/hyfetch.json"; 16 + }
+18
roles/games+graphics.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + programs.steam = { 7 + enable = true; 8 + remotePlay.openFirewall = true; 9 + dedicatedServer.openFirewall = true; 10 + }; 11 + 12 + environment.systemPackages = with pkgs; [ 13 + prismlauncher 14 + ace-of-penguins 15 + inputs.ow-mod-man.packages.${system}.owmods-gui 16 + libsForQt5.kmousetool 17 + ]; 18 + }
+19
roles/graphics/apps.nix
··· 1 + {pkgs, ...}: { 2 + environment.systemPackages = with pkgs; [ 3 + chromium 4 + 5 + ## Media 6 + libsForQt5.kdenlive 7 + obs-studio 8 + qmplay2 9 + gimp 10 + inkscape 11 + lorien 12 + 13 + ## 3D 14 + prusa-slicer 15 + 16 + ## Music 17 + spotify 18 + ]; 19 + }
+15
roles/graphics/audio.nix
··· 1 + {...}: { 2 + # When squint and don't think about it, audio is graphics 3 + hardware.pulseaudio.enable = false; 4 + 5 + security.rtkit.enable = true; # Allows pipewire and friends to run realtime 6 + 7 + services.pipewire = { 8 + enable = true; 9 + alsa = { 10 + enable = true; 11 + support32Bit = true; 12 + }; 13 + pulse.enable = true; 14 + }; 15 + }
+225
roles/graphics/firefox.nix
··· 1 + { 2 + pkgs, 3 + lib, 4 + ... 5 + }: { 6 + programs.firefox = { 7 + enable = true; 8 + package = pkgs.firefox-devedition; 9 + wrapperConfig = { 10 + pipeWireSupport = true; 11 + }; 12 + policies = { 13 + DisableTelemetry = true; 14 + DisableFirefoxStudies = true; 15 + DisableSetDesktopBackground = true; 16 + DontCheckDefaultBrowser = true; 17 + AppAutoUpdate = false; 18 + DNSOverHTTPS.Enabled = true; 19 + ShowHomeButton = true; 20 + DisplayBookmarksToolbar = "always"; 21 + DisableProfileImport = true; 22 + DisablePocket = true; 23 + DisableFirefoxAccounts = true; 24 + OfferToSaveLoginsDefault = false; 25 + OverrideFirstRunPage = ""; 26 + NoDefaultBookmarks = true; 27 + PasswordManagerEnabled = false; 28 + SearchBar = "unified"; 29 + EncryptedMediaExtensions = true; 30 + 31 + EnableTrackingProtection = { 32 + Value = true; 33 + Locked = true; 34 + Cryptomining = true; 35 + Fingerprinting = true; 36 + EmailTracking = true; 37 + }; 38 + 39 + Preferences = let 40 + lock = val: { 41 + Value = val; 42 + Status = "locked"; 43 + }; 44 + in { 45 + # General 46 + "browser.aboutConfig.showWarning" = lock false; 47 + "media.eme.enabled" = lock true; # Encrypted Media Extensions (DRM) 48 + "layout.css.prefers-color-scheme.content-override" = lock 0; 49 + "browser.startup.page" = 3; # Restore previous session 50 + "toolkit.telemetry.server" = lock ""; 51 + 52 + # New Tab 53 + "browser.newtabpage.activity-stream.showSponsored" = lock false; 54 + "browser.newtabpage.activity-stream.system.showSponsored" = lock false; 55 + "browser.newtabpage.activity-stream.feeds.section.topstories" = lock false; 56 + "browser.newtabpage.activity-stream.feeds.topsites" = lock false; 57 + "browser.newtabpage.activity-stream.showSponsoredTopSites" = lock false; 58 + "browser.newtabpage.activity-stream.showWeather" = lock false; 59 + "browser.newtabpage.activity-stream.system.showWeather" = lock false; 60 + "browser.newtabpage.activity-stream.feeds.weatherfeed" = lock false; 61 + "browser.newtabpage.activity-stream.feeds.telemetry" = lock false; 62 + "browser.newtabpage.activity-stream.telemetry" = lock false; 63 + "browser.newtabpage.activity-stream.telemetry.structuredIngestion.endpoint" = lock ""; 64 + "browser.newtabpage.pinned" = lock []; 65 + "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.havePinned" = lock ""; 66 + "browser.urlbar.suggest.weather" = lock false; 67 + "browser.urlbar.quicksuggest.scenario" = lock "offline"; 68 + "browser.urlbar.suggest.quicksuggest.nonsponsored" = lock false; 69 + "browser.urlbar.suggest.quicksuggest.sponsored" = lock false; 70 + 71 + # Devtools 72 + "devtools.theme" = lock "dark"; 73 + "devtools.dom.enabled" = lock true; 74 + "devtools.command-button-rulers.enabled" = lock true; 75 + "devtools.command-button-measure.enabled" = lock true; 76 + "devtools.command-button-screenshot.enabled" = lock true; 77 + "devtools.toolbox.host" = lock "right"; 78 + "devtools.webconsole.persistlog" = lock true; 79 + "devtools.webconsole.timestampMessages" = lock true; 80 + 81 + # Privacy 82 + "dom.private-attribution.submission.enabled" = lock false; 83 + "privacy.globalprivacycontrol.enabled" = lock true; 84 + }; 85 + 86 + Containers = { 87 + Testing = { 88 + name = "Testing 1"; 89 + icon = "pet"; 90 + color = "purple"; 91 + }; 92 + Testing2 = { 93 + name = "Testing 2"; 94 + icon = "pet"; 95 + color = "green"; 96 + }; 97 + }; 98 + 99 + Extensions.Install = map (x: "https://addons.mozilla.org/firefox/downloads/latest/${x}/latest.xpi") [ 100 + # Appearance 101 + "nicothin-space" 102 + "darkreader" 103 + "material-icons-for-github" 104 + "refined-github-" 105 + 106 + # Security / Privacy 107 + "privacy-badger17" 108 + "decentraleyes" 109 + "canvasblocker" 110 + "facebook-container" 111 + 112 + ## Ads / Youtube 113 + "adnauseam" 114 + "sponsorblock" 115 + "youtube-shorts-block" 116 + "dearrow" 117 + 118 + # Information 119 + "flagfox" 120 + "awesome-rss" 121 + 122 + # Devtools 123 + "react-devtools" 124 + "open-graph-preview-and-debug" 125 + "wave-accessibility-tool" 126 + "styl-us" 127 + 128 + # Misc 129 + "plasma-integration" # integration with MPRIS & KDE Connect 130 + "keepassxc-browser" # integration with KeepassXC 131 + ]; 132 + 133 + ExtensionSettings."*" = { 134 + default_area = "menupanel"; 135 + }; 136 + }; 137 + }; 138 + 139 + home-manager.users.bean.programs.firefox = { 140 + enable = true; 141 + package = pkgs.firefox-devedition; 142 + profiles.dev-edition-default.search = { 143 + force = true; 144 + default = "DuckDuckGo"; 145 + engines = let 146 + mkEngineForceFavicon = aliases: queryUrl: iconUrl: { 147 + definedAliases = aliases; 148 + iconUpdateURL = iconUrl; 149 + urls = [{template = queryUrl;}]; 150 + }; 151 + mkEngine = aliases: queryUrl: iconExt: ( 152 + mkEngineForceFavicon aliases queryUrl (let 153 + noPath = 154 + lib.strings.concatStrings 155 + ( 156 + lib.strings.intersperse "/" 157 + ( 158 + lib.lists.take 3 159 + (lib.strings.splitString "/" queryUrl) 160 + ) 161 + ); 162 + in "${noPath}/favicon.${iconExt}") 163 + ); 164 + in { 165 + # Dev 166 + "GitHub Repos" = mkEngineForceFavicon ["@gh" "@github"] "https://github.com/search?type=repositories&q={searchTerms}" "https://github.githubassets.com/favicons/favicon-dark.svg"; 167 + "SourceGraph" = mkEngine ["@sg" "@sourcegraph"] "https://sourcegraph.com/search?q={searchTerms}" "png"; 168 + 169 + ## Web 170 + "MDN Web Docs" = mkEngine ["@mdn"] "https://developer.mozilla.org/en-US/search?q={searchTerms}" "ico"; 171 + "Web.Dev" = mkEngineForceFavicon ["@webdev" "@lighthouse"] "https://web.dev/s/results?q={searchTerms}" "https://www.gstatic.com/devrel-devsite/prod/vc7080045e84cd2ce1faf7f7a3876037748d52d088e5100df2e949d051a784791/web/images/favicon.png"; 172 + "Can I Use" = mkEngineForceFavicon ["@ciu" "@baseline"] "https://caniuse.com/?search={searchTerms}" "https://caniuse.com/img/favicon-128.png"; 173 + "NPM" = mkEngineForceFavicon ["@npm"] "https://www.npmjs.com/search?q={searchTerms}" "https://static-production.npmjs.com/3dc95981de4241b35cd55fe126ab6b2c.png"; 174 + "Iconify" = mkEngine ["@iconify" "@icons"] "https://icon-sets.iconify.design/?query={searchTerms}" "ico"; 175 + "Astro" = mkEngineForceFavicon ["@astro"] "https://a.stro.cc/{searchTerms}" "https://docs.astro.build/favicon.svg"; 176 + "Porkbun" = mkEngine ["@porkbun"] "https://porkbun.com/checkout/search?q={searchTerms}" "ico"; 177 + "Http.Cat" = mkEngine ["@cat" "@hcat" "@httpcat"] "https://http.cat/{searchTerms}" "ico"; 178 + 179 + ## Rust 180 + "Crates.io" = mkEngine ["@crates" "@cratesio" "@cargo"] "https://crates.io/search?q={searchTerms}" "ico"; 181 + "Rust Docs" = mkEngineForceFavicon ["@rust" "@rustdocs" "@ruststd"] "https://doc.rust-lang.org/std/index.html?search={searchTerms}" "https://doc.rust-lang.org/static.files/favicon-2c020d218678b618.svg"; 182 + "Docsrs" = mkEngine ["@docsrs"] "https://docs.rs/releases/search?query={searchTerms}" "ico"; 183 + 184 + ## Python 185 + "PyPI" = mkEngineForceFavicon ["@pypi" "@pip"] "https://pypi.org/search/?q={searchTerms}" "https://pypi.org/static/images/favicon.35549fe8.ico"; 186 + 187 + ## .NET 188 + "NuGet" = mkEngine ["@nuget"] "https://www.nuget.org/packages?q={searchTerms}" "ico"; 189 + 190 + ## Linux Stuff 191 + "Kernel Docs" = mkEngine ["@lnx" "@linux" "@kernel"] "https://www.kernel.org/doc/html/latest/search.html?q={searchTerms}" "ico"; 192 + "Arch Wiki" = mkEngine ["@aw" "@arch"] "https://wiki.archlinux.org/index.php?title=Special%3ASearch&search={searchTerms}" "ico"; 193 + "Nerd Fonts" = mkEngineForceFavicon ["@nf" "@nerdfonts"] "https://www.nerdfonts.com/cheat-sheet?q={searchTerms}" "https://www.nerdfonts.com/assets/img/favicon.ico"; 194 + 195 + ### Nix 196 + "Nix Packages" = mkEngine ["@nixpkgs"] "https://search.nixos.org/packages?channel=unstable&size=500&query={searchTerms}" "png"; 197 + "NixOS Options" = mkEngine ["@nixos"] "https://search.nixos.org/options?channel=unstable&size=500&query={searchTerms}" "png"; 198 + "NixOS Wiki" = mkEngine ["@nixwiki"] "https://nixos.wiki/index.php?search={searchTerms}" "png"; 199 + "Home Manager Options" = mkEngineForceFavicon ["@hm"] "https://home-manager-options.extranix.com/?release=master&query={searchTerms}" "https://home-manager-options.extranix.com/images/favicon.png"; 200 + "Noogle" = mkEngine ["@noogle" "@nixlib"] "https://noogle.dev/q?limit=100&term={searchTerms}" "png"; 201 + "SourceGraph Nix" = mkEngine ["@sgn" "@yoink"] "https://sourcegraph.com/search?q=lang:Nix+-repo:NixOS/*+-repo:nix-community/*+{searchTerms}" "png"; 202 + "Nixpkgs Issues" = mkEngineForceFavicon ["@nixissues"] "https://github.com/NixOS/nixpkgs/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen+{searchTerms}" "https://github.githubassets.com/favicons/favicon-dark.svg"; 203 + 204 + # Media 205 + "YouTube" = mkEngine ["@yt"] "https://www.youtube.com/results?search_query={searchTerms}" "ico"; 206 + "Spotify" = mkEngineForceFavicon ["@sp" "@spotify"] "https://open.spotify.com/search/{searchTerms}" "https://open.spotifycdn.com/cdn/images/favicon16.1c487bff.png"; 207 + "Netflix" = mkEngine ["@nfx"] "https://www.netflix.com/search?q={searchTerms}" "ico"; 208 + "IMDb" = mkEngine ["@imdb"] "https://www.imdb.com/find?q={searchTerms}" "ico"; 209 + 210 + # Misc 211 + "Firefox Add-ons" = mkEngine ["@addons"] "https://addons.mozilla.org/en-US/firefox/search/?q={searchTerms}" "ico"; 212 + "Urban Dictionary" = mkEngine ["@ud" "@urban"] "https://www.urbandictionary.com/define.php?term={searchTerms}" "ico"; 213 + 214 + # Overrides 215 + "History".metaData.alias = "@h"; 216 + "Bookmarks".metaData.alias = "@b"; 217 + "Tabs".metaData.alias = "@t"; 218 + "Bing".metaData.hidden = true; 219 + "Amazon.com".metaData.alias = "@amz"; 220 + "Google".metaData.alias = "@g"; 221 + "Wikipedia (en)".metaData.alias = "@w"; 222 + }; 223 + }; 224 + }; 225 + }
+50
roles/graphics/foot.nix
··· 1 + {...}: let 2 + fontSize = "18"; 3 + in { 4 + programs.foot = { 5 + enable = true; 6 + settings = { 7 + main = { 8 + title = "Terminal (Foot)"; 9 + term = "xterm-256color"; 10 + font = "monospace:size=${fontSize}"; 11 + }; 12 + bell = { 13 + visual = true; 14 + }; 15 + cursor = { 16 + style = "beam"; 17 + blink = true; 18 + }; 19 + colors = { 20 + alpha = "0.8"; 21 + background = "101013"; 22 + foreground = "fcfcfc"; 23 + regular0 = "444a4c"; 24 + bright0 = "565f61"; 25 + dim0 = "303536"; 26 + regular1 = "ed254e"; 27 + bright1 = "f04265"; 28 + dim1 = "d91239"; 29 + regular2 = "71f79f"; 30 + bright2 = "9af9bb"; 31 + dim2 = "4df587"; 32 + regular3 = "fadd00"; 33 + bright3 = "ffe629"; 34 + dim3 = "d1b900"; 35 + regular4 = "0072ff"; 36 + bright4 = "2989ff"; 37 + dim4 = "0060d6"; 38 + regular5 = "d400dc"; 39 + bright5 = "f70aff"; 40 + dim5 = "ad00b3"; 41 + regular6 = "00c1e4"; 42 + bright6 = "0fdbff"; 43 + dim6 = "00a0bd"; 44 + regular7 = "fcfcfc"; 45 + bright7 = "ffffff"; 46 + dim7 = "e8e8e8"; 47 + }; 48 + }; 49 + }; 50 + }
+18
roles/graphics/greeter.nix
··· 1 + { 2 + pkgs, 3 + config, 4 + lib, 5 + ... 6 + }: { 7 + services.greetd = { 8 + enable = true; 9 + settings = { 10 + default_session = let 11 + greeting = ''--greeting "Authenticate into ${lib.toUpper config.networking.hostName}"''; 12 + cmd = ''--cmd "systemd-inhibit --what=handle-power-key:handle-lid-switch Hyprland"''; 13 + in { 14 + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --remember --time ${greeting} ${cmd}"; 15 + }; 16 + }; 17 + }; 18 + }
+123
roles/graphics/hypr.nix
··· 1 + { 2 + lib, 3 + hostName, 4 + system, 5 + inputs, 6 + pkgs, 7 + ... 8 + }: let 9 + in { 10 + home-manager.users.bean = { 11 + wayland.windowManager.hyprland = { 12 + enable = true; 13 + package = pkgs.hyprland; 14 + systemd.variables = ["--all"]; 15 + extraConfig = '' 16 + bind = SUPER,M,submap,passthru 17 + submap = passthru 18 + bind = SUPER,ESCAPE,submap,reset 19 + submap = reset 20 + ''; 21 + settings = { 22 + autogenerated = 0; 23 + monitor = [ 24 + "HDMI-A-1,1920x1080,0x0,1" 25 + "DVI-D-1,1920x1080,1920x0,1" 26 + "eDP-1,2256x1504,0x0,1,bitdepth,10" 27 + ",highres,auto,1" 28 + ]; 29 + general = { 30 + border_size = 2; 31 + resize_on_border = true; 32 + "col.active_border" = "rgb(ff0000) rgb(ff9a00) rgb(d0de21) rgb(4fdc4a) rgb(3fdad8) rgb(2fc9e2) rgb(1c7fee) rgb(5f15f2) rgb(ba0cf8) rgb(fb07d9) 45deg"; 33 + }; 34 + decoration = { 35 + rounding = 10; 36 + }; 37 + input = { 38 + numlock_by_default = true; 39 + touchpad = { 40 + natural_scroll = true; 41 + }; 42 + }; 43 + gestures = { 44 + workspace_swipe = true; 45 + }; 46 + xwayland = { 47 + force_zero_scaling = true; 48 + }; 49 + # debug = { 50 + # disable_logs = false; 51 + # }; 52 + misc = { 53 + enable_swallow = true; 54 + # swallow_regex = "^(foot)$"; 55 + disable_hyprland_logo = true; 56 + disable_splash_rendering = true; 57 + focus_on_activate = true; 58 + mouse_move_enables_dpms = true; 59 + key_press_enables_dpms = true; 60 + }; 61 + env = [ 62 + "TERMINAL,foot" 63 + ]; 64 + windowrulev2 = [ 65 + "workspace 1 silent,class:(.*)vesktop(.*),title:(.*)[Vv]esktop(.*)" 66 + "idleinhibit fullscreen,class:(.*),title:(.*)" 67 + ]; 68 + submap = "reset"; 69 + bind = let 70 + openTerminal = "foot"; 71 + forEachWorkspace = { 72 + mod, 73 + dispatch, 74 + }: 75 + builtins.genList (i: let 76 + num = builtins.toString i; 77 + in "${mod},${num},${dispatch},${ 78 + if num == "0" 79 + then "10" 80 + else num 81 + }") 82 + 10; 83 + in 84 + [ 85 + "SUPER,M,submap,passthru" 86 + "SUPER,Q,exec,firefox-devedition" 87 + "SUPER,Z,exec,systemctl suspend" 88 + ",XF86AudioMedia,exec,${openTerminal}" 89 + "SUPER,T,exec,${openTerminal}" 90 + "SUPER ALT CTRL SHIFT,L,exec,xdg-open https://linkedin.com" 91 + "SUPER,C,killactive," 92 + "SUPER SHIFT,D,exec,code" 93 + "SUPER,P,pseudo," 94 + "SUPER,R,togglefloating," 95 + "SUPER,F,fullscreen,1" 96 + "SUPER SHIFT,F,fullscreen,0" 97 + "SUPER,J,togglesplit," 98 + "SUPER,left,movefocus,l" 99 + "SUPER,right,movefocus,r" 100 + "SUPER,up,movefocus,u" 101 + "SUPER,down,movefocus,d" 102 + "SUPER,G,togglegroup" 103 + "SUPER SHIFT,G,lockactivegroup, toggle" 104 + "SUPER,TAB,changegroupactive" 105 + "SUPER SHIFT,TAB,changegroupactive,b" 106 + ",XF86RFKill,exec,rfkill toggle wifi" 107 + ] 108 + ++ forEachWorkspace { 109 + mod = "SUPER"; 110 + dispatch = "workspace"; 111 + } 112 + ++ forEachWorkspace { 113 + mod = "SUPER SHIFT"; 114 + dispatch = "movetoworkspace"; 115 + }; 116 + bindm = [ 117 + "SUPER,mouse:272,movewindow" 118 + "SUPER,mouse:273,resizewindow" 119 + ]; 120 + }; 121 + }; 122 + }; 123 + }
+50
roles/graphics/idle.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + config, 5 + target, 6 + ... 7 + }: let 8 + sunsetCmd = "${pkgs.wlsunset}/bin/wlsunset -S 6:00 -s 22:00"; 9 + screenOffCmd = "hyprctl dispatch dpms off; ${pkgs.swaynotificationcenter}/bin/swaync-client --inhibitor-add \"timeout\"; pkill wlsunset;"; 10 + screenOnCmd = "hyprctl dispatch dpms on; ${pkgs.swaynotificationcenter}/bin/swaync-client --inhibitor-remove \"timeout\"; ${sunsetCmd};"; 11 + in { 12 + home-manager.users.bean = { 13 + wayland.windowManager.hyprland.settings = { 14 + exec-once = [ 15 + sunsetCmd 16 + ''${inputs.wayland-mpris-idle-inhibit.packages.${target}.default}/bin/wayland-mpris-idle-inhibit --ignore "kdeconnect" --ignore "playerctld"'' 17 + ]; 18 + 19 + bindl = [ 20 + ",switch:on:Lid Switch,exec,${screenOffCmd}" 21 + ",switch:off:Lid Switch,exec,${screenOnCmd}" 22 + ]; 23 + }; 24 + 25 + xdg.configFile."hypr/hypridle.conf".text = '' 26 + general { 27 + lock_cmd = pidof hyprlock || hyprlock 28 + unlock_cmd = pkill hyprlock --signal SIGUSR1 29 + before_sleep_cmd = loginctl lock-session 30 + after_sleep_cmd = hyprctl dispatch dpms on 31 + } 32 + 33 + listener { 34 + timeout = 120 35 + on-timeout = loginctl lock-session 36 + } 37 + 38 + listener { 39 + timeout = 300 40 + on-timeout = ${screenOffCmd} 41 + on-resume = ${screenOnCmd} 42 + } 43 + 44 + listener { 45 + timeout = 600 46 + on-timeout = systemctl suspend 47 + } 48 + ''; 49 + }; 50 + }
+107
roles/graphics/lock.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + home-manager.users.bean = { 7 + wayland.windowManager.hyprland.settings = { 8 + bind = [ 9 + "SUPER,L,exec,pidof hyprlock || hyprlock --immediate" 10 + ]; 11 + }; 12 + 13 + xdg.configFile."hypr/hyprlock.conf".text = '' 14 + general { 15 + grace = 5 16 + } 17 + 18 + background { 19 + monitor = 20 + path = "${inputs.self}/res/pictures/background.png" 21 + blur_passes = 1 22 + } 23 + 24 + image { 25 + monitor = 26 + path = "${inputs.self}/res/pictures/cow.png" 27 + size = 150 28 + rounding = -1 29 + border_size = 2 30 + border_color = rgb(109, 237, 153) 31 + rotate = 0 32 + position = 0, 120 33 + halign = center 34 + valign = center 35 + 36 + shadow_passes = 1 37 + shadow_size = 5 38 + shadow_boost = 1.6 39 + } 40 + 41 + input-field { 42 + monitor = 43 + size = 250, 50 44 + outline_thickness = 2 45 + dots_size = 0.25 # Scale of input-field height, 0.2 - 0.8 46 + dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0 47 + dots_center = false 48 + dots_rounding = -1 # -1 default circle, -2 follow input-field rounding 49 + outer_color = rgb(150, 150, 150) 50 + inner_color = rgb(16, 16, 19) 51 + font_color = rgb(255, 255, 255) 52 + fade_on_empty = false 53 + fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered. 54 + placeholder_text = <span foreground="##dddddd" style="italic">Password</span> 55 + hide_input = false 56 + rounding = -1 # -1 means complete rounding (circle/oval) 57 + check_color = rgb(15, 219, 255) 58 + fail_color = rgb(237, 37, 78) # if authentication failed, changes outer_color and fail message color 59 + fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i> 60 + fail_transition = 300 # transition time in ms between normal outer_color and fail_color 61 + capslock_color = -1 62 + numlock_color = -1 63 + bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above) 64 + invert_numlock = false # change color if numlock is off 65 + swap_font_color = false # see below 66 + 67 + position = 0, -80 68 + halign = center 69 + valign = center 70 + } 71 + 72 + label { 73 + monitor = 74 + text = $DESC 75 + color = rgba(255, 255, 255, 1.0) 76 + font_size = 25 77 + font_family = sans-serif 78 + rotate = 0 # degrees, counter-clockwise 79 + 80 + position = 0, 0 81 + halign = center 82 + valign = center 83 + 84 + shadow_passes = 1 85 + shadow_size = 5 86 + shadow_boost = 1.6 87 + } 88 + 89 + label { 90 + monitor = 91 + text = cmd[update:30000] echo "$(date +"%A, %B %-d | %I:%M %p") | $(${pkgs.nushell}/bin/nu ${inputs.self}/res/bat_display.nu)" 92 + color = rgba(255, 255, 255, 1.0) 93 + font_size = 20 94 + font_family = sans-serif 95 + rotate = 0 # degrees, counter-clockwise 96 + 97 + position = 0, -40 98 + halign = center 99 + valign = top 100 + 101 + shadow_passes = 1 102 + shadow_size = 5 103 + shadow_boost = 1.6 104 + } 105 + ''; 106 + }; 107 + }
+285
roles/graphics/news.nix
··· 1 + { 2 + config, 3 + lib, 4 + pkgs, 5 + inputs, 6 + ... 7 + }: let 8 + yt-feed = id: { 9 + url = "https://www.youtube.com/feeds/videos.xml?channel_id=" + id; 10 + tags = ["!" "youtube"]; 11 + }; 12 + yt-subs = [ 13 + "UCmEzz-dPBVrsy4ZluSsYHDg" # Hyperplexed 14 + "UCa8W2_uf81Ew6gYuw0VPSeA" # Juxtoposed 15 + "UCMiyV_Ib77XLpzHPQH_q0qQ" # Veronica Explains 16 + "UC7_YxT-KID8kRbqZo7MyscQ" # Markiplier 17 + "UCUMwY9iS8oMyWDYIe6_RmoA" # No Boilerplate 18 + "UCRC6cNamj9tYAO6h_RXd5xA" # RTGame 19 + "UCYIwBA7mwDWnrckXs7gt76Q" # Snapcube 20 + "UCCHruaQlOKPHTl8iOPGDjFg" # Snapcube 2 (VODs) 21 + "UCL7DDQWP6x7wy0O6L5ZIgxg" # 2ndJerma 22 + "UC_S45UpAYVuc0fYEcHN9BVQ" # BoyBoy 23 + "UC-oTbS-PARG-kASUBRoCIUQ" # Camille 24 + "UC9z7EZAbkphEMg0SP7rw44A" # carykh 25 + "UCpmvp5czsIrQHsbqya4-6Jw" # Chad Chad 26 + "UC0e3QhIYukixgh5VVpKHH9Q" # Code Bullet 27 + "UCfPUcG3oCmXEYgdFuwlFh8w" # Dingo Doodles 28 + "UCsBjURrPoezykLs9EqgamOA" # Fireship 29 + "UCpFOj1CQMr9a3zaqEfhkTJw" # Grayfruit 30 + "UCGwu0nbY2wSkW8N-cghnLpA" # Jaiden Animations 31 + "UCoLUji8TYrgDy74_iiazvYA" # Jarvis Johnson 32 + "UClBNmmlREy6BD8PSTFBDyQg" # Kan Gao 33 + "UCm8EsftbfNzSiRHzc7I59KQ" # Kevin Faang 34 + "UCtHaxi4GTYDpJgMSGy7AeSw" # Michael Reeves 35 + "UCKxl5H_YOjlE_9sbcp65_pA" # Rekha Shankar 36 + "UC9CuvdOVfMPvKCiwdGKL3cQ" # Game Grumps 37 + "UCXq2nALoSbxLMehAvYTxt_A" # The Grumps 38 + "UCBa659QWEk1AI4Tg--mrJ2A" # Tom Scott 39 + "UCFLwN7vRu8M057qJF8TsBaA" # UpIsNotJump 40 + "UCzfyYtgvkx5mLy8nlLlayYg" # SpindleHorse 41 + "UCPsSoOCRNIj-eo2UbXfcdAw" # xen 42 42 + "UCYBbrJH2H6tmQZ7VHyA_esA" # Saltydkdan 43 + "UCBZb-2BHvUtZ-WzrEj16lug" # Raicuparta 44 + "UClyGlKOhDUooPJFy4v_mqPg" # DougDoug 45 + "UC5sc1ysFs7RfjjEFMuQ3ZQw" # DougDougDoug 46 + "UCqVEHtQoXHmUCfJ-9smpTSg" # Answer in Progress 47 + "UCPDXXXJj9nax0fr0Wfc048g" # Dropout 48 + "UCQALLeQPoZdZC4JNUboVEUg" # Jabrils 49 + "UC8EYr_ArKMKaxfgRq-iCKzA" # WindowsG Electronics 50 + "UCJXa3_WNNmIpewOtCHf3B0g" # LaurieWired 51 + ]; 52 + in { 53 + home-manager.users.bean = { 54 + xdg.dataFile."applications/newsboat.desktop".text = '' 55 + [Desktop Entry] 56 + Type=Application 57 + Name=newsboat 58 + Icon=newsboat 59 + ''; 60 + 61 + programs.newsboat = { 62 + enable = true; 63 + browser = ''"${inputs.self}/res/news-open.nu %u"''; 64 + 65 + # notify-program ${../res/news-notify.nu} 66 + 67 + extraConfig = '' 68 + confirm-mark-feed-read no 69 + confirm-mark-all-feeds-read no 70 + wrap-scroll yes 71 + text-width 90 72 + 73 + color info black green bold 74 + color listnormal color8 default 75 + color listnormal_unread default default 76 + color listfocus black green 77 + color listfocus_unread black green bold 78 + ''; 79 + 80 + queries = { 81 + "Youtube" = "tags # \"youtube\""; 82 + }; 83 + 84 + urls = 85 + [ 86 + { 87 + title = "Outer Wilds Mods"; 88 + url = "https://outerwildsmods.com/feed.xml"; 89 + tags = ["dev" "outer-wilds"]; 90 + } 91 + { 92 + title = "Philly Voice"; 93 + url = "https://www.phillyvoice.com/feed/section/news/"; 94 + tags = ["local"]; 95 + } 96 + { 97 + title = "ChesCo"; 98 + url = "https://www.mychesco.com/feed"; 99 + tags = ["local"]; 100 + } 101 + { 102 + title = "Mobius Digital"; 103 + url = "https://www.mobiusdigitalgames.com/news/feed"; 104 + tags = ["outer-wilds"]; 105 + } 106 + { 107 + title = "NixOS Blog"; 108 + url = "https://nixos.org/blog/feed.xml"; 109 + tags = ["dev" "linux" "nixos"]; 110 + } 111 + { 112 + title = "Linux Kernel Releases"; 113 + url = "https://www.kernel.org/feeds/kdist.xml"; 114 + tags = ["dev" "linux"]; 115 + } 116 + { 117 + title = "Linux Weekly News"; 118 + url = "https://lwn.net/headlines/newrss"; 119 + tags = ["dev" "linux"]; 120 + } 121 + { 122 + title = "Linux Kernel Planet"; 123 + url = "https://planet.kernel.org/rss20.xml"; 124 + tags = ["dev" "linux"]; 125 + } 126 + { 127 + title = "Free Desktop Planet"; 128 + url = "https://planet.freedesktop.org/atom.xml"; 129 + tags = ["dev" "linux"]; 130 + } 131 + { 132 + title = "KDE Blog"; 133 + url = "https://blogs.kde.org/index.xml"; 134 + tags = ["dev" "linux"]; 135 + } 136 + { 137 + title = "Cloudflare Blog"; 138 + url = "https://blog.cloudflare.com/rss"; 139 + tags = ["dev" "security"]; 140 + } 141 + { 142 + title = "Rust Blog"; 143 + url = "https://blog.rust-lang.org/feed.xml"; 144 + tags = ["dev" "rust"]; 145 + } 146 + { 147 + title = "Tauri Blog"; 148 + url = "https://tauri.app/blog/rss.xml"; 149 + tags = ["dev" "rust"]; 150 + } 151 + { 152 + title = "Node.js Blog"; 153 + url = "https://nodejs.org/en/feed/blog.xml"; 154 + tags = ["dev" "web"]; 155 + } 156 + { 157 + title = "V8 Blog"; 158 + url = "https://v8.dev/blog.atom"; 159 + tags = ["dev" "web"]; 160 + } 161 + { 162 + title = "Vite Blog"; 163 + url = "https://vitejs.dev/blog.rss"; 164 + tags = ["dev" "web"]; 165 + } 166 + { 167 + title = "React Blog"; 168 + url = "https://react.dev/rss.xml"; 169 + tags = ["dev" "web"]; 170 + } 171 + { 172 + title = "Astro JS"; 173 + url = "https://astro.build/rss.xml"; 174 + tags = ["dev" "web"]; 175 + } 176 + { 177 + title = "W3C Blog"; 178 + url = "https://www.w3.org/blog/feed/"; 179 + tags = ["dev" "web"]; 180 + } 181 + { 182 + title = "Mozilla Blog"; 183 + url = "https://blog.mozilla.org/en/feed/"; 184 + tags = ["dev" "web"]; 185 + } 186 + { 187 + title = "Mozilla Nightly Blog"; 188 + url = "https://blog.nightly.mozilla.org/feed/"; 189 + tags = ["dev" "web"]; 190 + } 191 + { 192 + title = "Mozilla Developer Network"; 193 + url = "https://developer.mozilla.org/en-US/blog/rss.xml"; 194 + tags = ["dev" "web"]; 195 + } 196 + { 197 + title = "Chrome Dev Blog"; 198 + url = "https://developer.chrome.com/static/blog/feed.xml"; 199 + tags = ["dev" "web"]; 200 + } 201 + { 202 + title = "Webkit Blog"; 203 + url = "https://webkit.org/feed/"; 204 + tags = ["dev" "web"]; 205 + } 206 + { 207 + title = "GitHub Blog"; 208 + url = "https://github.blog/feed/"; 209 + tags = ["dev" "github"]; 210 + } 211 + { 212 + title = "GitHub Status"; 213 + url = "https://www.githubstatus.com/history.rss"; 214 + tags = ["dev" "github"]; 215 + } 216 + { 217 + title = "Veronica Explains"; 218 + url = "https://vkc.sh/feed/"; 219 + tags = ["linux" "personal-blog"]; 220 + } 221 + { 222 + title = "Tom Scott Newsletter"; 223 + url = "https://www.tomscott.com/updates.xml"; 224 + tags = ["personal-blog"]; 225 + } 226 + { 227 + title = "Dave Eddy"; 228 + url = "https://blog.daveeddy.com/rss.xml"; 229 + tags = ["personal-blog"]; 230 + } 231 + { 232 + title = "Xe Iaso"; 233 + url = "https://xeiaso.net/blog.rss"; 234 + tags = ["personal-blog"]; 235 + } 236 + { 237 + title = "Anil Dash"; 238 + url = "https://www.anildash.com/feed.xml"; 239 + tags = ["personal-blog"]; 240 + } 241 + { 242 + title = "HiDeoo"; 243 + url = "https://hideoo.dev/notes/rss.xml"; 244 + tags = ["personal-blog"]; 245 + } 246 + { 247 + title = "Scripting News"; 248 + url = "http://scripting.com/rss.xml"; 249 + tags = ["personal-blog"]; 250 + } 251 + { 252 + title = "XKCD"; 253 + url = "https://xkcd.com/rss.xml"; 254 + tags = ["personal-blog"]; 255 + } 256 + { 257 + title = "Framework Laptop"; 258 + url = "https://frame.work/blog.rss"; 259 + tags = ["hardware"]; 260 + } 261 + { 262 + title = "Neo Win"; 263 + url = "https://www.neowin.net/news/rss/"; 264 + tags = ["tech"]; 265 + } 266 + { 267 + title = "Ars Technica"; 268 + url = "https://arstechnica.com/feed/"; 269 + tags = ["tech"]; 270 + } 271 + { 272 + title = "Lobste"; 273 + url = "https://lobste.rs/rss"; 274 + tags = ["tech"]; 275 + } 276 + { 277 + title = "Y Combinator"; 278 + url = "https://news.ycombinator.com/rss"; 279 + tags = ["tech"]; 280 + } 281 + ] 282 + ++ (map yt-feed yt-subs); 283 + }; 284 + }; 285 + }
+23
roles/graphics/printing.nix
··· 1 + {...}: { 2 + services.printing = { 3 + enable = true; 4 + stateless = true; 5 + }; 6 + 7 + hardware.printers = { 8 + ensurePrinters = [ 9 + { 10 + name = "RamPrint"; 11 + description = "WCU RamPrint"; 12 + deviceUri = "https://wcuprintp01.wcupa.net:9164/printers/RamPrint"; 13 + model = "drv:///sample.drv/generic.ppd"; 14 + } 15 + { 16 + name = "FHG_IMC_Color"; 17 + description = "FHG IMC Color"; 18 + deviceUri = "https://wcuprintp01.wcupa.net:9164/printers/FHG_IMC_Color"; 19 + model = "drv:///sample.drv/generic.ppd"; 20 + } 21 + ]; 22 + }; 23 + }
+164
roles/graphics/shell.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + config, 5 + lib, 6 + ... 7 + }: { 8 + environment.systemPackages = with pkgs; [ 9 + # Shell Components 10 + hyprlock 11 + swaynotificationcenter 12 + swayosd 13 + 14 + ## Waybar 15 + waybar 16 + qt6.qttools # For component 17 + 18 + libsForQt5.dolphin 19 + libsForQt5.ark # For archive support 20 + libsForQt5.kio-extras # For thumbnails 21 + libsForQt5.kdegraphics-thumbnailers # For thumbnails 22 + 23 + networkmanagerapplet 24 + pavucontrol 25 + udiskie 26 + 27 + wf-recorder 28 + slurp 29 + grim 30 + xdg-utils 31 + grimblast 32 + swappy 33 + 34 + keepassxc 35 + 36 + plasma5Packages.kdeconnect-kde 37 + 38 + hunspell 39 + hunspellDicts.en_US 40 + hunspellDicts.en_US-large 41 + 42 + (callPackage wl-clipboard.overrideAttrs { 43 + src = fetchFromGitHub { 44 + owner = "Bwc9876"; 45 + repo = "wl-clipboard"; 46 + rev = "bwc9876/x-kde-passwordManagerHint-sensitive"; 47 + sha256 = "sha256-DD0efaKaqAMqp4KwQPwuKlNtGuHIXvfE0SBfTKSADOM="; 48 + }; 49 + }) 50 + (callPackage cliphist.overrideAttrs { 51 + src = fetchFromGitHub { 52 + owner = "sentriz"; 53 + repo = "cliphist"; 54 + rev = "8c48df70bb3d9d04ae8691513e81293ed296231a"; 55 + sha256 = "sha256-tImRbWjYCdIY8wVMibc5g5/qYZGwgT9pl4pWvY7BDlI="; 56 + }; 57 + vendorHash = "sha256-gG8v3JFncadfCEUa7iR6Sw8nifFNTciDaeBszOlGntU="; 58 + }) 59 + ]; 60 + 61 + home-manager.users.bean = { 62 + xdg.configFile = { 63 + waybar.source = "${inputs.self}/res/waybar"; 64 + swaync.source = "${inputs.self}/res/swaync"; 65 + dolphinrc.source = "${inputs.self}/res/theming/dolphinrc"; 66 + "swayosd/style.css".source = "${inputs.self}/res/swayosd.css"; 67 + 68 + "kdeconnect/config".text = '' 69 + [General] 70 + name=${lib.toUpper config.networking.hostName} 71 + ''; 72 + 73 + "hypr/hyprpaper.conf".text = '' 74 + ipc = off 75 + splash = off 76 + preload = "${inputs.self}/res/pictures/background.jpg" 77 + wallpaper = ,"${inputs.self}/res/pictures/background.jpg" 78 + ''; 79 + }; 80 + 81 + programs = { 82 + rofi = { 83 + enable = true; 84 + package = pkgs.rofi-wayland.override { 85 + plugins = with pkgs; [ 86 + rofi-emoji-wayland 87 + rofi-power-menu 88 + rofi-bluetooth 89 + (rofi-calc.override { 90 + rofi-unwrapped = rofi-wayland-unwrapped; 91 + }) 92 + rofi-pulse-select 93 + ]; 94 + }; 95 + location = "center"; 96 + theme = "${inputs.self}/res/rofi/rofi-style.rasi"; 97 + }; 98 + }; 99 + 100 + wayland.windowManager.hyprland.settings = { 101 + exec-once = [ 102 + "${pkgs.hyprpaper}/bin/hyprpaper" 103 + "${pkgs.hypridle}/bin/hypridle" 104 + "dolphin --daemon" 105 + "waybar" 106 + "wl-paste --watch bash ${inputs.self}/res/clipboard_middleman.sh" 107 + "swaync" 108 + "swayosd-server" 109 + "nm-applet" 110 + "${pkgs.udiskie}/bin/udiskie -A -f dolphin" 111 + "${pkgs.nushell}/bin/nu ${inputs.self}/res/battery_notif.nu" 112 + "playerctld" 113 + "[workspace 3] keepassxc /home/bean/Documents/Database.kdbx" 114 + ]; 115 + 116 + bind = let 117 + powerMenu = "rofi -modi 'p:${pkgs.rofi-power-menu}/bin/rofi-power-menu' -show p --symbols-font \"FiraMono Nerd Font Mono\""; 118 + screenshot = "${pkgs.nushell}/bin/nu ${inputs.self}/res/screenshot.nu"; 119 + in [ 120 + "SUPER,S,exec,rofi -show drun -icon-theme \"candy-icons\" -show-icons" 121 + "SUPER SHIFT,E,exec,rofi -modi emoji -show emoji" 122 + "SUPER,Delete,exec,${powerMenu}" 123 + ",XF86PowerOff,exec,${powerMenu}" 124 + "SUPER ALT,C,exec,rofi -show calc -modi calc -no-show-match -no-sort -calc-command \"echo -n '{result}' | wl-copy\"" 125 + "SUPER,I,exec,${pkgs.rofi-pulse-select}/bin/rofi-pulse-select source" 126 + "SUPER,O,exec,${pkgs.rofi-pulse-select}/bin/rofi-pulse-select sink" 127 + "SUPER,B,exec,${pkgs.rofi-bluetooth}/bin/rofi-bluetooth" 128 + "SUPER,D,exec,nu ${inputs.self}/res/rofi/rofi-code.nu" 129 + "SUPER,Tab,exec,rofi -show window -show-icons" 130 + "SUPER,E,exec,nu ${inputs.self}/res/rofi/rofi-places.nu" 131 + "SUPER SHIFT,T,exec,nu ${inputs.self}/res/rofi/rofi-zoxide.nu" 132 + "SUPER,N,exec,${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw" 133 + "SUPER,A,exec,pavucontrol --tab 5" 134 + "SUPER,V,exec,cliphist list | sed -r \"s|binary data image/(.*)|󰋩 Image (\\1)|g\" | rofi -dmenu -display-columns 2 -p Clipboard | cliphist decode | wl-copy" 135 + "SUPER ALT,V,exec,echo -e \"Yes\\nNo\" | [[ $(rofi -dmenu -mesg \"Clear Clipboard History?\" -p Clear) == \"Yes\" ]] && cliphist wipe" 136 + ",Print,exec,${screenshot}" 137 + "SUPER SHIFT,S,exec,${screenshot}" 138 + "SUPER SHIFT,C,exec,${pkgs.hyprpicker}/bin/hyprpicker -a" 139 + ]; 140 + bindl = [ 141 + ",XF86AudioPlay,exec,playerctl play-pause" 142 + ",XF86AudioPause,exec,playerctl pause" 143 + ",XF86AudioStop,exec,playerctl stop" 144 + ",XF86AudioNext,exec,playerctl next" 145 + ",XF86AudioPrev,exec,playerctl previous" 146 + ]; 147 + bindr = [ 148 + "SUPER SHIFT,R,exec,pkill wf-recorder --signal SIGINT || nu ${inputs.self}/res/screenrec.nu" 149 + "CAPS,Caps_Lock,exec,swayosd-client --caps-lock" 150 + ",Scroll_Lock,exec,swayosd-client --scroll-lock" 151 + ",Num_Lock,exec,swayosd-client --num-lock" 152 + ]; 153 + bindel = [ 154 + ",XF86MonBrightnessUp,exec,swayosd-client --brightness raise" 155 + ",XF86MonBrightnessDown,exec,swayosd-client --brightness lower" 156 + ]; 157 + binde = [ 158 + ",XF86AudioRaiseVolume,exec,swayosd-client --output-volume raise" 159 + ",XF86AudioLowerVolume,exec,swayosd-client --output-volume lower" 160 + ",XF86AudioMute,exec,swayosd-client --output-volume mute-toggle" 161 + ]; 162 + }; 163 + }; 164 + }
+78
roles/graphics/theming.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + qt = { 7 + enable = true; 8 + platformTheme = "qt5ct"; 9 + style = "kvantum"; 10 + }; 11 + 12 + environment.pathsToLink = [ 13 + "/share/Kvantum" 14 + "/share/icons" 15 + ]; # Kvantum needs linking 16 + 17 + home-manager.users.bean = { 18 + qt = { 19 + enable = true; 20 + platformTheme.name = "qtct"; 21 + style.name = "kvantum"; 22 + }; 23 + 24 + xdg.configFile = { 25 + kdeglobals.source = "${inputs.self}/res/theming/kdeglobals"; 26 + "qt5ct/qt5ct.conf".source = "${inputs.self}/res/theming/qt5ct.conf"; 27 + "qt6ct/qt6ct.conf".source = "${inputs.self}/res/theming/qt6ct.conf"; 28 + "gtk-3.0/settings.ini".source = "${inputs.self}/res/theming/gtk/settings.ini"; 29 + "gtk-4.0/settings.ini".source = "${inputs.self}/res/theming/gtk/settings.ini"; 30 + "Kvantum/kvantum.kvconfig".text = '' 31 + [General] 32 + theme=Sweet-Ambar-Blue 33 + ''; 34 + }; 35 + 36 + wayland.windowManager.hyprland.settings = { 37 + systemd.variables = ["--all"]; 38 + env = let 39 + cursorSize = "24"; 40 + in [ 41 + "QT_QPA_PLATFORM,wayland;xcb" 42 + "QT_AUTO_SCREEN_SCALE_FACTOR,1" 43 + "HYPRCURSOR_THEME,Sweet-cursors-hypr" 44 + "HYPRCURSOR_SIZE,${cursorSize}" 45 + "XCURSOR_THEME,Sweet-cursors" 46 + "XCURSOR_SIZE,${cursorSize}" 47 + "GRIMBLAST_EDITOR,swappy -f " 48 + ]; 49 + exec-once = [ 50 + ''dconf write /org/gnome/desktop/interface/cursor-theme "Sweet-cursors"'' 51 + ''dconf write /org/gnome/desktop/interface/icon-theme "candy-icons"'' 52 + ''dconf write /org/gnome/desktop/interface/gtk-theme "Sweet-Ambar-Blue:dark"'' 53 + ]; 54 + }; 55 + }; 56 + 57 + fonts = { 58 + packages = with pkgs; [(nerdfonts.override {fonts = ["FiraCode"];}) noto-fonts noto-fonts-color-emoji liberation_ttf]; 59 + fontconfig = { 60 + enable = true; 61 + defaultFonts = rec { 62 + serif = ["Noto Sans" "FiraCode Nerd Font" "Noto Color Emoji"]; 63 + sansSerif = serif; 64 + monospace = ["FiraCode Nerd Font Mono" "Noto Color Emoji"]; 65 + emoji = ["FiraCode Nerd Font" "Noto Color Emoji"]; 66 + }; 67 + }; 68 + }; 69 + 70 + environment.systemPackages = with pkgs; [ 71 + libsForQt5.qt5ct 72 + kdePackages.qt6ct 73 + libsForQt5.qtstyleplugin-kvantum 74 + kdePackages.qtstyleplugin-kvantum 75 + (callPackage "${inputs.self}/pkgs/themes.nix" {inherit inputs;}) # Custom themes 76 + adwaita-icon-theme # For fallback icons 77 + ]; 78 + }
+64
roles/graphics/xdg.nix
··· 1 + { 2 + pkgs, 3 + config, 4 + ... 5 + }: { 6 + home-manager.users.bean.xdg = { 7 + enable = true; 8 + userDirs = with config.home-manager.users.bean.home; { 9 + enable = true; 10 + createDirectories = true; 11 + desktop = "${homeDirectory}/Desktop"; 12 + documents = "${homeDirectory}/Documents"; 13 + pictures = "${homeDirectory}/Pictures"; 14 + videos = "${homeDirectory}/Videos"; 15 + music = "${homeDirectory}/Music"; 16 + extraConfig = { 17 + "XDG_SCREENSHOTS_DIR" = "${homeDirectory}/Pictures/Screenshots"; 18 + }; 19 + }; 20 + mimeApps = { 21 + enable = true; 22 + defaultApplications = let 23 + textEditors = ["codium.desktop"]; 24 + browsers = ["firefox-devedition.desktop" "firefox.desktop" "chromium.desktop"]; 25 + imageViewers = ["gimp.desktop"]; 26 + in { 27 + "inode/directory" = ["org.kde.dolphin.desktop"]; 28 + "text/plain" = textEditors; 29 + "text/markdown" = textEditors; 30 + "text/xml" = textEditors; 31 + "text/x-markdown" = textEditors; 32 + "text/x-readme" = textEditors; 33 + "text/x-changelog" = textEditors; 34 + "text/x-copying" = textEditors; 35 + "text/x-install" = textEditors; 36 + "text/html" = browsers; 37 + "image/png" = imageViewers; 38 + "image/jpeg" = imageViewers; 39 + "image/gif" = browsers; 40 + "image/bmp" = imageViewers; 41 + "image/x-portable-pixmap" = imageViewers; 42 + "image/x-portable-bitmap" = imageViewers; 43 + "image/x-portable-graymap" = imageViewers; 44 + "image/x-portable-anymap" = imageViewers; 45 + "image/svg+xml" = imageViewers; 46 + "x-terminal-emulator" = ["foot"]; 47 + "x-scheme-handler/http" = browsers; 48 + "x-scheme-handler/https" = browsers; 49 + "x-scheme-handler/chrome" = browsers; 50 + "x-scheme-handler/vscode" = ["code-url-handler.desktop"]; 51 + "x-scheme-handler/x-github-client" = ["github-desktop.desktop"]; 52 + "x-scheme-handler/x-github-desktop-auth" = ["github-desktop.desktop"]; 53 + "application/x-extension-htm" = browsers; 54 + "application/x-extension-html" = browsers; 55 + "application/x-extension-shtml" = browsers; 56 + "application/x-extension-xht" = browsers; 57 + "application/x-extension-xhtml" = browsers; 58 + "application/xhtml+xml" = browsers; 59 + "application/xml" = browsers; 60 + "application/pdf" = browsers; 61 + }; 62 + }; 63 + }; 64 + }
+21
roles/hypervisor+graphics.nix
··· 1 + {pkgs, ...}: { 2 + virtualisation.libvirtd = { 3 + enable = true; 4 + qemu.swtpm.enable = true; # Win 11 needs TPM 5 + qemu.ovmf.packages = [ 6 + (pkgs.OVMF.override { 7 + # I have to build UEFI firmware from source, fun times 8 + secureBoot = true; # Win 11 needs secure boot 9 + tpmSupport = true; # Win 11 needs TPM 10 + }) 11 + .fd 12 + ]; 13 + }; 14 + 15 + # GUI For Managing Machines 16 + programs.virt-manager.enable = true; 17 + 18 + environment.systemPackages = with pkgs; [ 19 + libtpms # For win 11 20 + ]; 21 + }
+10
roles/hypervisor.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + virtualisation.libvirtd = { 7 + enable = true; 8 + onBoot = "ignore"; # I don't want VMs to start again on reboot 9 + }; 10 + }
+12
roles/latest-linux.nix
··· 1 + {pkgs, ...}: { 2 + boot = { 3 + initrd.systemd = { 4 + enable = true; 5 + }; 6 + 7 + # Use latest kernel with sysrqs and lockdown enabled 8 + kernelPackages = lib.mkDefault pkgs.linuxPackages_latest; 9 + kernelParams = lib.mkDefault ["lockdown=confidentiality"]; 10 + kernel.sysctl."kernel.sysrq" = 1; 11 + }; 12 + }
+3
roles/normalboot.nix
··· 1 + {...}: { 2 + boot.loader.systemd-boot.enable = true; 3 + }
+18
roles/secureboot.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + lib, 5 + ... 6 + }: { 7 + imports = [inputs.lanzaboote.nixosModules.lanzaboote]; 8 + 9 + boot = { 10 + loader.systemd-boot.enable = lib.mkForce false; 11 + bootspec.enable = true; 12 + 13 + lanzaboote = { 14 + enable = true; 15 + pkiBundle = "/etc/secureboot"; 16 + }; 17 + }; 18 + }
+17
roles/social/discord.nix
··· 1 + { 2 + pkgs, 3 + inputs, 4 + ... 5 + }: { 6 + # TODO: Nativify GMessages? 7 + 8 + environment.systemPackages = with pkgs; [ 9 + vesktop 10 + ]; 11 + 12 + home-manager.users.bean.home.file = { 13 + Vencord.source = "${inputs.self}/res/vencord"; 14 + "VencordDesktop/VencordDesktop/settings".source = "${inputs.self}/res/vencord/settings"; 15 + "VencordDesktop/VencordDesktop/themes".source = "${inputs.self}/res/vencord/themes"; 16 + }; 17 + }
+40
roles/ssh.nix
··· 1 + { 2 + lib, 3 + pkgs, 4 + config, 5 + ... 6 + }: let 7 + beanPubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKb2qxNUbvdBTAntmUyPIaOXwFd1nhZO/SS00SNss0nU"; 8 + in { 9 + users.users."bean".openssh.authorizedKeys.keys = [ 10 + beanPubkey 11 + ]; 12 + 13 + nix.sshServe = { 14 + enable = true; 15 + keys = [ 16 + beanPubkey 17 + ]; 18 + }; 19 + 20 + services.openssh = { 21 + enable = true; 22 + openFirewall = true; 23 + banner = '' 24 + === ${lib.toUpper config.networking.hostName} === 25 + 26 + ''; 27 + listenAddresses = [ 28 + { 29 + addr = "0.0.0.0"; 30 + } 31 + ]; 32 + ports = [8069]; 33 + settings.GSSAPIAuthentication = false; 34 + settings.PasswordAuthentication = false; 35 + settings.UseDns = false; 36 + # settings.LogLevel = "DEBUG1"; 37 + settings.PermitRootLogin = "no"; 38 + settings.KbdInteractiveAuthentication = false; 39 + }; 40 + }
+4
roles/vm.nix
··· 1 + {modulesPath, ...}: { 2 + imports = ["${modulesPath}/virtualisation/qemu-vm.nix"]; 3 + services.qemuGuest.enable = true; 4 + }
+24
roles/wireless.nix
··· 1 + {pkgs, ...}: { 2 + networking.networkmanager.enable = true; 3 + 4 + hardware.bluetooth = { 5 + enable = true; 6 + settings = { 7 + General = { 8 + Experimental = true; 9 + }; 10 + }; 11 + }; 12 + 13 + # TODO: Remove this eventually 14 + # Use legacy renegotiation for wpa_supplicant because some things are silly geese 15 + systemd.services.wpa_supplicant.environment.OPENSSL_CONF = pkgs.writeText "openssl.cnf" '' 16 + openssl_conf = openssl_init 17 + [openssl_init] 18 + ssl_conf = ssl_sect 19 + [ssl_sect] 20 + system_default = system_default_sect 21 + [system_default_sect] 22 + Options = UnsafeLegacyRenegotiation 23 + ''; 24 + }
+15
systems/b-pc-laptop.nix
··· 1 + { 2 + target = "x86_64-linux"; 3 + extraOverlays = []; 4 + 5 + eval = {inputs, ...}: { 6 + description = "Framework 13 Laptop"; 7 + 8 + edition = "25.05"; 9 + 10 + includeBaseMods = true; 11 + 12 + roles = ["latest-linux" "dev" "graphics" "vm" "fun" "secureboot" "wireless" "hypervisor"]; 13 + extraModules = [inputs.nixos-hardware.nixosModules.framework-13th-gen-intel]; 14 + }; 15 + }
+23
systems/mannco.nix
··· 1 + { 2 + target = "aarch64-linux"; 3 + extraOverlays = [ 4 + (final: super: { 5 + makeModulesClosure = x: 6 + super.makeModulesClosure (x // {allowMissing = true;}); 7 + }) 8 + ]; 9 + 10 + eval = {inputs, ...}: { 11 + description = "Raspberry Pi 4 Model B"; 12 + edition = "25.05"; 13 + 14 + includeBaseMods = true; 15 + 16 + roles = ["ssh"]; 17 + extraModules = [ 18 + "${inputs.nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix" 19 + {disabledModules = ["${inputs.nixpkgs}/nixos/modules/profiles/base.nix"];} 20 + inputs.nixos-hardware.nixosModules.raspberry-pi-4 21 + ]; 22 + }; 23 + }
+14
systems/test.nix
··· 1 + { 2 + target = "x86_64-linux"; 3 + extraOverlays = []; 4 + 5 + eval = {...}: { 6 + description = "Test / Example System"; 7 + edition = "25.05"; 8 + 9 + includeBaseMods = true; 10 + 11 + roles = ["latest-linux" "normalboot" "vm"]; 12 + extraModules = []; 13 + }; 14 + }