All my system configs and packages in one repo

hjemify

pluie.me dfde4c0a 29fd919c

verified
+1
.envrc
··· 1 + has nix && use flake
+2 -1
.gitignore
··· 1 - result 1 + result/ 2 + .direnv/
+14 -456
flake.lock
··· 1 1 { 2 2 "nodes": { 3 - "blender-bin": { 4 - "inputs": { 5 - "nixpkgs": [ 6 - "nixpkgs" 7 - ] 8 - }, 9 - "locked": { 10 - "dir": "blender", 11 - "lastModified": 1742939360, 12 - "narHash": "sha256-YeM/A4SWHlz2trSNjriPi4QR5zsYMC8vkQawSlRw2+w=", 13 - "owner": "edolstra", 14 - "repo": "nix-warez", 15 - "rev": "c9d2d5c61a37f2217e9241ccfa6c394ed2f3e52b", 16 - "type": "github" 17 - }, 18 - "original": { 19 - "id": "blender-bin", 20 - "type": "indirect" 21 - } 22 - }, 23 - "catppuccin": { 24 - "inputs": { 25 - "nixpkgs": "nixpkgs" 26 - }, 27 - "locked": { 28 - "lastModified": 1744447794, 29 - "narHash": "sha256-z5uK5BDmFg0L/0EW2XYLGr39FbQeXyNVnIEhkZrG8+Q=", 30 - "owner": "catppuccin", 31 - "repo": "nix", 32 - "rev": "c44fe73ed8e5d5809eded7cc6156ca9c40044e42", 33 - "type": "github" 34 - }, 35 - "original": { 36 - "owner": "catppuccin", 37 - "repo": "nix", 38 - "type": "github" 39 - } 40 - }, 41 - "crane": { 42 - "locked": { 43 - "lastModified": 1741148495, 44 - "narHash": "sha256-EV8KUaIZ2/CdBXlutXrHoZYbWPeB65p5kKZk71gvDRI=", 45 - "owner": "ipetkov", 46 - "repo": "crane", 47 - "rev": "75390a36cd0c2cdd5f1aafd8a9f827d7107f2e53", 48 - "type": "github" 49 - }, 50 - "original": { 51 - "owner": "ipetkov", 52 - "repo": "crane", 53 - "type": "github" 54 - } 55 - }, 56 - "ctp-discord-compiled": { 57 - "flake": false, 58 - "locked": { 59 - "lastModified": 1740810360, 60 - "narHash": "sha256-Y1HDjEiw/MP+t2oqkdZT7mUvm09YmRUPQ9FFi1Hk26U=", 61 - "owner": "catppuccin", 62 - "repo": "discord", 63 - "rev": "075f4e53795e336a77f922a61680d32d57b424f5", 64 - "type": "github" 65 - }, 66 - "original": { 67 - "owner": "catppuccin", 68 - "ref": "gh-pages", 69 - "repo": "discord", 70 - "type": "github" 71 - } 72 - }, 73 - "ctp-vscode-compiled": { 74 - "flake": false, 75 - "locked": { 76 - "lastModified": 1713966373, 77 - "narHash": "sha256-ODqdy+17MxSRLFzj2TYYSvG7xUXDYEDZfjW5SkzRGyA=", 78 - "owner": "catppuccin", 79 - "repo": "vscode", 80 - "rev": "4b857d9b86cbb393e121f0f2544a6efb549dbbf4", 81 - "type": "github" 82 - }, 83 - "original": { 84 - "owner": "catppuccin", 85 - "ref": "catppuccin-vsc-v3.14.0", 86 - "repo": "vscode", 87 - "type": "github" 88 - } 89 - }, 90 - "fenix": { 91 - "inputs": { 92 - "nixpkgs": [ 93 - "nixpkgs" 94 - ], 95 - "rust-analyzer-src": "rust-analyzer-src" 96 - }, 97 - "locked": { 98 - "lastModified": 1742452566, 99 - "narHash": "sha256-sVuLDQ2UIWfXUBbctzrZrXM2X05YjX08K7XHMztt36E=", 100 - "owner": "nix-community", 101 - "repo": "fenix", 102 - "rev": "7d9ba794daf5e8cc7ee728859bc688d8e26d5f06", 103 - "type": "github" 104 - }, 105 - "original": { 106 - "owner": "nix-community", 107 - "ref": "monthly", 108 - "repo": "fenix", 109 - "type": "github" 110 - } 111 - }, 112 - "firefox-addons": { 113 - "inputs": { 114 - "flake-utils": [ 115 - "flake-utils" 116 - ], 117 - "nixpkgs": [ 118 - "nixpkgs" 119 - ] 120 - }, 121 - "locked": { 122 - "dir": "pkgs/firefox-addons", 123 - "lastModified": 1742025179, 124 - "narHash": "sha256-gxfMDCQeGZk3wZjqdl2boaGGm+yiAkaNFNp3x5vhuYg=", 125 - "owner": "~rycee", 126 - "repo": "nur-expressions", 127 - "rev": "9b8d2f4a1e3a199878d1eb14d7e0f176052a8038", 128 - "type": "sourcehut" 129 - }, 130 - "original": { 131 - "dir": "pkgs/firefox-addons", 132 - "owner": "~rycee", 133 - "repo": "nur-expressions", 134 - "type": "sourcehut" 135 - } 136 - }, 137 3 "flake-compat": { 138 4 "flake": false, 139 5 "locked": { ··· 150 16 "type": "github" 151 17 } 152 18 }, 153 - "flake-compat_2": { 154 - "flake": false, 155 - "locked": { 156 - "lastModified": 1733328505, 157 - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", 158 - "owner": "edolstra", 159 - "repo": "flake-compat", 160 - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", 161 - "type": "github" 162 - }, 163 - "original": { 164 - "owner": "edolstra", 165 - "repo": "flake-compat", 166 - "type": "github" 167 - } 168 - }, 169 19 "flake-parts": { 170 20 "inputs": { 171 21 "nixpkgs-lib": [ ··· 204 54 "type": "github" 205 55 } 206 56 }, 207 - "flake-utils_2": { 208 - "inputs": { 209 - "systems": "systems_2" 210 - }, 211 - "locked": { 212 - "lastModified": 1731533236, 213 - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 214 - "owner": "numtide", 215 - "repo": "flake-utils", 216 - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 217 - "type": "github" 218 - }, 219 - "original": { 220 - "owner": "numtide", 221 - "repo": "flake-utils", 222 - "type": "github" 223 - } 224 - }, 225 57 "ghostty": { 226 58 "inputs": { 227 59 "flake-compat": "flake-compat", 228 - "flake-utils": "flake-utils_2", 60 + "flake-utils": "flake-utils", 229 61 "nixpkgs-stable": [ 230 62 "nixpkgs" 231 63 ], ··· 250 82 "type": "github" 251 83 } 252 84 }, 253 - "gitignore": { 254 - "inputs": { 255 - "nixpkgs": [ 256 - "lanzaboote", 257 - "pre-commit-hooks-nix", 258 - "nixpkgs" 259 - ] 260 - }, 261 - "locked": { 262 - "lastModified": 1709087332, 263 - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", 264 - "owner": "hercules-ci", 265 - "repo": "gitignore.nix", 266 - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 267 - "type": "github" 268 - }, 269 - "original": { 270 - "owner": "hercules-ci", 271 - "repo": "gitignore.nix", 272 - "type": "github" 273 - } 274 - }, 275 85 "hjem": { 276 86 "inputs": { 277 87 "nixpkgs": [ ··· 299 109 ] 300 110 }, 301 111 "locked": { 302 - "lastModified": 1745861051, 303 - "narHash": "sha256-L1B2KkvbNHCtNbmYNli/DqCwEhshcwrt/p904iIYPNs=", 112 + "lastModified": 1745973953, 113 + "narHash": "sha256-s1ZHPUq9mi0VHVLI927tFdsMQqB5ClEBrYCwI8C7BMA=", 304 114 "owner": "snugnug", 305 115 "repo": "hjem-rum", 306 - "rev": "1ad4898417031a6b280894f80f041118b6964432", 116 + "rev": "d152f54bcd38dff8badc9449f6aa8f44944e1b17", 307 117 "type": "github" 308 118 }, 309 119 "original": { ··· 312 122 "type": "github" 313 123 } 314 124 }, 315 - "home-manager": { 316 - "inputs": { 317 - "nixpkgs": [ 318 - "nixpkgs" 319 - ] 320 - }, 321 - "locked": { 322 - "lastModified": 1744618730, 323 - "narHash": "sha256-n3gN7aHwVRnnBZI64EDoKyJnWidNYJ0xezhqQtdjH2Q=", 324 - "owner": "nix-community", 325 - "repo": "home-manager", 326 - "rev": "85dd758c703ffbf9d97f34adcef3a898b54b4014", 327 - "type": "github" 328 - }, 329 - "original": { 330 - "owner": "nix-community", 331 - "repo": "home-manager", 332 - "type": "github" 333 - } 334 - }, 335 - "krunner-nix": { 336 - "inputs": { 337 - "nixpkgs": [ 338 - "nixpkgs" 339 - ] 340 - }, 341 - "locked": { 342 - "lastModified": 1696278906, 343 - "narHash": "sha256-z2tbFXMC+nSN7vhn2WSoMVdViolucLeoDSfOfnRcmCE=", 344 - "owner": "pluiedev", 345 - "repo": "krunner-nix", 346 - "rev": "8a819944620db8eab35e7dbb14d1916c9e7a478d", 347 - "type": "github" 348 - }, 349 - "original": { 350 - "owner": "pluiedev", 351 - "repo": "krunner-nix", 352 - "type": "github" 353 - } 354 - }, 355 - "lanzaboote": { 356 - "inputs": { 357 - "crane": "crane", 358 - "flake-compat": "flake-compat_2", 359 - "flake-parts": [ 360 - "flake-parts" 361 - ], 362 - "nixpkgs": [ 363 - "nixpkgs" 364 - ], 365 - "pre-commit-hooks-nix": "pre-commit-hooks-nix", 366 - "rust-overlay": "rust-overlay" 367 - }, 368 - "locked": { 369 - "lastModified": 1741442524, 370 - "narHash": "sha256-tVcxLDLLho8dWcO81Xj/3/ANLdVs0bGyCPyKjp70JWk=", 371 - "owner": "nix-community", 372 - "repo": "lanzaboote", 373 - "rev": "d8099586d9a84308ffedac07880e7f07a0180ff4", 374 - "type": "github" 375 - }, 376 - "original": { 377 - "owner": "nix-community", 378 - "repo": "lanzaboote", 379 - "type": "github" 380 - } 381 - }, 382 - "nix-darwin": { 383 - "inputs": { 384 - "nixpkgs": [ 385 - "nixpkgs" 386 - ] 387 - }, 388 - "locked": { 389 - "lastModified": 1744478979, 390 - "narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=", 391 - "owner": "LnL7", 392 - "repo": "nix-darwin", 393 - "rev": "43975d782b418ebf4969e9ccba82466728c2851b", 394 - "type": "github" 395 - }, 396 - "original": { 397 - "owner": "LnL7", 398 - "repo": "nix-darwin", 399 - "type": "github" 400 - } 401 - }, 402 125 "nix-index-database": { 403 126 "inputs": { 404 127 "nixpkgs": [ ··· 406 129 ] 407 130 }, 408 131 "locked": { 409 - "lastModified": 1744518957, 410 - "narHash": "sha256-RLBSWQfTL0v+7uyskC5kP6slLK1jvIuhaAh8QvB75m4=", 132 + "lastModified": 1745725746, 133 + "narHash": "sha256-iR+idGZJ191cY6NBXyVjh9QH8GVWTkvZw/w+1Igy45A=", 411 134 "owner": "nix-community", 412 135 "repo": "nix-index-database", 413 - "rev": "4fc9ea78c962904f4ea11046f3db37c62e8a02fd", 136 + "rev": "187524713d0d9b2d2c6f688b81835114d4c2a7c6", 414 137 "type": "github" 415 138 }, 416 139 "original": { ··· 421 144 }, 422 145 "nixos-hardware": { 423 146 "locked": { 424 - "lastModified": 1744366945, 425 - "narHash": "sha256-OuLhysErPHl53BBifhesrRumJNhrlSgQDfYOTXfgIMg=", 147 + "lastModified": 1745955289, 148 + "narHash": "sha256-mmV2oPhQN+YF2wmnJzXX8tqgYmUYXUj3uUUBSTmYN5o=", 426 149 "owner": "NixOS", 427 150 "repo": "nixos-hardware", 428 - "rev": "1fe3cc2bc5d2dc9c81cb4e63d2f67c1543340df1", 151 + "rev": "72081c9fbbef63765ae82bff9727ea79cc86bd5b", 429 152 "type": "github" 430 153 }, 431 154 "original": { ··· 437 160 }, 438 161 "nixpkgs": { 439 162 "locked": { 440 - "lastModified": 1744098102, 441 - "narHash": "sha256-tzCdyIJj9AjysC3OuKA+tMD/kDEDAF9mICPDU7ix0JA=", 442 - "owner": "NixOS", 443 - "repo": "nixpkgs", 444 - "rev": "c8cd81426f45942bb2906d5ed2fe21d2f19d95b7", 445 - "type": "github" 446 - }, 447 - "original": { 448 - "owner": "NixOS", 449 - "ref": "nixos-unstable", 450 - "repo": "nixpkgs", 451 - "type": "github" 452 - } 453 - }, 454 - "nixpkgs_2": { 455 - "locked": { 456 - "lastModified": 1744463964, 457 - "narHash": "sha256-LWqduOgLHCFxiTNYi3Uj5Lgz0SR+Xhw3kr/3Xd0GPTM=", 163 + "lastModified": 1745930157, 164 + "narHash": "sha256-y3h3NLnzRSiUkYpnfvnS669zWZLoqqI6NprtLQ+5dck=", 458 165 "owner": "NixOS", 459 166 "repo": "nixpkgs", 460 - "rev": "2631b0b7abcea6e640ce31cd78ea58910d31e650", 167 + "rev": "46e634be05ce9dc6d4db8e664515ba10b78151ae", 461 168 "type": "github" 462 169 }, 463 170 "original": { ··· 467 174 "type": "github" 468 175 } 469 176 }, 470 - "nixpkgs_3": { 471 - "locked": { 472 - "lastModified": 1735554305, 473 - "narHash": "sha256-zExSA1i/b+1NMRhGGLtNfFGXgLtgo+dcuzHzaWA6w3Q=", 474 - "owner": "nixos", 475 - "repo": "nixpkgs", 476 - "rev": "0e82ab234249d8eee3e8c91437802b32c74bb3fd", 477 - "type": "github" 478 - }, 479 - "original": { 480 - "owner": "nixos", 481 - "ref": "nixpkgs-unstable", 482 - "repo": "nixpkgs", 483 - "type": "github" 484 - } 485 - }, 486 - "plasma-manager": { 487 - "inputs": { 488 - "home-manager": [ 489 - "home-manager" 490 - ], 491 - "nixpkgs": [ 492 - "nixpkgs" 493 - ] 494 - }, 495 - "locked": { 496 - "lastModified": 1742765550, 497 - "narHash": "sha256-2vVIh2JrL6GAGfgCeY9e6iNKrBjs0Hw3bGQEAbwVs68=", 498 - "owner": "nix-community", 499 - "repo": "plasma-manager", 500 - "rev": "b70be387276e632fe51232887f9e04e2b6ef8c16", 501 - "type": "github" 502 - }, 503 - "original": { 504 - "owner": "nix-community", 505 - "repo": "plasma-manager", 506 - "type": "github" 507 - } 508 - }, 509 - "pre-commit-hooks-nix": { 510 - "inputs": { 511 - "flake-compat": [ 512 - "lanzaboote", 513 - "flake-compat" 514 - ], 515 - "gitignore": "gitignore", 516 - "nixpkgs": [ 517 - "lanzaboote", 518 - "nixpkgs" 519 - ] 520 - }, 521 - "locked": { 522 - "lastModified": 1740915799, 523 - "narHash": "sha256-JvQvtaphZNmeeV+IpHgNdiNePsIpHD5U/7QN5AeY44A=", 524 - "owner": "cachix", 525 - "repo": "pre-commit-hooks.nix", 526 - "rev": "42b1ba089d2034d910566bf6b40830af6b8ec732", 527 - "type": "github" 528 - }, 529 - "original": { 530 - "owner": "cachix", 531 - "repo": "pre-commit-hooks.nix", 532 - "type": "github" 533 - } 534 - }, 535 177 "root": { 536 178 "inputs": { 537 - "blender-bin": "blender-bin", 538 - "catppuccin": "catppuccin", 539 - "ctp-discord-compiled": "ctp-discord-compiled", 540 - "ctp-vscode-compiled": "ctp-vscode-compiled", 541 - "fenix": "fenix", 542 - "firefox-addons": "firefox-addons", 543 179 "flake-parts": "flake-parts", 544 - "flake-utils": "flake-utils", 545 180 "ghostty": "ghostty", 546 181 "hjem": "hjem", 547 182 "hjem-rum": "hjem-rum", 548 - "home-manager": "home-manager", 549 - "krunner-nix": "krunner-nix", 550 - "lanzaboote": "lanzaboote", 551 - "nix-darwin": "nix-darwin", 552 183 "nix-index-database": "nix-index-database", 553 184 "nixos-hardware": "nixos-hardware", 554 - "nixpkgs": "nixpkgs_2", 555 - "plasma-manager": "plasma-manager", 556 - "treefmt-nix": "treefmt-nix" 557 - } 558 - }, 559 - "rust-analyzer-src": { 560 - "flake": false, 561 - "locked": { 562 - "lastModified": 1742296961, 563 - "narHash": "sha256-gCpvEQOrugHWLimD1wTFOJHagnSEP6VYBDspq96Idu0=", 564 - "owner": "rust-lang", 565 - "repo": "rust-analyzer", 566 - "rev": "15d87419f1a123d8f888d608129c3ce3ff8f13d4", 567 - "type": "github" 568 - }, 569 - "original": { 570 - "owner": "rust-lang", 571 - "ref": "nightly", 572 - "repo": "rust-analyzer", 573 - "type": "github" 574 - } 575 - }, 576 - "rust-overlay": { 577 - "inputs": { 578 - "nixpkgs": [ 579 - "lanzaboote", 580 - "nixpkgs" 581 - ] 582 - }, 583 - "locked": { 584 - "lastModified": 1741228283, 585 - "narHash": "sha256-VzqI+k/eoijLQ5am6rDFDAtFAbw8nltXfLBC6SIEJAE=", 586 - "owner": "oxalica", 587 - "repo": "rust-overlay", 588 - "rev": "38e9826bc4296c9daf18bc1e6aa299f3e932a403", 589 - "type": "github" 590 - }, 591 - "original": { 592 - "owner": "oxalica", 593 - "repo": "rust-overlay", 594 - "type": "github" 185 + "nixpkgs": "nixpkgs" 595 186 } 596 187 }, 597 188 "systems": { ··· 606 197 "original": { 607 198 "owner": "nix-systems", 608 199 "repo": "default", 609 - "type": "github" 610 - } 611 - }, 612 - "systems_2": { 613 - "locked": { 614 - "lastModified": 1681028828, 615 - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 616 - "owner": "nix-systems", 617 - "repo": "default", 618 - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 619 - "type": "github" 620 - }, 621 - "original": { 622 - "owner": "nix-systems", 623 - "repo": "default", 624 - "type": "github" 625 - } 626 - }, 627 - "treefmt-nix": { 628 - "inputs": { 629 - "nixpkgs": "nixpkgs_3" 630 - }, 631 - "locked": { 632 - "lastModified": 1743748085, 633 - "narHash": "sha256-uhjnlaVTWo5iD3LXics1rp9gaKgDRQj6660+gbUU3cE=", 634 - "owner": "numtide", 635 - "repo": "treefmt-nix", 636 - "rev": "815e4121d6a5d504c0f96e5be2dd7f871e4fd99d", 637 - "type": "github" 638 - }, 639 - "original": { 640 - "owner": "numtide", 641 - "repo": "treefmt-nix", 642 200 "type": "github" 643 201 } 644 202 },
+51 -85
flake.nix
··· 6 6 7 7 # NOTE: please keep this in alphabetical order. 8 8 9 - blender-bin = { 10 - url = "blender-bin"; 11 - inputs.nixpkgs.follows = "nixpkgs"; 12 - }; 13 - 14 - catppuccin.url = "github:catppuccin/nix"; 15 - 16 - ctp-discord-compiled = { 17 - url = "github:catppuccin/discord/gh-pages"; 18 - flake = false; 19 - }; 20 - 21 - ctp-vscode-compiled = { 22 - url = "github:catppuccin/vscode/catppuccin-vsc-v3.14.0"; 23 - flake = false; 24 - }; 25 - 26 - fenix = { 27 - url = "github:nix-community/fenix/monthly"; 28 - inputs.nixpkgs.follows = "nixpkgs"; 29 - }; 9 + # ctp-discord-compiled = { 10 + # url = "github:catppuccin/discord/gh-pages"; 11 + # flake = false; 12 + # }; 30 13 31 - firefox-addons = { 32 - url = "sourcehut:~rycee/nur-expressions?dir=pkgs/firefox-addons"; 33 - inputs = { 34 - nixpkgs.follows = "nixpkgs"; 35 - flake-utils.follows = "flake-utils"; 36 - }; 37 - }; 14 + # ctp-vscode-compiled = { 15 + # url = "github:catppuccin/vscode/catppuccin-vsc-v3.14.0"; 16 + # flake = false; 17 + # }; 38 18 39 19 flake-parts = { 40 20 url = "github:hercules-ci/flake-parts"; 41 21 inputs.nixpkgs-lib.follows = "nixpkgs"; 42 22 }; 43 - 44 - # Only for input deduplication 45 - flake-utils.url = "github:numtide/flake-utils"; 46 23 47 24 ghostty = { 48 25 url = "github:pluiedev/ghostty/edge"; ··· 53 30 }; 54 31 55 32 hjem = { 56 - url = "github:feel-co/hjem"; 57 - inputs.nixpkgs.follows = "nixpkgs"; 33 + url = "github:feel-co/hjem"; 34 + inputs.nixpkgs.follows = "nixpkgs"; 58 35 }; 59 36 60 37 hjem-rum = { 61 - url = "github:snugnug/hjem-rum"; 62 - inputs.nixpkgs.follows = "nixpkgs"; 63 - }; 64 - 65 - krunner-nix = { 66 - url = "github:pluiedev/krunner-nix"; 38 + url = "github:snugnug/hjem-rum"; 67 39 inputs.nixpkgs.follows = "nixpkgs"; 68 40 }; 69 41 70 - lanzaboote = { 71 - url = "github:nix-community/lanzaboote"; 72 - inputs = { 73 - flake-parts.follows = "flake-parts"; 74 - nixpkgs.follows = "nixpkgs"; 75 - }; 76 - }; 77 - 78 - home-manager = { 79 - url = "github:nix-community/home-manager"; 80 - inputs.nixpkgs.follows = "nixpkgs"; 81 - }; 42 + # lanzaboote = { 43 + # url = "github:nix-community/lanzaboote"; 44 + # inputs = { 45 + # flake-parts.follows = "flake-parts"; 46 + # nixpkgs.follows = "nixpkgs"; 47 + # }; 48 + # }; 82 49 83 - nix-darwin = { 84 - url = "github:LnL7/nix-darwin"; 85 - inputs.nixpkgs.follows = "nixpkgs"; 86 - }; 50 + # home-manager = { 51 + # url = "github:nix-community/home-manager"; 52 + # inputs.nixpkgs.follows = "nixpkgs"; 53 + # }; 87 54 88 55 nix-index-database = { 89 56 url = "github:nix-community/nix-index-database"; ··· 92 59 93 60 nixos-hardware.url = "github:NixOS/nixos-hardware/master"; 94 61 95 - plasma-manager = { 96 - url = "github:nix-community/plasma-manager"; 97 - inputs = { 98 - home-manager.follows = "home-manager"; 99 - nixpkgs.follows = "nixpkgs"; 100 - }; 101 - }; 102 - 103 - treefmt-nix.url = "github:numtide/treefmt-nix"; 62 + # plasma-manager = { 63 + # url = "github:nix-community/plasma-manager"; 64 + # inputs = { 65 + # home-manager.follows = "home-manager"; 66 + # nixpkgs.follows = "nixpkgs"; 67 + # }; 68 + # }; 104 69 }; 105 70 106 71 outputs = 107 72 inputs: 108 73 let 74 + inherit (inputs.nixpkgs) lib; 109 75 packages' = 110 76 pkgs': 111 77 pkgs'.lib.packagesFromDirectoryRecursive { ··· 114 80 }; 115 81 in 116 82 inputs.flake-parts.lib.mkFlake { inherit inputs; } { 117 - imports = [ 118 - ./hm-modules 119 - ./systems 120 - ]; 121 - systems = [ 122 - "x86_64-linux" 123 - "x86_64-darwin" 124 - ]; 83 + imports = [ ./systems ]; 125 84 126 - flake.overlays.default = _: packages'; 85 + systems = lib.systems.flakeExposed; 86 + 87 + flake = { 88 + overlays.default = _: packages'; 89 + hjemModules = { 90 + hjem-ext.imports = lib.fileset.toList ( 91 + lib.fileset.fileFilter (file: file.hasExt "nix") ./modules/hjem-ext 92 + ); 93 + hjem-ctp.imports = lib.fileset.toList ( 94 + lib.fileset.fileFilter (file: file.hasExt "nix") ./modules/hjem-ctp 95 + ); 96 + }; 97 + }; 127 98 128 99 perSystem = 129 100 { pkgs, ... }: 130 101 { 131 102 packages = packages' pkgs; 132 - }; 133 103 134 - # perSystem = 135 - # { pkgs, ... }: 136 - # let 137 - # treefmt = inputs.treefmt-nix.lib.evalModule pkgs ./treefmt.nix; 138 - # formatter = treefmt.config.build.wrapper; 139 - # in 140 - # { 141 - # inherit formatter; 142 - # devShells.default = pkgs.mkShell { packages = [ formatter ]; }; 143 - # checks.formatting = treefmt.config.build.check inputs.self; 144 - # }; 104 + devShells.default = pkgs.mkShell { 105 + packages = with pkgs; [ 106 + nil 107 + nixfmt-rfc-style 108 + ]; 109 + }; 110 + }; 145 111 }; 146 112 }
-19
hm-modules/ctp-plus/default.nix
··· 1 - { inputs, ... }: 2 - { 3 - config, 4 - lib, 5 - pkgs, 6 - ... 7 - }@args: 8 - let 9 - args' = args // { 10 - inherit inputs; 11 - ctpLib = import "${inputs.catppuccin}/modules/lib" { inherit config lib pkgs; }; 12 - }; 13 - in 14 - { 15 - imports = map (p: import p args') [ 16 - ./plasma.nix 17 - ./vencord.nix 18 - ]; 19 - }
hm-modules/ctp-plus/plasma.nix modules/hjem-ctp/plasma.nix
hm-modules/ctp-plus/vencord.nix modules/hjem-ctp/vencord.nix
-10
hm-modules/default.nix
··· 1 - { flake-parts-lib, moduleWithSystem, inputs, ... }: 2 - let 3 - inherit (flake-parts-lib) importApply; 4 - in 5 - { 6 - flake.hmModules = { 7 - ctp-plus = importApply ./ctp-plus { inherit inputs; }; 8 - hm-plus = moduleWithSystem (import ./hm-plus); 9 - }; 10 - }
hm-modules/hm-plus/README.md modules/hjem-ext/README.md
-6
hm-modules/hm-plus/default.nix
··· 1 - { inputs' }: { 2 - imports = [ 3 - ./programs 4 - ]; 5 - _module.args = { inherit inputs'; }; 6 - }
-48
hm-modules/hm-plus/programs/1password.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) 9 - mkDefault 10 - mkIf 11 - mkEnableOption 12 - mkPackageOption 13 - optional 14 - getExe' 15 - ; 16 - 17 - cfg = config.programs._1password; 18 - in 19 - { 20 - options.programs._1password = { 21 - enable = mkEnableOption "1Password"; 22 - 23 - package = mkPackageOption pkgs "1Password" { default = [ "_1password-gui" ]; }; 24 - 25 - autostart = mkEnableOption "autostarting 1Password"; 26 - 27 - enableSshAgent = mkEnableOption "1Password's SSH agent"; 28 - }; 29 - config = mkIf cfg.enable { 30 - home.packages = 31 - [ cfg.package ] 32 - ++ optional cfg.autostart ( 33 - pkgs.makeAutostartItem { 34 - name = "1password"; 35 - inherit (cfg) package; 36 - } 37 - ); 38 - 39 - programs = mkIf cfg.enableSshAgent { 40 - git.signer = getExe' cfg.package "op-ssh-sign"; 41 - ssh.enable = mkDefault true; 42 - ssh.extraConfig = "IdentityAgent ${config.home.homeDirectory}/.1password/agent.sock"; 43 - }; 44 - 45 - # Some tools like Jujutsu don't care about ~/.ssh/config, so we have to set this manually 46 - home.sessionVariables.SSH_AUTH_SOCK = mkIf cfg.enableSshAgent "${config.home.homeDirectory}/.1password/agent.sock"; 47 - }; 48 - }
-10
hm-modules/hm-plus/programs/default.nix
··· 1 - { 2 - imports = [ 3 - ./1password.nix 4 - ./discord.nix 5 - ./fcitx5 6 - ./git.nix 7 - ./moar.nix 8 - ./vesktop.nix 9 - ]; 10 - }
-73
hm-modules/hm-plus/programs/discord.nix
··· 1 - { 2 - config, 3 - lib, 4 - pkgs, 5 - ... 6 - }: 7 - let 8 - inherit (lib) 9 - mkEnableOption 10 - mkPackageOption 11 - mkOption 12 - mkIf 13 - optionalAttrs 14 - types 15 - ; 16 - cfg = config.programs.discord; 17 - format = pkgs.formats.json { }; 18 - in 19 - { 20 - options.programs.discord = { 21 - enable = mkEnableOption "Discord"; 22 - 23 - package = mkPackageOption pkgs "Discord" { default = [ "discord" ]; }; 24 - 25 - settings = mkOption { 26 - inherit (format) type; 27 - description = '' 28 - Configuration written to {file}`$XDG_CONFIG_HOME/discord/settings.json`. 29 - ''; 30 - default = { }; 31 - }; 32 - 33 - openAsar.enable = mkEnableOption "OpenASAR"; 34 - 35 - vencord = { 36 - enable = mkEnableOption "Vencord"; 37 - 38 - settings = mkOption { 39 - inherit (format) type; 40 - description = '' 41 - Configuration written to {file}`$XDG_CONFIG_HOME/Vencord/settings/settings.json`. 42 - ''; 43 - default = { }; 44 - }; 45 - 46 - css = mkOption { 47 - type = types.lines; 48 - description = '' 49 - Style sheet written to {file}`$XDG_CONFIG_HOME/Vencord/settings/quickCss.css`. 50 - ''; 51 - default = ""; 52 - }; 53 - }; 54 - }; 55 - 56 - config = mkIf cfg.enable { 57 - home.packages = [ 58 - (cfg.package.override { 59 - withOpenASAR = cfg.openAsar.enable; 60 - withVencord = cfg.vencord.enable; 61 - }) 62 - ]; 63 - 64 - xdg.configFile = 65 - { 66 - "discord/settings.json".source = format.generate "discord-settings.json" cfg.settings; 67 - } 68 - // optionalAttrs cfg.vencord.enable { 69 - "Vencord/settings/settings.json".source = format.generate "vencord-settings.json" cfg.vencord.settings; 70 - "Vencord/settings/quickCss.css".text = cfg.vencord.css; 71 - }; 72 - }; 73 - }
-137
hm-modules/hm-plus/programs/fcitx5/default.nix
··· 1 - { 2 - config, 3 - osConfig, 4 - lib, 5 - pkgs, 6 - ... 7 - }: 8 - let 9 - inherit (lib) 10 - mkMerge 11 - mkIf 12 - mkOption 13 - types 14 - literalExpression 15 - ; 16 - im = config.i18n.inputMethod; 17 - cfg = im.fcitx5; 18 - 19 - fcitx5Package = 20 - if cfg.plasma6Support then 21 - pkgs.qt6Packages.fcitx5-with-addons.override { inherit (cfg) addons; } 22 - else 23 - pkgs.libsForQt5.fcitx5-with-addons; 24 - 25 - fcitx5Package' = fcitx5Package.override { inherit (cfg) addons; }; 26 - 27 - format = pkgs.formats.ini { }; 28 - formatWithGlobalSection = pkgs.formats.iniWithGlobalSection { }; 29 - in 30 - { 31 - imports = [ ./rime.nix ]; 32 - 33 - options.i18n.inputMethod.fcitx5 = { 34 - plasma6Support = mkOption { 35 - type = types.bool; 36 - default = osConfig.services.desktopManager.plasma6.enable; 37 - defaultText = literalExpression "config.services.desktopManager.plasma6.enable"; 38 - description = '' 39 - Use qt6 versions of fcitx5 packages. 40 - Required for configuring fcitx5 in KDE System Settings. 41 - ''; 42 - }; 43 - quickPhrase = mkOption { 44 - type = with types; attrsOf str; 45 - default = { }; 46 - example = literalExpression '' 47 - { 48 - smile = "(・∀・)"; 49 - angry = "( ̄ー ̄)"; 50 - } 51 - ''; 52 - description = "Quick phrases."; 53 - }; 54 - quickPhraseFiles = mkOption { 55 - type = with types; attrsOf path; 56 - default = { }; 57 - example = literalExpression '' 58 - { 59 - words = ./words.mb; 60 - numbers = ./numbers.mb; 61 - } 62 - ''; 63 - description = "Quick phrase files."; 64 - }; 65 - settings = { 66 - globalOptions = mkOption { 67 - type = types.submodule { freeformType = format.type; }; 68 - default = { }; 69 - description = '' 70 - The global options in `config` file in ini format. 71 - ''; 72 - }; 73 - inputMethod = mkOption { 74 - type = types.submodule { freeformType = format.type; }; 75 - default = { }; 76 - description = '' 77 - The input method configure in `profile` file in ini format. 78 - ''; 79 - }; 80 - addons = mkOption { 81 - type = with types; (attrsOf anything); 82 - default = { }; 83 - description = '' 84 - The addon configures in `conf` folder in ini format with global sections. 85 - Each item is written to the corresponding file. 86 - ''; 87 - example = literalExpression "{ pinyin.globalSection.EmojiEnabled = \"True\"; }"; 88 - }; 89 - }; 90 - ignoreUserConfig = lib.mkOption { 91 - type = lib.types.bool; 92 - default = false; 93 - description = '' 94 - Ignore the user configures. **Warning**: When this is enabled, the 95 - user config files are totally ignored and the user dict can't be saved 96 - and loaded. 97 - ''; 98 - }; 99 - }; 100 - 101 - config = mkIf (im.enabled == "fcitx5") { 102 - # override HM defaults 103 - i18n.inputMethod.package = lib.mkForce fcitx5Package'; 104 - 105 - i18n.inputMethod.fcitx5.addons = 106 - lib.optionals (cfg.quickPhrase != { }) [ 107 - (pkgs.writeTextDir "share/fcitx5/data/QuickPhrase.mb" ( 108 - lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value: "${name} ${value}") cfg.quickPhrase) 109 - )) 110 - ] 111 - ++ lib.optionals (cfg.quickPhraseFiles != { }) [ 112 - (pkgs.linkFarm "quickPhraseFiles" ( 113 - lib.mapAttrs' ( 114 - name: value: lib.nameValuePair "share/fcitx5/data/quickphrase.d/${name}.mb" value 115 - ) cfg.quickPhraseFiles 116 - )) 117 - ]; 118 - 119 - xdg.configFile = 120 - let 121 - optionalFile = 122 - p: f: v: 123 - lib.optionalAttrs (v != { }) { "fcitx5/${p}".source = f p v; }; 124 - in 125 - lib.attrsets.mergeAttrsList [ 126 - (optionalFile "config" format cfg.settings.globalOptions) 127 - (optionalFile "profile" format cfg.settings.inputMethod) 128 - (lib.concatMapAttrs ( 129 - name: value: optionalFile "conf/${name}.conf" formatWithGlobalSection value 130 - ) cfg.settings.addons) 131 - ]; 132 - 133 - home.sessionVariables = mkMerge [ 134 - (mkIf cfg.ignoreUserConfig { SKIP_FCITX_USER_PATH = "1"; }) 135 - ]; 136 - }; 137 - }
-46
hm-modules/hm-plus/programs/fcitx5/rime.nix
··· 1 - { 2 - config, 3 - lib, 4 - pkgs, 5 - ... 6 - }: 7 - let 8 - inherit (lib) 9 - mkIf 10 - mkEnableOption 11 - mkOption 12 - mapAttrs' 13 - nameValuePair 14 - types 15 - ; 16 - cfg = config.i18n.inputMethod.fcitx5.rime; 17 - format = pkgs.formats.yaml { }; 18 - in 19 - { 20 - options.i18n.inputMethod.fcitx5.rime = { 21 - enable = mkEnableOption "the Rime input engine for Fcitx5"; 22 - 23 - dataPkgs = mkOption { 24 - type = types.listOf types.package; 25 - default = [ pkgs.rime-data ]; 26 - }; 27 - 28 - settings = mkOption { 29 - inherit (format) type; 30 - default = { }; 31 - example = { 32 - default.patch.schema_list = [ 33 - { schema = "luna_pinyin_simp"; } 34 - { schema = "luna_pinyin"; } 35 - ]; 36 - }; 37 - }; 38 - }; 39 - 40 - config = mkIf cfg.enable { 41 - i18n.inputMethod.fcitx5.addons = [ (pkgs.fcitx5-rime.override { rimeDataPkgs = cfg.dataPkgs; }) ]; 42 - xdg.dataFile = mapAttrs' ( 43 - n: v: nameValuePair "fcitx5/rime/${n}.custom.yaml" { source = format.generate n v; } 44 - ) cfg.settings; 45 - }; 46 - }
-45
hm-modules/hm-plus/programs/git.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) 9 - getExe 10 - getExe' 11 - mkIf 12 - mkOption 13 - types 14 - ; 15 - cfg = config.programs.git; 16 - in 17 - { 18 - options.programs.git = { 19 - signingFormat = mkOption { 20 - type = types.enum [ 21 - "openpgp" 22 - "ssh" 23 - "x509" 24 - ]; 25 - default = "openpgp"; 26 - }; 27 - 28 - signer = mkOption { 29 - type = types.path; 30 - default = 31 - { 32 - openpgp = getExe' pkgs.gnupg "gpg2"; 33 - ssh = getExe pkgs.openssh; 34 - x509 = getExe' pkgs.gnupg "gpgsm"; 35 - } 36 - .${cfg.signingFormat}; 37 - }; 38 - }; 39 - config = mkIf cfg.enable { 40 - programs.git.extraConfig.gpg = { 41 - format = cfg.signingFormat; 42 - ${cfg.signingFormat}.program = cfg.signer; 43 - }; 44 - }; 45 - }
+5 -4
hm-modules/hm-plus/programs/moar.nix modules/hjem-ext/programs/moar.nix
··· 5 5 ... 6 6 }: 7 7 let 8 - cfg = config.programs.moar; 8 + cfg = config.ext.programs.moar; 9 9 10 10 toFlag = k: v: if lib.isBool v then 11 11 lib.optionalString (v) "-${k}" ··· 16 16 17 17 in 18 18 { 19 - options.programs.moar = { 19 + options.ext.programs.moar = { 20 20 enable = lib.mkEnableOption "Moar"; 21 21 22 22 package = lib.mkPackageOption pkgs "moar" {}; ··· 32 32 }; 33 33 }; 34 34 35 - config = lib.mkIf (cfg.enable) { 36 - home.sessionVariables = { 35 + config = lib.mkIf cfg.enable { 36 + packages = [ cfg.package ]; 37 + environment.sessionVariables = { 37 38 PAGER = "moar"; 38 39 MOAR = lib.concatStringsSep " " (lib.mapAttrsToList toFlag cfg.settings); 39 40 };
+17 -9
hm-modules/hm-plus/programs/vesktop.nix modules/hjem-ext/programs/vesktop.nix
··· 13 13 types 14 14 optionalAttrs 15 15 ; 16 - cfg = config.programs.vesktop; 16 + cfg = config.ext.programs.vesktop; 17 17 format = pkgs.formats.json { }; 18 18 in 19 19 { 20 - options.programs.vesktop = { 20 + options.ext.programs.vesktop = { 21 21 enable = mkEnableOption "Vesktop"; 22 22 23 23 package = mkPackageOption pkgs "Vesktop" { default = [ "vesktop" ]; }; ··· 58 58 }; 59 59 60 60 config = mkIf cfg.enable { 61 - home.packages = [ (cfg.package.override { withSystemVencord = cfg.vencord.useSystemPackage; }) ]; 61 + packages = [ 62 + (cfg.package.override { 63 + withSystemVencord = cfg.vencord.useSystemPackage; 64 + }) 65 + ]; 62 66 63 - xdg.configFile = { 64 - "vesktop/settings.json".source = format.generate "vesktop-settings.json" cfg.settings; 65 - } // optionalAttrs cfg.vencord.enable { 66 - "vesktop/settings/settings.json".source = format.generate "vencord-settings.json" cfg.vencord.settings; 67 - "vesktop/settings/quickCss.css".text = cfg.vencord.css; 68 - }; 67 + files = 68 + { 69 + ".config/vesktop/settings.json".source = format.generate "vesktop-settings.json" cfg.settings; 70 + } 71 + // optionalAttrs cfg.vencord.enable { 72 + ".config/vesktop/settings/settings.json".source = 73 + format.generate "vencord-settings.json" cfg.vencord.settings; 74 + 75 + ".config/vesktop/settings/quickCss.css".text = cfg.vencord.css; 76 + }; 69 77 }; 70 78 }
+31
modules/hjem-ext/programs/direnv.nix
··· 1 + { 2 + config, 3 + pkgs, 4 + lib, 5 + ... 6 + }: 7 + let 8 + cfg = config.ext.programs.direnv; 9 + in 10 + { 11 + options.ext.programs.direnv = { 12 + enable = lib.mkEnableOption "direnv"; 13 + package = lib.mkPackageOption pkgs "direnv" { }; 14 + 15 + nix-direnv = { 16 + enable = lib.mkEnableOption "nix-direnv"; 17 + package = lib.mkPackageOption pkgs "nix-direnv" { }; 18 + }; 19 + }; 20 + 21 + config = lib.mkIf cfg.enable { 22 + packages = [ cfg.package ]; 23 + 24 + rum.programs.fish.earlyConfigFiles.direnv = '' 25 + ${lib.getExe cfg.package} hook fish | source 26 + ''; 27 + 28 + files.".config/direnv/lib/hm-nix-direnv.sh".source = 29 + lib.mkIf cfg.nix-direnv.enable "${cfg.nix-direnv.package}/share/nix-direnv/direnvrc"; 30 + }; 31 + }
+29
modules/hjem-ext/programs/git.nix
··· 1 + { 2 + config, 3 + pkgs, 4 + lib, 5 + ... 6 + }: 7 + let 8 + cfg = config.ext.programs.git; 9 + format = pkgs.formats.gitIni { }; 10 + in 11 + { 12 + options.ext.programs.git = { 13 + enable = lib.mkEnableOption "Git"; 14 + package = lib.mkPackageOption pkgs "git" { }; 15 + 16 + settings = lib.mkOption { 17 + type = lib.types.submodule { 18 + freeformType = format.type; 19 + }; 20 + default = { }; 21 + }; 22 + }; 23 + 24 + config = lib.mkIf cfg.enable { 25 + packages = [ cfg.package ]; 26 + files.".config/git/config".source = lib.mkIf (cfg.settings != { }) 27 + (format.generate "git-config" cfg.settings); 28 + }; 29 + }
+44
modules/hjem-ext/programs/hyfetch.nix
··· 1 + { 2 + config, 3 + pkgs, 4 + lib, 5 + ... 6 + }: 7 + let 8 + cfg = config.ext.programs.hyfetch; 9 + format = pkgs.formats.json { }; 10 + configFile = format.generate "hyfetch.json" cfg.settings; 11 + in 12 + { 13 + options.ext.programs.hyfetch = { 14 + enable = lib.mkEnableOption "Hyfetch"; 15 + package = lib.mkPackageOption pkgs "hyfetch" { }; 16 + 17 + settings = lib.mkOption { 18 + type = lib.types.submodule { 19 + freeformType = format.type; 20 + 21 + options = { 22 + backend = lib.mkOption { 23 + type = lib.types.enum [ 24 + "neofetch" 25 + "fastfetch" 26 + "qwqfetch" 27 + ]; 28 + }; 29 + }; 30 + }; 31 + default = { }; 32 + }; 33 + }; 34 + 35 + config = lib.mkIf cfg.enable { 36 + packages = 37 + [ cfg.package ] 38 + ++ lib.optional (cfg.settings.backend == "fastfetch") pkgs.fastfetch 39 + ++ lib.optional (cfg.settings.backend == "neofetch") pkgs.neofetch; 40 + # TODO: add qwqfetch when it's added to nixpkgs 41 + 42 + files.".config/hyfetch.json".source = lib.mkIf (cfg.settings != { }) configFile; 43 + }; 44 + }
+29
modules/hjem-ext/programs/jujutsu.nix
··· 1 + { 2 + config, 3 + pkgs, 4 + lib, 5 + ... 6 + }: 7 + let 8 + cfg = config.ext.programs.jujutsu; 9 + format = pkgs.formats.toml { }; 10 + in 11 + { 12 + options.ext.programs.jujutsu = { 13 + enable = lib.mkEnableOption "Jujutsu"; 14 + package = lib.mkPackageOption pkgs "jujutsu" { }; 15 + 16 + settings = lib.mkOption { 17 + type = lib.types.submodule { 18 + freeformType = format.type; 19 + }; 20 + default = { }; 21 + }; 22 + }; 23 + 24 + config = lib.mkIf cfg.enable { 25 + packages = [ cfg.package ]; 26 + files.".config/jj/config.toml".source = lib.mkIf (cfg.settings != { }) 27 + (format.generate "jj-config.toml" cfg.settings); 28 + }; 29 + }
-19
packages/catppuccin-fcitx5/package.nix
··· 1 - { stdenvNoCC, fetchFromGitHub }: 2 - stdenvNoCC.mkDerivation { 3 - pname = "catppuccin-fcitx5"; 4 - version = "2022-10-05"; 5 - 6 - src = fetchFromGitHub { 7 - owner = "catppuccin"; 8 - repo = "fcitx5"; 9 - rev = "ce244cfdf43a648d984719fdfd1d60aab09f5c97"; 10 - hash = "sha256-uFaCbyrEjv4oiKUzLVFzw+UY54/h7wh2cntqeyYwGps="; 11 - }; 12 - 13 - installPhase = '' 14 - runHook preInstall 15 - mkdir -p $out/share/fcitx5 16 - cp -r src $out/share/fcitx5/themes 17 - runHook postInstall 18 - ''; 19 - }
+22
packages/catppuccin-fish/package.nix
··· 1 + { 2 + stdenvNoCC, 3 + fetchFromGitHub, 4 + }: 5 + stdenvNoCC.mkDerivation { 6 + pname = "catppuccin-fish"; 7 + version = "0-unstable-2025-03-01"; 8 + 9 + src = fetchFromGitHub { 10 + owner = "catppuccin"; 11 + repo = "fish"; 12 + rev = "6a85af2ff722ad0f9fbc8424ea0a5c454661dfed"; 13 + hash = "sha256-Oc0emnIUI4LV7QJLs4B2/FQtCFewRFVp7EDv8GawFsA="; 14 + }; 15 + 16 + installPhase = '' 17 + runHook preInstall 18 + mkdir -p $out/share/fish 19 + cp -r themes $out/share/fish/themes 20 + runHook postInstall 21 + ''; 22 + }
-9
roles/audio/default.nix
··· 1 - { lib, ... }: 2 - let 3 - inherit (lib) mkEnableOption; 4 - in 5 - { 6 - options.roles.audio.enable = mkEnableOption "audio support" // { 7 - default = true; 8 - }; 9 - }
-21
roles/audio/nixos.nix
··· 1 - { config, lib, ... }: 2 - let 3 - cfg = config.roles.audio; 4 - inherit (lib) mkIf; 5 - in 6 - { 7 - config = mkIf cfg.enable { 8 - services.pulseaudio.enable = false; 9 - security.rtkit.enable = true; 10 - 11 - roles.base.user.extraGroups = [ "rtkit" ]; 12 - 13 - services.pipewire = { 14 - enable = true; 15 - wireplumber.enable = true; 16 - alsa.enable = true; 17 - jack.enable = true; 18 - pulse.enable = true; 19 - }; 20 - }; 21 - }
-86
roles/base/default.nix
··· 1 - { config, lib, ... }: 2 - let 3 - inherit (lib) 4 - mkAliasOptionModule 5 - mkEnableOption 6 - mkOption 7 - types 8 - optional 9 - ; 10 - 11 - cfg = config.roles.base; 12 - in 13 - { 14 - options.roles.base = { 15 - username = mkOption { 16 - type = types.str; 17 - example = "cavej"; 18 - description = "The primary user's internal user name."; 19 - }; 20 - realName = mkOption { 21 - type = types.nullOr types.str; 22 - default = null; 23 - example = "Cave"; 24 - description = "The primary user's real name."; 25 - }; 26 - fullName = mkOption { 27 - type = types.nullOr types.str; 28 - default = null; 29 - example = "Cave Johnson"; 30 - description = "The primary user's full name."; 31 - }; 32 - publicKey = mkOption { 33 - type = types.nullOr types.str; 34 - default = null; 35 - description = "The primary user's public key."; 36 - }; 37 - 38 - canSudo = mkEnableOption "admin permissions for the primary user"; 39 - }; 40 - 41 - imports = [ 42 - (mkAliasOptionModule [ "hm" ] [ 43 - "home-manager" 44 - "users" 45 - cfg.username 46 - ]) 47 - (mkAliasOptionModule 48 - [ 49 - "roles" 50 - "base" 51 - "user" 52 - ] 53 - [ 54 - "users" 55 - "users" 56 - cfg.username 57 - ] 58 - ) 59 - ]; 60 - 61 - config = { 62 - assertions = [ 63 - { 64 - assertion = builtins.hasAttr "username" cfg; 65 - message = "base role username has to be set"; 66 - } 67 - ]; 68 - 69 - nix.settings.trusted-users = optional cfg.canSudo cfg.username; 70 - 71 - home-manager = { 72 - backupFileExtension = "backup"; 73 - useGlobalPkgs = true; 74 - useUserPackages = true; 75 - }; 76 - 77 - hm = { 78 - home = { 79 - inherit (cfg) username; 80 - homeDirectory = config.roles.base.user.home; 81 - }; 82 - 83 - programs.home-manager.enable = true; 84 - }; 85 - }; 86 - }
-18
roles/base/nixos.nix
··· 1 - { config, lib, ... }: 2 - let 3 - inherit (lib.lists) optional; 4 - 5 - cfg = config.roles.base; 6 - in 7 - { 8 - config = { 9 - roles.base.user = { 10 - isNormalUser = true; 11 - description = cfg.realName; 12 - extraGroups = optional cfg.canSudo "wheel"; 13 - home = "/home/${cfg.username}"; 14 - }; 15 - 16 - hm.home.stateVersion = config.system.stateVersion; 17 - }; 18 - }
-13
roles/boot/default.nix
··· 1 - { lib, ... }: 2 - let 3 - inherit (lib) mkEnableOption; 4 - in 5 - { 6 - imports = [ ./lanzaboote ]; 7 - 8 - options.roles.boot = { 9 - enable = mkEnableOption "boot settings" // { 10 - default = true; 11 - }; 12 - }; 13 - }
-20
roles/boot/lanzaboote/default.nix
··· 1 - { 2 - config, 3 - lib, 4 - inputs, 5 - ... 6 - }: 7 - { 8 - imports = [ inputs.lanzaboote.nixosModules.lanzaboote ]; 9 - 10 - options.roles.boot.lanzaboote.enable = lib.mkEnableOption "Lanzaboote, a secure boot implementation for NixOS"; 11 - 12 - config = lib.mkIf config.roles.boot.lanzaboote.enable { 13 - boot.lanzaboote = { 14 - enable = true; 15 - pkiBundle = "/etc/secureboot"; 16 - }; 17 - 18 - boot.loader.systemd-boot.enable = lib.mkForce false; 19 - }; 20 - }
-17
roles/boot/nixos.nix
··· 1 - { config, lib, ... }: 2 - let 3 - cfg = config.roles.boot; 4 - in 5 - { 6 - config = lib.mkIf cfg.enable { 7 - boot.loader = { 8 - systemd-boot = { 9 - enable = true; 10 - editor = false; 11 - consoleMode = "2"; 12 - configurationLimit = 10; 13 - }; 14 - efi.canTouchEfiVariables = true; 15 - }; 16 - }; 17 - }
-11
roles/darwin.nix
··· 1 - inputs@{ lib, ... }: 2 - { 3 - imports = 4 - [ ./. ] 5 - ++ (lib.pipe (import ./. inputs).imports [ 6 - (map (s: /${s}/darwin.nix)) 7 - (builtins.filter builtins.pathExists) 8 - ]); 9 - 10 - system.stateVersion = 4; 11 - }
-8
roles/default.nix
··· 1 - { lib, ... }: 2 - { 3 - imports = lib.pipe ./. [ 4 - builtins.readDir 5 - (lib.filterAttrs (n: ty: ty == "directory" && builtins.pathExists ./${n}/default.nix)) 6 - (lib.mapAttrsToList (n: _: ./${n})) 7 - ]; 8 - }
-71
roles/email/default.nix
··· 1 - { config, lib, ... }: 2 - let 3 - cfg = config.roles.email; 4 - inherit (lib) 5 - mkEnableOption 6 - mkIf 7 - mkOption 8 - types 9 - ; 10 - 11 - serverModule.options = { 12 - host = mkOption { 13 - type = types.str; 14 - example = "imap.migadu.com"; 15 - }; 16 - port = mkOption { 17 - type = types.port; 18 - example = 143; 19 - }; 20 - }; 21 - hostModule.options = { 22 - imap = mkOption { 23 - type = types.submodule serverModule; 24 - example = { 25 - host = "imap.migadu.com"; 26 - port = 993; 27 - }; 28 - }; 29 - smtp = mkOption { 30 - type = types.submodule serverModule; 31 - example = { 32 - host = "smtp.migadu.com"; 33 - port = 465; 34 - }; 35 - }; 36 - }; 37 - emailModule.options = { 38 - primary = mkOption { 39 - type = types.bool; 40 - default = false; 41 - example = true; 42 - }; 43 - realName = mkOption { 44 - type = types.str; 45 - example = "Leah"; 46 - }; 47 - host = mkOption { type = types.submodule hostModule; }; 48 - }; 49 - in 50 - { 51 - options.roles.email = { 52 - enable = mkEnableOption "E-Mail configurations"; 53 - 54 - accounts = mkOption { 55 - type = types.attrsOf (types.submodule emailModule); 56 - default = { }; 57 - }; 58 - }; 59 - 60 - config.hm.accounts.email = 61 - let 62 - accounts = builtins.mapAttrs (address: account: rec { 63 - inherit (account) primary realName; 64 - inherit (account.host) imap smtp; 65 - inherit address; 66 - userName = address; # Use the address as the IMAP/SMTP username by default 67 - thunderbird.enable = true; 68 - }) cfg.accounts; 69 - in 70 - mkIf cfg.enable { inherit accounts; }; 71 - }
-7
roles/fish/default.nix
··· 1 - { lib, ... }: 2 - { 3 - options.roles.fish = { 4 - enable = lib.mkEnableOption "Fish shell"; 5 - defaultShell = lib.mkEnableOption "Fish shell as the user's default shell"; 6 - }; 7 - }
-18
roles/fish/nixos.nix
··· 1 - { 2 - config, 3 - lib, 4 - pkgs, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - cfg = config.roles.fish; 10 - in 11 - { 12 - config = mkIf cfg.enable { 13 - programs.fish.enable = true; 14 - hm.programs.fish.enable = true; 15 - 16 - roles.base.user.shell = mkIf cfg.defaultShell pkgs.fish; 17 - }; 18 - }
-8
roles/fonts/darwin.nix
··· 1 - { config, lib, ... }: 2 - let 3 - cfg = config.roles.fonts; 4 - inherit (lib) mkIf; 5 - in 6 - { 7 - config = mkIf cfg.enable { fonts.fonts = cfg.packages; }; 8 - }
-17
roles/fonts/default.nix
··· 1 - { lib, ... }: 2 - let 3 - inherit (lib) mkEnableOption mkOption types; 4 - in 5 - { 6 - options.roles.fonts = { 7 - enable = mkEnableOption "default fonts"; 8 - packages = mkOption { 9 - type = types.listOf types.package; 10 - default = [ ]; 11 - }; 12 - defaults = mkOption { 13 - type = types.attrsOf (types.listOf types.str); 14 - default = { }; 15 - }; 16 - }; 17 - }
-18
roles/fonts/nixos.nix
··· 1 - { config, lib, ... }: 2 - let 3 - cfg = config.roles.fonts; 4 - inherit (lib) mkIf; 5 - in 6 - { 7 - config = mkIf cfg.enable { 8 - fonts = { 9 - inherit (cfg) packages; 10 - enableDefaultPackages = true; 11 - 12 - fontconfig = { 13 - enable = true; 14 - defaultFonts = cfg.defaults; 15 - }; 16 - }; 17 - }; 18 - }
-37
roles/mirrors/default.nix
··· 1 - { 2 - config, 3 - lib, 4 - ... 5 - }: 6 - let 7 - inherit (lib) 8 - mkEnableOption 9 - mkIf 10 - mkOption 11 - types 12 - ; 13 - 14 - cfg = config.roles.mirrors; 15 - in 16 - { 17 - options.roles.mirrors.chinese = { 18 - enable = mkEnableOption "Chinese mirror sites to speed up downloads in Mainland China"; 19 - 20 - sites = mkOption { 21 - description = "A list of Chinese mirror sites to use."; 22 - type = types.listOf types.str; 23 - default = [ 24 - "https://mirrors.ustc.edu.cn" 25 - "https://mirrors6.tuna.tsinghua.edu.cn" 26 - "https://mirrors.tuna.tsinghua.edu.cn" 27 - # "https://mirror.sjtu.edu.cn" 28 - ]; 29 - }; 30 - }; 31 - 32 - config = mkIf cfg.chinese.enable { 33 - # cache.nixos.org is *unbearably* slow when accessed from Mainland China. 34 - # Fortunately, mirror sites exist... Hooray(?) 35 - nix.settings.substituters = map (url: "${url}/nix-channels/store") cfg.chinese.sites; 36 - }; 37 - }
-11
roles/networking/default.nix
··· 1 - { lib, ... }: 2 - let 3 - inherit (lib) mkEnableOption; 4 - in 5 - { 6 - options.roles.networking = { 7 - enable = mkEnableOption "Networking" // { 8 - default = true; 9 - }; 10 - }; 11 - }
-18
roles/networking/nixos.nix
··· 1 - { 2 - config, 3 - lib, 4 - pkgs, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf getExe; 9 - cfg = config.roles.networking; 10 - in 11 - { 12 - config = mkIf cfg.enable { 13 - networking.networkmanager.enable = true; 14 - roles.base.user.extraGroups = mkIf config.roles.base.canSudo [ "networkmanager" ]; 15 - 16 - hm.home.packages = [ pkgs.networkmanagerapplet ]; 17 - }; 18 - }
-39
roles/nix/default.nix
··· 1 - { lib, inputs, self, ... }: 2 - let 3 - inherit (lib) mkDefault; 4 - in 5 - { 6 - nix = { 7 - registry = { 8 - nixpkgs.flake = inputs.nixpkgs; 9 - n.flake = inputs.nixpkgs; 10 - }; 11 - nixPath = 12 - let 13 - toNixPath = input: "${input}=${inputs.${input}.outPath}"; 14 - in 15 - [ (toNixPath "nixpkgs") ]; 16 - 17 - gc = { 18 - automatic = mkDefault true; 19 - dates = mkDefault "weekly"; 20 - options = mkDefault "--delete-older-than 7d"; 21 - }; 22 - 23 - settings = { 24 - auto-optimise-store = true; 25 - experimental-features = [ 26 - "nix-command" 27 - "flakes" 28 - "auto-allocate-uids" 29 - ]; 30 - trusted-users = [ "@wheel" ]; 31 - }; 32 - }; 33 - nixpkgs = { 34 - # I'm not part of the FSF and I don't care 35 - config.allowUnfree = true; 36 - 37 - overlays = [ self.overlays.default ]; 38 - }; 39 - }
-28
roles/nix/nixos.nix
··· 1 - { 2 - config, 3 - pkgs, 4 - lib, 5 - self, 6 - ... 7 - }: 8 - { 9 - system = { 10 - # Thank @luishfonseca for this 11 - # https://github.com/luishfonseca/dotfiles/blob/ab7625ec406b48493eda701911ad1cd017ce5bc1/modules/upgrade-diff.nix 12 - activationScripts.diff = { 13 - supportsDryActivation = true; 14 - text = '' 15 - ${lib.getExe pkgs.nvd} --nix-bin-dir=${pkgs.nix}/bin diff /run/current-system "$systemConfig" 16 - ''; 17 - }; 18 - 19 - # thanks to @getchoo 20 - autoUpgrade = { 21 - enable = true; 22 - flake = "github:pluiedev/flake#${config.networking.hostName}"; 23 - flags = [ "--refresh" ]; 24 - }; 25 - 26 - configurationRevision = self.rev or self.dirtyRev or "unknown-dirty"; 27 - }; 28 - }
-11
roles/nixos.nix
··· 1 - inputs@{ lib, ... }: 2 - { 3 - imports = 4 - [ ./. ] 5 - ++ (lib.pipe (import ./. inputs).imports [ 6 - (map (s: /${s}/nixos.nix)) 7 - (builtins.filter builtins.pathExists) 8 - ]); 9 - 10 - system.stateVersion = "24.05"; 11 - }
-7
roles/plasma/default.nix
··· 1 - { lib, ... }: 2 - { 3 - options.roles.plasma = { 4 - enable = lib.mkEnableOption "Plasma"; 5 - krunner-nix.enable = lib.mkEnableOption "krunner-nix, a KRunner plugin that suggests Nix programs to run"; 6 - }; 7 - }
-42
roles/plasma/nixos.nix
··· 1 - { 2 - config, 3 - lib, 4 - pkgs, 5 - inputs, 6 - inputs', 7 - ... 8 - }: 9 - let 10 - cfg = config.roles.plasma; 11 - inherit (lib) mkIf; 12 - in 13 - { 14 - config = mkIf cfg.enable { 15 - services = { 16 - desktopManager.plasma6.enable = true; 17 - displayManager = { 18 - defaultSession = "plasma"; 19 - sddm = { 20 - enable = true; 21 - wayland.enable = true; 22 - }; 23 - }; 24 - }; 25 - 26 - xdg.portal.extraPortals = [ pkgs.kdePackages.xdg-desktop-portal-kde ]; 27 - 28 - hm = { 29 - imports = [ inputs.plasma-manager.homeManagerModules.plasma-manager ]; 30 - 31 - home.packages = lib.optional cfg.krunner-nix.enable inputs'.krunner-nix.packages.default; 32 - 33 - # Janky workaround 34 - # https://github.com/nix-community/home-manager/issues/1586 35 - programs.firefox.package = pkgs.firefox.override { 36 - cfg.nativeMessagingHosts.packages = [ pkgs.plasma6Packages.plasma-browser-integration ]; 37 - }; 38 - 39 - programs.plasma.enable = true; 40 - }; 41 - }; 42 - }
-79
roles/rust/default.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - inputs', 6 - ... 7 - }: 8 - let 9 - cfg = config.roles.rust; 10 - inherit (lib) 11 - mkIf 12 - mkOption 13 - mkEnableOption 14 - types 15 - ; 16 - in 17 - { 18 - options.roles.rust = { 19 - enable = mkEnableOption "Rust"; 20 - 21 - package = mkOption { 22 - type = types.package; 23 - default = 24 - let 25 - fenix = inputs'.fenix.packages; 26 - in 27 - fenix.combine [ 28 - fenix.default.toolchain 29 - fenix.rust-analyzer 30 - ]; 31 - description = "Version of Rust to install. Defaults to nightly with rust-analyzer"; 32 - }; 33 - 34 - linker = mkOption { 35 - type = types.nullOr types.pathInStore; 36 - default = lib.getExe' pkgs.mold "mold"; 37 - example = "lib.getExe' pkgs.lld \"lld\""; 38 - description = "Linker to use when linking compiled Rust code"; 39 - }; 40 - 41 - settings = mkOption { 42 - type = types.nullOr (types.attrsOf types.anything); 43 - default = { }; 44 - }; 45 - 46 - rustfmt.settings = mkOption { 47 - type = types.nullOr (types.attrsOf types.anything); 48 - default = null; 49 - example = { 50 - hard_tabs = true; 51 - tab_spaces = 4; 52 - newline_style = "Unix"; 53 - }; 54 - }; 55 - }; 56 - 57 - config.hm = 58 - let 59 - toml = pkgs.formats.toml { }; 60 - linkerSettings = lib.optionalAttrs (cfg.linker != null) { 61 - target.${pkgs.hostPlatform.rust.rustcTarget} = { 62 - linker = "${lib.getExe pkgs.clang_16}"; 63 - rustflags = [ 64 - "-C" 65 - "link-arg=-fuse-ld=${cfg.linker}" 66 - ]; 67 - }; 68 - }; 69 - in 70 - mkIf cfg.enable { 71 - home.packages = [ cfg.package ]; 72 - 73 - xdg.configFile."rustfmt/rustfmt.toml".source = mkIf (cfg.rustfmt.settings != null) 74 - (toml.generate "rustfmt.toml" cfg.rustfmt.settings); 75 - 76 - home.file.".cargo/config.toml".source = mkIf (cfg.settings != null) 77 - (toml.generate "config.toml" (linkerSettings // cfg.settings)); 78 - }; 79 - }
+129
systems/common.nix
··· 1 + { 2 + config, 3 + self, 4 + pkgs, 5 + lib, 6 + inputs, 7 + ... 8 + }: 9 + { 10 + imports = [ 11 + inputs.hjem.nixosModules.hjem 12 + ]; 13 + 14 + hjem.extraModules = [ 15 + inputs.hjem-rum.hjemModules.default 16 + self.hjemModules.hjem-ext 17 + ]; 18 + 19 + system.stateVersion = "24.11"; 20 + 21 + nix = { 22 + # Add `n` as an alias of `nixpkgs` 23 + registry.n.to = { 24 + type = "path"; 25 + path = config.nixpkgs.flake.source; 26 + }; 27 + 28 + gc = { 29 + automatic = true; 30 + dates = "weekly"; 31 + options = "--delete-older-than 7d"; 32 + }; 33 + 34 + settings = { 35 + auto-optimise-store = true; 36 + experimental-features = [ 37 + "nix-command" 38 + "flakes" 39 + "auto-allocate-uids" 40 + "configurable-impure-env" 41 + ]; 42 + trusted-users = [ "@wheel" ]; 43 + impure-env = [ "all_proxy=http://127.0.0.1:2080" ]; 44 + }; 45 + }; 46 + 47 + nixpkgs = { 48 + # I'm not part of the FSF and I don't care 49 + config.allowUnfree = true; 50 + flake.setNixPath = true; 51 + 52 + overlays = [ self.overlays.default ]; 53 + }; 54 + 55 + boot = { 56 + loader = { 57 + systemd-boot = { 58 + enable = true; 59 + editor = false; 60 + consoleMode = "2"; 61 + configurationLimit = 10; 62 + }; 63 + efi.canTouchEfiVariables = true; 64 + }; 65 + 66 + # Silence NixOS Stage 1 logs, jump straight into plymouth 67 + consoleLogLevel = 0; 68 + initrd.verbose = false; 69 + plymouth.enable = true; 70 + kernelParams = [ 71 + "quiet" 72 + "splash" 73 + "plymouth.use-simpledrm" 74 + "i915.fastboot=1" 75 + ]; 76 + }; 77 + 78 + # Use native Wayland when possible 79 + environment.variables = { 80 + NIXOS_OZONE_WL = "1"; 81 + SDL_VIDEODRIVER = "wayland"; 82 + }; 83 + 84 + services = { 85 + flatpak.enable = true; 86 + 87 + desktopManager.plasma6.enable = true; 88 + displayManager = { 89 + defaultSession = "plasma"; 90 + sddm = { 91 + enable = true; 92 + wayland.enable = true; 93 + }; 94 + }; 95 + 96 + pulseaudio.enable = false; 97 + pipewire = { 98 + enable = true; 99 + wireplumber.enable = true; 100 + alsa.enable = true; 101 + jack.enable = true; 102 + pulse.enable = true; 103 + }; 104 + }; 105 + 106 + security.rtkit.enable = true; 107 + 108 + networking.networkmanager.enable = true; 109 + 110 + system = { 111 + # Thank @luishfonseca for this 112 + # https://github.com/luishfonseca/dotfiles/blob/ab7625ec406b48493eda701911ad1cd017ce5bc1/modules/upgrade-diff.nix 113 + activationScripts.diff = { 114 + supportsDryActivation = true; 115 + text = '' 116 + ${lib.getExe pkgs.nvd} --nix-bin-dir=${pkgs.nix}/bin diff /run/current-system "$systemConfig" 117 + ''; 118 + }; 119 + 120 + # thanks to @getchoo 121 + autoUpgrade = { 122 + enable = true; 123 + flake = "github:pluiedev/flake#${config.networking.hostName}"; 124 + flags = [ "--refresh" ]; 125 + }; 126 + 127 + configurationRevision = self.rev or self.dirtyRev or "unknown-dirty"; 128 + }; 129 + }
+15 -46
systems/default.nix
··· 1 - { withSystem, inputs, self, ... }: 2 - let 3 - mkMachine = 4 - name: { system, modules, builder }: 5 - withSystem system ({ inputs', self', ... }: 6 - builder { 7 - specialArgs = { inherit inputs inputs' self self'; }; 8 - modules = modules ++ [ 9 - ./${name} 10 - { 11 - networking.hostName = name; 12 - nixpkgs.hostPlatform = system; 13 - } 14 - ]; 15 - } 16 - ); 17 - 18 - mkMachines = builtins.mapAttrs mkMachine; 19 - 20 - # Composable parts 21 - personal = [ 22 - inputs.home-manager.nixosModules.home-manager 23 - ../users/personal.nix 24 - ]; 25 - nixos = [ ../roles/nixos.nix ]; 26 - darwin = [ ../roles/darwin.nix ]; 27 - 28 - # Presets 29 - nixos-pc = { 30 - system = "x86_64-linux"; 31 - modules = nixos ++ personal; 32 - builder = inputs.nixpkgs.lib.nixosSystem; 33 - }; 34 - darwin-pc = { 35 - system = "x86_64-darwin"; 36 - modules = darwin ++ personal; 37 - builder = inputs.nix-darwin.lib.darwinSystem; 38 - }; 39 - in 1 + { 2 + inputs, 3 + self, 4 + ... 5 + }: 40 6 { 41 - flake = { 42 - nixosConfigurations = mkMachines { 43 - fettuccine = nixos-pc; 44 - tagliatelle = nixos-pc; 45 - }; 46 - darwinConfigurations = mkMachines { 47 - fromage = darwin-pc; 7 + flake.nixosConfigurations = { 8 + fettuccine = inputs.nixpkgs.lib.nixosSystem { 9 + system = "x86_64-linux"; 10 + modules = [ 11 + ./fettuccine 12 + ../users/leah 13 + ]; 14 + specialArgs = { 15 + inherit inputs self; 16 + }; 48 17 }; 49 18 }; 50 19 }
+42 -19
systems/fettuccine/default.nix
··· 1 1 { 2 - lib, 2 + config, 3 3 pkgs, 4 + lib, 4 5 inputs, 5 - config, 6 6 ... 7 7 }: 8 8 { 9 9 imports = with inputs.nixos-hardware.nixosModules; [ 10 + ../common.nix 10 11 ./hardware-configuration.nix 11 12 12 13 common-hidpi 13 14 asus-zephyrus-gu603h 14 15 ]; 15 16 16 - roles = { 17 - # boot.lanzaboote.enable = true; 18 - # nvidia.enable = true; 17 + networking.hostName = "fettuccine"; 18 + 19 + boot = { 20 + # Disable Nvidia's HDMI audio 21 + blacklistedKernelModules = [ "snd_hda_codec_hdmi" ]; 22 + kernelPackages = pkgs.linuxPackages_xanmod_latest; 19 23 }; 20 24 21 - hardware.bluetooth.enable = true; 25 + # Enable building and testing aarch64 packages for Nixpkgs dev 26 + boot.binfmt.emulatedSystems = [ "aarch64-linux" ]; 27 + nix.settings.extra-platforms = [ "aarch64-linux" ]; 28 + 29 + hardware = { 30 + bluetooth.enable = true; 31 + 32 + nvidia = { 33 + # PCI bus IDs are already conveniently set by nixos-hardware 34 + prime.offload.enable = lib.mkForce true; 22 35 23 - # Other Nvidia settings are set via nixos-hardware 36 + # Beta can sometimes be more stable than, well, stable 37 + package = config.boot.kernelPackages.nvidiaPackages.beta; 38 + }; 39 + }; 24 40 25 - hardware.nvidia.prime.offload.enable = lib.mkForce true; 26 - hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.beta; 27 - # Disable Nvidia's HDMI audio 28 - boot.blacklistedKernelModules = [ "snd_hda_codec_hdmi" ]; 41 + # Nix can sometimes overload my poor, poor laptop CPU 42 + # so much that it can freeze my entire system. Amazing. 43 + # Please don't do that. 44 + nix.daemonCPUSchedPolicy = "idle"; 29 45 46 + # This is an ASUS computer after all 30 47 services.asusd.enable = true; 31 48 32 - specialisation.china.configuration = { 33 - roles.mirrors.chinese.enable = true; 34 - environment.variables.NIXOS_SPECIALISATION = "china"; 49 + networking.firewall = { 50 + enable = true; 35 51 36 - environment.systemPackages = [ pkgs.nekoray ]; 52 + # Allow previewing local Vite builds on other devices via LAN 53 + allowedTCPPorts = [ 5173 ]; 54 + }; 37 55 38 - nix.settings = { 39 - experimental-features = [ "configurable-impure-env" ]; 40 - impure-env = [ "all_proxy=http://127.0.0.1:2080" ]; 41 - }; 56 + specialisation.china.configuration = { 57 + # cache.nixos.org is *unbearably* slow when accessed from Mainland China. 58 + # Fortunately, mirror sites exist... Hooray(?) 59 + nix.settings.substituters = map (url: "${url}/nix-channels/store") [ 60 + "https://mirrors.ustc.edu.cn" 61 + "https://mirrors6.tuna.tsinghua.edu.cn" 62 + "https://mirrors.tuna.tsinghua.edu.cn" 63 + # "https://mirror.sjtu.edu.cn" # FIXME: buggy? 64 + ]; 42 65 }; 43 66 }
+43 -58
users/leah/appearance.nix
··· 1 1 { 2 - self, 3 - inputs, 4 2 pkgs, 5 3 lib, 6 4 ... ··· 8 6 let 9 7 flavor = "mocha"; 10 8 accent = "maroon"; 9 + 10 + mkUpper = str: (lib.toUpper (lib.substring 0 1 str)) + (lib.substring 1 (lib.stringLength str) str); 11 + fcitx5ini = pkgs.formats.iniWithGlobalSection { }; 11 12 in 12 13 { 13 - imports = [ inputs.catppuccin.nixosModules.catppuccin ]; 14 - catppuccin = { 15 - enable = true; 16 - inherit flavor accent; 14 + boot.plymouth = { 15 + themePackages = [ pkgs.plymouth-blahaj-theme ]; 16 + theme = "blahaj"; 17 17 }; 18 18 19 - catppuccin.plymouth.enable = false; 20 - boot.plymouth.themePackages = [ pkgs.plymouth-blahaj-theme ]; 21 - boot.plymouth.theme = "blahaj"; 19 + hjem.users.leah = { 20 + packages = [ pkgs.breezex-cursor ]; 21 + 22 + files = { 23 + ".local/share/fcitx5/themes/catppuccin-${flavor}-${accent}".source = 24 + "${pkgs.catppuccin-fcitx5}/share/fcitx5/themes/catppuccin-${flavor}-${accent}"; 22 25 23 - hm.imports = [ 24 - inputs.catppuccin.homeModules.catppuccin 25 - self.hmModules.ctp-plus 26 - ]; 26 + ".config/fcitx5/conf/classicui.conf".source = fcitx5ini.generate "fcitx5-classicui.conf" { 27 + globalSection = { 28 + Theme = "catppuccin-${flavor}-${accent}"; 29 + }; 30 + }; 27 31 28 - hm.catppuccin = { 29 - enable = true; 30 - inherit flavor accent; 31 - }; 32 + ".config/fish/themes/Catppuccin ${mkUpper flavor}.theme".source = 33 + "${pkgs.catppuccin-fish}/share/fish/themes/Catppuccin ${mkUpper flavor}.theme"; 34 + }; 32 35 33 - hm.programs.fish.interactiveShellInit = '' 34 - set -x LS_COLORS (${lib.getExe pkgs.vivid} generate catppuccin-${flavor}) 35 - ''; 36 + rum.programs.fish.earlyConfigFiles.theme = '' 37 + fish_config theme choose "Catppuccin ${mkUpper flavor}" 38 + set -x LS_COLORS (${lib.getExe pkgs.vivid} generate catppuccin-${flavor}) 39 + ''; 36 40 37 - hm.programs.moar.settings.style = "catppuccin-${flavor}"; 41 + ext.programs.moar.settings.style = "catppuccin-${flavor}"; 42 + }; 38 43 39 - hm.programs.plasma.fonts = 40 - let 41 - rethink = { 42 - family = "Rethink Sans"; 43 - pointSize = 12; 44 - }; 45 - in 46 - { 47 - general = rethink // { 48 - pointSize = 14; 49 - }; 50 - fixedWidth = { 51 - family = "Iosevka"; 52 - pointSize = 14; 53 - }; 54 - small = rethink // { 55 - pointSize = 11; 56 - }; 57 - toolbar = rethink; 58 - menu = rethink; 59 - windowTitle = rethink; 60 - }; 44 + fonts = { 45 + enableDefaultPackages = true; 61 46 62 - roles.fonts = { 63 - enable = true; 64 47 packages = with pkgs; [ 65 48 iosevka 66 49 noto-fonts-color-emoji ··· 70 53 dm-sans-unstable 71 54 ]; 72 55 73 - defaults = { 74 - serif = [ 75 - "I.Ming" 76 - ]; 77 - sansSerif = [ 78 - "DM Sans" 79 - "LXGW Neo XiHei" 80 - ]; 81 - emoji = [ "Noto Color Emoji" ]; 82 - monospace = [ 83 - "Iosevka" 84 - "LXGW Neo XiHei" 85 - ]; 56 + fontconfig = { 57 + defaultFonts = { 58 + serif = [ 59 + "I.Ming" 60 + ]; 61 + sansSerif = [ 62 + "DM Sans" 63 + "LXGW Neo XiHei" 64 + ]; 65 + emoji = [ "Noto Color Emoji" ]; 66 + monospace = [ 67 + "Iosevka" 68 + "LXGW Neo XiHei" 69 + ]; 70 + }; 86 71 }; 87 72 }; 88 73 }
+20 -66
users/leah/default.nix
··· 1 1 { 2 2 config, 3 - pkgs, 4 - self, 3 + inputs, 5 4 ... 6 5 }: 7 6 { 8 7 imports = [ 9 8 ./appearance.nix 10 - ./presets/plasma 9 + # ./presets/plasma 11 10 ./programs 11 + 12 + inputs.hjem.nixosModules.hjem 13 + inputs.nix-index-database.nixosModules.nix-index 12 14 ]; 13 15 14 - hm.imports = [ self.hmModules.hm-plus ]; 15 - 16 - boot = { 17 - binfmt.emulatedSystems = [ "aarch64-linux" ]; 18 - kernelParams = [ "plymouth.use-simpledrm" ]; 19 - kernelPackages = pkgs.linuxPackages_xanmod_latest; 20 - }; 21 - 22 - nix = { 23 - settings.extra-platforms = [ "aarch64-linux" ]; 24 - daemonCPUSchedPolicy = "idle"; 25 - }; 16 + hjem.extraModules = [ 17 + inputs.hjem-rum.hjemModules.default 18 + ]; 26 19 27 20 i18n.supportedLocales = [ "all" ]; 28 21 29 - roles.base = { 30 - username = "leah"; 31 - realName = "Leah"; 32 - fullName = "Leah Amelia Chen"; 33 - publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC7uJGE2/25M4a3DIVxtnTA5INqWsFGw+49qHXaN/kqy"; 34 - canSudo = true; 35 - }; 36 - 37 - roles.email = 38 - let 39 - realName = config.roles.base.fullName; 40 - host = { 41 - imap = { 42 - host = "imap.migadu.com"; 43 - port = 993; 44 - }; 45 - smtp = { 46 - host = "smtp.migadu.com"; 47 - port = 465; 48 - }; 49 - }; 50 - in 51 - { 52 - enable = true; 53 - accounts = { 54 - "hi@pluie.me" = { 55 - inherit realName host; 56 - primary = true; 57 - }; 58 - "acc@pluie.me" = { 59 - inherit host; 60 - realName = "${realName} [accounts]"; 61 - }; 62 - }; 63 - }; 64 - 65 - roles.fish = { 66 - enable = true; 67 - defaultShell = true; 22 + users.users.leah = { 23 + isNormalUser = true; 24 + description = "Leah C"; 25 + extraGroups = [ 26 + "wheel" # 1984 powers 27 + "rtkit" # Some apps may need to adjust audio priority at runtime 28 + "networkmanager" # Manage networks 29 + ]; 30 + home = "/home/leah"; 68 31 }; 69 32 70 - environment.variables = { 71 - NIXOS_OZONE_WL = "1"; 72 - SDL_VIDEODRIVER = "wayland"; 73 - }; 33 + # Name and directory should be populated by users.users 34 + hjem.users.leah.enable = true; 74 35 75 - networking.firewall = { 76 - enable = true; 77 - allowedTCPPorts = [ 78 - 80 79 - 443 80 - 5173 81 - ]; 82 - }; 36 + hjem.clobberByDefault = true; 83 37 }
-13
users/leah/presets/plasma/default.nix
··· 4 4 ./sddm.nix 5 5 ./settings 6 6 ]; 7 - 8 - boot.plymouth.enable = true; 9 - roles.plasma = { 10 - enable = true; 11 - krunner-nix.enable = true; 12 - }; 13 - 14 - # KDE manages GTK stuff by itself 15 - #hm.gtk.enable = lib.mkForce false; 16 - 17 - hm.home.packages = with pkgs; [ 18 - wl-clipboard 19 - ]; 20 7 }
-2
users/leah/presets/plasma/settings/default.nix
··· 2 2 { 3 3 imports = [ ./panels.nix ]; 4 4 5 - hm.programs.konsole.enable = true; 6 - 7 5 hm.programs.plasma = { 8 6 enable = true; 9 7
+29
users/leah/programs/1password.nix
··· 1 + { 2 + config, 3 + pkgs, 4 + lib, 5 + ... 6 + }: 7 + { 8 + programs = { 9 + _1password.enable = true; 10 + _1password-gui = { 11 + enable = true; 12 + package = pkgs._1password-gui-beta; 13 + 14 + # Unlock 1Pass via PolKit 15 + polkitPolicyOwners = [ "leah" ]; 16 + }; 17 + }; 18 + 19 + # Add 1Pass as SSH agent 20 + hjem.users.leah = { 21 + files.".ssh/config".text = '' 22 + Host * 23 + IdentityAgent ${config.hjem.users.leah.directory}/.1password/agent.sock 24 + ''; 25 + 26 + ext.programs.git.settings.gpg.ssh.program = 27 + lib.getExe' config.programs._1password-gui.package "op-ssh-sign"; 28 + }; 29 + }
+45 -130
users/leah/programs/default.nix
··· 1 1 { 2 - config, 3 2 pkgs, 4 - lib, 5 - inputs, 6 - inputs', 7 3 ... 8 4 }: 9 5 { 10 6 imports = [ 7 + ./1password.nix 11 8 ./discord 12 - ./fcitx5 9 + ./fcitx5.nix 13 10 ./firefox 14 - ./ghostty 15 - ./helix 16 - ./jj 17 - ./rust 18 - ]; 19 - 20 - hm.imports = [ inputs.nix-index-database.hmModules.nix-index ]; 21 - 22 - hm.home.packages = with pkgs; [ 23 - # Apps 24 - inputs'.blender-bin.packages.default 25 - chromium 26 - gimp 27 - inkscape-with-extensions 28 - vlc 29 - 30 - # Command-line apps 31 - just 32 - fastfetch 33 - nix-output-monitor 34 - nurl 35 - xclip 36 - moar 37 - 38 - (inputs.treefmt-nix.lib.evalModule pkgs ./treefmt.nix).config.build.wrapper 39 - ]; 40 - 41 - services.touchegg.enable = true; 42 - 43 - xdg.icons.enable = true; 44 - environment.systemPackages = [ 45 - pkgs.nekoray 46 - pkgs.adwaita-icon-theme 11 + ./fish.nix 12 + ./ghostty.nix 13 + ./helix.nix 14 + ./vcs.nix 15 + ./steam.nix 47 16 ]; 48 - 49 - services.flatpak.enable = true; 50 17 51 18 programs = { 52 - appimage.enable = true; 53 19 gamemode.enable = true; 54 20 localsend.enable = true; 55 - 56 - steam = { 57 - enable = true; 58 - extraCompatPackages = [ pkgs.proton-ge-bin ]; 59 - extraPackages = [ 60 - pkgs.ncurses6 # Crusader Kings III 61 - ]; 62 - remotePlay.openFirewall = true; 63 - }; 64 - nix-ld.enable = true; 21 + nix-index-database.comma.enable = true; 65 22 }; 66 23 24 + hjem.users.leah = { 25 + packages = with pkgs; [ 26 + # Apps 27 + nekoray 28 + prismlauncher 29 + vlc 30 + thunderbird 31 + telegram-desktop 67 32 68 - hm.programs = { 69 - bat = { 70 - enable = true; 71 - config = { 72 - map-syntax = [ "flake.lock:JSON" ]; 73 - }; 74 - syntaxes = { 75 - just = { 76 - src = lib.cleanSourceWith { 77 - filter = 78 - name: type: 79 - lib.cleanSourceFilter name type 80 - && !builtins.elem (baseNameOf name) [ 81 - "ShellScript (for Just).sublime-syntax" 82 - "Python (for Just).sublime-syntax" 83 - ]; 33 + # Command-line apps 34 + just 35 + nix-output-monitor 36 + ripgrep 37 + starship 38 + wl-clipboard 39 + eza 40 + ]; 84 41 85 - src = pkgs.fetchFromGitHub { 86 - owner = "nk9"; 87 - repo = "just_sublime"; 88 - rev = "352bae277961d41e2a1795a834dbf22661c8910f"; 89 - hash = "sha256-QCp6ypSBhgGZG4T7fNiFfCgZIVJoDSoJBkpcdw3aiuQ="; 90 - }; 91 - }; 92 - file = "Syntax/Just.sublime-syntax"; 93 - }; 94 - }; 95 - }; 96 - 97 - eza = { 98 - enable = true; 99 - git = true; 100 - icons = "auto"; 101 - }; 102 - direnv = { 103 - enable = true; 104 - nix-direnv.enable = true; 105 - }; 106 - 107 - gh = { 108 - enable = true; 109 - settings.git_protocol = "ssh"; 110 - }; 111 - 112 - git = { 113 - enable = true; 114 - userName = config.roles.base.fullName; 115 - userEmail = "hi@pluie.me"; 42 + files.".config/starship.toml".source = ./starship.toml; 116 43 117 - signing.key = config.roles.base.publicKey; 118 - signingFormat = "ssh"; 44 + rum.programs.obs-studio.enable = true; 119 45 120 - extraConfig = { 121 - init.defaultBranch = "main"; 122 - push.autoSetupRemote = true; 123 - url."https://github.com/".insteadOf = "gh:"; 46 + ext.programs = { 47 + direnv = { 48 + enable = true; 49 + nix-direnv.enable = true; 124 50 }; 125 - }; 126 51 127 - hyfetch = { 128 - enable = true; 129 - settings = { 130 - preset = "lesbian"; 131 - mode = "rgb"; 132 - lightness = 0.6; 133 - color_align.mode = "horizontal"; 134 - backend = "fastfetch"; 52 + hyfetch = { 53 + enable = true; 54 + settings = { 55 + preset = "lesbian"; 56 + mode = "rgb"; 57 + lightness = 0.6; 58 + color_align.mode = "horizontal"; 59 + backend = "fastfetch"; 60 + }; 135 61 }; 136 - }; 137 62 138 - moar = { 139 - enable = true; 140 - settings = { 141 - style = "catppuccin-mocha"; 142 - no-statusbar = true; 143 - wrap = true; 63 + moar = { 64 + enable = true; 65 + settings = { 66 + no-statusbar = true; 67 + wrap = true; 68 + }; 144 69 }; 145 - }; 146 - 147 - nix-index-database.comma.enable = true; 148 - 149 - obs-studio.enable = true; 150 - ripgrep.enable = true; 151 - 152 - starship = { 153 - enable = true; 154 - settings = builtins.fromTOML (builtins.readFile ./starship.toml); 155 70 }; 156 71 }; 157 72 }
+2 -2
users/leah/programs/discord/default.nix
··· 1 1 { 2 - hm.catppuccin.vesktop.splashTheming = true; 2 + # hm.catppuccin.vesktop.splashTheming = true; 3 3 4 - hm.programs.vesktop = { 4 + hjem.users.leah.ext.programs.vesktop = { 5 5 enable = true; 6 6 7 7 settings = {
+41
users/leah/programs/fcitx5.nix
··· 1 + { pkgs, ... }: 2 + let 3 + luna_pinyin = yaml.generate "luna_pinyin.yaml" { 4 + patch."speller/algebra" = [ 5 + "erase/^xx$/" 6 + "derive/in$/ing/" # in/ing 不分 7 + "derive/ing$/in/" 8 + 9 + # 非标拼写就 10 + "derive/^([nl])ve$/$1ue/" # nve = nue, lve = lue 11 + "derive/^([jqxy])v/$1u/" # ju = jv 12 + "derive/uen$/un/" # gun = guen 13 + "derive/uei$/ui/" # gui = guei 14 + "derive/iou$/iu/" # jiu = jiou 15 + ]; 16 + }; 17 + 18 + yaml = pkgs.formats.yaml { }; 19 + in 20 + { 21 + i18n.inputMethod = { 22 + enable = true; 23 + type = "fcitx5"; 24 + fcitx5.addons = with pkgs; [ 25 + fcitx5-mozc 26 + fcitx5-rime 27 + ]; 28 + }; 29 + 30 + hjem.users.leah.files = { 31 + ".local/share/fcitx5/rime/default.custom.yaml".source = yaml.generate "default.yaml" { 32 + patch.schema_list = [ 33 + { schema = "luna_pinyin_simp"; } 34 + { schema = "luna_pinyin"; } 35 + ]; 36 + }; 37 + ".local/share/fcitx5/rime/luna_pinyin.custom.yaml".source = luna_pinyin; 38 + ".local/share/fcitx5/rime/luna_pinyin_simp.custom.yaml".source = luna_pinyin; 39 + }; 40 + 41 + }
-48
users/leah/programs/fcitx5/default.nix
··· 1 - { pkgs, ... }: 2 - { 3 - hm.catppuccin.fcitx5.enable = false; # TODO 4 - 5 - hm.i18n.inputMethod = { 6 - enabled = "fcitx5"; 7 - fcitx5 = { 8 - addons = [ pkgs.fcitx5-mozc ]; 9 - 10 - # settings.groups = [ 11 - # { 12 - # name = "Default"; 13 - # defaultLayout = "us"; 14 - # defaultIM = "keyboard-us"; 15 - # items = map (name: {inherit name;}) ["keyboard-us" "rime" "mozc"]; 16 - # } 17 - # ]; 18 - 19 - rime = { 20 - enable = true; 21 - 22 - settings = 23 - let 24 - luna_pinyin.patch."speller/algebra" = [ 25 - "erase/^xx$/" 26 - "derive/in$/ing/" # in/ing 不分 27 - "derive/ing$/in/" 28 - 29 - # 非标拼写 30 - "derive/^([nl])ve$/$1ue/" # nve = nue, lve = lue 31 - "derive/^([jqxy])v/$1u/" # ju = jv 32 - "derive/uen$/un/" # gun = guen 33 - "derive/uei$/ui/" # gui = guei 34 - "derive/iou$/iu/" # jiu = jiou 35 - ]; 36 - in 37 - { 38 - default.patch.schema_list = [ 39 - { schema = "luna_pinyin_simp"; } 40 - { schema = "luna_pinyin"; } 41 - ]; 42 - inherit luna_pinyin; 43 - luna_pinyin_simp = luna_pinyin; 44 - }; 45 - }; 46 - }; 47 - }; 48 - }
+47 -135
users/leah/programs/firefox/default.nix
··· 1 1 { 2 - config, 3 2 lib, 4 3 pkgs, 5 - inputs', 6 4 ... 7 5 }: 8 - { 9 - hm.programs.firefox = { 10 - enable = true; 6 + let 7 + json = pkgs.formats.json { }; 8 + wrappedFirefox = pkgs.firefox.override { 9 + extraPoliciesFiles = [(json.generate "firefox-policies.json" policies)]; 10 + }; 11 11 12 - profiles.${config.roles.base.username} = { 13 - isDefault = true; 14 - name = config.roles.base.realName; 12 + addons = [ 13 + # Styling 14 + "addon@darkreader.org" # Dark Reader 15 + "{85860b32-02a8-431a-b2b1-40fbd64c9c69}" # File Icons for Git{Hub,Lab} 16 + "FirefoxColor@mozilla.com" # Firefox Color 17 + "{7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}" # Stylus 18 + "{a4c4eda4-fb84-4a84-b4a1-f7c1cbf2a1ad}" # Refined GitHub 19 + "{72742915-c83b-4485-9023-b55dc5a1e730}" # Wide GitHub 15 20 16 - extensions.packages = 17 - let 18 - # FIXME: firefox-addons currently receives free-only nixpkgs, 19 - # and so unfree plugins are blocked from evaluation. 20 - # Use this one dirty trick to make the FSF mad! :trolley: 21 - gaslight = pkgs: pkgs.overrideAttrs { meta.license.free = true; }; 22 - in 23 - with inputs'.firefox-addons.packages; 24 - map gaslight [ 25 - # Essentials 26 - auto-tab-discard 27 - onepassword-password-manager 28 - ublock-origin 21 + # Privacy 22 + "gdpr@cavi.au.dk" # Consent-O-Matic 23 + "addon@fastforward.team" # FastForward 24 + "{6d96bb5e-1175-4ebf-8ab5-5f56f1c79f65}" # Google Analytics Opt-out 25 + "{6d85dea2-0fb4-4de3-9f8c-264bce9a2296}" # Link Cleaner 26 + "uBlock0@raymondhill.net" # uBlock Origin 29 27 30 - # Avoid annoyances 31 - consent-o-matic 32 - don-t-fuck-with-paste 33 - enhanced-h264ify 34 - fastforwardteam 35 - faststream 36 - gaoptout 37 - istilldontcareaboutcookies 38 - link-cleaner 39 - musescore-downloader 40 - native-mathml 41 - privacy-possum 42 - re-enable-right-click 43 - sponsorblock 44 - terms-of-service-didnt-read 45 - youtube-nonstop 46 - 47 - # Redirectors 48 - indie-wiki-buddy 49 - libredirect 50 - localcdn 51 - modrinthify 52 - 53 - # Augmentations 54 - augmented-steam 55 - github-file-icons 56 - octolinker 57 - protondb-for-steam 58 - refined-github 59 - widegithub 60 - wikiwand-wikipedia-modernized 61 - 62 - # Language 63 - furiganaize 64 - immersive-translate 65 - languagetool 66 - 67 - # Styling 68 - darkreader 69 - firefox-color 70 - stylus 71 - 72 - # Dev 73 - a11ycss 74 - header-editor 75 - rust-search-extension 76 - 77 - disconnect 78 - pronoundb 79 - search-by-image 80 - unpaywall 81 - wayback-machine 82 - ]; 28 + # "Stop Websites from Doing Stupid Things I Don't Want" 29 + "{278b0ae0-da9d-4cc6-be81-5aa7f3202672}" # Allow Right Click 30 + "DontFuckWithPaste@raim.ist" # Don't Fuck With Paste 83 31 84 - search = 85 - let 86 - mkParams = lib.mapAttrsToList lib.nameValuePair; 87 - nixIcon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; 88 - nixosSearch = path: aliases: { 89 - urls = [ { template = "https://nixpkgs.dev${path}/{searchTerms}"; } ]; 90 - icon = nixIcon; 91 - definedAliases = aliases; 92 - }; 32 + # YouTube 33 + "{9a41dee2-b924-4161-a971-7fb35c053a4a}" # enhanced-h264ify 34 + "sponsorBlocker@ajay.app" # SponsorBlock for YouTube 35 + "{0d7cafdd-501c-49ca-8ebb-e3341caaa55e}" # YouTube NonStop 36 + 37 + # Utilities 38 + "{d634138d-c276-4fc8-924b-40a0ea21d284}" # 1Password 39 + "{c2c003ee-bd69-42a2-b0e9-6f34222cb046}" # Auto Tab Discard 40 + "{cb31ec5d-c49a-4e5a-b240-16c767444f62}" # Indie Wiki Buddy 41 + "octolinker@stefanbuck.com" # OctoLinker 42 + "firefox-addon@pronoundb.org" # PronounDB 43 + "wayback_machine@mozilla.org" # Wayback Machine 44 + ]; 93 45 94 - search = path: queryKey: { 95 - template = path; 96 - params = mkParams { ${queryKey} = "{searchTerms}"; }; 97 - }; 98 - in 99 - { 100 - default = "ddg"; 101 - force = true; 102 - engines = { 103 - "Nixpkgs" = nixosSearch "" [ "@np" ]; 104 - "NixOS Options" = nixosSearch "/option" [ 105 - "@ns" 106 - "@no" 107 - ]; 108 - "NixOS Wiki" = { 109 - urls = [ (search "https://wiki.nixos.org/index.php" "search") ]; 110 - icon = nixIcon; 111 - definedAliases = [ "@nw" ]; 112 - }; 113 - "Nixpkgs PR Tracker" = { 114 - urls = [ (search "https://nixpk.gs/pr-tracker.html" "pr") ]; 115 - icon = nixIcon; 116 - definedAliases = [ "@npr" ]; 117 - }; 118 - "Home Manager Settings" = { 119 - urls = [ (search "https://home-manager-options.extranix.com" "query") ]; 120 - icon = nixIcon; 121 - definedAliases = [ "@hm" ]; 122 - }; 123 - "Wiktionary" = { 124 - urls = [ (search "https://en.wiktionary.org/wiki/Special:Search" "search") ]; 125 - icon = "https://en.wiktionary.org/favicon.ico"; 126 - definedAliases = [ "@wkt" ]; 127 - }; 128 - "GitHub" = { 129 - urls = [ (search "https://github.com/search" "q") ]; 130 - icon = "https://github.com/favicon.ico"; 131 - definedAliases = [ "@gh" ]; 132 - }; 133 - "docs.rs" = { 134 - urls = [ (search "https://docs.rs/releases/search" "query") ]; 135 - icon = "https://docs.rs/-/static/favicon.ico"; 136 - definedAliases = [ "@rs" ]; 137 - }; 138 - "lib.rs" = { 139 - urls = [ (search "https://lib.rs/search" "q") ]; 140 - icon = "https://lib.rs/favicon.ico"; 141 - definedAliases = [ "@lrs" ]; 142 - }; 143 - }; 144 - }; 145 - }; 46 + policies = { 47 + ExtensionSettings = lib.listToAttrs ( 48 + map (id: lib.nameValuePair id { 49 + installation_mode = "normal_installed"; 50 + install_url = "https://addons.mozilla.org/firefox/downloads/latest/${id}/latest.xpi"; 51 + }) addons); 146 52 }; 53 + 54 + # TODO: Specifying custom search engines is *very* cursed. 55 + # I've seen how HM does it, and I don't think it's worth it at all... 56 + in 57 + { 58 + hjem.users.leah.packages = [ wrappedFirefox ]; 147 59 }
+23
users/leah/programs/fish.nix
··· 1 + { 2 + config, 3 + ... 4 + }: 5 + { 6 + 7 + programs.fish.enable = true; 8 + users.users.leah.shell = config.programs.fish.package; 9 + 10 + hjem.users.leah.rum.programs.fish = { 11 + enable = true; 12 + inherit (config.programs.fish) package; 13 + 14 + functions.eza = "eza --git --icons=auto"; 15 + abbrs = { 16 + ls = "eza"; 17 + ll = "eza -l"; 18 + la = "eza -a"; 19 + lt = "eza --tree"; 20 + lla = "eza -la"; 21 + }; 22 + }; 23 + }
+4 -6
users/leah/programs/ghostty/default.nix users/leah/programs/ghostty.nix
··· 1 1 { 2 - inputs', 2 + inputs, 3 + pkgs, 3 4 ... 4 5 }: 5 6 { 6 - hm.programs.ghostty = { 7 + hjem.users.leah.rum.programs.ghostty = { 7 8 enable = true; 8 - 9 - package = inputs'.ghostty.packages.default; 10 - 11 - enableFishIntegration = true; 9 + package = inputs.ghostty.packages.${pkgs.system}.default; 12 10 13 11 settings = { 14 12 font-family = "Iosevka";
+185
users/leah/programs/helix.nix
··· 1 + { 2 + hjem.users.leah = { 3 + environment.sessionVariables.EDITOR = "hx"; 4 + 5 + # TODO: upstream this 6 + files.".config/helix/ignore".text = '' 7 + flake.lock 8 + ''; 9 + 10 + rum.programs.helix = { 11 + enable = true; 12 + 13 + settings = { 14 + theme = "catppuccin_mocha_plus"; 15 + 16 + editor = { 17 + line-number = "relative"; 18 + bufferline = "multiple"; 19 + cursorline = true; 20 + color-modes = true; 21 + text-width = 100; 22 + popup-border = "all"; 23 + rulers = [ 100 ]; 24 + 25 + end-of-line-diagnostics = "hint"; 26 + inline-diagnostics = { 27 + cursor-line = "info"; 28 + other-lines = "error"; 29 + }; 30 + 31 + soft-wrap.enable = true; 32 + 33 + cursor-shape = { 34 + insert = "bar"; 35 + normal = "block"; 36 + select = "underline"; 37 + }; 38 + 39 + statusline = { 40 + left = [ 41 + "mode" 42 + "spacer" 43 + "spinner" 44 + ]; 45 + right = [ 46 + "read-only-indicator" 47 + "file-modification-indicator" 48 + "file-name" 49 + "separator" 50 + "file-type" 51 + "position-percentage" 52 + "spacer" 53 + "separator" 54 + "position" 55 + ]; 56 + mode = { 57 + normal = "NORMAL"; 58 + insert = "INSERT"; 59 + select = "VISUAL"; 60 + }; 61 + }; 62 + 63 + lsp = { 64 + display-messages = true; 65 + display-progress-messages = true; 66 + display-inlay-hints = true; 67 + }; 68 + 69 + auto-save = { 70 + focus-lost = true; # Ghostty supports it :) 71 + after-delay.enable = true; 72 + }; 73 + 74 + whitespace.render = { 75 + space = "none"; 76 + tab = "all"; 77 + }; 78 + 79 + indent-guides.render = true; 80 + 81 + gutters.layout = [ 82 + "diff" 83 + "diagnostics" 84 + "line-numbers" 85 + "spacer" 86 + ]; 87 + }; 88 + keys = { 89 + normal = { 90 + "C-s" = ":w"; 91 + "tab" = "move_parent_node_end"; 92 + "S-tab" = "move_parent_node_start"; 93 + "A-h" = "goto_previous_buffer"; 94 + "A-l" = "goto_next_buffer"; 95 + }; 96 + insert = { 97 + "S-tab" = "move_parent_node_start"; 98 + }; 99 + select = { 100 + "tab" = "move_parent_node_end"; 101 + "S-tab" = "move_parent_node_start"; 102 + }; 103 + }; 104 + }; 105 + themes.catppuccin_mocha_plus = { 106 + inherits = "catppuccin_mocha"; 107 + 108 + "ui.statusline" = { 109 + fg = "subtext0"; 110 + bg = "mantle"; 111 + }; 112 + "ui.statusline.normal" = { 113 + fg = "mantle"; 114 + bg = "rosewater"; 115 + modifiers = [ "bold" ]; 116 + }; 117 + "ui.statusline.insert" = { 118 + fg = "mantle"; 119 + bg = "maroon"; 120 + modifiers = [ "bold" ]; 121 + }; 122 + "ui.statusline.select" = { 123 + fg = "mantle"; 124 + bg = "mauve"; 125 + modifiers = [ "bold" ]; 126 + }; 127 + 128 + "ui.cursor.primary.normal" = { 129 + fg = "base"; 130 + bg = "rosewater"; 131 + }; 132 + "ui.cursor.primary.insert" = { 133 + fg = "base"; 134 + bg = "maroon"; 135 + }; 136 + "ui.cursor.primary.select" = { 137 + fg = "base"; 138 + bg = "mauve"; 139 + }; 140 + 141 + # Underlines are gross 142 + "ui.bufferline" = { 143 + fg = "subtext0"; 144 + bg = "mantle"; 145 + modifiers = [ "dim" ]; 146 + }; 147 + "ui.bufferline.active" = { 148 + fg = "text"; 149 + bg = "base"; 150 + modifiers = [ "bold" ]; 151 + }; 152 + 153 + # Mimick VS Code 154 + "ui.virtual.inlay-hint" = { 155 + fg = "overlay0"; 156 + bg = "base"; 157 + }; 158 + 159 + "ui.popup".fg = "rosewater"; 160 + "ui.popup.info".fg = "maroon"; 161 + "ui.help".fg = "maroon"; 162 + "ui.menu".fg = "text"; 163 + "ui.menu.selected" = { 164 + fg = "maroon"; 165 + modifiers = [ "bold" ]; 166 + }; 167 + "ui.menu.scroll".fg = "maroon"; 168 + "ui.background".bg = ""; # Transparent 169 + 170 + # Why the heck is it *blue*?; 171 + "diff.delta" = "yellow"; 172 + 173 + # Maroon itself is already eye-catching enough, no need to italicize 174 + "variable.parameter" = "maroon"; 175 + # Teal is wayyyyyy too obtrusive in Nix 176 + "variable.other.member" = "subtext1"; 177 + "variable.builtin" = "peach"; 178 + 179 + # Fix ${} in Nix 180 + "punctuation.special" = "maroon"; 181 + "operator" = "maroon"; 182 + }; 183 + }; 184 + }; 185 + }
-210
users/leah/programs/helix/default.nix
··· 1 - { 2 - pkgs, 3 - ... 4 - }: 5 - { 6 - hm.catppuccin.helix.enable = false; 7 - 8 - hm.programs.helix = { 9 - enable = true; 10 - defaultEditor = true; 11 - 12 - ignores = [ 13 - "flake.lock" 14 - ]; 15 - settings = { 16 - theme = "catppuccin_mocha_plus"; 17 - 18 - editor = { 19 - line-number = "relative"; 20 - bufferline = "multiple"; 21 - cursorline = true; 22 - color-modes = true; 23 - text-width = 100; 24 - popup-border = "all"; 25 - rulers = [ 100 ]; 26 - 27 - end-of-line-diagnostics = "hint"; 28 - inline-diagnostics = { 29 - cursor-line = "info"; 30 - other-lines = "error"; 31 - }; 32 - 33 - soft-wrap.enable = true; 34 - 35 - cursor-shape = { 36 - insert = "bar"; 37 - normal = "block"; 38 - select = "underline"; 39 - }; 40 - 41 - statusline = { 42 - left = [ 43 - "mode" 44 - "spacer" 45 - "spinner" 46 - ]; 47 - right = [ 48 - "read-only-indicator" 49 - "file-modification-indicator" 50 - "file-name" 51 - "separator" 52 - "file-type" 53 - "position-percentage" 54 - "spacer" 55 - "separator" 56 - "position" 57 - ]; 58 - mode = { 59 - normal = "NORMAL"; 60 - insert = "INSERT"; 61 - select = "VISUAL"; 62 - }; 63 - }; 64 - 65 - lsp = { 66 - display-messages = true; 67 - display-progress-messages = true; 68 - display-inlay-hints = true; 69 - }; 70 - 71 - auto-save = { 72 - focus-lost = true; # Ghostty supports it :) 73 - after-delay.enable = true; 74 - }; 75 - 76 - whitespace.render = { 77 - space = "none"; 78 - tab = "all"; 79 - }; 80 - 81 - indent-guides.render = true; 82 - 83 - gutters.layout = [ 84 - "diff" 85 - "diagnostics" 86 - "line-numbers" 87 - "spacer" 88 - ]; 89 - }; 90 - keys = { 91 - normal = { 92 - "C-s" = ":w"; 93 - "tab" = "move_parent_node_end"; 94 - "S-tab" = "move_parent_node_start"; 95 - "A-h" = "goto_previous_buffer"; 96 - "A-l" = "goto_next_buffer"; 97 - }; 98 - insert = { 99 - "S-tab" = "move_parent_node_start"; 100 - }; 101 - select = { 102 - "tab" = "move_parent_node_end"; 103 - "S-tab" = "move_parent_node_start"; 104 - }; 105 - }; 106 - }; 107 - themes.catppuccin_mocha_plus = { 108 - inherits = "catppuccin_mocha"; 109 - 110 - "ui.statusline" = { 111 - fg = "subtext0"; 112 - bg = "mantle"; 113 - }; 114 - "ui.statusline.normal" = { 115 - fg = "mantle"; 116 - bg = "rosewater"; 117 - modifiers = [ "bold" ]; 118 - }; 119 - "ui.statusline.insert" = { 120 - fg = "mantle"; 121 - bg = "maroon"; 122 - modifiers = [ "bold" ]; 123 - }; 124 - "ui.statusline.select" = { 125 - fg = "mantle"; 126 - bg = "mauve"; 127 - modifiers = [ "bold" ]; 128 - }; 129 - 130 - "ui.cursor.primary.normal" = { 131 - fg = "base"; 132 - bg = "rosewater"; 133 - }; 134 - "ui.cursor.primary.insert" = { 135 - fg = "base"; 136 - bg = "maroon"; 137 - }; 138 - "ui.cursor.primary.select" = { 139 - fg = "base"; 140 - bg = "mauve"; 141 - }; 142 - 143 - # Underlines are gross 144 - "ui.bufferline" = { 145 - fg = "subtext0"; 146 - bg = "mantle"; 147 - modifiers = [ "dim" ]; 148 - }; 149 - "ui.bufferline.active" = { 150 - fg = "text"; 151 - bg = "base"; 152 - modifiers = [ "bold" ]; 153 - }; 154 - 155 - # Mimick VS Code 156 - "ui.virtual.inlay-hint" = { 157 - fg = "overlay0"; 158 - bg = "base"; 159 - }; 160 - 161 - "ui.popup".fg = "rosewater"; 162 - "ui.popup.info".fg = "maroon"; 163 - "ui.help".fg = "maroon"; 164 - "ui.menu".fg = "text"; 165 - "ui.menu.selected" = { 166 - fg = "maroon"; 167 - modifiers = [ "bold" ]; 168 - }; 169 - "ui.menu.scroll".fg = "maroon"; 170 - "ui.background".bg = ""; # Transparent 171 - 172 - # Why the heck is it *blue*?; 173 - "diff.delta" = "yellow"; 174 - 175 - # Maroon itself is already eye-catching enough, no need to italicize 176 - "variable.parameter" = "maroon"; 177 - # Teal is wayyyyyy too obtrusive in Nix 178 - "variable.other.member" = "subtext1"; 179 - "variable.builtin" = "peach"; 180 - 181 - # Fix ${} in Nix 182 - "punctuation.special" = "maroon"; 183 - "operator" = "maroon"; 184 - }; 185 - }; 186 - 187 - hm.home.packages = with pkgs; [ 188 - # Language servers 189 - lua-language-server 190 - nil 191 - basedpyright 192 - oxlint 193 - ruff-lsp 194 - typescript-language-server 195 - vscode-langservers-extracted 196 - zls 197 - 198 - # Formatters 199 - black 200 - nixfmt-rfc-style 201 - prettierd 202 - shfmt 203 - stylua 204 - 205 - tree-sitter 206 - ]; 207 - # ++ (with pkgs.nodePackages_latest; [ 208 - # svelte-language-server 209 - # ]); 210 - }
-61
users/leah/programs/jj/default.nix
··· 1 - { pkgs, config, ... }: 2 - { 3 - hm.programs.git.difftastic.enable = true; 4 - 5 - hm.home.packages = with pkgs; [ 6 - watchman 7 - meld 8 - ]; 9 - 10 - hm.programs.jujutsu = { 11 - enable = true; 12 - settings = { 13 - user = { 14 - name = config.roles.base.fullName; 15 - email = "hi@pluie.me"; 16 - }; 17 - ui = { 18 - default-command = ["log"]; 19 - diff.tool = [ 20 - "difft" 21 - "--color=always" 22 - "$left" 23 - "$right" 24 - ]; 25 - pager = "moar -no-linenumbers"; 26 - diff-editor = "meld"; 27 - merge-editor = "meld"; 28 - log-word-wrap = true; 29 - editor = "hx"; 30 - }; 31 - template-aliases = { 32 - "format_short_id(id)" = ''id.shortest(12).prefix() ++ "[" ++ id.shortest(12).rest() ++ "]"''; 33 - "format_timestamp(timestamp)" = "timestamp.ago()"; 34 - "format_short_signature(signature)" = "signature"; 35 - }; 36 - 37 - fix.tools = { 38 - nixfmt = { 39 - command = [ "nixfmt" ]; 40 - patterns = [ "glob:'**/*.nix'" ]; 41 - }; 42 - }; 43 - 44 - signing = { 45 - behavior = "drop"; 46 - backend = "ssh"; 47 - key = config.roles.base.publicKey; 48 - }; 49 - 50 - git = { 51 - sign-on-push = true; 52 - private-commits = "description(glob:'wip:*')"; 53 - }; 54 - 55 - core = { 56 - fsmonitor = "watchman"; 57 - watchman.register-snapshot-trigger = true; 58 - }; 59 - }; 60 - }; 61 - }
+40
users/leah/programs/steam.nix
··· 1 + { 2 + config, 3 + pkgs, 4 + lib, 5 + ... 6 + }: 7 + let 8 + # Helper script for running Steam games with 9 + # a *reasonable* preset 10 + steam-assist = 11 + lib.optionalString config.hardware.nvidia.prime.offload.enable '' 12 + export __NV_PRIME_RENDER_OFFLOAD=1 13 + export __GLX_VENDOR_LIBRARY_NAME=nvidia 14 + '' + '' 15 + ${lib.getExe' pkgs.gamemode "gamemoderun"} $@ 16 + ''; 17 + in 18 + { 19 + programs.gamemode.enable = true; 20 + 21 + programs.steam = { 22 + enable = true; 23 + 24 + # Install Proton GE by default 25 + extraCompatPackages = [ pkgs.proton-ge-bin ]; 26 + 27 + # Some native Linux games *assume* the distro has 28 + # certain packages that may not be present on NixOS. 29 + extraPackages = [ 30 + pkgs.ncurses6 # Crusader Kings III 31 + ]; 32 + 33 + protontricks.enable = true; 34 + remotePlay.openFirewall = true; 35 + }; 36 + 37 + hjem.users.leah.packages = [ 38 + (pkgs.writeShellScriptBin "steam-assist" steam-assist) 39 + ]; 40 + }
+81
users/leah/programs/vcs.nix
··· 1 + { 2 + pkgs, 3 + lib, 4 + ... 5 + }: 6 + { 7 + hjem.users.leah.packages = with pkgs; [ 8 + jujutsu 9 + difftastic 10 + watchman 11 + ]; 12 + 13 + hjem.users.leah.ext.programs = { 14 + git = { 15 + enable = true; 16 + settings = { 17 + diff.external = "${lib.getExe pkgs.difftastic} --color auto --background light --display side-by-side"; 18 + 19 + init.defaultBranch = "main"; 20 + push.autoSetupRemote = true; 21 + url."https://github.com/".insteadOf = "gh:"; 22 + gpg.format = "ssh"; 23 + 24 + user = { 25 + name = "Leah Amelia Chen"; 26 + email = "hi@pluie.me"; 27 + signingKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC7uJGE2/25M4a3DIVxtnTA5INqWsFGw+49qHXaN/kqy"; 28 + }; 29 + }; 30 + }; 31 + 32 + jujutsu = { 33 + enable = true; 34 + settings = { 35 + user = { 36 + name = "Leah Amelia Chen"; 37 + email = "hi@pluie.me"; 38 + }; 39 + ui = { 40 + default-command = [ "log" ]; 41 + diff.tool = [ 42 + "${lib.getExe pkgs.difftastic}" 43 + "--color=always" 44 + "$left" 45 + "$right" 46 + ]; 47 + pager = "${lib.getExe pkgs.moar} -no-linenumbers"; 48 + log-word-wrap = true; 49 + }; 50 + template-aliases = { 51 + "format_short_id(id)" = ''id.shortest(12).prefix() ++ "[" ++ id.shortest(12).rest() ++ "]"''; 52 + "format_timestamp(timestamp)" = "timestamp.ago()"; 53 + "format_short_signature(signature)" = "signature"; 54 + }; 55 + 56 + fix.tools = { 57 + nixfmt = { 58 + command = [ "nixfmt" ]; 59 + patterns = [ "glob:'**/*.nix'" ]; 60 + }; 61 + }; 62 + 63 + signing = { 64 + behavior = "drop"; 65 + backend = "ssh"; 66 + key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC7uJGE2/25M4a3DIVxtnTA5INqWsFGw+49qHXaN/kqy"; 67 + }; 68 + 69 + git = { 70 + sign-on-push = true; 71 + private-commits = "description(glob:'wip:*')"; 72 + }; 73 + 74 + core = { 75 + fsmonitor = "watchman"; 76 + watchman.register-snapshot-trigger = true; 77 + }; 78 + }; 79 + }; 80 + }; 81 + }