Compare commits
40 Commits
a62b187832
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 434f14707c | |||
| f94f6e63b1 | |||
| ca285c92f7 | |||
| bcf0c17c51 | |||
| 5b9b48fede | |||
| fe2730b673 | |||
| 31b70d4221 | |||
| b9c0ab5f85 | |||
| 09f39d1537 | |||
| b696672f11 | |||
| 1ed32e29b0 | |||
| f04a72f19d | |||
| 3cf1f4f11f | |||
| dbf7c1cd2e | |||
| 134fc441a5 | |||
| d989792774 | |||
| 275d07f6e2 | |||
| 8357053c2a | |||
| 09585ce7ea | |||
| 1221a3a984 | |||
| 89a2eb335e | |||
| efca1819b4 | |||
| d94e534ee4 | |||
| 6b60113552 | |||
| b04faa3602 | |||
| 60dcf24b80 | |||
| 5f2eedbc53 | |||
| 9285f2f3ef | |||
| 978e7b4b62 | |||
| 4e27abcb70 | |||
| 97670b5b48 | |||
| 9a3e50be1f | |||
| 0eaf7a718f | |||
| dcece454e1 | |||
| 234b126da2 | |||
| 74c14e48b4 | |||
| 60376586a2 | |||
| 507ccca228 | |||
| 758a1dce3d | |||
| e165d31d40 |
313
flake.lock
generated
313
flake.lock
generated
@ -1,5 +1,27 @@
|
||||
{
|
||||
"nodes": {
|
||||
"aagl": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-overlay": "rust-overlay"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779290455,
|
||||
"narHash": "sha256-FsCEzxL4NotctEIiQnzvIGDcANWasc+RZ/2d6QJVD+Q=",
|
||||
"owner": "ezKEa",
|
||||
"repo": "aagl-gtk-on-nix",
|
||||
"rev": "1e9a8def348c046a626d087998782c2ae7779434",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "ezKEa",
|
||||
"repo": "aagl-gtk-on-nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"alejandra": {
|
||||
"inputs": {
|
||||
"fenix": "fenix",
|
||||
@ -23,6 +45,28 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"awww": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-overlay": "rust-overlay_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779666993,
|
||||
"narHash": "sha256-W0yA7Y37oj5BBzl4ojO8dtv9MuOvdrIZDxtRjs7kpdg=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "9b7f47f7f394dce0a17a7b161e0d2fe391ce72b3",
|
||||
"revCount": 1366,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/LGFae/awww"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/LGFae/awww"
|
||||
}
|
||||
},
|
||||
"base16": {
|
||||
"inputs": {
|
||||
"fromYaml": "fromYaml"
|
||||
@ -61,11 +105,11 @@
|
||||
"base16-helix": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1760703920,
|
||||
"narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
|
||||
"lastModified": 1776754714,
|
||||
"narHash": "sha256-E3OAK27smtATTmX45uoTSRsVD+Y+ZiVVfgM/tjpbtYg=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-helix",
|
||||
"rev": "d646af9b7d14bff08824538164af99d0c521b185",
|
||||
"rev": "4d508123037e7851ad36ebf7d9c48b0e9e1eb581",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -136,11 +180,11 @@
|
||||
"firefox-gnome-theme": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1764873433,
|
||||
"narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
|
||||
"lastModified": 1776136500,
|
||||
"narHash": "sha256-r0gN2brVWA351zwMV0Flmlcd6SGMvYqFbvC3DfKFM8Y=",
|
||||
"owner": "rafaelmardojai",
|
||||
"repo": "firefox-gnome-theme",
|
||||
"rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
|
||||
"rev": "0f8ba203d475587f477e7ae12661bd8459e225b7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -149,6 +193,38 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1761588595,
|
||||
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
@ -157,11 +233,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769996383,
|
||||
"narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
|
||||
"lastModified": 1778716662,
|
||||
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
|
||||
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -178,11 +254,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1767609335,
|
||||
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
|
||||
"lastModified": 1775087534,
|
||||
"narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
|
||||
"rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -226,20 +302,18 @@
|
||||
"gnome-shell": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"host": "gitlab.gnome.org",
|
||||
"lastModified": 1767737596,
|
||||
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
|
||||
"owner": "GNOME",
|
||||
"repo": "gnome-shell",
|
||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
||||
"type": "gitlab"
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"host": "gitlab.gnome.org",
|
||||
"owner": "GNOME",
|
||||
"ref": "gnome-49",
|
||||
"repo": "gnome-shell",
|
||||
"type": "gitlab"
|
||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"grub2-themes": {
|
||||
@ -267,11 +341,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773286336,
|
||||
"narHash": "sha256-+yFtmhOHterllxWmV6YbdevTXpJdGS0mS0UmJ0k9fh0=",
|
||||
"lastModified": 1779678629,
|
||||
"narHash": "sha256-gHcIFg0mm+KFsg7iZQt67kni3+qR5U3PhEC9P7vKlZ4=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "7d06e0cefe6e4a1e85b2b3274dcb0b3da242a557",
|
||||
"rev": "612bbe3b405ad5f71d7bf9edecc04b678a061652",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -293,11 +367,11 @@
|
||||
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773303738,
|
||||
"narHash": "sha256-qrl74wNFMTUzA8z6nSEWNjQcJI/MQEWdWu2Wn+u4Ctg=",
|
||||
"lastModified": 1779622619,
|
||||
"narHash": "sha256-CoyW4Uy3DEpI252S6vTV6/UeQ+6wsIHvi94ggC1Ev/E=",
|
||||
"owner": "sodiboo",
|
||||
"repo": "niri-flake",
|
||||
"rev": "329df7671b7859abd1cbca5d5af296ed6dc22b46",
|
||||
"rev": "f9e8b871f11137d4b9e15296ea134522dc7a7cb4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -326,11 +400,11 @@
|
||||
"niri-unstable": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1773130184,
|
||||
"narHash": "sha256-3bwx4WqCB06yfQIGB+OgIckOkEDyKxiTD5pOo4Xz2rI=",
|
||||
"lastModified": 1779374863,
|
||||
"narHash": "sha256-qKWgJ2MUODpg+b8tOwWMdMKREvs8TdGBz63SHaQZCeA=",
|
||||
"owner": "YaLTeR",
|
||||
"repo": "niri",
|
||||
"rev": "b07bde3ee82dd73115e6b949e4f3f63695da35ea",
|
||||
"rev": "4294948cf1c70c50e938383c2c865d7ca455ac7e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -341,11 +415,11 @@
|
||||
},
|
||||
"nix-flatpak": {
|
||||
"locked": {
|
||||
"lastModified": 1768656715,
|
||||
"narHash": "sha256-Sbh037scxKFm7xL0ahgSCw+X2/5ZKeOwI2clqrYr9j4=",
|
||||
"lastModified": 1777402031,
|
||||
"narHash": "sha256-6gkfl9y3+ti0Z6dgby8/R4/DRT8sWU0I0TLCIxwWtjk=",
|
||||
"owner": "gmodena",
|
||||
"repo": "nix-flatpak",
|
||||
"rev": "123fe29340a5b8671367055b75a6e7c320d6f89a",
|
||||
"rev": "22a3adbe7c5c8c8a10a635d32c9ef7fc01a6e4b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -354,13 +428,33 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-index-database": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779604987,
|
||||
"narHash": "sha256-ZQ5z+fVhxYKtIFwtqGp5O0PD84BM1riASvqDaN5Xs+s=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-index-database",
|
||||
"rev": "8fba98c80b48fa013820e0163c5096922fea4ddd",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-index-database",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixos-hardware": {
|
||||
"locked": {
|
||||
"lastModified": 1772972630,
|
||||
"narHash": "sha256-mUJxsNOrBMNOUJzN0pfdVJ1r2pxeqm9gI/yIKXzVVbk=",
|
||||
"lastModified": 1779258371,
|
||||
"narHash": "sha256-j1iZsLy6oFApqR1oiDmHhvkwxXqcNi0aoSJj643LuwU=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "3966ce987e1a9a164205ac8259a5fe8a64528f72",
|
||||
"rev": "c97bc4d15bd3473dd095e8e8ba57330ab1943a77",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -371,11 +465,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1773304180,
|
||||
"narHash": "sha256-e/ctVWU2EYXBOsJHU76lN6vqugD8u1Xl20MJ+A+bPuE=",
|
||||
"lastModified": 1779700212,
|
||||
"narHash": "sha256-1pEdBfcjgfrSoYfP06BXC/ypGhwONP+PMO44yEb2Aqc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d5eb8dca28f5be580c26f8fcb2ec4ec4215e9102",
|
||||
"rev": "415536cd2b4165c658dd130f53fbd316333b182b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -387,11 +481,11 @@
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1773068389,
|
||||
"narHash": "sha256-vMrm7Pk2hjBRPnCSjhq1pH0bg350Z+pXhqZ9ICiqqCs=",
|
||||
"lastModified": 1779467186,
|
||||
"narHash": "sha256-nOesoDCiXcUftqbRBMz9tt4blI5PvljMWbm3kuCA+0s=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "44bae273f9f82d480273bab26f5c50de3724f52f",
|
||||
"rev": "b77b3de8775677f84492abe84635f87b0e153f0f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -403,11 +497,11 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1773122722,
|
||||
"narHash": "sha256-FIqHByVqxCprNjor1NqF80F2QQoiiyqanNNefdlvOg4=",
|
||||
"lastModified": 1779508470,
|
||||
"narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "62dc67aa6a52b4364dd75994ec00b51fbf474e50",
|
||||
"rev": "29916453413845e54a65b8a1cf996842300cd299",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -417,20 +511,34 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1779259093,
|
||||
"narHash": "sha256-7DKWmH23hL2eYdkxCKeqj2i+yljTKuU+3Nk1UPHOnxc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d99b013d5d1931ad77fe3912ed218170dec5d9a4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixvim": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs": "nixpkgs_3",
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772402258,
|
||||
"narHash": "sha256-3DmCFOdmbkFML1/G9gj8Wb+rCCZFPOQtNoMCpqOF8SA=",
|
||||
"lastModified": 1779683452,
|
||||
"narHash": "sha256-Ksx8jghpDBCPDiTaTyGhYUXG1BUwqPjf5pajl0q0cqA=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixvim",
|
||||
"rev": "21ae25e13b01d3b4cdc750b5f9e7bad68b150c10",
|
||||
"rev": "afec1bae0e6f7983a5c03ec559f7ed2ec0e714a9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -451,11 +559,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1767810917,
|
||||
"narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=",
|
||||
"lastModified": 1777598946,
|
||||
"narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NUR",
|
||||
"rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4",
|
||||
"rev": "5d55af01c0f86be583931fe99207fc56c14134b3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -511,11 +619,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772361940,
|
||||
"narHash": "sha256-B1Cz+ydL1iaOnGlwOFld/C8lBECPtzhiy/pP93/CuyY=",
|
||||
"lastModified": 1775856943,
|
||||
"narHash": "sha256-b7Mp7P+q2Md5AGt4rjHfMcBykzMumFTen10ST++AuTU=",
|
||||
"owner": "nix-community",
|
||||
"repo": "plasma-manager",
|
||||
"rev": "a4b33606111c9c5dcd10009042bb710307174f51",
|
||||
"rev": "a524a6160e6df89f7673ba293cf7d78b559eb1a5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -531,11 +639,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773291133,
|
||||
"narHash": "sha256-9Odn+7x5l90HnXRY7MwVYcX+8CYAo+ldJ+GOVs7e2T8=",
|
||||
"lastModified": 1779430452,
|
||||
"narHash": "sha256-zTslhsxLqUlRTML506iougTGzyR38Fzhzn7t4KDEuuE=",
|
||||
"owner": "outfoxxed",
|
||||
"repo": "quickshell",
|
||||
"rev": "9a9c60525014bcdf83aace03db4b53c19168edcc",
|
||||
"rev": "4b4fca3224ab977dc515ac0bb78d00b3dfa71e00",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -546,12 +654,15 @@
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"aagl": "aagl",
|
||||
"alejandra": "alejandra",
|
||||
"awww": "awww",
|
||||
"cookiez-assets": "cookiez-assets",
|
||||
"grub2-themes": "grub2-themes",
|
||||
"home-manager": "home-manager",
|
||||
"niri": "niri",
|
||||
"nix-flatpak": "nix-flatpak",
|
||||
"nix-index-database": "nix-index-database",
|
||||
"nixos-hardware": "nixos-hardware",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"nixvim": "nixvim",
|
||||
@ -578,6 +689,48 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"rust-overlay": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"aagl",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1777605393,
|
||||
"narHash": "sha256-Hjp0VOOHgHcTrX23iVvnfAudPcuCmfkfpQNFwv2v/ks=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "ff88db34cfa486fc4964a6991cab1678d82eee8c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"rust-overlay_2": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"awww",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1764038373,
|
||||
"narHash": "sha256-M6w2wNBRelcavoDAyFL2iO4NeWknD40ASkH1S3C0YGM=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "ab3536fe850211a96673c6ffb2cb88aab8071cc9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"stylix": {
|
||||
"inputs": {
|
||||
"base16": "base16",
|
||||
@ -592,18 +745,17 @@
|
||||
],
|
||||
"nur": "nur",
|
||||
"systems": "systems_2",
|
||||
"tinted-foot": "tinted-foot",
|
||||
"tinted-kitty": "tinted-kitty",
|
||||
"tinted-schemes": "tinted-schemes",
|
||||
"tinted-tmux": "tinted-tmux",
|
||||
"tinted-zed": "tinted-zed"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772296853,
|
||||
"narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=",
|
||||
"lastModified": 1779378391,
|
||||
"narHash": "sha256-IsDb9erotvx9npI94UDosvMeYQK17p7/vmU2v9batrY=",
|
||||
"owner": "nix-community",
|
||||
"repo": "stylix",
|
||||
"rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf",
|
||||
"rev": "c1456cc4ba3c9485e7b4158c909eeca5a752cd59",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -643,23 +795,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-foot": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1726913040,
|
||||
"narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-foot",
|
||||
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-foot",
|
||||
"rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"tinted-kitty": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
@ -679,11 +814,11 @@
|
||||
"tinted-schemes": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767710407,
|
||||
"narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=",
|
||||
"lastModified": 1777041405,
|
||||
"narHash": "sha256-BAGZ7ObFV/9Z61OJZun7ifPyhkuHqNuW1QIhQ8LuzCo=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "schemes",
|
||||
"rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2",
|
||||
"rev": "5f868b3a338b6904c47f3833b9c411be641983a8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -695,11 +830,11 @@
|
||||
"tinted-tmux": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767489635,
|
||||
"narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
|
||||
"lastModified": 1777169200,
|
||||
"narHash": "sha256-h7dDbIzP5hDr9v97w9PL6jdAgXawmj6krcH+959rqpU=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-tmux",
|
||||
"rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
|
||||
"rev": "f798c2dce44ef815bb6b8f05a82135c7942d35ac",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -711,11 +846,11 @@
|
||||
"tinted-zed": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767488740,
|
||||
"narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
|
||||
"lastModified": 1777463218,
|
||||
"narHash": "sha256-Bhkozqtq3BKLqWTlmKm8uAptfX4aRGI8QX3eEL54Vpc=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-zed",
|
||||
"rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
|
||||
"rev": "5768d08ed2e7944a26a958868cdb073cb8856dae",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -744,11 +879,11 @@
|
||||
"xwayland-satellite-unstable": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1772429643,
|
||||
"narHash": "sha256-M+bAeCCcjBnVk6w/4dIVvXvpJwOKnXjwi/lDbaN6Yws=",
|
||||
"lastModified": 1779591853,
|
||||
"narHash": "sha256-osTG6d7BfV5CchHjETh3jcmZwDYrHpNcpAIyh1KyIs0=",
|
||||
"owner": "Supreeeme",
|
||||
"repo": "xwayland-satellite",
|
||||
"rev": "10f985b84cdbcc3bbf35b3e7e43d1b2a84fa9ce2",
|
||||
"rev": "3273a0fccd71da21c6362c74f3b1d1c0a89ff3ba",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
36
flake.nix
36
flake.nix
@ -4,10 +4,25 @@
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
|
||||
pinned-kernel.url = "github:NixOS/nixpkgs/3b5ec87c520b3f3f890c439da30b9fc3f7e173d3";
|
||||
#To pin Kernel versin 7.0.10 because others have bluetooth issues
|
||||
|
||||
nix-index-database = {
|
||||
url = "github:nix-community/nix-index-database";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
aagl = {
|
||||
url = "github:ezKEa/aagl-gtk-on-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nixos-hardware.url = "github:NixOS/nixos-hardware"; #To Provide Framework13 hardware modules
|
||||
|
||||
home-manager.url = "github:nix-community/home-manager/master";
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/master";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
plasma-manager = {
|
||||
url = "github:nix-community/plasma-manager";
|
||||
@ -15,12 +30,13 @@
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
|
||||
#stylix.url = "github:nix-community/stylix/";
|
||||
stylix.url = "github:nix-community/stylix/master"; #Had to use branch or it would not build corrently
|
||||
stylix.inputs.nixpkgs.follows = "nixpkgs";
|
||||
stylix = {
|
||||
url = "github:nix-community/stylix/master"; #Had to use branch or it would not build corrently
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
quickshell = {
|
||||
url = "github:outfoxxed/quickshell";
|
||||
noctalia = {
|
||||
url = "github:noctalia-dev/noctalia-shell/v5";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
@ -31,7 +47,7 @@
|
||||
|
||||
nixvim = {
|
||||
url = "github:nix-community/nixvim";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
#Do not use follows here as it will throw warnings with nixvim's built-in source
|
||||
};
|
||||
|
||||
alejandra = {
|
||||
@ -58,14 +74,18 @@
|
||||
nixpkgs,
|
||||
alejandra,
|
||||
pam-fprint-grosshack,
|
||||
pinned-kernel,
|
||||
cookiez-assets,
|
||||
home-manager,
|
||||
plasma-manager,
|
||||
noctalia,
|
||||
nixos-hardware,
|
||||
aagl,
|
||||
stylix,
|
||||
niri,
|
||||
grub2-themes,
|
||||
nix-flatpak,
|
||||
nix-index-database,
|
||||
...
|
||||
}: let
|
||||
username = "cookiez";
|
||||
|
||||
@ -14,19 +14,37 @@
|
||||
version,
|
||||
system,
|
||||
pam-fprint-grosshack-pkg,
|
||||
cookiez-assets,
|
||||
...
|
||||
}: {
|
||||
}: let
|
||||
kernel-pinned = import inputs.pinned-kernel {inherit system;};
|
||||
in {
|
||||
#Assign Swap to the PC
|
||||
#swapDevices = [{
|
||||
# device = "/swapfile";
|
||||
# size = 16 * 1024; # 16GB
|
||||
#}];
|
||||
swapDevices = [
|
||||
{
|
||||
device = "/swapfile";
|
||||
size = 34 * 1024; # 34GB
|
||||
#randomEncryption.enable = true; #Doesnt work with hybernation
|
||||
}
|
||||
];
|
||||
nix = {
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
options = "--delete-older-than 14d";
|
||||
};
|
||||
settings = {
|
||||
auto-optimise-store = true;
|
||||
nix-path = config.nix.nixPath;
|
||||
};
|
||||
nixPath = ["nixpkgs=${inputs.nixpkgs}"];
|
||||
};
|
||||
|
||||
imports = [
|
||||
inputs.nix-index-database.nixosModules.nix-index
|
||||
inputs.home-manager.nixosModules.home-manager
|
||||
inputs.grub2-themes.nixosModules.default
|
||||
inputs.nix-flatpak.nixosModules.nix-flatpak
|
||||
inputs.aagl.nixosModules.default
|
||||
./hardware-configuration.nix
|
||||
|
||||
./firefox
|
||||
@ -38,8 +56,10 @@
|
||||
|
||||
# Bootloader.
|
||||
boot = {
|
||||
kernelPackages = kernel-pinned.linuxPackages_latest;
|
||||
kernelParams = ["quiet" "splash"];
|
||||
initrd = {
|
||||
systemd.enable = true; #For swap to automatically work
|
||||
verbose = false;
|
||||
kernelModules = ["amdgpu"];
|
||||
};
|
||||
@ -100,7 +120,7 @@
|
||||
useUserPackages = true;
|
||||
users.${username} = ./home.nix;
|
||||
backupFileExtension = "backup"; # Automatically backs up conflicting files during activation
|
||||
extraSpecialArgs = {inherit inputs username project version system host cookiez-assets;};
|
||||
extraSpecialArgs = {inherit inputs username project version system host;};
|
||||
sharedModules = [inputs.plasma-manager.homeModules.plasma-manager];
|
||||
};
|
||||
|
||||
@ -124,22 +144,6 @@
|
||||
|
||||
# List services that you want to enable:
|
||||
services = {
|
||||
ollama = {
|
||||
enable = false;
|
||||
# Optional: load models on startup
|
||||
#loadModels = [ ... ];
|
||||
};
|
||||
|
||||
open-webui = {
|
||||
enable = true;
|
||||
package = pkgs.open-webui;
|
||||
#environment = {
|
||||
# DATA_DIR = "/var/lib/open-webui"; # System-wide writable dir
|
||||
# OLLAMA_API_BASE_URL = "http://127.0.0.1:11434";
|
||||
#};
|
||||
#openFirewall = true;
|
||||
};
|
||||
|
||||
fprintd.enable = true;
|
||||
fprintd.tod.enable = true;
|
||||
fprintd.tod.driver = pkgs.libfprint-2-tod1-goodix;
|
||||
@ -192,12 +196,19 @@
|
||||
openssh.enable = true;
|
||||
};
|
||||
|
||||
systemd.services.fprintd = {
|
||||
systemd = {
|
||||
tmpfiles.rules = [
|
||||
"L+ /var/lib/assets - - - - ${inputs.cookiez-assets}"
|
||||
];
|
||||
services.fprintd = {
|
||||
wantedBy = ["multi-user.target"];
|
||||
serviceConfig.Type = "simple";
|
||||
};
|
||||
};
|
||||
|
||||
fonts = {
|
||||
fontDir.enable = true;
|
||||
|
||||
packages = with pkgs; [
|
||||
font-awesome
|
||||
nerd-fonts.jetbrains-mono
|
||||
@ -222,10 +233,42 @@
|
||||
programs = {
|
||||
steam.enable = true;
|
||||
|
||||
gamemode.enable = true;
|
||||
|
||||
gamescope.enable = true;
|
||||
|
||||
nix-index-database.comma.enable = true;
|
||||
|
||||
direnv = {
|
||||
enable = true;
|
||||
silent = true; # Suppresses direnv's output in the terminal
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
|
||||
ssh.askPassword = lib.mkForce "${pkgs.kdePackages.ksshaskpass}/bin/ksshaskpass";
|
||||
|
||||
sleepy-launcher.enable = true; #Zenless zone zero launcher
|
||||
|
||||
#In order for dynamically linked executables to work
|
||||
nix-ld.enable = true;
|
||||
nix-ld = {
|
||||
enable = true;
|
||||
#To ensure that the neccesary libraries are included in the wrapper
|
||||
libraries = with pkgs; [
|
||||
wayland
|
||||
libadwaita
|
||||
gtk4
|
||||
gtk3
|
||||
glib
|
||||
gdk-pixbuf
|
||||
pango
|
||||
cairo
|
||||
libGL
|
||||
openssl
|
||||
dbus
|
||||
fontconfig
|
||||
freetype
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Configure console keymap
|
||||
@ -276,7 +319,7 @@
|
||||
users.users.${username} = {
|
||||
isNormalUser = true;
|
||||
description = "Cookiez";
|
||||
extraGroups = ["networkmanager" "wheel" "docker"];
|
||||
extraGroups = ["networkmanager" "wheel" "docker" "gamemode" "dialout" "tty"];
|
||||
packages = with pkgs; [
|
||||
#User Packages Here
|
||||
];
|
||||
@ -290,7 +333,7 @@
|
||||
# dockerCompat = true;
|
||||
#};
|
||||
|
||||
waydroid.enable = true;
|
||||
waydroid.enable = false;
|
||||
};
|
||||
|
||||
environment = {
|
||||
@ -341,7 +384,15 @@
|
||||
};
|
||||
|
||||
#Allow Nix Commands
|
||||
nix.settings.experimental-features = ["nix-command" "flakes"];
|
||||
nix.settings = {
|
||||
experimental-features = ["nix-command" "flakes"];
|
||||
|
||||
max-substitution-jobs = 32;
|
||||
http-connections = 50;
|
||||
|
||||
extra-substituters = ["https://ezkea.cachix.org" "https://noctalia.cachix.org" "https://nix-community.cachix.org"];
|
||||
extra-trusted-public-keys = ["ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" "noctalia.cachix.org-1:pCOR47nnMEo5thcxNDtzWpOxNFQsBRglJzxWPp3dkU4=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="];
|
||||
};
|
||||
|
||||
# Allow unfree packages
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
@ -7,18 +7,18 @@
|
||||
../niri
|
||||
];
|
||||
|
||||
specialisation = {
|
||||
"plasma" = {
|
||||
inheritParentConfig = false;
|
||||
configuration = {
|
||||
imports = [
|
||||
../plasma
|
||||
./configuration.nix
|
||||
];
|
||||
|
||||
environment.etc."nixos-tags".text = "plasma";
|
||||
};
|
||||
};
|
||||
#specialisation = {
|
||||
# "plasma" = {
|
||||
# inheritParentConfig = false;
|
||||
# configuration = {
|
||||
# imports = [
|
||||
# ../plasma
|
||||
# ./configuration.nix
|
||||
# ];
|
||||
#
|
||||
# environment.etc."nixos-tags".text = "plasma";
|
||||
# };
|
||||
# };
|
||||
|
||||
# "minimal" = {
|
||||
# inheritParentConfig = false;
|
||||
@ -31,16 +31,16 @@
|
||||
# };
|
||||
# };
|
||||
|
||||
"niri" = {
|
||||
inheritParentConfig = false;
|
||||
configuration = {
|
||||
imports = [
|
||||
../niri
|
||||
./configuration.nix
|
||||
];
|
||||
|
||||
environment.etc."nixos-tags".text = "niri";
|
||||
};
|
||||
};
|
||||
};
|
||||
# "niri" = {
|
||||
# inheritParentConfig = false;
|
||||
# configuration = {
|
||||
# imports = [
|
||||
# ../niri
|
||||
# ./configuration.nix
|
||||
# ];
|
||||
#
|
||||
# environment.etc."nixos-tags".text = "niri";
|
||||
# };
|
||||
# };
|
||||
#};
|
||||
}
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
username,
|
||||
project,
|
||||
cookiez-assets,
|
||||
...
|
||||
}: {
|
||||
xdg = {
|
||||
@ -20,11 +20,13 @@
|
||||
noDisplay = true;
|
||||
};
|
||||
|
||||
dataFile."icons/hicolor/256x256/apps/vencord-custom.png".source = "${inputs.cookiez-assets}/apps/discord.png";
|
||||
|
||||
desktopEntries."discord" = {
|
||||
categories = ["Network" "InstantMessaging" "Chat"];
|
||||
exec = "vesktop %U";
|
||||
genericName = "Internet Messenger";
|
||||
icon = "${cookiez-assets}/apps/discord.png";
|
||||
icon = "vencord-custom";
|
||||
name = "Discord";
|
||||
type = "Application";
|
||||
};
|
||||
@ -38,6 +40,8 @@
|
||||
type = "Application";
|
||||
};
|
||||
|
||||
dataFile."icons/hicolor/256x256/apps/kitty-custom.png".source = "${inputs.cookiez-assets}/apps/kitty.png";
|
||||
|
||||
desktopEntries.kitty = {
|
||||
name = "kitty";
|
||||
genericName = "Terminal emulator";
|
||||
@ -46,7 +50,8 @@
|
||||
terminal = false;
|
||||
categories = ["System" "TerminalEmulator"];
|
||||
|
||||
icon = "${cookiez-assets}/apps/kitty.png";
|
||||
#icon = "${inputs.cookiez-assets}/apps/kitty.png";
|
||||
icon = "kitty-custom";
|
||||
};
|
||||
|
||||
desktopEntries."org.kde.kinfocenter" = {
|
||||
@ -59,11 +64,6 @@
|
||||
noDisplay = true;
|
||||
};
|
||||
|
||||
desktopEntries."org.kde.kmenuedit" = {
|
||||
name = "Menu Editor";
|
||||
noDisplay = true;
|
||||
};
|
||||
|
||||
desktopEntries."micro" = {
|
||||
name = "Micro";
|
||||
noDisplay = true;
|
||||
@ -107,10 +107,5 @@
|
||||
name = "KWrite";
|
||||
noDisplay = true;
|
||||
};
|
||||
|
||||
desktopEntries."org.kde.discover" = {
|
||||
name = "Discover";
|
||||
noDisplay = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
enable = true;
|
||||
profiles = {
|
||||
"${username}" = {
|
||||
isDefault = true;
|
||||
extensions.force = true;
|
||||
|
||||
#Create multiple containers, like "work" "social media" ..., for cookies to reside in so they dont cross leak
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
home.username = username;
|
||||
home.homeDirectory = "/home/${username}";
|
||||
home.packages = [
|
||||
(import ./ncli.nix {
|
||||
(import ./ncli/default.nix {
|
||||
inherit pkgs host project;
|
||||
backupFiles = [
|
||||
".gtkrc-2.0.backup"
|
||||
@ -25,6 +25,7 @@
|
||||
".config/gtk-4.0/settings.ini.backup"
|
||||
".config/niri/config.kdl"
|
||||
];
|
||||
devTemplate = ../other/dev-template.nix;
|
||||
})
|
||||
];
|
||||
|
||||
@ -55,6 +56,12 @@
|
||||
#];
|
||||
};
|
||||
|
||||
direnv = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
|
||||
kitty = {
|
||||
enable = true;
|
||||
settings = {
|
||||
@ -67,6 +74,7 @@
|
||||
|
||||
git = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
settings = {
|
||||
user = {
|
||||
name = "Cookiez";
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
username,
|
||||
project,
|
||||
cookiez-assets,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
];
|
||||
|
||||
services = {
|
||||
hyprpaper = {
|
||||
enable = false;
|
||||
|
||||
settings = {
|
||||
preload = [
|
||||
#"/home/${username}/${project}/other/wallpaper1.png"
|
||||
#"/home/${username}/${project}/other/wallpaper2.png"
|
||||
#"/home/${username}/${project}/other/wallpaper3.png"
|
||||
"${cookiez-assets}/wallpapers/pixel-desert.png"
|
||||
];
|
||||
|
||||
wallpaper = [
|
||||
#"eDP-1,/home/${username}/${project}/other/wallpaper1.png"
|
||||
#"eDP-1,/home/${username}/${project}/other/wallpaper2.png"
|
||||
#"eDP-1,/home/${username}/${project}/other/wallpaper3.png"
|
||||
"eDP-1,${cookiez-assets}/wallpapers/pixel-desert.png"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
336
modules/ncli.nix
336
modules/ncli.nix
@ -1,336 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
host,
|
||||
backupFiles ? [".config/mimeapps.list.backup"],
|
||||
project,
|
||||
...
|
||||
}: let
|
||||
backupFilesString = pkgs.lib.strings.concatStringsSep " " backupFiles;
|
||||
in
|
||||
pkgs.writeShellScriptBin "ncli" ''
|
||||
#!${pkgs.bash}/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# --- Configuration ---
|
||||
PROJECT="${project}"
|
||||
HOST="${host}"
|
||||
BACKUP_FILES_STR="${backupFilesString}"
|
||||
VERSION="2.0.0"
|
||||
FLAKE_NIX_PATH="$HOME/$PROJECT/flake.nix"
|
||||
|
||||
read -r -a BACKUP_FILES <<< "$BACKUP_FILES_STR"
|
||||
|
||||
# --- Read Colors file ---
|
||||
source /$HOME/$PROJECT/other/colors.sh
|
||||
|
||||
# --- Helper Functions ---
|
||||
print_help() {
|
||||
echo "NixOS CLI Utility -- version $VERSION"
|
||||
echo ""
|
||||
echo "Usage: ncli [command]"
|
||||
echo ""
|
||||
echo "System Commands:"
|
||||
echo " rebuild - Rebuild the NixOS system configuration."
|
||||
echo " update - Update the flake and rebuild the system."
|
||||
echo ""
|
||||
echo "Maintenance Commands:"
|
||||
echo " cleanup - Clean up old system generations. Can specify a number to keep."
|
||||
echo " diag - Create a system diagnostic report (saves to ~/diag.txt)."
|
||||
echo " list-gens - List user and system generations."
|
||||
echo " trim - Trim filesystems to improve SSD performance."
|
||||
echo ""
|
||||
echo "Git Commands:"
|
||||
echo " commit [msg] - Add all changes and commit with message."
|
||||
echo " push - Push changes to origin."
|
||||
echo " pull - Pull latest changes from origin."
|
||||
echo " status - Show git status."
|
||||
echo ""
|
||||
echo " help - Show this help message."
|
||||
echo ""
|
||||
}
|
||||
|
||||
handle_backups() {
|
||||
if [ ''${#BACKUP_FILES[@]} -eq 0 ]; then
|
||||
echo "No backup files configured to check."
|
||||
return
|
||||
fi
|
||||
|
||||
echo "Checking for backup files to remove..."
|
||||
for file_path in "''${BACKUP_FILES[@]}"; do
|
||||
full_path="$HOME/$file_path"
|
||||
if [ -f "$full_path" ]; then
|
||||
echo "Removing stale backup file: $full_path"
|
||||
rm "$full_path"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# --- Main Logic ---
|
||||
if [ "$#" -eq 0 ]; then
|
||||
echo "Error: No command provided." >&2
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
cleanup)
|
||||
echo "Warning! This will remove old generations of your system."
|
||||
read -p "How many generations to keep (default: all)? " keep_count
|
||||
|
||||
if [ -z "$keep_count" ]; then
|
||||
read -p "This will remove all but the current generation. Continue (y/N)? " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
nh clean all -v
|
||||
else
|
||||
echo "Cleanup cancelled."
|
||||
fi
|
||||
else
|
||||
read -p "This will keep the last $keep_count generations. Continue (y/N)? " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
nh clean all -k "$keep_count" -v
|
||||
else
|
||||
echo "Cleanup cancelled."
|
||||
fi
|
||||
fi
|
||||
|
||||
LOG_DIR="$HOME/ncli-cleanup-logs"
|
||||
mkdir -p "$LOG_DIR"
|
||||
LOG_FILE="$LOG_DIR/ncli-cleanup-$(date +%Y-%m-%d_%H-%M-%S).log"
|
||||
echo "Cleaning up old log files..." >> "$LOG_FILE"
|
||||
find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1
|
||||
echo "Cleanup process logged to $LOG_FILE"
|
||||
;;
|
||||
diag)
|
||||
echo "Generating system diagnostic report..."
|
||||
{
|
||||
echo "=== NixOS System Diagnostic Report ==="
|
||||
echo "Generated: $(date)"
|
||||
echo ""
|
||||
echo "=== System Information ==="
|
||||
inxi --full 2>/dev/null || echo "inxi not available"
|
||||
echo ""
|
||||
echo "=== Git Status ==="
|
||||
cd "$HOME/$PROJECT" 2>/dev/null && git status 2>/dev/null || echo "Git status not available"
|
||||
echo ""
|
||||
} > "$HOME/diag.txt"
|
||||
echo "Diagnostic report saved to $HOME/diag.txt"
|
||||
;;
|
||||
help)
|
||||
print_help
|
||||
;;
|
||||
list-gens)
|
||||
echo "--- User Generations ---"
|
||||
nix-env --list-generations | cat || echo "Could not list user generations."
|
||||
echo ""
|
||||
echo "--- System Generations ---"
|
||||
nix profile history --profile /nix/var/nix/profiles/system | cat || echo "Could not list system generations."
|
||||
;;
|
||||
rebuild)
|
||||
handle_backups
|
||||
geno=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
echo -e "Starting NixOS rebuild for current host: $HOST on generation: $YELLOW$geno$NOCOLOR"
|
||||
cd "$HOME/$PROJECT" || { echo "Error: Could not change to $HOME/$PROJECT"; exit 1; }
|
||||
|
||||
current=""
|
||||
if [ -f /etc/nixos-tags ]; then
|
||||
current=$(cat /etc/nixos-tags)
|
||||
fi
|
||||
|
||||
if sudo nixos-rebuild switch --flake .; then
|
||||
echo "✓ Rebuild finished successfully for $HOST"
|
||||
|
||||
if [ -n "$current" ]; then
|
||||
sudo /run/current-system/specialisation/$current/bin/switch-to-configuration test
|
||||
else
|
||||
echo "No specialization tag found, staying on default system."
|
||||
fi
|
||||
|
||||
genn=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
echo -e "Running on new generation: $YELLOW $geno $NOCOLOR-> $GREEN$genn$NOCOLOR"
|
||||
|
||||
else
|
||||
echo "✗ Rebuild failed for $HOST" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
update)
|
||||
handle_backups
|
||||
geno=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
echo -e "Updating flake and rebuilding system for current host: $HOST on generation: $YELLOW$geno$NOCOLOR"
|
||||
cd "$HOME/$PROJECT" || { echo "Error: Could not change to $HOME/$PROJECT"; exit 1; }
|
||||
|
||||
# --- Selective flake update ---
|
||||
read -rp "Update [a]ll inputs or [s]elect manually? (a/s): " choice
|
||||
|
||||
case "$choice" in
|
||||
a|A)
|
||||
echo "Updating all inputs..."
|
||||
if nix flake update --flake .; then
|
||||
echo "✓ Flake updated successfully"
|
||||
else
|
||||
echo "✗ Flake update failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
s|S)
|
||||
echo "Fetching available updates (this may take a moment)..."
|
||||
TEMP_LOCK=$(mktemp)
|
||||
trap 'rm -f "$TEMP_LOCK"' EXIT
|
||||
|
||||
nix flake update --output-lock-file "$TEMP_LOCK" --flake . 2>/dev/null
|
||||
|
||||
outdated=$(jq -r --slurpfile new "$TEMP_LOCK" '
|
||||
.nodes as $old |
|
||||
$new[0].nodes as $newn |
|
||||
($old | keys[]) |
|
||||
select(. != "root") |
|
||||
select(
|
||||
($old[.].locked.lastModified // 0) !=
|
||||
($newn[.].locked.lastModified // 0)
|
||||
)
|
||||
' flake.lock)
|
||||
|
||||
if [[ -z "$outdated" ]]; then
|
||||
echo "✓ All inputs are already up to date, skipping flake update."
|
||||
else
|
||||
echo
|
||||
echo "Updates available for:"
|
||||
printf '%s\n' "$outdated"
|
||||
echo
|
||||
echo "Tab to select, Enter to update, Esc to cancel."
|
||||
selected=$(printf '%s\n' "$outdated" | fzf --multi) || {
|
||||
echo "No inputs selected, skipping flake update."
|
||||
selected=""
|
||||
}
|
||||
if [[ -n "$selected" ]]; then
|
||||
if nix flake update --flake . $selected; then
|
||||
echo "✓ Flake updated successfully"
|
||||
else
|
||||
echo "✗ Flake update failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice, skipping flake update."
|
||||
;;
|
||||
esac
|
||||
# --- End selective flake update ---
|
||||
|
||||
|
||||
current=""
|
||||
if [ -f /etc/nixos-tags ]; then
|
||||
current=$(cat /etc/nixos-tags)
|
||||
fi
|
||||
|
||||
if [ -n "$current" ]; then
|
||||
echo "Rebuilding system... Current specialization: $current"
|
||||
else
|
||||
echo "Rebuilding system... Staying on current specialization"
|
||||
fi
|
||||
|
||||
if sudo nixos-rebuild switch --flake .; then
|
||||
echo "✓ Update and rebuild finished successfully for $HOST"
|
||||
|
||||
if [ -n "$current" ]; then
|
||||
sudo /run/current-system/specialisation/$current/bin/switch-to-configuration test
|
||||
else
|
||||
echo "No specialization tag found, staying on default system."
|
||||
fi
|
||||
|
||||
genn=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
echo -e "Running on new generation: $YELLOW $geno $NOCOLOR-> $GREEN$genn$NOCOLOR"
|
||||
|
||||
else
|
||||
echo "✗ Update and rebuild failed for $HOST" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
commit)
|
||||
cd "$HOME/$PROJECT" || { echo "Error: Could not change to $HOME/$PROJECT"; exit 1; }
|
||||
if [ "$#" -lt 2 ]; then
|
||||
read -p "Enter commit message: " commit_msg
|
||||
else
|
||||
shift
|
||||
commit_msg="$*"
|
||||
fi
|
||||
|
||||
if [ -z "$commit_msg" ]; then
|
||||
echo "Error: Commit message cannot be empty" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git add -A && git commit -m "$commit_msg"
|
||||
;;
|
||||
home-backups)
|
||||
ls -a ~ | grep backup
|
||||
;;
|
||||
switch)
|
||||
current=""
|
||||
if [ -f /etc/nixos-tags ]; then
|
||||
current=$(cat /etc/nixos-tags)
|
||||
fi
|
||||
|
||||
if [ "$#" -ge 2 ]; then
|
||||
spec_name="$2"
|
||||
if [ -n "$current" ]; then
|
||||
echo "Already on specialization: $current. Cannot switch directly to '$spec_name'. Please reboot or return to default first."
|
||||
else
|
||||
if [ -d "/run/current-system/specialisation/$spec_name" ]; then
|
||||
echo "Switching to specialization: $spec_name"
|
||||
sudo /run/current-system/specialisation/$spec_name/bin/switch-to-configuration test
|
||||
else
|
||||
echo "Error: Specialization '$spec_name' not found."
|
||||
echo "Available specializations:"
|
||||
ls /run/current-system/specialisation/
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ -n "$current" ]; then
|
||||
echo "Already on a specialization: $current. To switch, please reboot, or use 'sudo nixos-rebuild switch --flake .' to get back to default, and then switch after."
|
||||
else
|
||||
specs=$(ls /run/current-system/specialisation/)
|
||||
echo "Specializations available:"
|
||||
echo "$specs"
|
||||
echo ""
|
||||
echo "To switch to a specialization, run: 'ncli switch <tag>'"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
push)
|
||||
cd "$HOME/$PROJECT" || { echo "Error: Could not change to $HOME/$PROJECT"; exit 1; }
|
||||
git push origin $(git branch --show-current)
|
||||
;;
|
||||
pull)
|
||||
cd "$HOME/$PROJECT" || { echo "Error: Could not change to $HOME/$PROJECT"; exit 1; }
|
||||
git pull origin $(git branch --show-current)
|
||||
;;
|
||||
status)
|
||||
cd "$HOME/$PROJECT" || { echo "Error: Could not change to $HOME/$PROJECT"; exit 1; }
|
||||
git status
|
||||
;;
|
||||
format)
|
||||
nix fmt .
|
||||
;;
|
||||
trim)
|
||||
echo "Running 'sudo fstrim -v /' may take a few minutes and impact system performance."
|
||||
read -p "Enter to run now or enter to exit (y/N): " -n 1 -r
|
||||
echo # move to a new line
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Running fstrim..."
|
||||
sudo fstrim -v /
|
||||
echo "fstrim complete."
|
||||
else
|
||||
echo "Trim operation cancelled."
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Error: Invalid command '$1'" >&2
|
||||
print_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
''
|
||||
136
modules/ncli/builder.nix
Normal file
136
modules/ncli/builder.nix
Normal file
@ -0,0 +1,136 @@
|
||||
# ncli/builder.nix — Assembles all modules into the final script
|
||||
{
|
||||
pkgs,
|
||||
host,
|
||||
backupFiles ? [".config/mimeapps.list.backup"],
|
||||
project,
|
||||
...
|
||||
}: let
|
||||
# --- Shared library ---
|
||||
lib = import ./lib.nix {inherit pkgs host project backupFiles;};
|
||||
|
||||
# --- Command modules ---
|
||||
rebuild = import ./commands/rebuild.nix lib;
|
||||
maintenance = import ./commands/maintenance.nix lib;
|
||||
git = import ./commands/git.nix lib;
|
||||
switch = import ./commands/switch.nix lib;
|
||||
dev = import ./commands/dev.nix lib;
|
||||
|
||||
# --- Help text ---
|
||||
print_help = ''
|
||||
print_help() {
|
||||
echo "NixOS CLI Utility -- version 2.1.3"
|
||||
echo ""
|
||||
echo "Usage: ncli [command]"
|
||||
echo ""
|
||||
echo "System Commands:"
|
||||
echo " rebuild - Rebuild the NixOS system configuration."
|
||||
echo " update - Update the flake and rebuild the system."
|
||||
echo ""
|
||||
echo "Maintenance Commands:"
|
||||
echo " cleanup - Clean up old system generations. Can specify a number to keep."
|
||||
echo " diag - Create a system diagnostic report (saves to ~/diag.txt)."
|
||||
echo " list-gens - List user and system generations."
|
||||
echo " trim - Trim filesystems to improve SSD performance."
|
||||
echo ""
|
||||
echo "Git Commands:"
|
||||
echo " commit [msg] - Add all changes and commit with message."
|
||||
echo " push - Push changes to origin."
|
||||
echo " pull - Pull latest changes from origin."
|
||||
echo " status - Show git status."
|
||||
echo ""
|
||||
echo "Development Commands:"
|
||||
echo " dev - Initialize a Nix development environment (flake.nix + direnv)."
|
||||
echo " dev track - Remove assume-unchanged flag from flake files."
|
||||
echo " dev untrack - Mark flake files as assume-unchanged in a directory."
|
||||
echo ""
|
||||
echo " help - Show this help message."
|
||||
echo ""
|
||||
}
|
||||
'';
|
||||
in
|
||||
pkgs.writeShellScriptBin "ncli" ''
|
||||
#!${pkgs.bash}/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# --- Configuration ---
|
||||
PROJECT="${project}"
|
||||
HOST="${host}"
|
||||
BACKUP_FILES_STR="${lib.backupFilesString}"
|
||||
VERSION="2.2.0"
|
||||
FLAKE_NIX_PATH="$HOME/$PROJECT/flake.nix"
|
||||
|
||||
read -r -a BACKUP_FILES <<< "$BACKUP_FILES_STR"
|
||||
|
||||
# --- Read Colors file ---
|
||||
source ${lib.colorsSource}
|
||||
|
||||
# --- Helper Functions ---
|
||||
${lib.handle_backups}
|
||||
${lib.handle_build_error}
|
||||
${lib.print_header}
|
||||
${lib.print_success}
|
||||
${lib.print_error}
|
||||
${lib.print_info}
|
||||
${print_help}
|
||||
|
||||
# --- Main Logic ---
|
||||
if [ "$#" -eq 0 ]; then
|
||||
echo "Error: No command provided." >&2
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
rebuild)
|
||||
${rebuild.rebuild_case}
|
||||
;;
|
||||
update)
|
||||
${rebuild.update_case}
|
||||
;;
|
||||
cleanup)
|
||||
${maintenance.cleanup_case}
|
||||
;;
|
||||
diag)
|
||||
${maintenance.diag_case}
|
||||
;;
|
||||
list-gens)
|
||||
${maintenance.list_gens_case}
|
||||
;;
|
||||
trim)
|
||||
${maintenance.trim_case}
|
||||
;;
|
||||
home-backups)
|
||||
${maintenance.home_backups_case}
|
||||
;;
|
||||
commit)
|
||||
${git.commit_case}
|
||||
;;
|
||||
push)
|
||||
${git.push_case}
|
||||
;;
|
||||
pull)
|
||||
${git.pull_case}
|
||||
;;
|
||||
status)
|
||||
${git.status_case}
|
||||
;;
|
||||
format)
|
||||
${git.format_case}
|
||||
;;
|
||||
switch)
|
||||
${switch.switch_case}
|
||||
;;
|
||||
dev)
|
||||
${dev.dev_case}
|
||||
;;
|
||||
help)
|
||||
print_help
|
||||
;;
|
||||
*)
|
||||
echo "Error: Invalid command '$1'" >&2
|
||||
print_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
''
|
||||
364
modules/ncli/commands/dev.nix
Normal file
364
modules/ncli/commands/dev.nix
Normal file
@ -0,0 +1,364 @@
|
||||
# ncli/commands/dev.nix — dev init / track / untrack
|
||||
lib: {
|
||||
dev_case = ''
|
||||
# Only flake files need assume-unchanged (Nix requires them in the index).
|
||||
# .envrc and .direnv are handled via .git/info/exclude instead.
|
||||
DEV_FILES=(flake.nix flake.lock)
|
||||
DIRENV_LOCAL_FILES=(.envrc .direnv)
|
||||
|
||||
_dev_resolve_dir() {
|
||||
read -rp " Enter target directory [./]: " TARGET_DIR
|
||||
TARGET_DIR="''${TARGET_DIR:-./}"
|
||||
if [[ ! -d "$TARGET_DIR" ]]; then
|
||||
print_error "Directory '$TARGET_DIR' does not exist."
|
||||
exit 1
|
||||
fi
|
||||
TARGET_ABS="$(cd "$TARGET_DIR" && pwd)"
|
||||
if ! git -C "$TARGET_ABS" rev-parse --git-dir > /dev/null 2>&1; then
|
||||
print_error "No Git repository found at '$TARGET_ABS'."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
_add_local_excludes() {
|
||||
local repo_abs="$1"
|
||||
local git_dir exclude_file
|
||||
git_dir="$(git -C "$repo_abs" rev-parse --git-dir)"
|
||||
exclude_file="$git_dir/info/exclude"
|
||||
mkdir -p "$(dirname "$exclude_file")"
|
||||
touch "$exclude_file"
|
||||
|
||||
for entry in "''${DIRENV_LOCAL_FILES[@]}"; do
|
||||
if ! grep -qxF "$entry" "$exclude_file" 2>/dev/null; then
|
||||
echo "$entry" >> "$exclude_file"
|
||||
print_success "$entry → ignored via .git/info/exclude (local only)"
|
||||
else
|
||||
print_info "$entry already in .git/info/exclude, skipping."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
_remove_local_excludes() {
|
||||
local repo_abs="$1"
|
||||
local git_dir exclude_file tmp_file
|
||||
git_dir="$(git -C "$repo_abs" rev-parse --git-dir)"
|
||||
exclude_file="$git_dir/info/exclude"
|
||||
|
||||
[[ -f "$exclude_file" ]] || return 0
|
||||
|
||||
tmp_file="$(mktemp)"
|
||||
cp "$exclude_file" "$tmp_file"
|
||||
|
||||
for entry in "''${DIRENV_LOCAL_FILES[@]}"; do
|
||||
if grep -qxF "$entry" "$tmp_file" 2>/dev/null; then
|
||||
grep -vxF "$entry" "$tmp_file" > "''${tmp_file}.new" || true
|
||||
mv "''${tmp_file}.new" "$tmp_file"
|
||||
print_success "$entry → removed from .git/info/exclude"
|
||||
else
|
||||
print_info "$entry not present in .git/info/exclude, skipping."
|
||||
fi
|
||||
done
|
||||
|
||||
mv "$tmp_file" "$exclude_file"
|
||||
}
|
||||
|
||||
case "''${2:-init}" in
|
||||
|
||||
untrack)
|
||||
echo ""
|
||||
echo -e "''${BLUE}--- Dev: Track Files (assume-unchanged) ---''${NOCOLOR}"
|
||||
echo ""
|
||||
_dev_resolve_dir
|
||||
|
||||
acted=false
|
||||
for f in "''${DEV_FILES[@]}"; do
|
||||
full="$TARGET_ABS/$f"
|
||||
if [[ ! -f "$full" ]]; then
|
||||
print_info "$f not found in $TARGET_ABS — skipping."
|
||||
continue
|
||||
fi
|
||||
if ! git -C "$TARGET_ABS" ls-files --error-unmatch "$f" > /dev/null 2>&1; then
|
||||
git -C "$TARGET_ABS" add --intent-to-add "$f"
|
||||
fi
|
||||
git -C "$TARGET_ABS" update-index --assume-unchanged "$f"
|
||||
print_success "$f → untracked (assume-unchanged)"
|
||||
acted=true
|
||||
done
|
||||
|
||||
_add_local_excludes "$TARGET_ABS"
|
||||
|
||||
if ! $acted; then
|
||||
print_info "No dev files found in '$TARGET_ABS' to track."
|
||||
fi
|
||||
;;
|
||||
|
||||
track)
|
||||
echo ""
|
||||
echo -e "''${BLUE}--- Dev: Untrack Files (remove assume-unchanged) ---''${NOCOLOR}"
|
||||
echo ""
|
||||
_dev_resolve_dir
|
||||
|
||||
acted=false
|
||||
for f in "''${DEV_FILES[@]}"; do
|
||||
if git -C "$TARGET_ABS" ls-files -v "$f" 2>/dev/null | grep -q "^h "; then
|
||||
git -C "$TARGET_ABS" update-index --no-assume-unchanged "$f"
|
||||
print_success "$f → tracked (assume-unchanged removed)"
|
||||
acted=true
|
||||
else
|
||||
print_info "$f is not marked assume-unchanged — skipping."
|
||||
fi
|
||||
done
|
||||
|
||||
_remove_local_excludes "$TARGET_ABS"
|
||||
|
||||
if ! $acted; then
|
||||
print_info "No files in '$TARGET_ABS' had the assume-unchanged bit set."
|
||||
fi
|
||||
;;
|
||||
|
||||
init|*)
|
||||
SOURCE_FLAKE="$HOME/${lib.project}/other/dev-template.nix"
|
||||
|
||||
if [[ ! -f "$SOURCE_FLAKE" ]]; then
|
||||
print_error "Source flake template not found: $SOURCE_FLAKE"
|
||||
echo "Please ensure dev-template.nix exists in $HOME/${lib.project}/other/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_header
|
||||
|
||||
# ---- Step 1: Target Directory ----
|
||||
echo -e "''${YELLOW}Step 1/5: Target Directory''${NOCOLOR}"
|
||||
echo ""
|
||||
read -p " Enter target directory [./]: " TARGET_DIR
|
||||
|
||||
if [[ -z "$TARGET_DIR" ]]; then
|
||||
TARGET_DIR="./"
|
||||
fi
|
||||
|
||||
if [[ ! -d "$TARGET_DIR" ]]; then
|
||||
print_error "Directory '$TARGET_DIR' does not exist. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_success "Target directory: $TARGET_DIR"
|
||||
echo ""
|
||||
|
||||
# ---- Check for existing flake ----
|
||||
if [[ -f "$TARGET_DIR/flake.nix" ]]; then
|
||||
echo ""
|
||||
print_error "A flake.nix already exists in '$TARGET_DIR'!"
|
||||
echo ""
|
||||
read -p " Would you like to just place the .envrc instead? [y/N]: " ENVRC_ONLY
|
||||
ENVRC_ONLY="''${ENVRC_ONLY:-N}"
|
||||
|
||||
if [[ "$ENVRC_ONLY" =~ ^[Yy]$ ]]; then
|
||||
TARGET_ABS="$(cd "$TARGET_DIR" && pwd)"
|
||||
echo ""
|
||||
print_info "Placing .envrc only..."
|
||||
if ! grep -qxF "use flake" "$TARGET_ABS/.envrc" 2>/dev/null; then
|
||||
echo "use flake" >> "$TARGET_ABS/.envrc"
|
||||
print_success ".envrc created at $TARGET_ABS/"
|
||||
else
|
||||
print_info ".envrc already contains 'use flake', nothing to do."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
print_info "Next steps:"
|
||||
echo " cd $TARGET_DIR"
|
||||
echo " direnv allow"
|
||||
echo ""
|
||||
exit 0
|
||||
else
|
||||
print_info "Aborting. No files were changed."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# ---- Step 2: Project Name ----
|
||||
echo -e "''${YELLOW}Step 2/5: Project Name''${NOCOLOR}"
|
||||
echo ""
|
||||
read -p " Enter development environment name [devShell]: " PROJECT_NAME
|
||||
|
||||
if [[ -z "$PROJECT_NAME" ]]; then
|
||||
PROJECT_NAME="devShell"
|
||||
fi
|
||||
|
||||
print_success "Project name: $PROJECT_NAME"
|
||||
echo ""
|
||||
|
||||
# ---- Step 3: Select template ----
|
||||
echo -e "''${YELLOW}Step 3/5: Select Template''${NOCOLOR}"
|
||||
echo ""
|
||||
echo " 1) Empty - Basic shell, add packages yourself"
|
||||
echo " 2) Python - Python 3, pip, venv setup"
|
||||
echo " 3) Node.js - Node.js, npm"
|
||||
echo " 4) Rust - Rustc, cargo, rust-analyzer"
|
||||
echo " 5) Go - Go, gopls, golangci-lint"
|
||||
echo " 6) C/C++ - GCC, CMake, GDB, pkg-config"
|
||||
echo " 7) Java - JDK 21, Maven"
|
||||
echo ""
|
||||
|
||||
read -p " Select template [1-7] (default: 1): " TEMPLATE_CHOICE
|
||||
|
||||
case "$TEMPLATE_CHOICE" in
|
||||
2)
|
||||
TEMPLATE="python3"
|
||||
PACKAGES="python3 python3Packages.pip python3Packages.virtualenv"
|
||||
BUILD_INPUTS=""
|
||||
SHELL_HOOK_EXTRA="
|
||||
if [ ! -d .venv ]; then
|
||||
echo 'Creating Python virtual environment...'
|
||||
python3 -m venv .venv
|
||||
fi
|
||||
source .venv/bin/activate
|
||||
echo 'Python venv activated.'
|
||||
"
|
||||
;;
|
||||
3)
|
||||
TEMPLATE="node"
|
||||
PACKAGES="nodejs_22"
|
||||
BUILD_INPUTS=""
|
||||
SHELL_HOOK_EXTRA='echo "Node.js $(node --version) ready."'
|
||||
;;
|
||||
4)
|
||||
TEMPLATE="rust"
|
||||
PACKAGES="rustc cargo rust-analyzer"
|
||||
BUILD_INPUTS="openssl pkg-config"
|
||||
SHELL_HOOK_EXTRA='echo "Rust $(rustc --version) ready."'
|
||||
;;
|
||||
5)
|
||||
TEMPLATE="go"
|
||||
PACKAGES="go gopls golangci-lint"
|
||||
BUILD_INPUTS=""
|
||||
SHELL_HOOK_EXTRA='
|
||||
export GOPATH="$PWD/.gopath"
|
||||
export PATH="$GOPATH/bin:$PATH"
|
||||
mkdir -p "$GOPATH"
|
||||
echo "Go $(go version) ready. GOPATH: $GOPATH"
|
||||
'
|
||||
;;
|
||||
6)
|
||||
TEMPLATE="cpp"
|
||||
PACKAGES="gcc gdb cmake gnumake"
|
||||
BUILD_INPUTS="pkg-config"
|
||||
SHELL_HOOK_EXTRA='echo "GCC $(gcc --version | head -1) ready."'
|
||||
;;
|
||||
7)
|
||||
TEMPLATE="java"
|
||||
PACKAGES="jdk21 maven"
|
||||
BUILD_INPUTS=""
|
||||
SHELL_HOOK_EXTRA='echo "Java $(java --version | head -1) ready."'
|
||||
;;
|
||||
*)
|
||||
TEMPLATE="empty"
|
||||
PACKAGES=""
|
||||
BUILD_INPUTS=""
|
||||
SHELL_HOOK_EXTRA=""
|
||||
;;
|
||||
esac
|
||||
|
||||
print_success "Selected template: $TEMPLATE"
|
||||
echo ""
|
||||
|
||||
# ---- Step 4: Copy and modify flake ----
|
||||
echo -e "''${YELLOW}Step 4/5: Generating flake.nix''${NOCOLOR}"
|
||||
echo ""
|
||||
|
||||
cp "$SOURCE_FLAKE" "$TARGET_DIR/flake.nix"
|
||||
print_success "Copied flake.nix to $TARGET_DIR/"
|
||||
|
||||
sed -i "s|name = \"replaceNameHere\";|name = \"''${PROJECT_NAME}\";|" "$TARGET_DIR/flake.nix"
|
||||
print_success "Set project name: $PROJECT_NAME"
|
||||
|
||||
if [[ -n "$PACKAGES" ]]; then
|
||||
sed -i "s|# replacePackagesHere|$PACKAGES|" "$TARGET_DIR/flake.nix"
|
||||
print_success "Added packages: $PACKAGES"
|
||||
fi
|
||||
|
||||
if [[ -n "$BUILD_INPUTS" ]]; then
|
||||
BUILD_INPUTS_LINE="buildInputs = with pkgs; [ $BUILD_INPUTS ];"
|
||||
sed -i "s|# replaceBuildInputsHere|$BUILD_INPUTS_LINE|" "$TARGET_DIR/flake.nix"
|
||||
print_success "Added build inputs: $BUILD_INPUTS"
|
||||
fi
|
||||
|
||||
if [[ -n "$SHELL_HOOK_EXTRA" ]]; then
|
||||
awk -v hook="$SHELL_HOOK_EXTRA" '/# replaceShellHookHere/ { print hook; next } { print }' \
|
||||
"$TARGET_DIR/flake.nix" > "$TARGET_DIR/flake.nix.tmp" \
|
||||
&& mv "$TARGET_DIR/flake.nix.tmp" "$TARGET_DIR/flake.nix"
|
||||
print_success "Added template-specific shell hook"
|
||||
fi
|
||||
|
||||
# ---- Step 5: Git Integration & .envrc ----
|
||||
echo -e "''${YELLOW}Step 5/5: Git Integration''${NOCOLOR}"
|
||||
echo ""
|
||||
|
||||
TARGET_ABS="$(cd "$TARGET_DIR" && pwd)"
|
||||
|
||||
echo "Creating .envrc for direnv to automatically work!"
|
||||
if ! grep -qxF "use flake" "$TARGET_ABS/.envrc" 2>/dev/null; then
|
||||
echo "use flake" >> "$TARGET_ABS/.envrc"
|
||||
print_success ".envrc created at $TARGET_ABS/"
|
||||
else
|
||||
print_info ".envrc already contains 'use flake', skipping."
|
||||
fi
|
||||
|
||||
if git -C "$TARGET_ABS" rev-parse --git-dir > /dev/null 2>&1; then
|
||||
echo " A Git repository was detected at:"
|
||||
echo " $(git -C "$TARGET_ABS" rev-parse --show-toplevel)"
|
||||
echo ""
|
||||
|
||||
_add_local_excludes "$TARGET_ABS"
|
||||
echo ""
|
||||
|
||||
echo " Nix flakes require flake.nix (and flake.lock) to be Git-tracked."
|
||||
echo " This script can stage them as 'assume-unchanged' so Nix sees them,"
|
||||
echo " but they will NEVER be committed or show up in git status."
|
||||
echo ""
|
||||
read -p " Set up flake files as tracked-but-invisible to Git? [y/N]: " GIT_CHOICE
|
||||
|
||||
GIT_CHOICE="''${GIT_CHOICE:-N}"
|
||||
|
||||
if [[ "$GIT_CHOICE" =~ ^[Yy]$ ]]; then
|
||||
cat > "$TARGET_ABS/flake.lock" << 'FLAKE_LOCK_EOF'
|
||||
{
|
||||
"nodes": {
|
||||
"root": {}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
FLAKE_LOCK_EOF
|
||||
print_success "flake.lock ready (Nix will populate it on first run if empty)"
|
||||
|
||||
git -C "$TARGET_ABS" add --intent-to-add flake.nix flake.lock
|
||||
git -C "$TARGET_ABS" update-index --assume-unchanged flake.nix flake.lock
|
||||
print_success "flake.nix + flake.lock → tracked (assume-unchanged)"
|
||||
else
|
||||
print_info "Skipped. You can do this manually later:"
|
||||
echo ""
|
||||
echo " git -C \"$TARGET_ABS\" add --intent-to-add flake.nix flake.lock"
|
||||
echo " git -C \"$TARGET_ABS\" update-index --assume-unchanged flake.nix flake.lock"
|
||||
echo ""
|
||||
fi
|
||||
else
|
||||
print_info "No Git repository detected — skipping Git integration."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# ---- Done ----
|
||||
echo -e "''${GREEN}==============================================''${NOCOLOR}"
|
||||
echo -e "''${GREEN} Done! Your flake is ready at:''${NOCOLOR}"
|
||||
echo -e "''${GREEN} $TARGET_DIR/flake.nix''${NOCOLOR}"
|
||||
echo -e "''${GREEN}==============================================''${NOCOLOR}"
|
||||
echo ""
|
||||
print_info "Next steps:"
|
||||
echo " cd $TARGET_DIR"
|
||||
echo " direnv allow # Trust the .envrc so direnv auto-activates"
|
||||
echo " nix develop # Or just: cd out and back in"
|
||||
echo ""
|
||||
;;
|
||||
|
||||
esac
|
||||
'';
|
||||
}
|
||||
40
modules/ncli/commands/git.nix
Normal file
40
modules/ncli/commands/git.nix
Normal file
@ -0,0 +1,40 @@
|
||||
# ncli/commands/git.nix — commit, push, pull, status, format
|
||||
lib: let
|
||||
inherit (lib) project;
|
||||
in {
|
||||
commit_case = ''
|
||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||
if [ "$#" -lt 2 ]; then
|
||||
read -p "Enter commit message: " commit_msg
|
||||
else
|
||||
shift
|
||||
commit_msg="$*"
|
||||
fi
|
||||
|
||||
if [ -z "$commit_msg" ]; then
|
||||
echo "Error: Commit message cannot be empty" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git add -A && git commit -m "$commit_msg"
|
||||
'';
|
||||
|
||||
push_case = ''
|
||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||
git push origin $(git branch --show-current)
|
||||
'';
|
||||
|
||||
pull_case = ''
|
||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||
git pull origin $(git branch --show-current)
|
||||
'';
|
||||
|
||||
status_case = ''
|
||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||
git status
|
||||
'';
|
||||
|
||||
format_case = ''
|
||||
nix fmt .
|
||||
'';
|
||||
}
|
||||
75
modules/ncli/commands/maintenance.nix
Normal file
75
modules/ncli/commands/maintenance.nix
Normal file
@ -0,0 +1,75 @@
|
||||
# ncli/commands/maintenance.nix — cleanup, diag, list-gens, trim, home-backups
|
||||
lib: let
|
||||
inherit (lib) project;
|
||||
in {
|
||||
cleanup_case = ''
|
||||
echo "Warning! This will remove old generations of your system."
|
||||
read -p "How many generations to keep (default: all)? " keep_count
|
||||
|
||||
if [ -z "$keep_count" ]; then
|
||||
read -p "This will remove all but the current generation. Continue (y/N)? " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
nh clean all -v
|
||||
else
|
||||
echo "Cleanup cancelled."
|
||||
fi
|
||||
else
|
||||
read -p "This will keep the last $keep_count generations. Continue (y/N)? " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
nh clean all -k "$keep_count" -v
|
||||
else
|
||||
echo "Cleanup cancelled."
|
||||
fi
|
||||
fi
|
||||
|
||||
LOG_DIR="$HOME/ncli-cleanup-logs"
|
||||
mkdir -p "$LOG_DIR"
|
||||
LOG_FILE="$LOG_DIR/ncli-cleanup-$(date +%Y-%m-%d_%H-%M-%S).log"
|
||||
echo "Cleaning up old log files..." >> "$LOG_FILE"
|
||||
find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1
|
||||
echo "Cleanup process logged to $LOG_FILE"
|
||||
'';
|
||||
|
||||
diag_case = ''
|
||||
echo "Generating system diagnostic report..."
|
||||
{
|
||||
echo "=== NixOS System Diagnostic Report ==="
|
||||
echo "Generated: $(date)"
|
||||
echo ""
|
||||
echo "=== System Information ==="
|
||||
inxi --full 2>/dev/null || echo "inxi not available"
|
||||
echo ""
|
||||
echo "=== Git Status ==="
|
||||
cd "$HOME/${project}" 2>/dev/null && git status 2>/dev/null || echo "Git status not available"
|
||||
echo ""
|
||||
} > "$HOME/diag.txt"
|
||||
echo "Diagnostic report saved to $HOME/diag.txt"
|
||||
'';
|
||||
|
||||
list_gens_case = ''
|
||||
echo "--- User Generations ---"
|
||||
nix-env --list-generations | cat || echo "Could not list user generations."
|
||||
echo ""
|
||||
echo "--- System Generations ---"
|
||||
nix profile history --profile /nix/var/nix/profiles/system | cat || echo "Could not list system generations."
|
||||
'';
|
||||
|
||||
trim_case = ''
|
||||
echo "Running 'sudo fstrim -v /' may take a few minutes and impact system performance."
|
||||
read -p "Enter to run now or enter to exit (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Running fstrim..."
|
||||
sudo fstrim -v /
|
||||
echo "fstrim complete."
|
||||
else
|
||||
echo "Trim operation cancelled."
|
||||
fi
|
||||
'';
|
||||
|
||||
home_backups_case = ''
|
||||
ls -a ~ | grep backup
|
||||
'';
|
||||
}
|
||||
145
modules/ncli/commands/rebuild.nix
Normal file
145
modules/ncli/commands/rebuild.nix
Normal file
@ -0,0 +1,145 @@
|
||||
# ncli/commands/rebuild.nix — Rebuild + Update logic
|
||||
lib: let
|
||||
inherit (lib) host project handle_backups handle_build_error;
|
||||
in rec {
|
||||
# Shared rebuild snippet used by both `rebuild` and `update`
|
||||
rebuild_logic = ''
|
||||
handle_backups
|
||||
geno=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||
|
||||
current=""
|
||||
if [ -f /etc/nixos-tags ]; then
|
||||
current=$(cat /etc/nixos-tags)
|
||||
fi
|
||||
'';
|
||||
|
||||
rebuild_case = ''
|
||||
${rebuild_logic}
|
||||
echo -e "Starting NixOS rebuild for current host: ${host} on generation: $YELLOW$geno$NOCOLOR"
|
||||
|
||||
# Step 1: Build the configuration and safely update the bootloader first
|
||||
set +e
|
||||
sudo nixos-rebuild boot --flake .
|
||||
_rebuild_exit=$?
|
||||
set -e
|
||||
|
||||
if [ "$_rebuild_exit" -eq 0 ]; then
|
||||
echo "✓ Rebuild and bootloader update finished successfully for ${host}"
|
||||
|
||||
# Step 2: Now that boot entries are safe, activate the system live
|
||||
echo "Activating new configuration..."
|
||||
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
|
||||
|
||||
if [ -n "$current" ]; then
|
||||
sudo /nix/var/nix/profiles/system/specialisation/"$current"/bin/switch-to-configuration test
|
||||
else
|
||||
echo "No specialization tag found, staying on default system."
|
||||
fi
|
||||
|
||||
genn=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
echo -e "Running on new generation: $YELLOW $geno $NOCOLOR-> $GREEN$genn$NOCOLOR"
|
||||
else
|
||||
( exit "$_rebuild_exit" ); handle_build_error
|
||||
echo "✗ Rebuild failed for ${host}" >&2
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
|
||||
update_case = ''
|
||||
${rebuild_logic}
|
||||
echo -e "Updating flake and rebuilding system for current host: ${host} on generation: $YELLOW$geno$NOCOLOR"
|
||||
|
||||
# --- Selective flake update ---
|
||||
read -rp "Update [a]ll inputs or [s]elect manually? (a/s): " choice
|
||||
|
||||
case "$choice" in
|
||||
a|A)
|
||||
echo "Updating all inputs..."
|
||||
if nix flake update --flake .; then
|
||||
echo "✓ Flake updated successfully"
|
||||
else
|
||||
echo "✗ Flake update failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
s|S)
|
||||
echo "Fetching available updates (this may take a moment)..."
|
||||
TEMP_LOCK=$(mktemp)
|
||||
trap 'rm -f "$TEMP_LOCK"' EXIT
|
||||
|
||||
nix flake update --output-lock-file "$TEMP_LOCK" --flake . 2>/dev/null
|
||||
|
||||
outdated=$(jq -r --slurpfile new "$TEMP_LOCK" '
|
||||
.nodes as $old |
|
||||
$new[0].nodes as $newn |
|
||||
($old | keys[]) |
|
||||
select(. != "root") |
|
||||
select(
|
||||
($old[.].locked.lastModified // 0) !=
|
||||
($newn[.].locked.lastModified // 0)
|
||||
)
|
||||
' flake.lock)
|
||||
|
||||
if [[ -z "$outdated" ]]; then
|
||||
echo "✓ All inputs are already up to date, skipping flake update."
|
||||
else
|
||||
echo
|
||||
echo "Updates available for:"
|
||||
printf '%s\n' "$outdated"
|
||||
echo
|
||||
echo "Tab to select, Enter to update, Esc to cancel."
|
||||
selected=$(printf '%s\n' "$outdated" | fzf --multi) || {
|
||||
echo "No inputs selected, skipping flake update."
|
||||
selected=""
|
||||
}
|
||||
if [[ -n "$selected" ]]; then
|
||||
if nix flake update --flake . $selected; then
|
||||
echo "✓ Flake updated successfully"
|
||||
else
|
||||
echo "✗ Flake update failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice, skipping flake update."
|
||||
;;
|
||||
esac
|
||||
# --- End selective flake update ---
|
||||
|
||||
if [ -n "$current" ]; then
|
||||
echo "Rebuilding system... Current specialization: $current"
|
||||
else
|
||||
echo "Rebuilding system... Staying on current specialization"
|
||||
fi
|
||||
|
||||
# Step 1: Build the configuration and safely update the bootloader first
|
||||
set +e
|
||||
sudo nixos-rebuild boot --flake .
|
||||
_rebuild_exit=$?
|
||||
set -e
|
||||
|
||||
if [ "$_rebuild_exit" -eq 0 ]; then
|
||||
echo "✓ Update, rebuild and bootloader update finished successfully for ${host}"
|
||||
|
||||
# Step 2: Now that boot entries are safe, activate the system live
|
||||
echo "Activating new configuration..."
|
||||
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
|
||||
|
||||
if [ -n "$current" ]; then
|
||||
sudo /nix/var/nix/profiles/system/specialisation/"$current"/bin/switch-to-configuration test
|
||||
else
|
||||
echo "No specialization tag found, staying on default system."
|
||||
fi
|
||||
|
||||
genn=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | grep current | awk '{print $1}')
|
||||
echo -e "Running on new generation: $YELLOW $geno $NOCOLOR-> $GREEN$genn$NOCOLOR"
|
||||
else
|
||||
( exit "$_rebuild_exit" ); handle_build_error
|
||||
echo "✗ Update and rebuild failed for ${host}" >&2
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
}
|
||||
35
modules/ncli/commands/switch.nix
Normal file
35
modules/ncli/commands/switch.nix
Normal file
@ -0,0 +1,35 @@
|
||||
# ncli/commands/switch.nix — Specialization switching
|
||||
lib: {
|
||||
switch_case = ''
|
||||
current=""
|
||||
if [ -f /etc/nixos-tags ]; then
|
||||
current=$(cat /etc/nixos-tags)
|
||||
fi
|
||||
|
||||
if [ "$#" -ge 2 ]; then
|
||||
spec_name="$2"
|
||||
if [ -n "$current" ]; then
|
||||
echo "Already on specialization: $current. Cannot switch directly to '$spec_name'. Please reboot or return to default first."
|
||||
else
|
||||
if [ -d "/run/current-system/specialisation/$spec_name" ]; then
|
||||
echo "Switching to specialization: $spec_name"
|
||||
sudo /run/current-system/specialisation/"$spec_name"/bin/switch-to-configuration test
|
||||
else
|
||||
echo "Error: Specialization '$spec_name' not found."
|
||||
echo "Available specializations:"
|
||||
ls /run/current-system/specialisation/
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ -n "$current" ]; then
|
||||
echo "Already on a specialization: $current. To switch, please reboot, or use 'sudo nixos-rebuild switch --flake .' to get back to default, and then switch after."
|
||||
else
|
||||
specs=$(ls /run/current-system/specialisation/)
|
||||
echo "Specializations available:"
|
||||
echo "$specs"
|
||||
echo ""
|
||||
echo "To switch to a specialization, run: 'ncli switch <tag>'"
|
||||
fi
|
||||
fi
|
||||
'';
|
||||
}
|
||||
8
modules/ncli/default.nix
Normal file
8
modules/ncli/default.nix
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
pkgs,
|
||||
host,
|
||||
backupFiles ? [".config/mimeapps.list.backup"],
|
||||
project,
|
||||
...
|
||||
}:
|
||||
import ./builder.nix {inherit pkgs host backupFiles project;}
|
||||
88
modules/ncli/lib.nix
Normal file
88
modules/ncli/lib.nix
Normal file
@ -0,0 +1,88 @@
|
||||
# ncli/lib.nix — Shared helpers and utilities
|
||||
{ pkgs, host, project, backupFiles }:
|
||||
|
||||
let
|
||||
backupFilesString = pkgs.lib.strings.concatStringsSep " " backupFiles;
|
||||
in
|
||||
{
|
||||
# --- Injected config ---
|
||||
inherit pkgs host project backupFiles backupFilesString;
|
||||
|
||||
# --- Color / banner source ---
|
||||
colorsSource = "$HOME/${project}/other/colors.sh";
|
||||
|
||||
# --- Backup helper ---
|
||||
handle_backups = ''
|
||||
handle_backups() {
|
||||
echo "Checking for backup files to remove..."
|
||||
found=0
|
||||
for file_path in "''${BACKUP_FILES[@]}"; do
|
||||
full_path="$HOME/$file_path"
|
||||
if [ -f "$full_path" ]; then
|
||||
echo "Removing stale backup file: $full_path"
|
||||
rm "$full_path"
|
||||
found=1
|
||||
fi
|
||||
done
|
||||
if [ "$found" -eq 0 ]; then
|
||||
echo "No stale backup files found."
|
||||
fi
|
||||
}
|
||||
'';
|
||||
|
||||
# --- OOM / build error handler ---
|
||||
handle_build_error = ''
|
||||
handle_build_error() {
|
||||
local exit_code=$?
|
||||
if [ "$exit_code" -eq 137 ]; then
|
||||
echo ""
|
||||
echo -e "''${RED}╔══════════════════════════════════════════════════════════╗''${NOCOLOR}"
|
||||
echo -e "''${RED}║ BUILD KILLED — Signal 9 (SIGKILL) detected ║''${NOCOLOR}"
|
||||
echo -e "''${RED}╚══════════════════════════════════════════════════════════╝''${NOCOLOR}"
|
||||
echo ""
|
||||
echo -e "''${YELLOW}What happened:''${NOCOLOR}"
|
||||
echo " The build process was forcefully terminated by the OS."
|
||||
echo " This is almost always the Linux kernel OOM killer running out"
|
||||
echo " of RAM + swap during Nix evaluation or compilation."
|
||||
echo ""
|
||||
echo -e "''${YELLOW}Suggested fixes (try in order):''${NOCOLOR}"
|
||||
echo ""
|
||||
echo -e " ''${GREEN}1. Reduce parallel jobs''${NOCOLOR} (lowest RAM usage):"
|
||||
echo " sudo nixos-rebuild switch --flake . --max-jobs 1 --cores 1"
|
||||
echo ""
|
||||
echo -e " ''${GREEN}2. Confirm OOM killer fired:''${NOCOLOR}"
|
||||
echo " journalctl -k --since '5 minutes ago' | grep -i oom"
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
'';
|
||||
|
||||
# --- Print helpers (used by dev init) ---
|
||||
print_header = ''
|
||||
print_header() {
|
||||
echo ""
|
||||
echo -e "''${BLUE}==============================================''${NOCOLOR}"
|
||||
echo -e "''${BLUE} Nix Flake Development Environment Initializer''${NOCOLOR}"
|
||||
echo -e "''${BLUE}==============================================''${NOCOLOR}"
|
||||
echo ""
|
||||
}
|
||||
'';
|
||||
|
||||
print_success = ''
|
||||
print_success() {
|
||||
echo -e "''${GREEN}[OK]''${NOCOLOR} $1"
|
||||
}
|
||||
'';
|
||||
|
||||
print_error = ''
|
||||
print_error() {
|
||||
echo -e "''${RED}[ERR]''${NOCOLOR} $1"
|
||||
}
|
||||
'';
|
||||
|
||||
print_info = ''
|
||||
print_info() {
|
||||
echo -e "''${YELLOW}[->]''${NOCOLOR} $1"
|
||||
}
|
||||
'';
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
{
|
||||
config,
|
||||
inputs,
|
||||
pkgs,
|
||||
...
|
||||
@ -7,11 +6,7 @@
|
||||
imports = [
|
||||
];
|
||||
|
||||
home-manager.sharedModules = [
|
||||
./home.nix
|
||||
];
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
hyprpaper
|
||||
inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default
|
||||
];
|
||||
}
|
||||
9
modules/noctalia/home.nix
Normal file
9
modules/noctalia/home.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{inputs, ...}: {
|
||||
imports = [
|
||||
inputs.noctalia.homeModules.default
|
||||
];
|
||||
|
||||
programs.noctalia = {
|
||||
enable = true;
|
||||
};
|
||||
}
|
||||
@ -7,21 +7,21 @@
|
||||
}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
#CLI tools
|
||||
pdftk #PDF toolkit
|
||||
yt-dlp #YouTube and others video downloader
|
||||
imagemagick #Used as a dependency for Zenless Zone Zero
|
||||
#pdftk #PDF toolkit
|
||||
#yt-dlp #YouTube and others video downloader
|
||||
tailscale #VPN
|
||||
speedtest-cli #Internet speed tester
|
||||
#speedtest-cli #Internet speed tester
|
||||
#duplicati
|
||||
ollama-rocm
|
||||
open-webui
|
||||
cloudflare-warp
|
||||
ddrescue
|
||||
texliveFull #LaTeX PDF maker
|
||||
#open-webui
|
||||
#cloudflare-warp
|
||||
#ddrescue
|
||||
#texliveFull #LaTeX PDF maker
|
||||
lazygit #Git CLI tool with TUI
|
||||
gtypist #Typing tutor
|
||||
powertop #Power consumption monitor and optimizer
|
||||
file #File type identifier
|
||||
hashcat #Password recovery/cracking tool
|
||||
packwiz #A Minecraft modpack editor
|
||||
#gtypist #Typing tutor
|
||||
#powertop #Power consumption monitor and optimizer
|
||||
#file #File type identifier
|
||||
#hashcat #Password recovery/cracking tool
|
||||
#packwiz #A Minecraft modpack editor
|
||||
];
|
||||
}
|
||||
|
||||
@ -4,5 +4,6 @@
|
||||
./cli.nix
|
||||
./essentials.nix
|
||||
./flatpak.nix
|
||||
./overlays.nix
|
||||
];
|
||||
}
|
||||
|
||||
@ -7,58 +7,60 @@
|
||||
}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
#Programming
|
||||
jetbrains.pycharm #The PyCharm IDE to edit Python code
|
||||
jetbrains.idea #The IntelliJ IDE to edit Java code
|
||||
jetbrains.clion #The CLion IDE to edit and compile c/c++ code
|
||||
#jetbrains.pycharm #The PyCharm IDE to edit Python code
|
||||
#jetbrains.idea #The IntelliJ IDE to edit Java code
|
||||
#jetbrains.clion #The CLion IDE to edit and compile c/c++ code
|
||||
jetbrains.datagrip #The DataGrip IDE to manage Databases
|
||||
#jetbrains-toolbox
|
||||
#racket #The racket Programming language, with DrRacket IDE, for University (*Not* because it's my favourite)
|
||||
rustup #Rust Programming Toolchain
|
||||
#rustup #Rust Programming Toolchain
|
||||
#go #Go Programming Language
|
||||
gcc #C/C++ Compiler
|
||||
pkg-config
|
||||
#gcc #C/C++ Compiler
|
||||
#pkg-config
|
||||
vscode #Editor for all kinds of programms
|
||||
nodejs_22 #NodeJS for JavaScript programming
|
||||
#nodejs_22 #NodeJS for JavaScript programming
|
||||
|
||||
#Hochschule
|
||||
postgresql #Database system
|
||||
dbeaver-bin #Database Management Tool
|
||||
sqlite #Lightweight Database system
|
||||
#postgresql #Database system
|
||||
#dbeaver-bin #Database Management Tool
|
||||
#sqlite #Lightweight Database system
|
||||
|
||||
#Desktop Applications
|
||||
mangohud
|
||||
protonup-qt #For managing proton versions
|
||||
drawio
|
||||
ryubing #Nintendo Switch Emulator
|
||||
vlc #VLC Media Player
|
||||
lutris #Gaming Platform
|
||||
mission-center #For a Task Manager like GUI
|
||||
trayscale #Tailscale unofficial GUI
|
||||
spotify #Spotify Music Client
|
||||
rpi-imager #Raspberry Pi Imager
|
||||
#spotify #Spotify Music Client
|
||||
#rpi-imager #Raspberry Pi Imager
|
||||
atlauncher #Minecraft Launcher
|
||||
#discord
|
||||
vesktop #Aternative for discord on Wayland
|
||||
wineWow64Packages.stagingFull
|
||||
winetricks
|
||||
wasistlos #Whatsapp
|
||||
losslesscut-bin #Lossless cut for quckly cutting videos
|
||||
#karere #Whatsapp
|
||||
#losslesscut-bin #Lossless cut for quckly cutting videos
|
||||
#obs-studio #Screen Recorder
|
||||
gparted #Disk partition Manager
|
||||
#rustdesk #Remote Desktop Client
|
||||
realvnc-vnc-viewer #VNC Remote Desktop Client
|
||||
#realvnc-vnc-viewer #VNC Remote Desktop Client
|
||||
eddie #AirVPN desktop client
|
||||
chromium #Chromium browser for Youtube app to work
|
||||
moonlight-qt #Game Streaming Client
|
||||
#moonlight-qt #Game Streaming Client
|
||||
kitty #Kitty Terminal Emulator
|
||||
wmctrl #To Force windows into fullscreen
|
||||
kdePackages.dolphin #KDE File Browser
|
||||
libreoffice-still #Office Suite
|
||||
#libreoffice-still #Office Suite
|
||||
kdePackages.kservice
|
||||
qbittorrent #Torrent Client
|
||||
waydroid #Android emulator on Linux
|
||||
gimp2-with-plugins #Image Editor
|
||||
kdePackages.filelight #Disk Usage Analyzer
|
||||
filezilla
|
||||
audacity
|
||||
freecad
|
||||
#qbittorrent #Torrent Client
|
||||
#waydroid #Android emulator on Linux
|
||||
#gimp2-with-plugins #Image Editor
|
||||
#kdePackages.filelight #Disk Usage Analyzer
|
||||
#filezilla
|
||||
#audacity
|
||||
#freecad
|
||||
];
|
||||
}
|
||||
|
||||
@ -10,22 +10,23 @@
|
||||
environment.systemPackages = with pkgs; [
|
||||
#Essentials (CLI Only)
|
||||
wget #A tool for quickly downloading things from the Web
|
||||
javaPackages.compiler.openjdk25 #Java Development Kit 25
|
||||
python314 #Python
|
||||
python314Packages.pip #Pip for Python 3.12
|
||||
python314Packages.cmake #The CMake tool to manage project build configurations
|
||||
#javaPackages.compiler.openjdk25 #Java Development Kit 25
|
||||
#python314 #Python
|
||||
#python314Packages.pip #Pip for Python 3.12
|
||||
#python314Packages.cmake #The CMake tool to manage project build configurations
|
||||
fastfetch #A utility to see information about your machine
|
||||
btop #A replacement for htop to see your machines resources
|
||||
git #Git ... no need to explain
|
||||
efibootmgr #A tool to manage UEFI boot entries
|
||||
#efibootmgr #A tool to manage UEFI boot entries
|
||||
zip #A utility for ZIP archives
|
||||
unzip #A utility for ZIP archives
|
||||
p7zip
|
||||
rar #A utility for RAR archives
|
||||
gnutar #A utility for .tar archives
|
||||
cron #A tool to set up commands to run scheduled
|
||||
tmux #A tool to let command windows contiune to run in the background
|
||||
home-manager #A package to also edit the user Configuration, like with nix
|
||||
konsave #A package to transfer the look and feel of KDE Plasma to other machines
|
||||
#konsave #A package to transfer the look and feel of KDE Plasma to other machines
|
||||
openssh #SSH
|
||||
zoxide #Alternatice to cd, browse files
|
||||
zsh #Search for file names
|
||||
@ -47,7 +48,7 @@
|
||||
pipewire #Multimedia handling
|
||||
fzf #Needed for nix-selective update tool
|
||||
jq #Needed for nix-selective update tool
|
||||
distrobox
|
||||
#distrobox
|
||||
dbus
|
||||
cifs-utils
|
||||
samba
|
||||
|
||||
10
modules/packages/overlays.nix
Normal file
10
modules/packages/overlays.nix
Normal file
@ -0,0 +1,10 @@
|
||||
{...}: {
|
||||
nixpkgs.overlays = [
|
||||
#Skip checks of openldap (dependency for Lutris) as it is already tested enough upstream and is not needed directly
|
||||
(final: prev: {
|
||||
openldap = prev.openldap.overrideAttrs (old: {
|
||||
doCheck = false;
|
||||
});
|
||||
})
|
||||
];
|
||||
}
|
||||
@ -15,9 +15,15 @@
|
||||
stylix = {
|
||||
enable = true;
|
||||
autoEnable = false; #So I can choose my programs it targets myself!
|
||||
#image = ../../other/wallpaper2.png;
|
||||
#autoEnable = true; #Auto generate theme based on wallpaper
|
||||
#image = "${inputs.cookiez-assets}/wallpapers/beach-forest.png";
|
||||
#polarity = "dark"; # "dark" or "light"
|
||||
base16Scheme = "${pkgs.base16-schemes}/share/themes/dracula.yaml";
|
||||
#override = {
|
||||
# base05 = "e0e0e0"; # default text — light grey (no # prefix!)
|
||||
# base04 = "b0b0b0"; # secondary/muted text
|
||||
# base06 = "f5f5f5"; # lighter text variant
|
||||
#};
|
||||
|
||||
opacity = {
|
||||
desktop = 0.5;
|
||||
terminal = 0.9;
|
||||
@ -43,7 +49,8 @@
|
||||
plymouth.logoAnimated = true;
|
||||
console.enable = true; #Default console without desktop environment! (NOT KITTY!)
|
||||
grub.enable = false;
|
||||
#qt.enable = false;
|
||||
qt.enable = true;
|
||||
gtk.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
inputs.niri.homeModules.stylix
|
||||
];
|
||||
|
||||
services = {
|
||||
@ -18,8 +19,7 @@
|
||||
# colorTheme.enable = true;
|
||||
# profileNames = ["${username}"];
|
||||
#};
|
||||
qt.enable = true;
|
||||
qt.platform = "kde";
|
||||
niri.enable = true;
|
||||
#kde.enable = false;
|
||||
};
|
||||
};
|
||||
|
||||
@ -1,153 +0,0 @@
|
||||
{
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"modules-left": [
|
||||
"custom/launcher",
|
||||
"hyprland/workspaces",
|
||||
"cpu",
|
||||
"memory"
|
||||
|
||||
],
|
||||
"modules-center": [
|
||||
"hyprland/window"
|
||||
],
|
||||
"spacing": 4,
|
||||
"modules-right": [
|
||||
"tray",
|
||||
"wireplumber",
|
||||
"network",
|
||||
"backlight",
|
||||
"clock",
|
||||
"battery",
|
||||
"custom/power"
|
||||
],
|
||||
"backlight": {
|
||||
"device": "intel_backlight",
|
||||
"format": "{percent}% {icon}",
|
||||
"format-icons": ["", ""]
|
||||
},
|
||||
"hyprland/workspaces": {
|
||||
"format": "{name}",
|
||||
"persistent-workspaces": {
|
||||
"1": [],
|
||||
"2": [],
|
||||
"3": []
|
||||
}
|
||||
},
|
||||
"hyprland/window": {
|
||||
"icon": false,
|
||||
"separate-outputs": true,
|
||||
"format": "{}"
|
||||
},
|
||||
"tray": {
|
||||
"icon-size": 15,
|
||||
"spacing": 7
|
||||
},
|
||||
"clock": {
|
||||
"format": "{:%H:%M} ",
|
||||
"format-alt": "{:%A, %B %d, %Y (%R)}",
|
||||
"tooltip-format": "<tt><small>{calendar}</small></tt>",
|
||||
"calendar": {
|
||||
"mode": "year",
|
||||
"mode-mon-col": 3,
|
||||
"weeks-pos": "right",
|
||||
"on-scroll": 1,
|
||||
"on-click-right": "mode",
|
||||
"format": {
|
||||
"months": "<span color='#f5e0dc'><b>{}</b></span>",
|
||||
"days": "<span color='#cdd6f4'><b>{}</b></span>",
|
||||
"weeks": "<span color='#fab387'><b>W{}</b></span>",
|
||||
"weekdays": "<span color='#f5c2e7'><b>{}</b></span>",
|
||||
"today": "<span color='#cba6f7'><b><u>{}</u></b></span>"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"on-click-right": "mode",
|
||||
"on-click-forward": "tz_up",
|
||||
"on-click-backward": "tz_down",
|
||||
"on-scroll-up": "shift_up",
|
||||
"on-scroll-down": "shift_down"
|
||||
}
|
||||
},
|
||||
"cpu": {
|
||||
"interval": 1,
|
||||
"format": "CPU {usage:>2}% {icon0}{icon1}{icon2}{icon3}",
|
||||
"format-icons": [
|
||||
"▁",
|
||||
"▂",
|
||||
"▃",
|
||||
"▄",
|
||||
"▅",
|
||||
"▆",
|
||||
"▇",
|
||||
"█"
|
||||
],
|
||||
"on-click": "kitty -e btop"
|
||||
},
|
||||
"memory": {
|
||||
"interval": 30,
|
||||
"format": "MEM {used:0.1f}G/{total:0.1f}G"
|
||||
},
|
||||
"network": {
|
||||
"format": " Disabled",
|
||||
"format-wifi": " ",
|
||||
"format-ethernet": " ",
|
||||
"format-disconnected": "⚠",
|
||||
"tooltip": true,
|
||||
"tooltip-format": "{ifname}\n{ipaddr}",
|
||||
"tooltip-format-wifi": "{essid} {ifname}\n{ipaddr}\nstrength: {signalStrength}%",
|
||||
"on-click": "networkmanager_dmenu"
|
||||
},
|
||||
"custom/launcher": {
|
||||
"format": " ",
|
||||
"tooltip": false,
|
||||
"on-click": "wofi -c ~/.config/wofi/config -I"
|
||||
},
|
||||
"custom/power": {
|
||||
"format": " ",
|
||||
"on-click": "~/.config/wofi/scripts/power.sh",
|
||||
"tooltip": false
|
||||
},
|
||||
"wireplumber": {
|
||||
"scroll-step": 10,
|
||||
"format": "{volume}% {icon} ",
|
||||
"format-bluetooth": "{icon} {volume}%",
|
||||
"format-muted": "muted ",
|
||||
"on-click": "pavucontrol",
|
||||
"format-icons": {
|
||||
"headphones": "",
|
||||
"handsfree": "",
|
||||
"headset": "",
|
||||
"phone": "",
|
||||
"portable": "",
|
||||
"car": "",
|
||||
"default": [
|
||||
"",
|
||||
""
|
||||
]
|
||||
}
|
||||
},
|
||||
"battery": {
|
||||
"states": {
|
||||
"warning": 30,
|
||||
"critical": 15
|
||||
},
|
||||
"format": "{capacity}% {icon}",
|
||||
"format-charging": " {capacity}%",
|
||||
"format-pluged": " {capacity}%",
|
||||
"format-full": " {capacity}%",
|
||||
"format-icons": [
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
""
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
{...}: {
|
||||
# xdg.configFile."waybar/config.jsonc".source = ./config.jsonc;
|
||||
# xdg.configFile."waybar/style.css".source = ./style.css;
|
||||
}
|
||||
@ -1,167 +0,0 @@
|
||||
* {
|
||||
font-family: "JetBrainsMono Nerd Font", sans-serif;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
window > box {
|
||||
margin-top: 0px;
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
#window {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 12px 8px 8px;
|
||||
margin: 0px 0;
|
||||
}
|
||||
|
||||
window#waybar.empty #window {
|
||||
background: rgba(12, 12, 12, 0);
|
||||
}
|
||||
|
||||
.modules-left {
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.modules-right {
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.modules-center {
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
#workspaces {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 4px 4px 4px 6px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
min-height: 0;
|
||||
padding: 0 7px;
|
||||
margin-right: 2px;
|
||||
color: #f5e0dc;
|
||||
}
|
||||
|
||||
#workspaces button.urgent {
|
||||
color: #f5e0dc;
|
||||
animation-name: blink;
|
||||
animation-duration: 0.5s;
|
||||
animation-timing-function: linear;
|
||||
animation-iteration-count: infinite;
|
||||
animation-direction: alternate;
|
||||
}
|
||||
|
||||
#workspaces button.empty {
|
||||
color: #cdd6f4;
|
||||
}
|
||||
|
||||
#workspaces button.visible {
|
||||
color: #89dceb;
|
||||
}
|
||||
|
||||
#workspaces button.active {
|
||||
color: #fab387;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
to {
|
||||
color: #202020;
|
||||
background-color: #dcf5f3;
|
||||
}
|
||||
}
|
||||
|
||||
#custom-launcher {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 8px 8px 4px;
|
||||
margin: 4px 0;
|
||||
color: #89dceb;
|
||||
}
|
||||
|
||||
#custom-power {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 12px 8px 8px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
#cpu {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 8px 8px 20px;
|
||||
margin: 4px 0;
|
||||
color: #f2cdcd;
|
||||
}
|
||||
|
||||
#memory {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 8px 8px 20px;
|
||||
margin: 4px 0;
|
||||
color: #fab387;
|
||||
}
|
||||
|
||||
#wireplumber {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 8px 8px 20px;
|
||||
margin: 4px 0;
|
||||
color: #f9e2af;
|
||||
}
|
||||
|
||||
#wireplumber.muted {
|
||||
color: #f38ba8;
|
||||
}
|
||||
|
||||
#clock {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 10px 10px 10px;
|
||||
margin: 4px 0;
|
||||
color: #94e2d5;
|
||||
}
|
||||
|
||||
#network {
|
||||
background-color: #202020;
|
||||
color: #cdd6f4;
|
||||
border-radius: 20px;
|
||||
padding: 8px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
#network.disabled {
|
||||
color: #f38ba8;
|
||||
}
|
||||
|
||||
#tray {
|
||||
background-color: #202020;
|
||||
border-radius: 20px;
|
||||
padding: 8px 12px 8px 12px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
#battery {
|
||||
background-color: #202020;
|
||||
color: #cdd6f4;
|
||||
border-radius: 20px;
|
||||
padding: 8px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
#backlight {
|
||||
background-color: #202020;
|
||||
color: #cdd6f4;
|
||||
border-radius: 20px;
|
||||
padding: 8px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
{
|
||||
config,
|
||||
inputs,
|
||||
pkgs,
|
||||
username,
|
||||
project,
|
||||
@ -7,31 +8,8 @@
|
||||
}: {
|
||||
#To show logs of services run:
|
||||
#journalctl --user-unit={service-name} --user
|
||||
systemd.user.services.niri-waybar = {
|
||||
description = "Waybar status bar for Niri";
|
||||
|
||||
# "wantedBy" replaces the [Install] section
|
||||
wantedBy = ["graphical-session.target"];
|
||||
|
||||
# "partOf" and "after" replace the [Unit] section dependencies
|
||||
partOf = ["graphical-session.target"];
|
||||
after = ["graphical-session.target"];
|
||||
|
||||
# [Unit] configuration goes here
|
||||
unitConfig = {
|
||||
# This checks the environment variable to ensure we are in Niri
|
||||
ConditionEnvironment = "XDG_CURRENT_DESKTOP=niri";
|
||||
};
|
||||
|
||||
# [Service] configuration goes here
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.waybar}/bin/waybar";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "1s";
|
||||
};
|
||||
};
|
||||
|
||||
# 2. The Niri Session Cleanup Service
|
||||
# The Niri Session Cleanup Service
|
||||
# This service starts when the graphical session starts, and when it stops,
|
||||
# it forcibly stops the graphical-session.target to ensure a clean state for the next login.
|
||||
systemd.user.services.niri-session-manager = {
|
||||
|
||||
@ -2,12 +2,12 @@
|
||||
config,
|
||||
inputs,
|
||||
pkgs,
|
||||
system,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./autostart.nix
|
||||
../modules/hyprlock
|
||||
../modules/hyprpaper
|
||||
../modules/stylix
|
||||
];
|
||||
|
||||
@ -16,10 +16,8 @@
|
||||
];
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
#mako
|
||||
fuzzel
|
||||
waybar
|
||||
xwayland-satellite
|
||||
lxsession #Needed for things like gparted
|
||||
];
|
||||
|
||||
programs = {
|
||||
@ -33,7 +31,6 @@
|
||||
#services.xserver.displayManager.sddm.enable = true;
|
||||
|
||||
xdg.portal = {
|
||||
#Needed for waybar
|
||||
enable = true;
|
||||
extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr];
|
||||
config.common.default = "*";
|
||||
|
||||
@ -5,31 +5,13 @@
|
||||
}: {
|
||||
imports = [
|
||||
inputs.niri.homeModules.niri
|
||||
../modules/waybar/home.nix
|
||||
../modules/noctalia/home.nix
|
||||
];
|
||||
|
||||
xdg.configFile."mako/config".text = ''
|
||||
default-timeout=5000
|
||||
ignore-timeout=1
|
||||
'';
|
||||
|
||||
programs.niri = {
|
||||
package = pkgs.niri;
|
||||
enable = true;
|
||||
#xwayland.enable = true;
|
||||
# config = ''
|
||||
# binds {
|
||||
# Super+Return { spawn "kitty"; }
|
||||
# Super+Space { spawn "fuzzel"; }
|
||||
# Super+Q { close-window; }
|
||||
# Super+Left { focus-column-left; }
|
||||
# Super+Right { focus-column-right; }
|
||||
# Super+Up { focus-workspace-up; }
|
||||
# Super+Down { focus-workspace-down; }
|
||||
# Super+L { spawn "hyprlock"; }
|
||||
# Super+Shift+E { "quit"; }
|
||||
# }
|
||||
# '';
|
||||
|
||||
config = ''
|
||||
input {
|
||||
keyboard {
|
||||
@ -38,6 +20,10 @@
|
||||
}
|
||||
numlock
|
||||
}
|
||||
mouse {
|
||||
accel-profile "flat"
|
||||
accel-speed -0.4
|
||||
}
|
||||
}
|
||||
|
||||
prefer-no-csd
|
||||
@ -83,11 +69,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
// spawn-at-startup "waybar"
|
||||
spawn-at-startup "hyprpaper"
|
||||
spawn-at-startup "${pkgs.mako}/bin/mako"
|
||||
|
||||
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
|
||||
spawn-at-startup "noctalia"
|
||||
spawn-at-startup "lxpolkit"
|
||||
|
||||
hotkey-overlay {
|
||||
// Uncomment this line to disable the "Important Hotkeys" pop-up at startup.
|
||||
@ -102,6 +85,11 @@
|
||||
draw-border-with-background false
|
||||
}
|
||||
|
||||
// layer-rule {
|
||||
// match namespace="^awww-daemonbackdrop$"
|
||||
// place-within-backdrop true
|
||||
// }
|
||||
|
||||
output "eDP-1" {
|
||||
mode "2880x1920@120.000"
|
||||
scale 2
|
||||
@ -111,24 +99,26 @@
|
||||
binds {
|
||||
Mod+Shift+Minus { show-hotkey-overlay; }
|
||||
|
||||
Mod+Shift+S hotkey-overlay-title="Make a screenshot selection" { spawn-sh "noctalia msg screenshot-region";}
|
||||
|
||||
Mod+T hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
|
||||
Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; }
|
||||
Super+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; }
|
||||
Mod+D hotkey-overlay-title="Run an Application" { spawn-sh "noctalia msg panel-toggle launcher"; }
|
||||
Super+L hotkey-overlay-title="Lock the Screen" { spawn-sh "noctalia msg session lock"; }
|
||||
|
||||
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
|
||||
|
||||
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; }
|
||||
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
|
||||
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
|
||||
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
|
||||
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; }
|
||||
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; }
|
||||
XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; }
|
||||
XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; }
|
||||
|
||||
XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
|
||||
XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
|
||||
XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
|
||||
XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
|
||||
|
||||
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
|
||||
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
|
||||
XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; }
|
||||
XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; }
|
||||
|
||||
Mod+O repeat=false { toggle-overview; }
|
||||
|
||||
|
||||
75
other/dev-template.nix
Normal file
75
other/dev-template.nix
Normal file
@ -0,0 +1,75 @@
|
||||
{
|
||||
description = "A reproducible development environment";
|
||||
|
||||
# ─────────────────────────────────────────────
|
||||
# Inputs – external flakes this flake depends on
|
||||
# ─────────────────────────────────────────────
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
|
||||
# flake-utils generates per-system outputs so you don't
|
||||
# have to repeat yourself for every architecture.
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
# ─────────────────────────────────────────────
|
||||
# Outputs – everything this flake exposes
|
||||
# ─────────────────────────────────────────────
|
||||
outputs = { self, nixpkgs, flake-utils, ... }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
# Allow non-free packages
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
# ─────────────────────────────────────────
|
||||
# `nix develop` drops you into this shell
|
||||
# ─────────────────────────────────────────
|
||||
devShells.default = pkgs.mkShell {
|
||||
|
||||
# Human-readable name shown in the shell prompt
|
||||
name = "replaceNameHere";
|
||||
|
||||
# ── Runtime packages available inside the shell ──────────────
|
||||
# Add or remove anything from https://search.nixos.org/packages
|
||||
packages = with pkgs; [
|
||||
# Version control
|
||||
git
|
||||
|
||||
# Common utilities
|
||||
curl
|
||||
wget
|
||||
bat
|
||||
|
||||
# ── Language toolchains ──────────────────────────────────
|
||||
# replacePackagesHere
|
||||
];
|
||||
|
||||
# ── Build inputs (headers, libraries needed at compile time) ──
|
||||
# Use this for native C libraries, e.g.:
|
||||
# buildInputs = with pkgs; [ openssl zlib pkg-config ];
|
||||
|
||||
# replaceBuildInputsHere
|
||||
|
||||
# ── Shell hook – runs every time you enter the shell ──────────
|
||||
shellHook = ''
|
||||
echo ""
|
||||
echo " 🐚 Development shell ready!"
|
||||
echo " 📦 nixpkgs: ${nixpkgs.rev or "unknown"}"
|
||||
echo ""
|
||||
|
||||
# replaceShellHookHere
|
||||
'';
|
||||
|
||||
# ── Environment variables always present in the shell ─────────
|
||||
|
||||
# Allow broken or insecure packages
|
||||
# NIX_CONFIG = "allow-broken = true";
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
mkdir -p /var/lib/AccountsService/{icons,users}
|
||||
cp /home/cookiez/NixOS/other/pfp.png /var/lib/AccountsService/icons/cookiez
|
||||
echo -e "[User]\nIcon=/var/lib/AccountsService/icons/cookiez\n" > /var/lib/AccountsService/users/cookiez
|
||||
|
||||
chown root:root /var/lib/AccountsService/users/cookiez
|
||||
chmod 0600 /var/lib/AccountsService/users/cookiez
|
||||
|
||||
chown root:root /var/lib/AccountsService/icons/cookiez
|
||||
chmod 0444 /var/lib/AccountsService/icons/cookiez
|
||||
@ -12,10 +12,15 @@
|
||||
description = "Automatically start Yakuake";
|
||||
after = ["graphical-session.target"];
|
||||
wantedBy = ["graphical-session.target"];
|
||||
|
||||
unitConfig = {
|
||||
ConditionEnvironment = "XDG_CURRENT_DESKTOP=KDE";
|
||||
};
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = ["${pkgs.kdePackages.yakuake}/bin/yakuake"];
|
||||
|
||||
Type = "oneshot";
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "5s";
|
||||
Environment = "PATH=/run/current-system/sw/bin:/etc/profiles/per-user/$USER/bin";
|
||||
@ -30,7 +35,7 @@
|
||||
serviceConfig = {
|
||||
ExecStart = ["${pkgs.trayscale}/bin/trayscale --hide-window"];
|
||||
|
||||
Type = "oneshot";
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "5s";
|
||||
};
|
||||
|
||||
@ -1,20 +1,20 @@
|
||||
{
|
||||
config,
|
||||
inputs,
|
||||
pkgs,
|
||||
username,
|
||||
project,
|
||||
cookiez-assets,
|
||||
...
|
||||
}: let
|
||||
# Define the custom background package with the correct relative path
|
||||
# background-package = pkgs.stdenvNoCC.mkDerivation {
|
||||
# name = "background-image";
|
||||
# src = ../other/wallpaper4.png; # Place wallpaper.jpg in the same directory as this config file
|
||||
# dontUnpack = true;
|
||||
# installPhase = ''
|
||||
# cp $src $out
|
||||
# '';
|
||||
# };
|
||||
background-package = pkgs.stdenvNoCC.mkDerivation {
|
||||
name = "background-image";
|
||||
src = "${inputs.cookiez-assets}/wallpapers/forest-cat.png"; # Place wallpaper.jpg in the same directory as this config file
|
||||
dontUnpack = true;
|
||||
installPhase = ''
|
||||
cp $src $out
|
||||
'';
|
||||
};
|
||||
plasmaTheme = "desktop"; #Possible values are "laptop" or "desktop"
|
||||
powerProfile = "laptop"; #Possible values are "laptop" or "desktop"
|
||||
in {
|
||||
@ -25,7 +25,7 @@ in {
|
||||
|
||||
# Pass the variable to home-manager
|
||||
home-manager.extraSpecialArgs = {
|
||||
inherit plasmaTheme powerProfile cookiez-assets;
|
||||
inherit plasmaTheme powerProfile;
|
||||
};
|
||||
|
||||
home-manager.sharedModules = [
|
||||
@ -38,8 +38,6 @@ in {
|
||||
"sddm".serviceConfig.KillMode = "mixed";
|
||||
};
|
||||
|
||||
programs.gamemode.enable = true;
|
||||
|
||||
services = {
|
||||
xserver = {
|
||||
enable = true;
|
||||
@ -82,10 +80,10 @@ in {
|
||||
];
|
||||
|
||||
systemPackages = with pkgs; [
|
||||
#(pkgs.writeTextDir "share/sddm/themes/breeze/theme.conf.user" ''
|
||||
# [General]
|
||||
# background = "${background-package}"
|
||||
#'') #Custom SDDM theme with background image
|
||||
(pkgs.writeTextDir "share/sddm/themes/breeze/theme.conf.user" ''
|
||||
[General]
|
||||
background = "${background-package}"
|
||||
'') #Custom SDDM theme with background image
|
||||
kdePackages.plymouth-kcm
|
||||
xdg-desktop-portal
|
||||
kdePackages.xdg-desktop-portal-kde
|
||||
|
||||
@ -14,4 +14,7 @@
|
||||
]
|
||||
++ lib.optionals (plasmaTheme == "laptop") [./settings/laptop.nix]
|
||||
++ lib.optionals (plasmaTheme == "desktop") [./settings/desktop.nix];
|
||||
|
||||
#Add the wallpapers to be available to KDE wallpaper settings page
|
||||
xdg.dataFile."wallpapers/cookiez".source = "${inputs.cookiez-assets}/wallpapers";
|
||||
}
|
||||
|
||||
@ -4,7 +4,6 @@
|
||||
username,
|
||||
project,
|
||||
plasmaTheme,
|
||||
cookiez-assets,
|
||||
...
|
||||
}: {
|
||||
programs = {
|
||||
@ -124,7 +123,7 @@
|
||||
};
|
||||
};
|
||||
configFile = {
|
||||
plasmarc.Wallpapers.usersWallpapers = "${cookiez-assets}/wallpapers/pixel-desert.png";
|
||||
plasmarc.Wallpapers.usersWallpapers = "${inputs.cookiez-assets}/wallpapers/pixel-desert.png";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@ -8,8 +8,8 @@
|
||||
}: let
|
||||
profiles = {
|
||||
laptop = {
|
||||
AC.powerProfile = "powerSaving";
|
||||
battery.powerProfile = "powerSaving";
|
||||
AC.powerProfile = null; #Set to null so it doesnt change on plugging it in.
|
||||
battery.powerProfile = null;
|
||||
lowBattery.powerProfile = "powerSaving";
|
||||
};
|
||||
desktop = {
|
||||
|
||||
Reference in New Issue
Block a user