commit 279f90bfb82dd5f9e8ad45825cec011aeb1f5842 Author: Snorre Ettrup Altschul Date: Tue Jan 14 19:04:37 2025 +0100 starting point diff --git a/README.md b/README.md new file mode 100755 index 0000000..2ddb888 --- /dev/null +++ b/README.md @@ -0,0 +1,165 @@ +# My nixos flake +This is my nixos configuration. + +# Installation +To install either run the following script, or follow the instructions. + +```sh +curl https://gitlab.com/SpoodyTheOne/nixos-config/-/raw/master/install.sh -o install.sh +sudo chmod +x install.sh +./install.sh +``` + +## Disko partitioning +### Finding your disk +run `lsblk` to find the name of your drive. In my case it was `/dev/nvme0n1` but other names it can have are `/dev/sd[a-z]` or `/dev/vd[a-z]` if you are installing on a virtual machine. + +### Acquire disko config +run +```sh +curl https://gitlab.com/SpoodyTheOne/nixos-config/-/raw/master/modules/disko/disko-luks.nix -o /tmp/disko.nix +``` +to download the latest version of my disko config + +### Run disko partitioning +This will run my disko config and partition your disk. + +> [!WARNING] +> This command will erase all data on the chosen disk. Make sure you partition the correct disk and that you've backed up anything important on it + +The command to run the config is +```sh +sudo nix --experimental-features "nix-command flakes" \ +run github:nix-community/disko -- \ +--mode disko /tmp/disko.nix \ +--arg device '""' \ +--arg swap-size '""' +``` + +> [!NOTE] +> The swap size can be any number suffixed with the standard K,M,G for gigabytes and such. + +During the installation you will be prompted for a password. This is the password used for unencrypting your disk every time you boot. +You will be prompted twice, once to lock it, and then again to unlock it. + +The device will now be mounted on `/mnt` and should contain the following structure + - /persist + - /boot + - /nix + +## Generate configuration +You need to generate the `hardware-configuration.nix` file for your system. +To do this run + +```sh +sudo nixos-generate-config --no-filesystems --root /mnt +``` + +This will generate a folder called `/mnt/etc/nixos` with the hardware configuration file in it. + +Next step is to move `hardware-configuration.nix` into `/tmp` and then clone the git repo to `/etc/nixos` + +```sh +nix-shell -p git # For the git command +sudo mv /mnt/etc/nixos/hardware-configuration.nix /tmp # Move configuration away +sudo rm -rf /mnt/etc/nixos # Nuke config folder so we can clone +sudo git clone https://gitlab.com/SpoodyTheOne/nixos-config.git /mnt/etc/nixos # Clone config +``` + +## Configuring config +Start by replacing the bootstrap hosts hardware-configuration with your own + +```sh +# Move hardware configuration +sudo mv /tmp/hardware-configuration.nix /mnt/etc/nixos/hosts/bootstrap +# go to /etc/nixos +cd /mnt/etc/nixos +# Add hardware configuration to git for nix to recognize it +sudo git add . +``` + +## Configure users +Go to `/mnt/etc/nixos/flake.nix` and change the config for the bootstrap host disko module to have the same settings you used for setting up your disk. + +```sh +sudo vim /mnt/etc/nixos/flake.nix +``` + +## Install +Now that everything is configured run + +```sh +# Copy configuration to permanent storage so its not nuked on reboot +sudo cp -r /mnt/etc/nixos /mnt/persist +sudo nixos-install --root /mnt --flake /mnt/etc/nixos#bootstrap +``` + +to install everything and then reboot. + +## After reboot +After the reboot you will be prompted for your disk password. After inputting it the system will boot as normal. + +Once booted log in using the user `bootstrap` and the password `1234`. + +Next step, modify the bootstrap host configuration to enable impermanence and change the user and password. Then rebuild and reboot + +```sh +cd /persist/nixos +sudo vim hosts/bootstrap/configuration.nix +``` + +in the config go to imports and uncomment this block + +```nix +# UNCOMMENT AFTER REBOOT +# Delete unwanted files +# (import ../../modules/disko/delete-on-boot.nix { +# inherit lib; +# persistExtraDirectories = [ ]; +# persistExtraFiles = [ ]; +# }) +``` + +Futher down in the file theres a line that says `users.users."bootstrap"`. Modify the string to your desired username and change the following lines in the user + +```sh +# Generate a password and place the output in a file +mkpasswd > /tmp/passwd +``` +Then in vim read the contenst of the password into the hashedPassword field +```vim +:read /tmp/passwd +``` + +The end result should look something like this +```diff +- initialPassword = "1234"; ++ hashedPassword = "$y$j9T$TK08gB8eSmQdGaS2Gfiex/$L2moQMRxYDEiuEeql/MidoQhFBAJC1qnOTx7ChpAOtC"'; +``` + +Move `/persist/nixos/` to `/etc/nixos` and rebuild. Then the installation will be done + +```sh +sudo mv -r /persist/nixos /etc +``` + +Then rebuild +```sh +sudo nix-rebuild switch --flake /persist/nixos#bootstrap +reboot +``` + +Don't worry about all the errors that occur during the rebuild. This only happens the first time after switching to impermanence + +# Post Installation +Once you've installed you're free to create a new host and modify it to your hearts content. You can base it off of my laptop host, it has a lot of nice things + +My config includes an alias for rebuilding the system called `nix-rebuild` for fast iterations + +# Update +In order to update the flake inputs simply run + +```sh +cd /etc/nixos +nix flake update +``` diff --git a/flake.lock b/flake.lock new file mode 100755 index 0000000..01616f2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,747 @@ +{ + "nodes": { + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1732200724, + "narHash": "sha256-+R1BH5wHhfnycySb7Sy5KbYEaTJZWm1h+LW1OtyhiTs=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "153d52373b0fb2d343592871009a286ec8837aec", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "base16-fish": { + "flake": false, + "locked": { + "lastModified": 1622559957, + "narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=", + "owner": "tomyun", + "repo": "base16-fish", + "rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe", + "type": "github" + }, + "original": { + "owner": "tomyun", + "repo": "base16-fish", + "type": "github" + } + }, + "base16-helix": { + "flake": false, + "locked": { + "lastModified": 1725860795, + "narHash": "sha256-Z2o8VBPW3I+KKTSfe25kskz0EUj7MpUh8u355Z1nVsU=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "7f795bf75d38e0eea9fed287264067ca187b88a9", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1731949548, + "narHash": "sha256-XIDexXM66sSh5j/x70e054BnUsviibUShW7XhbDGhYo=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "61165b1632409bd55e530f3dbdd4477f011cadc6", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1735644329, + "narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=", + "owner": "numtide", + "repo": "devshell", + "rev": "f7795ede5b02664b57035b3b757876703e2c3eac", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736165297, + "narHash": "sha256-OT+sF4eNDFN/OdyUfIQwyp28+CFQL7PAdWn0wGU7F0U=", + "owner": "nix-community", + "repo": "disko", + "rev": "76816af65d5294761636a838917e335992a52e0c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "flake-compat": { + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "revCount": 57, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736143030, + "narHash": "sha256-+hu54pAoLDEZT9pjHlqL9DNzWz0NbUn8NEAHP7PQPzU=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "b905f6fc23a9051a6e1b741e1438dbfc0634c6de", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": [ + "stylix", + "systems" + ] + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": [ + "nixvim", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1735882644, + "narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "a5a961387e75ae44cc20f0a57ae463da5e959656", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "git-hooks_2": { + "inputs": { + "flake-compat": [ + "stylix", + "flake-compat" + ], + "gitignore": "gitignore_2", + "nixpkgs": [ + "stylix", + "nixpkgs" + ], + "nixpkgs-stable": [ + "stylix", + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1731363552, + "narHash": "sha256-vFta1uHnD29VUY4HJOO/D6p6rxyObnf+InnSMT4jlMU=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "cd1af27aa85026ac759d5d3fccf650abe7e1bbf0", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "nixvim", + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "stylix", + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gnome-shell": { + "flake": false, + "locked": { + "lastModified": 1732369855, + "narHash": "sha256-JhUWbcYPjHO3Xs3x9/Z9RuqXbcp5yhPluGjwsdE2GMg=", + "owner": "GNOME", + "repo": "gnome-shell", + "rev": "dadd58f630eeea41d645ee225a63f719390829dc", + "type": "github" + }, + "original": { + "owner": "GNOME", + "ref": "47.2", + "repo": "gnome-shell", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736089250, + "narHash": "sha256-/LPWMiiJGPHGd7ZYEgmbE2da4zvBW0acmshUjYC3WG4=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "172b91bfb2b7f5c4a8c6ceac29fd53a01ef07196", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736089250, + "narHash": "sha256-/LPWMiiJGPHGd7ZYEgmbE2da4zvBW0acmshUjYC3WG4=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "172b91bfb2b7f5c4a8c6ceac29fd53a01ef07196", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_3": { + "inputs": { + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1735774425, + "narHash": "sha256-C73gLFnEh8ZI0uDijUgCDWCd21T6I6tsaWgIBHcfAXg=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "5f6aa268e419d053c3d5025da740e390b12ac936", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1734945620, + "narHash": "sha256-olIfsfJK4/GFmPH8mXMmBDAkzVQ1TWJmeGT3wBGfQPY=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "d000479f4f41390ff7cf9204979660ad5dd16176", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "impermanence", + "type": "github" + } + }, + "ixx": { + "inputs": { + "flake-utils": [ + "nixvim", + "nuschtosSearch", + "flake-utils" + ], + "nixpkgs": [ + "nixvim", + "nuschtosSearch", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729958008, + "narHash": "sha256-EiOq8jF4Z/zQe0QYVc3+qSKxRK//CFHMB84aYrYGwEs=", + "owner": "NuschtOS", + "repo": "ixx", + "rev": "9fd01aad037f345350eab2cd45e1946cc66da4eb", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "ref": "v0.0.6", + "repo": "ixx", + "type": "github" + } + }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736085891, + "narHash": "sha256-bTl9fcUo767VaSx4Q5kFhwiDpFQhBKna7lNbGsqCQiA=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "ba9b3173b0f642ada42b78fb9dfc37ca82266f6c", + "type": "github" + }, + "original": { + "owner": "lnl7", + "repo": "nix-darwin", + "type": "github" + } + }, + "nix-index-database": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736047960, + "narHash": "sha256-hutd85FA1jUJhhqBRRJ+u7UHO9oFGD/RVm2x5w8WjVQ=", + "owner": "nix-community", + "repo": "nix-index-database", + "rev": "816a6ae88774ba7e74314830546c29e134e0dffb", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-index-database", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1736012469, + "narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1735648875, + "narHash": "sha256-fQ4k/hyQiH9RRPznztsA9kbcDajvwV1sRm01el6Sr3c=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "47e29c20abef74c45322eca25ca1550cdf5c3b50", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixvim": { + "inputs": { + "devshell": "devshell", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "git-hooks": "git-hooks", + "home-manager": "home-manager_2", + "nix-darwin": "nix-darwin", + "nixpkgs": [ + "nixpkgs" + ], + "nuschtosSearch": "nuschtosSearch", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1736157655, + "narHash": "sha256-/ggXMK8Q/rN94kaaSHPtEcf4SPKgPXfzSbDgAR6Odzs=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "31139e0605fd886d981e0a197e30ceac4b859d6e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixvim", + "type": "github" + } + }, + "nuschtosSearch": { + "inputs": { + "flake-utils": "flake-utils", + "ixx": "ixx", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1735854821, + "narHash": "sha256-Iv59gMDZajNfezTO0Fw6LHE7uKAShxbvMidmZREit7c=", + "owner": "NuschtOS", + "repo": "search", + "rev": "836908e3bddd837ae0f13e215dd48767aee355f0", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "repo": "search", + "type": "github" + } + }, + "root": { + "inputs": { + "disko": "disko", + "home-manager": "home-manager", + "impermanence": "impermanence", + "nix-index-database": "nix-index-database", + "nixpkgs": "nixpkgs", + "nixvim": "nixvim", + "stylix": "stylix", + "zen-browser": "zen-browser" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_2", + "git-hooks": "git-hooks_2", + "gnome-shell": "gnome-shell", + "home-manager": "home-manager_3", + "nixpkgs": "nixpkgs_2", + "systems": "systems_2", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1736176887, + "narHash": "sha256-XacDv8TFEcqaZlfsRqNFUCgca7Xv3SQtzrXon8oEhVo=", + "owner": "danth", + "repo": "stylix", + "rev": "b47ef3b8560c3921404d72cec95d84632e355e01", + "type": "github" + }, + "original": { + "owner": "danth", + "repo": "stylix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "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": { + "lastModified": 1716423189, + "narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1729501581, + "narHash": "sha256-1ohEFMC23elnl39kxWnjzH1l2DFWWx4DhFNNYDTYt54=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "f0e7f7974a6441033eb0a172a0342e96722b4f14", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1725758778, + "narHash": "sha256-8P1b6mJWyYcu36WRlSVbuj575QWIFZALZMTg5ID/sM4=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "122c9e5c0e6f27211361a04fae92df97940eccf9", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736115332, + "narHash": "sha256-FBG9d7e0BTFfxVdw4b5EmNll2Mv7hfRc54hbB4LrKko=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "1788ca5acd4b542b923d4757d4cfe4183cc6a92d", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "zen-browser": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1727721329, + "narHash": "sha256-QYlWZwUSwrM7BuO+dXclZIwoPvBIuJr6GpFKv9XKFPI=", + "owner": "MarceColl", + "repo": "zen-browser-flake", + "rev": "e6ab73f405e9a2896cce5956c549a9cc359e5fcc", + "type": "github" + }, + "original": { + "owner": "MarceColl", + "repo": "zen-browser-flake", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100755 index 0000000..0a72b33 --- /dev/null +++ b/flake.nix @@ -0,0 +1,153 @@ +{ + description = "Nixos configuration flake"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + # neorg-overlay.url = "github:nvim-neorg/nixpkgs-neorg-overlay"; + + stylix = { + url = "github:danth/stylix"; + # inputs.nixpkgs.follows = "nixpkgs"; + }; + + zen-browser = { + url = "github:MarceColl/zen-browser-flake"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + nixvim = { + url = "github:nix-community/nixvim"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + disko = { + url = "github:nix-community/disko"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + impermanence = { + url = "github:nix-community/impermanence"; + }; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + nix-index-database = { + url = "github:nix-community/nix-index-database"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + # hyprland.url = "github:hyprwm/Hyprland"; + # + # hyprfocus = { + # url = "github:pyt0xic/hyprfocus"; + # inputs.hyprland.follows = "hyprland"; + # }; + # + # hyprland-plugins = { + # url = "github:hyprwm/hyprland-plugins"; + # inputs.hyprland.follows = "hyprland"; + # }; + + }; + + outputs = { self, nixpkgs, ... } @ inputs: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; overlays = []; }; + in + { + nixosConfigurations = { + + bootstrap = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + }; + modules = [ + inputs.disko.nixosModules.default + (import ./modules/disko/disko-luks.nix { device = "/dev/nvme0n1"; swap-size = "8G"; encrypted = false; }) + + ./hosts/bootstrap/configuration.nix + + inputs.impermanence.nixosModules.impermanence + ]; + }; + + desktop = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + }; + modules = [ + inputs.disko.nixosModules.default + (import ./modules/disko/disko-luks.nix { device = "/dev/nvme0n1"; swap-size = "8G"; encrypted = false; }) + + ./hosts/desktop/configuration.nix + + inputs.impermanence.nixosModules.impermanence + inputs.home-manager.nixosModules.default + inputs.nixvim.nixosModules.nixvim + inputs.stylix.nixosModules.stylix + + inputs.nix-index-database.nixosModules.nix-index + { programs.nix-index-database.comma.enable = true; } + ]; + }; + + nixos-vm = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + }; + modules = [ + inputs.disko.nixosModules.default + (import ./hosts/nixos-vm/disko-luks.nix { device = "/dev/vda"; }) + + ./hosts/nixos-vm/configuration.nix + + inputs.impermanence.nixosModules.impermanence + inputs.home-manager.nixosModules.default + inputs.nixvim.nixosModules.nixvim + inputs.stylix.nixosModules.stylix + ]; + }; + + laptop = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + }; + modules = [ + inputs.disko.nixosModules.default + (import ./modules/disko/disko-luks.nix { device = "/dev/sda"; swap-size = "32G"; encrypted = true; }) + + ./hosts/laptop/configuration.nix + + inputs.impermanence.nixosModules.impermanence + inputs.home-manager.nixosModules.default + inputs.nixvim.nixosModules.nixvim + inputs.stylix.nixosModules.stylix + + inputs.nix-index-database.nixosModules.nix-index + { programs.nix-index-database.comma.enable = true; } + ]; + }; + }; + + templates = { + + dotnet = { + path = ./templates/dotnet; + description = "Flake for programming in dotnet"; + }; + + latex = { + path = ./templates/latex; + description = "Flake for creating latex documents"; + }; + + + }; + + }; +} diff --git a/hosts/bootstrap/configuration.nix b/hosts/bootstrap/configuration.nix new file mode 100755 index 0000000..06b1776 --- /dev/null +++ b/hosts/bootstrap/configuration.nix @@ -0,0 +1,84 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +{ config, lib, pkgs, inputs, ... }: +{ + # This is where you specify all .nix files to import + imports = + [ + # Hardware configuration that you generated in earlier steps + ./hardware-configuration.nix + + (import ../../modules/disko/delete-on-boot.nix { + inherit lib; + persistExtraDirectories = [ ]; + persistExtraFiles = [ ]; + users = {}; + }) + ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + boot.loader.timeout = 0; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + # System wide packages goes here + environment.systemPackages = with pkgs; [ + git + vim + ]; + + users.users."snorre" = { + isNormalUser = true; + + # Unsafe and resets every boot, use hashedPassword after installation + initialPassword = "1234"; + # hashedPassword = "Generate hash with `mkpasswd` and place result here"; + + extraGroups = [ + "networkmanager" + "audio" + "wheel" # Allows this user to use `sudo` + ]; + }; + + networking.hostName = "bootstrap"; # Define your hostname. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Ssh configuration here + services.openssh = { + enable = false; # Set to true to allow ssh connections + settings = { + # Require public key authentication + # Set to true to allow connecting with username+password + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + # Users who can be connected to from ssh. Set to null to allow all users + AllowUsers = null; + # Disallow ssh connections to root user. DONT ENABLE THIS + PermitRootLogin = "no"; + }; + }; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "23.11"; # Did you read the comment? + +} diff --git a/hosts/bootstrap/hardware-configuration.nix b/hosts/bootstrap/hardware-configuration.nix new file mode 100644 index 0000000..8d5a934 --- /dev/null +++ b/hosts/bootstrap/hardware-configuration.nix @@ -0,0 +1,26 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp8s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp7s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/desktop/configuration.nix b/hosts/desktop/configuration.nix new file mode 100755 index 0000000..b9bda6d --- /dev/null +++ b/hosts/desktop/configuration.nix @@ -0,0 +1,415 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +{ config, lib, pkgs, inputs, ... }: +let + persistence = { + "snorre" = import ./persist.nix; + }; +in +{ + imports = + [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + # ../../modules/drivers/nvidia.nix + ../../modules/plymouth/blahaj.nix + + (import ../../modules/disko/delete-on-boot.nix { + inherit lib; + persistExtraDirectories = [ ]; + persistExtraFiles = [ ]; + users = persistence; + }) + # ../../modules/plymouth + #../../modules/users/main-user.nix + ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + boot.loader.timeout = 0; + + boot.kernelPackages = pkgs.linuxPackages_zen; + + # boot.plymouth.enable = true; + # boot.plymouth.theme = "nixos-bgrt"; + # boot.plymouth.themePackages = [ + # pkgs.nixos-bgrt-plymouth + # ]; + + programs.nix-ld.enable = true; + # programs.nix-ld.libraries = with pkgs; [ + # # Add any missing dynamic libraries for unpackaged programs + # # here, NOT in environment.systemPackages + # ]; + + boot.consoleLogLevel = 0; + boot.initrd.verbose = false; + boot.kernelParams = [ + "i915.fastboot=1" + "preempt=full" + "quiet" + "splash" + # "boot.shell_on_fail" + "loglevel=3" + # "rd.systemd.show_status=false" + # "rd.udev.log_level=3" + + # "udev.log_priority=3" + ]; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + home-manager = { + extraSpecialArgs = { inherit inputs; }; + users = { + "snorre" = import ./home.nix; + }; + }; + + # fonts.packages = with pkgs; [ + # (nerdfonts.override { + # fonts = [ + # "Devicons"config + # ]; + # }) + # ]; + + programs.localsend.openFirewall = true; + + virtualisation.libvirtd.enable = true; + programs.virt-manager.enable = true; + + programs.steam = { + enable = true; + gamescopeSession.enable = false; + }; + + security.chromiumSuidSandbox.enable = true; # unity3d.enable was only to allow chrome root sandboxxing + programs.adb.enable = true; + + # nixos loves its files. So much that it opens more than 8000 of them at times. Lets increase the limit + # security.pam.loginLimits = [{ + # domain = "*"; + # type = "soft"; + # item = "nofile"; + # value = "65536"; + # }]; + + users.users."snorre" = { + isNormalUser = true; + hashedPassword = "$y$j9T$L2udHOsjFhnZpksLamKec/$IwNrtR9YCSx8eIau5VD3todAqFkfvSL9ONiEQNiGV.9"; + extraGroups = [ + "networkmanager" + "audio" + "wheel" + "adbusers" + "libvirtd" + ]; + +# openssh.authorizedKeys.keyFiles = [ +# ./ssh/authorized_keys_snorre +# ]; + + shell = pkgs.zsh; + }; + + # Programs to enable + # programs.zsh.enable = true; # Better shell than bash + programs.zsh = { + enable = true; + # This prevents cache invalidation when also managing zsh from home-manager, + # leading to faster startup times + enableGlobalCompInit = false; + }; + programs.hyprland = { + # Hyprland desktop environment + enable = true; + portalPackage = pkgs.xdg-desktop-portal-hyprland; + }; + + programs.ssh.startAgent = true; # ssh-agent for interacting with github + # security.chromiumSuidSandbox.enable = true; # unity3d.enable was only to allow chrome root sandboxxing + # programs.noisetorch.enable = true; # Noisetorch because discord krisp doesnt work + + # Fuck nano, all my homies hate nano + programs.nano.enable = false; + + # I want my steams and other non-libre software + nixpkgs.config.allowUnfree = true; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + wget + curl + git + # ranger + + # libsecret manager + # pass-secret-service + keepassxc + libsecret + + # ((drv: pkgs.symlinkJoin { + # name = drv.name; + # paths = [ drv ]; + # postBuild = "rm -rf $out/share/applications"; + # }) pkgs.neovim) + + neovim + + # graphics + mesa + + # Notifications + libnotify + + # For enabling and styling QT + libsForQt5.qtstyleplugin-kvantum + libsForQt5.qt5ct + catppuccin-kvantum + + # Gnome keyring makes it so we dont have to keep logging into programs + gnome-keyring + # Ui for when programs want sudo + polkit-kde-agent + ]; + + programs.gamemode = { + enable = true; + enableRenice = true; + + settings = { + general = { + renice = 3; + }; + + custom = { + # start = "${pkgs.libnotify}/bin/notify-send 'GameMode started'"; + # end = "${pkgs.libnotify}/bin/notify-send 'GameMode ended'"; + + start = + let + script = pkgs.writeScriptBin "gamemode_start.sh" '' + ${pkgs.libnotify}/bin/notify-send "GameMode started" + ${pkgs.libnotify}/bin/notify-send "user is: $USER" + /home/$USER/.nix-profile/bin/hyprctl keyword input:touchpad:disable_while_typing false + ''; + in + "${script}/bin/gamemode_start.sh"; + + end = + let + script = pkgs.writeScriptBin "gamemode_end.sh" '' + ${pkgs.libnotify}/bin/notify-send "GameMode end" + /home/$USER/.nix-profile/bin/hyprctl keyword input:touchpad:disable_while_typing true + ''; + in + "${script}/bin/gamemode_end.sh"; + }; + }; + }; + + # Session variables for qt and hyprland + environment.sessionVariables = { + XDG_CURRENT_DESKTOP = "Hyprland"; + XDG_SESSION_DESKTOP = "Hyprland"; + XDG_SESSION_TYPE = "wayland"; + GDK_BACKEND = "wayland"; + GTK_USE_PORTAL = "1"; + QT_QPA_PLATFORMTHEME = "qt5ct"; + QT_QPA_PLATFORM = "wayland"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + QT_AUTO_SCREEN_SCALE_FACTOR = "0"; + MOZ_ENABLE_WAYLAND = "1"; + # SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent"; + }; + + xdg.portal = { + enable = true; + wlr.enable = true; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + (pkgs.callPackage ../../modules/portals/xdg-desktop-portal-termfilechooser.nix { }) + ]; + # xdgOpenUsePortal = true; + }; + + qt = { + enable = true; + platformTheme = "qt5ct"; + }; + + + # Delete old entries to + nix = { + gc = { + automatic = true; + options = "--delete-older-than 30d"; + }; + }; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-material-dark-soft.yaml"; + stylix.autoEnable = true; + stylix.polarity = "dark"; + + # stylix.cursor.package = ( pkgs.callPackage ../../modules/stylix/cursors/posy-improved {} ); + # stylix.cursor.name = "Posy_Cursor"; + + stylix.cursor.package = pkgs.bibata-cursors; + stylix.cursor.name = "Bibata-Modern-Ice"; + stylix.cursor.size = 24; + + stylix.image = ./nixos-wallpaper.png; + + networking.hostName = "desktop"; # Define your hostname. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + networking.networkmanager.wifi.powersave = true; + networking.firewall = { + enable = true; + allowedTCPPorts = [ 8000 ]; + allowedUDPPortRanges = [ + { from = 8000; to = 8010; } + ]; + }; + + # Fuck off, i wanna boot + systemd.services."NetworkManager-wait-online".enable = false; + + # Set your time zone. + time.timeZone = "Europe/Copenhagen"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + # console = { + # keyMap = "dk"; + # }; + + # Remove message when running commands as sudo + security.sudo = { + enable = true; + extraConfig = '' + Defaults lecture = never + ''; + }; + + services.blueman = { + enable = true; + }; + + virtualisation.docker = { + enable = true; + storageDriver = "btrfs"; + }; + + hardware.bluetooth.enable = true; + hardware.bluetooth.powerOnBoot = false; + hardware.bluetooth.settings = { + General = { + Experimental = true; + }; + }; + + hardware.graphics = { + enable = true; + extraPackages = with pkgs; [ + intel-media-driver # LIBVA_DRIVER_NAME=iHD + intel-vaapi-driver # LIBVA_DRIVER_NAME=i965 (older but works better for Firefox/Chromium) + libvdpau-va-gl + ]; + }; + + services.pipewire = { + enable = true; + audio.enable = true; + alsa.enable = true; + pulse.enable = true; + wireplumber.enable = true; + }; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + programs.mtr.enable = true; + programs.gnupg.agent = { + enable = true; + # enableSSHSupport = true; + }; + + # services.power-profiles-daemon = { + # enable = true; + # }; + services.auto-cpufreq = { + enable = true; + settings = { + charger = { + governor = "performance"; + turbo = "auto"; + }; + + battery = { + governor = "powersave"; + energy_performance_preference = "power"; + turbo = "never"; + scaling_max_freq = 1000000; + }; + + }; + }; + + services.thermald.enable = true; + + services.openssh = { + enable = true; + settings = { + # Require public key authentication + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + AllowUsers = null; + PermitRootLogin = "no"; + }; + }; + + # Minimal TUI displaymanager for loggin in and launching hyprland + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland"; + user = "snorre"; + }; + + # First session auto starts hyprland + initial_session = { + command = "${pkgs.hyprland}/bin/Hyprland"; + user = "snorre"; + }; + }; + }; + + # hardware.opengl.driSupport = true; # This is already enabled by default + # hardware.opengl.driSupport32Bit = true; # For 32 bit applications + + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "23.11"; # Did you read the comment? + +} + diff --git a/hosts/desktop/disko.nix b/hosts/desktop/disko.nix new file mode 100644 index 0000000..dfa75a2 --- /dev/null +++ b/hosts/desktop/disko.nix @@ -0,0 +1,29 @@ +{ device ? throw "Set this to your disk device, e.g. /dev/sda" +, swap-size ? "0" +, encrypted ? false +, lib +, ... +}: +let + disko-luks = import ../modules/disko/disko-luks.nix; +in +{ + disko.devices.disk = lib.mergeAttrsList [ + { main = disko-luks.devices.disk.main; } + { + hdd = { + device = "/dev/sda"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + main = { + size = "100%"; + + }; + }; + }; + }; + } + ]; +} diff --git a/hosts/desktop/hardware-configuration.nix b/hosts/desktop/hardware-configuration.nix new file mode 100644 index 0000000..8d5a934 --- /dev/null +++ b/hosts/desktop/hardware-configuration.nix @@ -0,0 +1,26 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp8s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp7s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/desktop/home.nix b/hosts/desktop/home.nix new file mode 100755 index 0000000..b0535ab --- /dev/null +++ b/hosts/desktop/home.nix @@ -0,0 +1,151 @@ +{ pkgs, inputs, lib, ... }: + +{ + imports = [ + # inputs.impermanence.nixosModules.home-manager.impermanence + + ../../modules/stylix/home + ../../modules/editors/nixvim + ../../modules/shells/zsh.nix + + ../../modules/programs/dunst.nix + ../../modules/programs/waybar + ../../modules/programs/hyprpaper.nix + ../../modules/programs/tofi.nix + ../../modules/programs/alacritty.nix + ../../modules/programs/firefox.nix + ../../modules/programs/tmux.nix + ../../modules/programs/mangohud.nix + + (import ../../modules/window-managers/hyprland { + monitors = [ + "DP-2, 1920x1080@240, 1080x300, 1" + "HDMI-A-1, 1920x1080@144, 0x0, 1, transform, 1" + ]; + + border-radius = 4; + }) + + ../../modules/window-managers/hyprland/hyprlock.nix + ../../modules/window-managers/hyprland/hypridle.nix + + # (import ../../modules/disko/impermanence-home.nix { + # extraDirectories = [ + # ".jump" + # + # ".mozilla" + # ".zen" + # + # ".config/vesktop" + # ".config/zsh" + # + # ".cache/mozilla" + # ".cache/zen" + # ".cache/nvidia" + # ".cache/nix" + # ".cache/obexd" + # ".factorio" + # ".local/share/Steam" + # ]; + # extraFiles = [ ]; + # + # username = "snorre"; + # nixIndexEnabled = true; + # }) + ]; + + home.username = "snorre"; + home.homeDirectory = "/home/snorre"; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-material-dark-soft.yaml"; + stylix.polarity = "dark"; + stylix.image = ./nixos-wallpaper.png; + stylix.autoEnable = true; + stylix.targets.alacritty.enable = true; + # hyprpaper.wallpaper = ./nixos-wallpaper.png; + + nixpkgs.config.allowUnfree = true; + + home.packages = + let + tex = (pkgs.texlive.combine { + inherit (pkgs.texlive) scheme-medium + titling + biblatex hyperref amsmath tcolorbox environ + ; + }); + in + (with pkgs; [ + file + nixpkgs-fmt + ripgrep + jump + wl-clipboard + hyprpaper + hyprpicker + grimblast + tofi + brightnessctl + # Required for waybar to work + playerctl + wl-clipboard + + localsend + + ipe + texlivePackages.latex + texlivePackages.luatex + zathura + tex + biber + + prismlauncher + + spotify + vesktop + sublime-merge + + obs-studio + + vial + ]); + + # Mount 2tb harddisk + systemd.user.mounts."home-snorre-2tb" = { + Unit = { + Description = "Mount 2tb hdd to home folder"; + }; + + Mount = { + What = "/dev/sda1"; + Where = "/home/snorre/2tb"; + Type = "ext4"; + Options = "defaults"; + TimeoutSec = 30; + }; + }; + + programs.btop.enable = true; + + # programs.nix-index = { + # enable = true; + # enableZshIntegration = true; + # }; + + zsh.jump.enable = true; + zsh.jump.show-destination = true; + # Since zsh is the login shell it overrides $HOME/.zsh_history before impermanence can restore the old version. + # Therefore we simply store the history directly in /persist + zsh.histFile = "/persist/system/home/snorre/.zsh_history"; + + # Let home-manager manage itself + programs.home-manager.enable = true; + + home.sessionVariables = { + EDITOR = "nvim"; + # NIX_AUTO_RUN = "1"; # Automatically run non-installed commands if possible + # NIX_BUILD_SHELL = "zsh"; + }; + + home.stateVersion = "23.11"; +} diff --git a/hosts/desktop/nixos-wallpaper.png b/hosts/desktop/nixos-wallpaper.png new file mode 100755 index 0000000..f4cccc0 Binary files /dev/null and b/hosts/desktop/nixos-wallpaper.png differ diff --git a/hosts/desktop/persist.nix b/hosts/desktop/persist.nix new file mode 100644 index 0000000..d960583 --- /dev/null +++ b/hosts/desktop/persist.nix @@ -0,0 +1,32 @@ +{ + directories = [ + ### DEFAULT BEGIN ### + "Documents" + "Music" + "Pictures" + "Videos" + ".gnupg" + ".ssh" + ".local" + ".cache/mesa_shader_cache" + ".cache/mesa_shader_cache_db" + #### DEFAULT END #### + + ".jump" + + ".mozilla" + + ".config/vesktop" + ".config/zsh" + + ".cache/mozilla" + ".cache/nix" + ".cache/obexd" + ".factorio" + ".local/share/Steam" + ]; + files = [ + ".zsh_history" + ".gitconfig" + ]; +} diff --git a/hosts/laptop/configuration.nix b/hosts/laptop/configuration.nix new file mode 100755 index 0000000..7cc4991 --- /dev/null +++ b/hosts/laptop/configuration.nix @@ -0,0 +1,433 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +{ config, lib, pkgs, inputs, ... }: +let + persistence = { + "snorre" = import ./persist.nix; + "work" = import ./persist-work.nix; + }; +in +{ + imports = + [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + ../../modules/drivers/nvidia.nix + ../../modules/plymouth/blahaj.nix + + (import ../../modules/disko/delete-on-boot.nix { + inherit lib; + persistExtraDirectories = [ ]; + persistExtraFiles = [ ]; + users = persistence; + }) + # ../../modules/plymouth + #../../modules/users/main-user.nix + ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + boot.loader.timeout = 0; + + boot.kernelPackages = pkgs.linuxPackages_zen; + + # boot.plymouth.enable = true; + # boot.plymouth.theme = "nixos-bgrt"; + # boot.plymouth.themePackages = [ + # pkgs.nixos-bgrt-plymouth + # ]; + + programs.nix-ld.enable = true; + # programs.nix-ld.libraries = with pkgs; [ + # # Add any missing dynamic libraries for unpackaged programs + # # here, NOT in environment.systemPackages + # ]; + + boot.consoleLogLevel = 0; + boot.initrd.verbose = false; + boot.kernelParams = [ + "i915.fastboot=1" + "preempt=full" + "quiet" + "splash" + # "boot.shell_on_fail" + "loglevel=3" + # "rd.systemd.show_status=false" + # "rd.udev.log_level=3" + + # "udev.log_priority=3" + ]; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + home-manager = { + extraSpecialArgs = { inherit inputs; }; + users = { + "snorre" = import ./home.nix; + "work" = import ./work-home.nix; + }; + }; + + # fonts.packages = with pkgs; [ + # (nerdfonts.override { + # fonts = [ + # "Devicons"config + # ]; + # }) + # ]; + + programs.localsend.openFirewall = true; + + virtualisation.libvirtd.enable = true; + programs.virt-manager.enable = true; + + programs.steam = { + enable = true; + gamescopeSession.enable = false; + }; + + security.chromiumSuidSandbox.enable = true; # unity3d.enable was only to allow chrome root sandboxxing + programs.adb.enable = true; + + # nixos loves its files. So much that it opens more than 8000 of them at times. Lets increase the limit + # security.pam.loginLimits = [{ + # domain = "*"; + # type = "soft"; + # item = "nofile"; + # value = "65536"; + # }]; + + users.users."snorre" = { + isNormalUser = true; + hashedPassword = "$6$xHtgaWKUglOBLft2$ZUN2p1GgzMJuXMs31SKxBta.8T1V0nXKMyFrq061pBA53dpG7zkWrMweSdC7eEg/fsloH5TO2Ats7MISF5nWL/"; + extraGroups = [ + "networkmanager" + "audio" + "wheel" + "adbusers" + "libvirtd" + ]; + + openssh.authorizedKeys.keyFiles = [ + ./ssh/authorized_keys_snorre + ]; + + shell = pkgs.zsh; + + }; + + users.users."work" = { + isNormalUser = true; + hashedPassword = "$6$LcwJW76Ow8rki4NT$sFEMJOp/L452dPjjQR8TOzEOHDb7yfaMwexYw2COCGTJYeb2.ZDrbVTfmabqpEl4EzCds9BEAP.L536yb8Lik0"; + extraGroups = [ + "networkmanager" + "audio" + "wheel" + "adbusers" + "libvirtd" + "docker" + ]; + + shell = pkgs.zsh; + }; + + # Programs to enable + # programs.zsh.enable = true; # Better shell than bash + programs.zsh = { + enable = true; + # This prevents cache invalidation when also managing zsh from home-manager, + # leading to faster startup times + enableGlobalCompInit = false; + }; + programs.hyprland = { + # Hyprland desktop environment + enable = true; + portalPackage = pkgs.xdg-desktop-portal-hyprland; + }; + + programs.ssh.startAgent = true; # ssh-agent for interacting with github + # security.chromiumSuidSandbox.enable = true; # unity3d.enable was only to allow chrome root sandboxxing + # programs.noisetorch.enable = true; # Noisetorch because discord krisp doesnt work + + # Fuck nano, all my homies hate nano + programs.nano.enable = false; + + # I want my steams and other non-libre software + nixpkgs.config.allowUnfree = true; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + wget + curl + git + # ranger + + # libsecret manager + # pass-secret-service + keepassxc + libsecret + + # ((drv: pkgs.symlinkJoin { + # name = drv.name; + # paths = [ drv ]; + # postBuild = "rm -rf $out/share/applications"; + # }) pkgs.neovim) + + neovim + + # graphics + mesa + + # Notifications + libnotify + + # For enabling and styling QT + libsForQt5.qtstyleplugin-kvantum + libsForQt5.qt5ct + catppuccin-kvantum + + # Gnome keyring makes it so we dont have to keep logging into programs + gnome-keyring + # Ui for when programs want sudo + polkit-kde-agent + ]; + + programs.gamemode = { + enable = true; + enableRenice = true; + + settings = { + general = { + renice = 3; + }; + + custom = { + # start = "${pkgs.libnotify}/bin/notify-send 'GameMode started'"; + # end = "${pkgs.libnotify}/bin/notify-send 'GameMode ended'"; + + start = + let + script = pkgs.writeScriptBin "gamemode_start.sh" '' + ${pkgs.libnotify}/bin/notify-send "GameMode started" + ${pkgs.libnotify}/bin/notify-send "user is: $USER" + /home/$USER/.nix-profile/bin/hyprctl keyword input:touchpad:disable_while_typing false + ''; + in + "${script}/bin/gamemode_start.sh"; + + end = + let + script = pkgs.writeScriptBin "gamemode_end.sh" '' + ${pkgs.libnotify}/bin/notify-send "GameMode end" + /home/$USER/.nix-profile/bin/hyprctl keyword input:touchpad:disable_while_typing true + ''; + in + "${script}/bin/gamemode_end.sh"; + }; + }; + }; + + # Session variables for qt and hyprland + environment.sessionVariables = { + XDG_CURRENT_DESKTOP = "Hyprland"; + XDG_SESSION_DESKTOP = "Hyprland"; + XDG_SESSION_TYPE = "wayland"; + GDK_BACKEND = "wayland"; + GTK_USE_PORTAL = "1"; + QT_QPA_PLATFORMTHEME = "qt5ct"; + QT_QPA_PLATFORM = "wayland"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + QT_AUTO_SCREEN_SCALE_FACTOR = "0"; + MOZ_ENABLE_WAYLAND = "1"; + # SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent"; + }; + + xdg.portal = { + enable = true; + wlr.enable = true; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + (pkgs.callPackage ../../modules/portals/xdg-desktop-portal-termfilechooser.nix { }) + ]; + # xdgOpenUsePortal = true; + }; + + qt = { + enable = true; + platformTheme = "qt5ct"; + }; + + + # Delete old entries to + nix = { + gc = { + automatic = true; + options = "--delete-older-than 30d"; + }; + }; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-material-dark-soft.yaml"; + stylix.autoEnable = true; + stylix.polarity = "dark"; + + # stylix.cursor.package = ( pkgs.callPackage ../../modules/stylix/cursors/posy-improved {} ); + # stylix.cursor.name = "Posy_Cursor"; + + stylix.cursor.package = pkgs.bibata-cursors; + stylix.cursor.name = "Bibata-Modern-Ice"; + stylix.cursor.size = 24; + + stylix.image = ./nixos-wallpaper.png; + + networking.hostName = "laptop"; # Define your hostname. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + networking.networkmanager.wifi.powersave = true; + networking.firewall = { + enable = true; + allowedTCPPorts = [ 8000 ]; + allowedUDPPortRanges = [ + { from = 8000; to = 8010; } + ]; + }; + + # Fuck off, i wanna boot + systemd.services."NetworkManager-wait-online".enable = false; + + # Set your time zone. + time.timeZone = "Europe/Copenhagen"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + keyMap = "dk"; + }; + + # Remove message when running commands as sudo + security.sudo = { + enable = true; + extraConfig = '' + Defaults lecture = never + ''; + }; + + services.blueman = { + enable = true; + }; + + virtualisation.docker = { + enable = true; + storageDriver = "btrfs"; + }; + + hardware.bluetooth.enable = true; + hardware.bluetooth.powerOnBoot = false; + hardware.bluetooth.settings = { + General = { + Experimental = true; + }; + }; + + hardware.graphics = { + enable = true; + extraPackages = with pkgs; [ + intel-media-driver # LIBVA_DRIVER_NAME=iHD + intel-vaapi-driver # LIBVA_DRIVER_NAME=i965 (older but works better for Firefox/Chromium) + libvdpau-va-gl + ]; + }; + + services.pipewire = { + enable = true; + audio.enable = true; + alsa.enable = true; + pulse.enable = true; + wireplumber.enable = true; + }; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + programs.mtr.enable = true; + programs.gnupg.agent = { + enable = true; + # enableSSHSupport = true; + }; + + # services.power-profiles-daemon = { + # enable = true; + # }; + services.auto-cpufreq = { + enable = true; + settings = { + charger = { + governor = "performance"; + turbo = "auto"; + }; + + battery = { + governor = "powersave"; + energy_performance_preference = "power"; + turbo = "never"; + scaling_max_freq = 1000000; + }; + + }; + }; + + services.thermald.enable = true; + + services.openssh = { + enable = true; + settings = { + # Require public key authentication + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + AllowUsers = null; + PermitRootLogin = "no"; + }; + }; + + # Minimal TUI displaymanager for loggin in and launching hyprland + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland"; + user = "snorre"; + }; + + # First session auto starts hyprland + initial_session = { + command = "${pkgs.hyprland}/bin/Hyprland"; + user = "snorre"; + }; + }; + }; + + # hardware.opengl.driSupport = true; # This is already enabled by default + # hardware.opengl.driSupport32Bit = true; # For 32 bit applications + + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "23.11"; # Did you read the comment? + +} + diff --git a/hosts/laptop/hardware-configuration.nix b/hosts/laptop/hardware-configuration.nix new file mode 100755 index 0000000..9cb6923 --- /dev/null +++ b/hosts/laptop/hardware-configuration.nix @@ -0,0 +1,26 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp2s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/laptop/home.nix b/hosts/laptop/home.nix new file mode 100755 index 0000000..88be01c --- /dev/null +++ b/hosts/laptop/home.nix @@ -0,0 +1,124 @@ +{ pkgs, inputs, ... }: + +{ + imports = [ + # inputs.impermanence.nixosModules.home-manager.impermanence + + ../../modules/stylix/home + ../../modules/editors/nixvim + ../../modules/shells/zsh.nix + + ../../modules/programs/dunst.nix + ../../modules/programs/waybar + ../../modules/programs/hyprpaper.nix + ../../modules/programs/tofi.nix + ../../modules/programs/alacritty.nix + # ../../modules/programs/firefox.nix + ../../modules/programs/tmux.nix + + (import ../../modules/window-managers/hyprland { monitors = ["eDP-1, 1920x1080@60, auto, 1"]; }) + ../../modules/window-managers/hyprland/hyprlock.nix + ../../modules/window-managers/hyprland/hypridle.nix + + # (import ../../modules/disko/impermanence-home.nix { + # extraDirectories = [ + # ".jump" + # + # ".mozilla" + # ".zen" + # + # ".config/vesktop" + # ".config/zsh" + # + # ".cache/mozilla" + # ".cache/zen" + # ".cache/nvidia" + # ".cache/nix" + # ".cache/obexd" + # ".factorio" + # ".local/share/Steam" + # ]; + # extraFiles = [ ]; + # + # username = "snorre"; + # nixIndexEnabled = true; + # }) + ]; + + home.username = "snorre"; + home.homeDirectory = "/home/snorre"; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-material-dark-soft.yaml"; + stylix.polarity = "dark"; + stylix.image = ./nixos-wallpaper.png; + stylix.autoEnable = true; + stylix.targets.alacritty.enable = true; + # hyprpaper.wallpaper = ./nixos-wallpaper.png; + + nixpkgs.config.allowUnfree = true; + + home.packages = + let + tex = (pkgs.texlive.combine { + inherit (pkgs.texlive) scheme-medium + titling + biblatex hyperref amsmath tcolorbox environ + ; + }); + in + (with pkgs; [ + file + nixpkgs-fmt + ripgrep + jump + wl-clipboard + hyprpaper + hyprpicker + grimblast + tofi + brightnessctl + # Required for waybar to work + playerctl + wl-clipboard + + localsend + + ipe + texlivePackages.latex + texlivePackages.luatex + zathura + tex + biber + + inputs.zen-browser.packages."${system}".default + + spotify + vesktop + sublime-merge + ]); + + programs.btop.enable = true; + programs.mangohud.enable = true; + + # programs.nix-index = { + # enable = true; + # enableZshIntegration = true; + # }; + + zsh.jump.enable = true; + zsh.jump.show-destination = true; + # Since zsh is the login shell it overrides $HOME/.zsh_history before impermanence can restore the old version. + # Therefore we simply store the history directly in /persist + zsh.histFile = "/persist/system/home/snorre/.zsh_history"; + + # Let home-manager manage itself + programs.home-manager.enable = true; + + home.sessionVariables = { + EDITOR = "nvim"; + # NIX_AUTO_RUN = "1"; # Automatically run non-installed commands if possible + # NIX_BUILD_SHELL = "zsh"; + }; + + home.stateVersion = "23.11"; +} diff --git a/hosts/laptop/nixos-wallpaper.png b/hosts/laptop/nixos-wallpaper.png new file mode 100755 index 0000000..f4cccc0 Binary files /dev/null and b/hosts/laptop/nixos-wallpaper.png differ diff --git a/hosts/laptop/persist-work.nix b/hosts/laptop/persist-work.nix new file mode 100644 index 0000000..67d7932 --- /dev/null +++ b/hosts/laptop/persist-work.nix @@ -0,0 +1,33 @@ +{ + directories = [ + ### DEFAULT BEGIN ### + "Documents" + "Music" + "Pictures" + "Videos" + ".gnupg" + ".ssh" + ".local" + ".cache/mesa_shader_cache" + ".cache/mesa_shader_cache_db" + #### DEFAULT END #### + + ".jump" + + ".mozilla" + ".zen" + + ".config/vesktop" + ".config/zsh" + + ".cache/mozilla" + ".cache/zen" + ".cache/nvidia" + ".cache/nix" + ".cache/obexd" + ]; + files = [ + ".zsh_history" + ".gitconfig" + ]; +} diff --git a/hosts/laptop/persist.nix b/hosts/laptop/persist.nix new file mode 100644 index 0000000..f71f3da --- /dev/null +++ b/hosts/laptop/persist.nix @@ -0,0 +1,35 @@ +{ + directories = [ + ### DEFAULT BEGIN ### + "Documents" + "Music" + "Pictures" + "Videos" + ".gnupg" + ".ssh" + ".local" + ".cache/mesa_shader_cache" + ".cache/mesa_shader_cache_db" + #### DEFAULT END #### + + ".jump" + + ".mozilla" + ".zen" + + ".config/vesktop" + ".config/zsh" + + ".cache/mozilla" + ".cache/zen" + ".cache/nvidia" + ".cache/nix" + ".cache/obexd" + ".factorio" + ".local/share/Steam" + ]; + files = [ + ".zsh_history" + ".gitconfig" + ]; +} diff --git a/hosts/laptop/ssh/authorized_keys_snorre b/hosts/laptop/ssh/authorized_keys_snorre new file mode 100755 index 0000000..844788d --- /dev/null +++ b/hosts/laptop/ssh/authorized_keys_snorre @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJjfAFx5C/+96wtYHve/wY9SNCdx0E/pQIgeP9EcJEjx snorre@archlinux diff --git a/hosts/laptop/work-home.nix b/hosts/laptop/work-home.nix new file mode 100755 index 0000000..5bc6e64 --- /dev/null +++ b/hosts/laptop/work-home.nix @@ -0,0 +1,141 @@ +{ config, pkgs, inputs, ... }: + +{ + imports = [ + inputs.impermanence.nixosModules.home-manager.impermanence + + ../../modules/stylix/home + ../../modules/editors/nixvim + ../../modules/shells/zsh.nix + + ../../modules/programs/dunst.nix + ../../modules/programs/waybar + ../../modules/programs/hyprpaper.nix + + ../../modules/programs/tofi.nix + ../../modules/programs/alacritty.nix + ../../modules/programs/tmux.nix + # ../../modules/programs/firefox.nix + + ../../modules/window-managers/hyprland + ../../modules/window-managers/hyprland/hyprlock.nix + ../../modules/window-managers/hyprland/hypridle.nix + + # (import ../../modules/disko/impermanence-home.nix { + # extraDirectories = [ + # ".jump" + # ".android" + # ".mozilla" + # ".zen" + # + # ".config/zsh" + # ".config/unity3d" + # + # # Required for android studio to not reset every time i reboot + # ".config/Google" + # ".cache/Google" + # + # ".cache/mozilla" + # ".cache/nvidia" + # ".cache/nix" + # ".cache/zen" + # { + # directory = ".gradle"; + # method = "symlink"; + # } + # { + # directory = "Android"; + # method = "symlink"; + # } + # ]; + # extraFiles = [ + # ]; + # + # username = "work"; + # nixIndexEnabled = true; + # }) + ]; + + home.username = "work"; + home.homeDirectory = "/home/work"; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-material-dark-soft.yaml"; + stylix.polarity = "dark"; + + stylix.image = ./nixos-wallpaper.png; + hyprpaper.wallpaper = ./nixos-wallpaper.png; + + nixpkgs.config.allowUnfree = true; + + # Man, i love unity workarounds in my system config + # nixpkgs.config.permittedInsecurePackages = [ + # "openssl-1.1.1w" + # ]; + + home.packages = with pkgs; [ + file + nixpkgs-fmt + ripgrep + jump + hyprpaper + wl-clipboard + grimblast + tofi + # Required for waybar to work + playerctl + + zoom-us + + # (unityhub.override { + # extraLibs = pkgs: with pkgs; [ + # openssl_1_1 # Unity doesnt like secure versions of openssl + # ]; + # }) + # Vscode is neccesary ~for~ _to make_ unity to generate .csproj files + # vscode + # + inputs.zen-browser.packages."${system}".default + + sublime-merge + # android-studio + slack + spotify + ]; + + stylix.targets.alacritty.enable = true; + + programs.btop.enable = true; + programs.mangohud.enable = true; + + zsh.jump.enable = true; + zsh.jump.show-destination = true; + # zsh.histFile = "/persist/home/work/.zsh_history"; + + # xdg.desktopEntries = { + # unityhub = { + # name = "Unity Hub"; + # genericName = "Game Engine"; + # exec = builtins.toString (pkgs.writeShellScript "start_unity_hub.sh" '' + # #! /usr/bin/env nix-shell + # #! nix-shell -i bash -p vscode + # ${pkgs.unityhub}/opt/unityhub/unityhub %U + # ''); + # terminal = false; + # type = "Application"; + # categories = [ "Development" ]; + # icon = "unityhub"; + # # tryExec = "unityhub"; + # mimeType = [ "x-scheme-handler/unityhub" ]; + # }; + # }; + + # Let home-manager manage itself + programs.home-manager.enable = true; + + home.sessionVariables = { + EDITOR = "nvim"; + # NIX_AUTO_RUN = "1"; # Automatically run non-installed commands if possible + }; + + home.stateVersion = "23.11"; +} diff --git a/hosts/nixos-vm/configuration.nix b/hosts/nixos-vm/configuration.nix new file mode 100755 index 0000000..4253ce2 --- /dev/null +++ b/hosts/nixos-vm/configuration.nix @@ -0,0 +1,184 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +{ config, lib, pkgs, inputs, ... }: + +{ + imports = + [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + #../../modules/users/main-user.nix + ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + boot.initrd.postDeviceCommands = lib.mkAfter '' + # Prepare temporary folder + mkdir /btrfs_tmp + + # Open encrypted partition + cryptsetup luksOpen /dev/vda3 crypted + + # Mount unencrypted partition in temp folder + mount /dev/mapper/crypted /btrfs_tmp + + # Check if root subvolume exists in partition + if [[ -e /btrfs_tmp/root ]]; then + # If a folder for old roots doesnt exist we create one + mkdir -p /btrfs_tmp/old_roots + # Get timestamp for naming roots + timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") + # Move old root into folder + mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" + fi + + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "btrfs_tmp/$i" + done + btrfs subvolume delete "$1" + } + + # Delete old roots older than 30 days + for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done + + # Create new root + btrfs subvolume create /btrfs_tmp/root + umount /btrfs_tmp + ''; + + # Dont nuke all the files. We wanna keep something + fileSystems."/persist".neededForBoot = true; + environment.persistence."/persist/system" = { + hideMounts = true; + directories = [ + "/etc/nixos" + "/var/log" + "/var/lib/bluetooth" + "/var/lib/nixos" + "/var/lib/systemd/coredump" + "/etc/NetworkManager/system-connections" + { directory = "/var/lib/colord"; user = "colord"; group = "colord"; mode = "u=rwx, g=rx, o="; } + ]; + files = [ + "/etc/machine-id" + "/etc/ssh/ssh_host_rsa_key" + "/etc/ssh/ssh_host_ed25519_key" + "/etc/ssh/ssh_host_rsa_key.pub" + "/etc/ssh/ssh_host_ed25519_key.pub" + ]; + }; + + programs.fuse.userAllowOther = true; + + home-manager = { + extraSpecialArgs = { inherit inputs; }; + users = { + "snorre" = import ./home.nix; + }; + }; + + users.users."snorre" = + { + isNormalUser = true; + initialPassword = "1234"; + extraGroups = [ + "networkmanager" + "audio" + "wheel" + ]; + + shell = pkgs.zsh; + }; + + # Programs to enable + programs.zsh.enable = true; # Better shell than bash + + # Fuck nano, all my homies hate nano + programs.nano.enable = false; + + # Delete old entries to + nix = { + gc = { + automatic = true; + options = "--delete-older-than 7d"; + }; + }; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/eighties.yaml"; + stylix.autoEnable = true; + stylix.polarity = "dark"; + + stylix.cursor.package = pkgs.bibata-cursors; + stylix.cursor.name = "Bibata-Modern-Ice"; + stylix.cursor.size = 24; + + networking.hostName = "nixos-vm"; # Define your hostname. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Set your time zone. + time.timeZone = "Europe/Copenhagen"; + + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + console = { + keyMap = "dk"; + }; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + wget + curl + git + + neovim + ]; + + # Remove message when running commands as sudo + security.sudo = { + enable = true; + extraConfig = '' + Defaults lecture = never + ''; + }; + + services.openssh = { + enable = true; + settings = { + PasswordAuthentication = true; + AllowUsers = null; + PermitRootLogin = "no"; + }; + }; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "23.11"; # Did you read the comment? + +} + diff --git a/hosts/nixos-vm/disko-luks.nix b/hosts/nixos-vm/disko-luks.nix new file mode 100755 index 0000000..9a70f41 --- /dev/null +++ b/hosts/nixos-vm/disko-luks.nix @@ -0,0 +1,72 @@ +{ device ? throw "Set this to your disk device, e.g. /dev/sda" +, ... +}: { + disko.devices = { + disk = { + main = { + inherit device; + type = "disk"; + content = { + type = "gpt"; + partitions = { + ESP = { + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ + "defaults" + ]; + }; + }; + + swap = { + size = "8G"; + content = { + type = "swap"; + resumeDevice = true; + }; + }; + + # Fill until 8gb are left + luks = { + size = "100%"; + content = { + type = "luks"; + name = "crypted"; + # disable settings.keyFile if you want to use interactive password entry + passwordFile = null; # Interactive + settings = { + allowDiscards = true; + keyFile = null; + }; + # additionalKeyFiles = [ "/tmp/additionalSecret.key" ]; + content = { + type = "btrfs"; + extraArgs = [ "-f" ]; + subvolumes = { + "/root" = { + mountpoint = "/"; + mountOptions = [ "compress=zstd" "noatime" ]; + }; + "/persist" = { + mountpoint = "/persist"; + mountOptions = [ "subvol=persist" "compress=zstd" "noatime" ]; + }; + "/nix" = { + mountpoint = "/nix"; + mountOptions = [ "subvol=nix" "compress=zstd" "noatime" ]; + }; + }; + }; + }; + }; + + }; + }; + }; + }; + }; +} diff --git a/hosts/nixos-vm/hardware-configuration.nix b/hosts/nixos-vm/hardware-configuration.nix new file mode 100755 index 0000000..29852de --- /dev/null +++ b/hosts/nixos-vm/hardware-configuration.nix @@ -0,0 +1,25 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ + (modulesPath + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp1s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/hosts/nixos-vm/home.nix b/hosts/nixos-vm/home.nix new file mode 100755 index 0000000..cd99561 --- /dev/null +++ b/hosts/nixos-vm/home.nix @@ -0,0 +1,57 @@ +{ config, pkgs, inputs, ... }: + +{ + imports = [ + inputs.impermanence.nixosModules.home-manager.impermanence + + ../../modules/editors/nixvim + ../../modules/shells/zsh.nix + ]; + + home.username = "snorre"; + home.homeDirectory = "/home/snorre"; + + home.packages = with pkgs; [ + file + nixpkgs-fmt + jump + ]; + + zsh.jump.enable = true; + zsh.jump.show-destination = true; + + # Let home-manager manage itself + programs.home-manager.enable = true; + + home.sessionVariables = { + EDITOR = "nvim"; + }; + + home.stateVersion = "23.11"; + + home.persistence."/persist/home" = { + directories = [ + "Downloads" + "Music" + "Pictures" + "Documents" + "Videos" + ".gnupg" + ".ssh" + ".local" + ".jump" + { + directory = ".factorio"; + method = "symlink"; + } + { + directory = ".local/share/Steam"; + method = "symlink"; + } + ]; + files = [ + ".gitconfig" + ]; + allowOther = true; + }; +} diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..cf474d0 --- /dev/null +++ b/install.sh @@ -0,0 +1,49 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p git + +if [ "$#" -ne 3 ]; then + cat << EOF +usage: sudo ./install.sh +EOF +exit +fi + +# Download disko config +curl https://gitlab.com/SpoodyTheOne/nixos-config/-/raw/master/modules/disko/disko-luks.nix -o /tmp/disko.nix +curl https://gitlab.com/SpoodyTheOne/nixos-config/-/raw/master/modules/disko/disko-btrfs-impermanence.nix -o /tmp/disko-btrfs-impermanence.nix + +echo "During partitioning you will be asked for a password. This password is used when booting. It will be asked for twice" +sudo nix --experimental-features "nix-command flakes" \ +run github:nix-community/disko -- \ +--mode disko /tmp/disko.nix \ +--arg device "\"$1\"" \ +--arg swap-size "\"$2\"" +--arg swap-size "\"$3\"" + +sudo nixos-generate-config --no-filesystems --root /mnt +sudo mv /mnt/etc/nixos/hardware-configuration.nix /tmp # Move configuration away +sudo rm -rf /mnt/etc/nixos # Nuke config folder so we can clone +sudo git clone https://gitlab.com/SpoodyTheOne/nixos-config.git /mnt/etc/nixos # Clone config + +# Move hardware configuration +sudo mv /tmp/hardware-configuration.nix /mnt/etc/nixos/hosts/bootstrap +# go to /etc/nixos +cd /mnt/etc/nixos +# Add hardware configuration to git for nix to recognize it +sudo git add . + +echo -n +echo -e "\x1b[33mYou will now be placed in vim, Please edit the bootstrap config to match the arguments given to the script\x1b[37m" +sleep 5 + +sudo vim /mnt/etc/nixos/flake.nix +63 + +echo -n +echo -e "\x1b[31mThe system will install in 5 seconds. If you think you misconfigured flake.nix please press ctrl-c now to cancel\x1b[37m" +sleep 5 + +# Copy configuration to permanent storage so its not nuked on reboot +sudo cp -r /mnt/etc/nixos /mnt/persist +sudo nixos-install --root /mnt --flake /mnt/etc/nixos#bootstrap + +echo -e "\x1b[32mIf no errors occured please reboot and follow the 'After reboot' section at https://gitlab.com/SpoodyTheOne/nixos-config"; diff --git a/modules/disko/delete-on-boot.nix b/modules/disko/delete-on-boot.nix new file mode 100755 index 0000000..7c41799 --- /dev/null +++ b/modules/disko/delete-on-boot.nix @@ -0,0 +1,80 @@ +{ lib +, persistExtraDirectories +, persistExtraFiles +, users ? {} +, extraConfig ? {} +, ... +}: + +{ + boot.initrd.postDeviceCommands = lib.mkAfter '' + # Prepare temporary folder + mkdir /btrfs_tmp + + # Open encrypted partition + # cryptsetup luksOpen /dev/sda3 crypted + + # Mount unencrypted partition in temp folder + mount /dev/mapper/crypted /btrfs_tmp + + # Check if root subvolume exists in partition + if [[ -e /btrfs_tmp/root ]]; then + # If a folder for old roots doesnt exist we create one + mkdir -p /btrfs_tmp/old_roots + # Get timestamp for naming roots + timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") + # Move old root into folder + mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" + fi + + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "btrfs_tmp/$i" + done + btrfs subvolume delete "$1" + } + + # Delete old roots older than 30 days + for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done + + # Create new root + btrfs subvolume create /btrfs_tmp/root + umount /btrfs_tmp + ''; + + # Dont nuke all the files. We wanna keep something + fileSystems."/persist".neededForBoot = true; + environment.persistence."/persist/system" = { + hideMounts = true; + directories = [ + "/etc/nixos" + "/var/log" + "/var/lib/bluetooth" + "/var/lib/nixos" + "/var/lib/systemd/coredump" + "/etc/NetworkManager/system-connections" + { directory = "/var/lib/colord"; user = "colord"; group = "colord"; mode = "u=rwx, g=rx, o="; } + ] ++ (if (persistExtraDirectories == null) then [ ] else persistExtraDirectories); + + files = [ + "/etc/machine-id" + "/etc/ssh/ssh_host_rsa_key" + "/etc/ssh/ssh_host_ed25519_key" + "/etc/ssh/ssh_host_rsa_key.pub" + "/etc/ssh/ssh_host_ed25519_key.pub" + ] ++ (if (persistExtraFiles == null) then [ ] else persistExtraFiles); + + inherit users; + }; + + # environment.etc = { + # "group".source = "/persist/system/etc/group"; + # "passwd".source = "/persist/system/etc/passwd"; + # "shadow".source = "/persist/system/etc/shadow"; + # }; + + programs.fuse.userAllowOther = true; +} diff --git a/modules/disko/disko-btrfs-impermanence.nix b/modules/disko/disko-btrfs-impermanence.nix new file mode 100644 index 0000000..ce16d07 --- /dev/null +++ b/modules/disko/disko-btrfs-impermanence.nix @@ -0,0 +1,18 @@ +{ + type = "btrfs"; + extraArgs = [ "-f" ]; + subvolumes = { + "/root" = { + mountpoint = "/"; + mountOptions = [ "compress=zstd" "noatime" ]; + }; + "/persist" = { + mountpoint = "/persist"; + mountOptions = [ "subvol=persist" "compress=zstd" "noatime" ]; + }; + "/nix" = { + mountpoint = "/nix"; + mountOptions = [ "subvol=nix" "compress=zstd" "noatime" ]; + }; + }; +} diff --git a/modules/disko/disko-luks.nix b/modules/disko/disko-luks.nix new file mode 100755 index 0000000..9b29371 --- /dev/null +++ b/modules/disko/disko-luks.nix @@ -0,0 +1,62 @@ +{ device ? throw "Set this to your disk device, e.g. /dev/sda" +, swap-size ? "0" +, encrypted ? false +, ... +}: { + disko.devices = { + disk = { + main = { + inherit device; + type = "disk"; + content = { + type = "gpt"; + partitions = { + ESP = { + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ + "defaults" + ]; + }; + }; + + swap = if swap-size == "0" then {} else { + size = swap-size; + content = { + type = "swap"; + resumeDevice = true; + }; + }; + + # Fill until 8gb are left + root = if encrypted then { + size = "100%"; + content = { + type = "luks"; + name = "crypted"; + # disable settings.keyFile if you want to use interactive password entry + passwordFile = null; # Interactive + settings = { + allowDiscards = true; + keyFile = null; + }; + # additionalKeyFiles = [ "/tmp/additionalSecret.key" ]; + content = (import ./disko-btrfs-impermanence.nix); + }; + } + else + { + size = "100%"; + content = (import ./disko-btrfs-impermanence.nix); + }; + + }; + }; + }; + }; + }; +} diff --git a/modules/disko/impermanence-home.nix b/modules/disko/impermanence-home.nix new file mode 100755 index 0000000..fa674a5 --- /dev/null +++ b/modules/disko/impermanence-home.nix @@ -0,0 +1,31 @@ +{ extraDirectories +, extraFiles +, username ? throw "need to know the username" +, nixIndexEnabled ? false +, ... +}: + +{ + home.persistence."/persist/home/${username}" = { + directories = [ + # "Downloads" # no. + "Documents" + "Music" + "Pictures" + "Videos" + ".gnupg" + ".ssh" + ".local" + ".cache/mesa_shader_cache" + ".cache/mesa_shader_cache_db" + # TODO: Move this shit into work user + ] ++ (if (extraDirectories == null) then [ ] else extraDirectories); + files = [ + ".gitconfig" + # ".zsh_history" + ] ++ (if (extraFiles == null) then [ ] else extraFiles) + # ++ (if nixIndexEnabled then [ ".cache/nix-index" ] else []) + ; + allowOther = true; + }; +} diff --git a/modules/drivers/nvidia.nix b/modules/drivers/nvidia.nix new file mode 100755 index 0000000..1941e73 --- /dev/null +++ b/modules/drivers/nvidia.nix @@ -0,0 +1,63 @@ +{ config, pkgs, lib, ... }: + +{ + nixpkgs.config.nvidia.acceptLicense = true; + services.xserver.videoDrivers = [ "nvidia" ]; + + boot.kernelParams = [ "nvidia.NVreg_PreserveVideoMemoryAllocations=1" ]; + + hardware.graphics = { + enable = true; + enable32Bit = true; + extraPackages = with pkgs; [ + nvidia-vaapi-driver + ]; + }; + + hardware.nvidia = { + + package = config.boot.kernelPackages.nvidiaPackages.stable; + modesetting.enable = true; + open = false; + nvidiaSettings = true; + dynamicBoost.enable = false; + + powerManagement = { + enable = true; + finegrained = false; + }; + + prime = { + sync.enable = true; + intelBusId = "PCI:0:2:0"; + nvidiaBusId = "PCI:1:0:0"; + + # offload = { + # enable = true; + # enableOffloadCmd = true; + # }; + }; + }; + + specialisation = { + Battery.configuration = { + system.nixos.tags = [ "Battery" ]; + boot.extraModprobeConfig = '' + blacklist nouveau + options nouveau modeset=0 + ''; + + services.udev.extraRules = ''s + # Remove NVIDIA USB xHCI Host Controller devices, if present + ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1" + # Remove NVIDIA USB Type-C UCSI devices, if present + ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1" + # Remove NVIDIA Audio devices, if present + ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1" + # Remove NVIDIA VGA/3D controller devices + ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1" +''; + boot.blacklistedKernelModules = [ "nouveau" "nvidia" "nvidia_drm" "nvidia_modeset" ]; + }; + }; +} diff --git a/modules/editors/nixvim/default.nix b/modules/editors/nixvim/default.nix new file mode 100755 index 0000000..9ee75f7 --- /dev/null +++ b/modules/editors/nixvim/default.nix @@ -0,0 +1,39 @@ +{ config, pkgs, lib, inputs, ... }: + +{ + imports = [ + inputs.nixvim.homeManagerModules.default + + ./plugins/lualine.nix + ./plugins/undotree.nix + ./plugins/telescope.nix + ./plugins/lsp.nix + ./plugins/lsp-lines.nix + ./plugins/cmp.nix + ./plugins/wilder.nix + ./plugins/nvim-ts-comment-context.nix + ./plugins/treesitter.nix + ./plugins/vimtex.nix + # ./plugins/neorg.nix + # ./plugins/image.nix + # ./plugins/treesitter.nix + ./plugins/which-key.nix + + ./syntax/fsharp.nix + + ./extra.nix + ./options.nix + ./keymaps.nix + ]; + + programs.nixvim = { + enable = true; + + # opts.performance.byteCompileLua = { + # enable = true; + # plugins = true; + # }; + + # colorschemes.nord.enable = true; + }; +} diff --git a/modules/editors/nixvim/extra.nix b/modules/editors/nixvim/extra.nix new file mode 100755 index 0000000..d00900d --- /dev/null +++ b/modules/editors/nixvim/extra.nix @@ -0,0 +1,70 @@ +{ config, pkgs, lib, ... }: +{ + programs.nixvim.extraConfigLua = lib.strings.concatLines ([ + '' + vim.cmd([[ + augroup highlight_yank + autocmd! + au TextYankPost * silent! lua vim.highlight.on_yank{higroup="IncSearch", timeout=100} + augroup END + ]]) + + '' + ] + ); + + programs.nixvim.extraPlugins = [ + # actions-preview.nvim + (pkgs.vimUtils.buildVimPlugin { + name = "actions-preview.nvim"; + src = pkgs.fetchFromGitHub { + owner = "aznhe21"; + repo = "actions-preview.nvim"; + rev = "9f52a01c374318e91337697ebed51c6fae57f8a4"; + hash = "sha256-lYjsv8y1fMuTGpBF/iG7cm/a7tLdh748vJhVsSp/Iz8="; + }; + }) + + # (pkgs.vimUtils.buildVimPlugin { + # name = "fsharp-vim"; + # src = pkgs.fetchFromGitHub { + # owner = "DrTom"; + # repo = "fsharp-vim"; + # rev = "81f51e7155c3df0f56e48b894aba8cb65a9cc04b"; + # hash = "sha256-cSsUVG3MbjGD6bheZ+k1bxkDx0fZ17kbKqgBNywOaZc="; + # }; + # }) + + # fsharp-language-server + # (pkgs.vimUtils.buildVimPlugin { + # name = "fsharp-language-server"; + # src = pkgs.fetchFromGitHub { + # owner = "fsprojects"; + # repo = "fsharp-language-server"; + # rev = "471439c562c484f2fe57adfd54485e7c1ee4ca29"; + # hash = ""; + # }; + # }) + + ] + ++ + ( + if config.programs.nixvim.plugins.neorg.enable + then [ + (pkgs.vimUtils.buildVimPlugin { + inherit (pkgs.luaPackages.lua-utils-nvim) pname version src; + }) + + (pkgs.vimUtils.buildVimPlugin { + inherit (pkgs.luaPackages.pathlib-nvim) pname version src; + }) + + (pkgs.vimUtils.buildVimPlugin { + inherit (pkgs.luaPackages.nvim-nio) pname version src; + }) + ] + else [ ] + ) + ; + +} diff --git a/modules/editors/nixvim/keymaps.nix b/modules/editors/nixvim/keymaps.nix new file mode 100755 index 0000000..5e23869 --- /dev/null +++ b/modules/editors/nixvim/keymaps.nix @@ -0,0 +1,75 @@ +{ ... }: +{ + programs.nixvim.globals.mapleader = " "; + programs.nixvim.globals.maplocalleader = ","; + + programs.nixvim.keymaps = [ + { + key = "gl"; + action = "lua vim.diagnostic.open_float()"; + } + { + key = "u"; + action = "UndotreeToggle"; + } + { + key = "f"; + action = "Telescope fd"; + } + { + key = "g"; + action = "Telescope live_grep"; + } + { + key = "D"; + action = "Telescope diagnostics"; + } + { + key = "b"; + action = "Telescope buffers"; + } + { + key = "s"; + action = "Telescope lsp_document_symbols"; + } + { + key = "w"; + action = ""; + } + { + # Unbind F1 + key = ""; + action = ""; + } + ]; + + programs.nixvim.autoCmd = [ + { + desc = "LSP Actions"; + event = "LspAttach"; + callback = { + __raw = '' + function(event) + local opts = { buffer = event.buf } + + -- these will be buffer-local keybindings + -- because they only work if you have an active language server + + vim.keymap.set('n', 'K', 'lua vim.lsp.buf.hover()', opts) + vim.keymap.set('n', 'gd', 'Telescope lsp_definitions', opts) + vim.keymap.set('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) + vim.keymap.set('n', 'gi', 'Telescope lsp_implementations', opts) + vim.keymap.set('n', 'go', 'Telescope lsp_type_definitions', opts) + vim.keymap.set('n', 'gr', 'Telescope lsp_references', opts) + vim.keymap.set('n', 'gs', 'lua vim.lsp.buf.signature_help()', opts) + vim.keymap.set('n', 'r', 'lua vim.lsp.buf.rename()', opts) + vim.keymap.set({ 'n', 'x' }, '', 'lua vim.lsp.buf.format({async = true})', opts) + -- vim.keymap.set('n', 'a', 'lua vim.lsp.buf.code_action()', opts) + vim.keymap.set("n", "a", require("actions-preview").code_actions, opts) + vim.keymap.set("n", "gh", "ClangdSwitchSourceHeader", opts) + end + ''; + }; + } + ]; +} diff --git a/modules/editors/nixvim/options.nix b/modules/editors/nixvim/options.nix new file mode 100755 index 0000000..671b033 --- /dev/null +++ b/modules/editors/nixvim/options.nix @@ -0,0 +1,23 @@ +{ ... }: +{ + programs.nixvim.opts = { + number = true; + relativenumber = true; + nuw = 1; + scrolloff = 8; + signcolumn = "yes"; + termguicolors = true; + + # undodir = lib.concatStrings [ xdg.stateHome "nvim/undodir" ]; + undofile = true; + + ignorecase = true; + smartcase = true; + cmdheight = 1; + smarttab = true; + expandtab = true; + shiftwidth = 2; + tabstop = 2; + softtabstop = 2; + }; +} diff --git a/modules/editors/nixvim/plugins/cmp.nix b/modules/editors/nixvim/plugins/cmp.nix new file mode 100755 index 0000000..e62e037 --- /dev/null +++ b/modules/editors/nixvim/plugins/cmp.nix @@ -0,0 +1,69 @@ +{ config, ... }: +{ + # programs.nixvim.plugins.cmp-vsnip.enable = true; + # programs.nixvim.plugins.cmp_luasnip.enable = true; + programs.nixvim.plugins.cmp-nvim-lsp-signature-help.enable = true; + programs.nixvim.plugins.cmp-latex-symbols.enable = true; + programs.nixvim.plugins.cmp-nvim-lsp.enable = true; + + programs.nixvim.plugins.cmp = { + enable = true; + autoEnableSources = true; + settings = { + sources = [ + { name = "nvim_lsp"; } + { name = "path"; } + # { name = "buffer"; } + { name = "nvim_lsp_signature_help"; } + { name = "latex_symbols"; } + { name = "vsnip"; } + ] + ++ + ( + if config.programs.nixvim.plugins.orgmode.enable + then [{ name = "orgmode"; }] + else [ ] + ) + ++ + ( + if config.programs.nixvim.plugins.neorg.enable + then [{ name = "neorg"; }] + else [ ] + ) + ; + + mapping = { + "" = "cmp.mapping.confirm({ select = true })"; + "" = "cmp.mapping.confirm({ select = true })"; + + "" = '' + function(fallback) + if cmp.visible() then + cmp.select_next_item() + else + fallback() + end + end + ''; + + "" = '' + function(fallback) + if cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end + ''; + + "" = "cmp.mapping.complete()"; + }; + + # snippet.expand = '' + # function(args) + # require("luasnip").lsp_expand(args.body) + # end + # ''; + }; + }; +} diff --git a/modules/editors/nixvim/plugins/image.nix b/modules/editors/nixvim/plugins/image.nix new file mode 100755 index 0000000..38d6416 --- /dev/null +++ b/modules/editors/nixvim/plugins/image.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + programs.nixvim.plugins.image = { + enable = true; + backend = "ueberzug"; + }; + + programs.nixvim.plugins.clipboard-image = { + enable = true; + clipboardPackage = pkgs.wl-clipboard; + }; +} diff --git a/modules/editors/nixvim/plugins/lsp-lines.nix b/modules/editors/nixvim/plugins/lsp-lines.nix new file mode 100755 index 0000000..a6de9f0 --- /dev/null +++ b/modules/editors/nixvim/plugins/lsp-lines.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + programs.nixvim.plugins.lsp-lines = { + enable = true; + }; +} diff --git a/modules/editors/nixvim/plugins/lsp.nix b/modules/editors/nixvim/plugins/lsp.nix new file mode 100755 index 0000000..03e0871 --- /dev/null +++ b/modules/editors/nixvim/plugins/lsp.nix @@ -0,0 +1,75 @@ +{ ... }: +{ + programs.nixvim.plugins.zig.enable = true; + programs.nixvim.plugins.lsp = { + enable = true; + servers = { + lua_ls.enable = true; + nil_ls = { + enable = true; + + settings = { + formatting.command = [ "nixpkgs-fmt" ]; + }; + }; + + clangd = { + enable = true; + # package = null; # Install your own clang fucker # actually dont, its aids + cmd = [ "clangd" "--background-index" "--suggest-missing-includes" ]; + }; + + # As much as i hate python, it is useful for CTF and quick scripts + pylsp = { + enable = true; + }; + + zls = { + enable = true; + }; + + ts_ls = { + enable = true; + }; + + rust_analyzer = { + enable = true; + package = null; # Install your own rust + cargoPackage = null; # Install your own rust + installCargo = false; # Install your own rust + rustcPackage = null; # Install your own rust + installRustc = false; # Install your own rust + }; + + # TODO: Create a flake.nix for texlabs so its not installed globally. + texlab = { + enable = true; + }; + + fsautocomplete = { + enable = false; + cmd = [ "fsautocomplete" "--adaptive-lsp-server-enabled" "--verbose" ]; + filetypes = [ "fsharp" "fs" ]; + package = null; # Fuck you too + + # settings = { + # AutomaticWorkspaceInit = true; + # + # callback = { + # __raw = '' + # function() + # print("fsharp lsp") + # end + # ''; + # }; + # }; + }; + + csharp_ls = { + enable = true; + # package = null; # Fuck c#, install it yourself if you need it + }; + + }; + }; +} diff --git a/modules/editors/nixvim/plugins/lualine.nix b/modules/editors/nixvim/plugins/lualine.nix new file mode 100755 index 0000000..ccec838 --- /dev/null +++ b/modules/editors/nixvim/plugins/lualine.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.nixvim.plugins.lualine.enable = true; +} diff --git a/modules/editors/nixvim/plugins/neorg.nix b/modules/editors/nixvim/plugins/neorg.nix new file mode 100755 index 0000000..7062fc9 --- /dev/null +++ b/modules/editors/nixvim/plugins/neorg.nix @@ -0,0 +1,26 @@ +{ ... }: +{ + programs.nixvim.plugins.neorg = { + enable = true; + # lazyLoading = true; + + modules = { + "core.defaults" = { + __empty = null; + }; + + "core.dirman" = { + config = { + workspaces = { + notes = "~/Documents/notes"; + }; + }; + }; + + "core.concealer" = { + __empty = null; + }; + }; + }; + +} diff --git a/modules/editors/nixvim/plugins/nvim-ts-comment-context.nix b/modules/editors/nixvim/plugins/nvim-ts-comment-context.nix new file mode 100755 index 0000000..03d04d4 --- /dev/null +++ b/modules/editors/nixvim/plugins/nvim-ts-comment-context.nix @@ -0,0 +1,6 @@ +{ lib, ... }: + +{ + programs.nixvim.plugins.ts-context-commentstring.enable = true; + programs.nixvim.plugins.comment.enable = true; +} diff --git a/modules/editors/nixvim/plugins/orgmode.nix b/modules/editors/nixvim/plugins/orgmode.nix new file mode 100755 index 0000000..818014b --- /dev/null +++ b/modules/editors/nixvim/plugins/orgmode.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + programs.nixvim.plugins.orgmode = { + enable = true; + settings = { + org_agenda_files = "~/documents/notes/**/*"; + org_default_notes_file = "~/documents/notes/index.org"; + }; + }; +} diff --git a/modules/editors/nixvim/plugins/telescope.nix b/modules/editors/nixvim/plugins/telescope.nix new file mode 100755 index 0000000..5f41182 --- /dev/null +++ b/modules/editors/nixvim/plugins/telescope.nix @@ -0,0 +1,5 @@ +{...}: +{ + programs.nixvim.plugins.telescope.enable = true; + programs.nixvim.plugins.web-devicons.enable = true; +} diff --git a/modules/editors/nixvim/plugins/treesitter.nix b/modules/editors/nixvim/plugins/treesitter.nix new file mode 100755 index 0000000..6d72325 --- /dev/null +++ b/modules/editors/nixvim/plugins/treesitter.nix @@ -0,0 +1,13 @@ +{ ... }: + +{ + programs.nixvim.plugins.treesitter = { + enable = true; + + settings = { + auto_install = false; + }; + }; + + programs.nixvim.plugins.treesitter-textobjects.enable = true; +} diff --git a/modules/editors/nixvim/plugins/undotree.nix b/modules/editors/nixvim/plugins/undotree.nix new file mode 100755 index 0000000..f3ed990 --- /dev/null +++ b/modules/editors/nixvim/plugins/undotree.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.nixvim.plugins.undotree.enable = true; +} diff --git a/modules/editors/nixvim/plugins/vimtex.nix b/modules/editors/nixvim/plugins/vimtex.nix new file mode 100755 index 0000000..9d76c52 --- /dev/null +++ b/modules/editors/nixvim/plugins/vimtex.nix @@ -0,0 +1,12 @@ +{ ... }: +{ + programs.nixvim.plugins.vimtex = { + enable = true; + texlivePackage = null; + settings = { + compiler_method = "luatex"; + view_method = "zathura"; + quickfix_mode = 0; + }; + }; +} diff --git a/modules/editors/nixvim/plugins/which-key.nix b/modules/editors/nixvim/plugins/which-key.nix new file mode 100755 index 0000000..b6ce666 --- /dev/null +++ b/modules/editors/nixvim/plugins/which-key.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.nixvim.plugins.which-key.enable = true; +} diff --git a/modules/editors/nixvim/plugins/wilder.nix b/modules/editors/nixvim/plugins/wilder.nix new file mode 100755 index 0000000..0d76df3 --- /dev/null +++ b/modules/editors/nixvim/plugins/wilder.nix @@ -0,0 +1,22 @@ +{ ... }: +{ + programs.nixvim.plugins.wilder = { + enable = true; + modes = [ ":" "/" "?" ]; + enableCmdlineEnter = true; + acceptKey = ""; + renderer = '' + wilder.popupmenu_renderer( + wilder.popupmenu_border_theme({ + highlights = { + border = 'Normal', -- highlight to use for the border + }, + left = { ' ', wilder.popupmenu_devicons() }, + -- 'single', 'double', 'rounded' or 'solid' + -- can also be a list of 8 characters, see :h wilder#popupmenu_border_theme() for more details + border = 'rounded', + }) + ) + ''; + }; +} diff --git a/modules/editors/nixvim/syntax/fsharp.nix b/modules/editors/nixvim/syntax/fsharp.nix new file mode 100755 index 0000000..6309529 --- /dev/null +++ b/modules/editors/nixvim/syntax/fsharp.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: +{ + xdg.configFile."nvim/syntax/fsharp.vim" = + let + git = pkgs.fetchFromGitHub { + owner = "lulu-berlin"; + repo = "vim-fsharp"; + rev = "1afff075e0a1bcbedcc52881454b99f58ec5bbfc"; + sha256 = "sha256-tpEgCxZubyzz4z+JVep1R6F+mQidw/iAfRMTOF00v6U="; + }; + in + { + source = "${git}/syntax/fsharp.vim"; + }; +} diff --git a/modules/plymouth/blahaj.nix b/modules/plymouth/blahaj.nix new file mode 100755 index 0000000..532add6 --- /dev/null +++ b/modules/plymouth/blahaj.nix @@ -0,0 +1,8 @@ +{pkgs, ...}: +{ + boot.plymouth.enable = true; + boot.plymouth.themePackages = with pkgs; [ + plymouth-blahaj-theme + ]; + boot.plymouth.theme = "blahaj"; +} diff --git a/modules/plymouth/default.nix b/modules/plymouth/default.nix new file mode 100755 index 0000000..84ac053 --- /dev/null +++ b/modules/plymouth/default.nix @@ -0,0 +1,13 @@ +{pkgs, ...}: +{ + boot.plymouth.enable = true; + # boot.plymouth.themePackages = with pkgs; [ + # plymouth-blahaj-theme + # ]; + # boot.plymouth.theme = "blahaj"; + + # boot.plymouth.theme = "plymouth-modern-bgrt"; + # boot.plymouth.themePackages = [ + # (pkgs.callPackage ./modern-bgrt.nix {}) + # ]; +} diff --git a/modules/plymouth/modern-bgrt.nix b/modules/plymouth/modern-bgrt.nix new file mode 100755 index 0000000..973ccb9 --- /dev/null +++ b/modules/plymouth/modern-bgrt.nix @@ -0,0 +1,277 @@ +{ lib +, stdenv +, fetchFromGitHub +, unstableGitUpdater +, pkgs +}: + +stdenv.mkDerivation { + name = "modern-bgrt"; + version = "0-unstable-2023-03-10"; + + src = fetchFromGitHub { + repo = "plymouth-modern-bgrt"; + owner = "glics"; + rev = "a795623409865db39f3a8df2effaeb8b388ca36c"; + hash = "sha256-WslJCrv8LyWBrZuu8xstuafr7piR/QY8L52c+sAk9vU="; + }; + + dontConfigure = true; + dontBuild = true; + + nativeBuildInputs = [ pkgs.imagemagick ]; + + installPhase = '' + runHook preInstall + + # mkdir -p $out/share/plymouth/themes/modern-bgrt + # cp -r $src/theme/{*} $out/share/plymouth/themes/modern-bgrt/ + # substituteInPlace $out/share/plymouth/themes/modern-bgrt/*.plymouth --replace '/usr/share/plymouth/themes/plymouth-modern-bgrt' "$out/share/plymouth/themes/modern-bgrt/images" + # + # substituteInPlace $out/share/plymouth/themes/modern-bgrt/*.plymouth --replace '/usr/share/plymouth/themes/plymouth-modern-bgrt/bgrt.script' "$out/share/plymouth/themes/modern-bgrt/bgrt.script" + + mkdir /tmp/plymouth-theme + cp -r $src/* /tmp/plymouth-theme + + substituteInPlace /tmp/plymouth-theme/install.sh --replace '/usr' "$out" + substituteInPlace /tmp/plymouth-theme/install.sh --replace 'convert /sys/firmware/acpi/bgrt/image theme/bgrt.png' "convert theme/bgrt.jpeg theme/bgrt.png" + substituteInPlace /tmp/plymouth-theme/install.sh --replace '[[ !' "[[" + + substituteInPlace /tmp/plymouth-theme/install.sh --replace 'convert' "${pkgs.imagemagick}/bin/convert" + + echo "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAUFBQUFBQUGBgUICAcICAsKCQkKCxEMDQwNDBEaEBMQ +EBMQGhcbFhUWGxcpIBwcICkvJyUnLzkzMzlHREddXX0BBQUFBQUFBQYGBQgIBwgICwoJCQoLEQwN +DA0MERoQExAQExAaFxsWFRYbFykgHBwgKS8nJScvOTMzOUdER11dff/CABEIAHcDhAMBIgACEQED +EQH/xAAvAAEAAwADAQEBAAAAAAAAAAAABwgJBAUGAwECAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMB +AAIQAxAAAACmQHM7XSYrHO87DOSAtmI5MubWW29UQFVvSEYzr90EAAAB748Cv17UzQaaDMtppRQj +YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuWU0aaVdK2gAAAAmfTHNvSQP5qmWt83l5481+7 +rGiVDUNCc2H8407MY5HEAABy9XM49TR+MwTTn+McBsfmbEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAaM5zaMk/0rupSsp2AAABypMvsR7Y5EJXOqIAAcrQjO30JrvRG7nZGM7Rehh5sBcK5RmV +qDxuScTHLZjhmObYzrzIM1VMqmxlFirjS2YzG9sv05kAd0dL2t6rImUHQbDcEx1XPmozGbGUFK2l +yimrYythQbuLn2nMo/MbG9EZCLQ1pOJ211bRmUfndiOAY7LmU2P4AehvEUS9pqLyTJjx2zHgTKVP +EDhaa8xjm1qyeOMD78m3NzzHPh6j5cABoBYwxzWzqYEr3oM5fUalfpkJ0WykImbL33gQX4KDtjKl +lJ1/7DGPTZcY0aM0muyT/Su6lKynYCwGgRj62MqSUpfo0hnaGZmFF70Z5lcwAAAaNz7Vu0gpBd+m +RTQFrLZ5QDWn1+X2oJ+eH9hjgav9flgGsGT+sB7jruxjokVm1HxrN1OVg8hpFTjT0fjPMuF/eV42 +X+FEb7DP7QHP4rRdCl90C5HV9p1RzI7z/jQ187zILTMkiEZw/D+Y7pJBJrj6fHPRQnihV9YqMvOX +xLKFrZXRuIGpvwDQuw+Ntuy6+belUUmb2teOei5YHNXSqr5Qf9/JbNAPeuIcrK/VGoBSbsOvsQX8 +5/1hAoD6mK9LyWuehAk+P82+rNge3yJ0sPU5dazVgKDaAZ/6AFmOu7HpjuWfcTmrjJYdjdnPHQ4n ++ld1KVlO7U+suEfP94mfZ6ypwAaMz/lBeknakl242MsHI44AAPaF8Zz4n6cqjHtaXHVAAlfUHL7U +E42OGx+OAA1gyf1gPcZ76EZsEHAAt3d2l10SLcudJ82ABq9lDp4S5n9oDn8VouhS+6BcivNhqxFB +ALcVHs6X7jSS4aMzAJ5gaYjTbzHp/PGRF+qC6HFiuq7WMzu0HCceTAotF/NXxR6bIc6w2N6L5+hM +c7xwpfU7+jtrsnzZTyHA98Y36F1t0JOdn9e7JE+GweRevIy81DycPFAWMrnNRpd5D1/TGQGgGf8A +oAWYqja6mBTYADRnObRkn/zfpOmO5896HqzNmIZuhEAAAvVa7NfSgqFSTZiBzN9MMXHXu8m0gvR7 +0UhjOjRbG8+AAAJX1By+1BONjhsfjgANYMn9YD3GbGk+bBBwALKaCZCavn95Q67xmZZrNiEdXPFy +GM/tAc/itF0KX3QLkVis7WIoIBZ2sVnS/cNTLDRmYBMUOzEabee9D54yIubTL2prHDkqc8xnX8q8 +RJyJetiUIa8RqZYgvTa/LrUU8h69+FO6WSDHxcS6mTOsZ5j1QVsz6nSCxrdkjcEuvRi8/EMcl04y +K83l+lrD+4fmDPErroBn/oAWYphc+mBTYADRnObRkn+mFz6VkhWSxvvcWUzw0d4pjisRXcAAmfTH +H3QgnoB84KJ5RTKwPgfXGm5NNgAACV9QcjrFF3scLVVVAGsGT9mS/wDmxIEAHjQAJ7gQbEdhk9Y8 +ukq14MtbwMyJoNEs/u6hAj26FL5cNPKxRrHZCQFnaxSKapw1X3yZXoCYod9ca1eepzwCroJ90Hx7 +9Sa3qQe/LQKtxaXHzh8b0wA1SytnA0oieBIiIXA0wzPmA048tVWPCBuMDlcUX9s3jPMRpsqP3pZv ++aeV3LA0zBoBn/NxpVTDp4mInAA0ZzmnY0ipX1kRkVfT5i7tu8Z7HGgdCO3+RVN3Y6QAE8zsFXox +BYYJirCEagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8QALxAAAQMEAgIA +AwkBAAMAAAAABQMEBgECBwgAECA3ERUwEhMUFhcYMjQ2YCExQf/aAAgBAQABCADtq1dPnCLZpCdY +jha1N5Kl9bsVqsL26eQsAS2GUWfMONGjt+5Ras8f6xv39EX8zLa14xfs7kWU+wFM4Vas7Q/6eNAH +8pOjAY/HOJ41jpnZRn2exLjmSrqOSkeg8RiPxqA7zHgkSeYvz8b+hBsdyXIJKrMKA1ahjCxO85TX +nEfK684d5XXnDvK684d5lkCKjGQpIGE/8XgrFMBmcHvKHq684d5sLAIpBHcWTjv0dfPb8P8AC++2 +y2t1z6aQ0Xfak/GySOGLKXDe1P8AzZfbXzaNV3rpq0bwKHDoJGRYVnyt1KUrWvzFnz8cx5+OY8zs +parliX32f8Xqz6yW624/vwT6WuTJV1lkCrZxS+xKy+9TI+yzASqsOh0jnkwlyt1xzqKZlyFEFEvw +eM83xrIP3Q9flbfjZdTjtquydumrjyxAyTf5NhSC3Lr7bLa3XZNygcnpp/Wv/H6s+slutuP78E+i +3brulk0EMBYpeQli5NmuZ9zEuYePoiA8UFlmyqSyOCcu3TlheEN8z/iN+JMEZaF8sH+14V0QupaO +JfXHBjBe++wb+nmQPh9qr8USFLUQIfRGAjZq6+0Xfj2fWU+1e6aOmC97d12NBmTF99gyuPJ/Snxq +/GEBS/3D/wAhoQwYUvTGNsRZNdJWKpkYBNxP3tX30UkFV7/sJfKifFmbtvbS5f6IyIys1ZYoLvw9 +k6y37dxONyEJS24r9TVn1kt1tx/fgn0MaYqO5LeOLGcCxRDsfpWXDuZum18IgT5dr5xmQP4qeFHG +AYq0OiBhZlWlLqfCuRNe4rLvvn4eURcxEDTwMX61NbN3LqdUWqPHcoyYWXW3J8rSlaVpWo8dyo8d +wyOYfKCt1OY1Ysb8dQa+6o8dzIuPDM7zlIQwWHYGgEUb2XOUGrRsnSxD7NvJInSsbkVegwUpISTU +YMx3rdHASKD2VNGbRihY3Z8JCRhlqozJZU1wRRbODcJwowZ3YriFVajx3NokUkMhjbEeamt2ziye +/fVHjubQME6wyO2NMWa4DWTZsXmzJkyHtkWrPh+NR6TtLmZnLuAF4mguejDZq4euEGzbGOuIkY2Q +LTVmyZj26TZlwoJFG2dzMplXXBNBs4NQq6lbK1pXqORwzKirYSGgGt0XAJIupM0ZtGCFjdn1LMYQ +iaIqVMZTwadx99oky5q/IWraRlY49qPHcl8PHyaMHglV0FmqyyC3WqkW+N8hlS3MyxP8347Ps0+9 +aoe3Hwhcy7qPHc2kPtri4OMs+Y4xLJcjOa3M4fhaAwy1C9CltKUpSnFEk1rLk1JvgGByxFZZjO8f +STHxOrEz1qy0arwE3etUeO5syAdFC2NxQjH+t0ZBt0HkoYhQwpFNAd9m3n2beZV9lzzmrPrJbrbj ++/BO8QYSIzxdEqWYAAQtk2ZM6jx3MyZuFjvxcciNa1rX411uYJNcVi1rOtrTF60mjYb6OtRv5pjJ +u1v62zYopnIg/s61kk8cja8zqa/VDG/GE/g5Z4gxH8vvsTsuvu/VDG/P1QxvwpkzHaoommnzGfrm +B9NhLJk9KvkO5HSn5XkdesGYwRgseRJveXVtspWtTWZMZAFfuXwHMGM5Er9wwpX40+NGrZuzS+5a +82o9jDutRv4ZA6ICGBRcWu7evWo5qq4euMz4tbLURvByWPSVJRYLy+2xS2626F4UBRCdHpGkpfYn +Zeoo9zBjAZfVNyAmsRk9brQnWyuO0I6cbScbxq1cvXTdo2xJjVhjqPpo9TfK0Nx/SqRZ3ts1tXra +ximzMINLItiyKyTlFJVFwg3doKt182Yzrj2SUvYxY85i8jCmmzF41JsWT5rzP0WpGsjl7kesYxf8 +nQSPhruVpStPhXKkV/Js7kAmzgwe4LEhw5qDENQQYUIarrJt0V1lptI1ZdLDx1TE2OnWRpOmy4LF +jwrBoOHcOyqMxlOxQ4ln7Eaq1EaBz4WQtKug/JVFQszBuw5ecQ8lBZKQAkOapevT3Swxk4Ksiinh +lX2XPOas+slutuP78E6wzgVwfq3kMrQQbtUEkEF1kGyKiyuZM/Lm/wAXHYj1r36hinez9K25Mt+j +qj/jZJ3tz9n72AeOD/a8K6f0p8sK18cZ+uYH1knJAjGwOj96e2FyaZcKXNr8iT9S6t136gTzik8n +Ctl6SuEovbKsjAWy3Lq22UrWuZ8ykpmUeBAnWC8yv4+RYxo91tR7GHdajfwyB0ZMMQAkiVf5DySe +yIWWdPuBDZaOEUCQjFE/QyJEmxS/l6lidlb78wZdJzwq7YMONXTpi4RctME5Rcz8E6ZFuZwDJHMX +ypKvNZYoibmzow55lecUx9DSBex+/elHrl8+61pyS8QKWwolzNcTTlmOzqFvNbZT+YYBYLW5tLGa +EYkMkCPMJxb82ZFAtlOVetaP7WHW1cUoszASpDmtcY+dz+0orzYOUUjeOCaCXMCxFKK48FKX8zTl +W3HQlFsPKFSRt8u/J8jkmORMoiUCYsyKzyRGLCCfNoojYTizSSoc1S9enupAfFxUK/NlZdsvNzDm ++wA7ybkN6rest+oE85+oE846dOXrhZy61Z9ZLdbZW3KkoLZZhfAX3FW0kmdKUpT4UKFBwZg5Ikcv +ZtIzxZcSH71nKNX2MmzW3ra8DckYi5+36GuoO4LjIYqp1tYVQXk0ZF2eGD/a8K6f0p8sK18cZ+uY +H1s8TWd5HsY18NTGSN5mYP68zYfXj2NJQ6b+GMD98jx9FCl/NqPYw7rUb+GQOtnCio/GtrVLvU4l +Ww7LBleZiLXBcYTN5Z3rcTuYZVEodTZvY6hcuQv5qqwojBzb2vCgMGdRSSMfpzj7n6c4+5+nOPuN +YPCWDlJ2x5enYrYpYobYUFGS4+muUrpHchNmK/JQCbSeNnAjh41cMHbpk51Zi1WEdMSZbjvKdUti +Un9OT6MpTCHSEHeokogoomprZF6goBQmrzZyVfNps2CIjmV5EgxZJooWNkEEE+ZnPqyLJEpXu71m +P3i8iWi7uZAG2l4NL2FOapevT3W1xdRrHosHs8dWfWS3RKKAy50Obf8AJRJwsQDuixnKWWjuSSN/ +2/CFT2SwAlc/B472AiUyq3ZEOZZhFs8hJQVYsiq3VURW8oJEH03k4sG0YMmoxixHtXb1qNarPHmQ +tmh7D74fCyxQgbIOyJLwwf7XhXT+lPlhWvjjP1zA+tjPb0n8dSL/AIOJ7Z1sahctigzdZ4YJZrMM +SxFFbm1HsYd1qN/DIHW13+EA+GqHsYt1sH6elfhgP23D+pd/lJR1q86SXxs4S6yRlMRjL5PeT/dd +CufuuhXP3XQrn7roVz910K5+66FckZJExITxJBm6cMXbV62iUgbSqMgzjfmfoW4GZQVtYRQA2i0b +CBG+RZNZD4VITVL771Lq3XYrldJhAo4WU5l7HzppmC8QwFjmogYOGNDJVqEEEyroyWdHCxMq7jDh +JrJY84V6yI0XYTyZt1+9fGa7vLEYqlyRukmcckTlXmqXr091tv8AzgPlqz6yW6cHhDU0ODOuGgww ++LdjCeXMPE8cP73Lby1tya/OoO4iY5nvCi79RzMIz4iRZA0/aDhuHcVNsbhq3OeZ5yU+lkmfBGvl +g/2vCun9KfLCtfHGfrmB9bGe3pP46vnqDcgOhinJGDaSICXCu5JHScUNkApTqGxUlNZENBjxY9qG +HDxzTm1HsYd1qN/DIHW13+EA+GqHsYt1sH6elfhgP23D+pd/lJR1qbIrLL5VHVuZ1hC80gbtJl2i +iq4VTRR/Kko5+VJR3qtK/wAWDMxhfklhomQnoeYcc2rlXwsARVHmqUp+5dyGKrcLRIYWkkYkK/Nn +JV8ohTcIj1B5ChKofHDSXNm8fuWBu2ZM+9ZIC4FMn0wIczxIEQGMpD8eapevT3W2/wDOA+WrPrJb +raxddoWgThDCecUJgm2j0j4SHMDDByOIZiwy+x87vJDvHXdyqhlqN2WdZGwDF5xesTYSTBWSo1cp +dc9GkBilE346OHzHwqNietk9PX2KFoFjGKY8bXWCeXV+Ft13FVlV1VFVfLB/teFdP6U+WFa+OM/X +MD62M9vSfxjxt5HDYsyyjcgFyoEKODOZExTGMjs7bCBXVyfNVlflonVudvHFlCeP8ZxrHDG5AX1t +R7GHdajfwyB1td/hAPhqh7GLdbB+npX4YD9tw/qXf5SUdQSWuoRKg55uIKjzgxiUYcyjruxk710a +jL/CGUx6t1l4zAmUyiydlMVYIEwRdIwU5liaIQWEliNesOyr8n5BAPr+rq22UrWuTZRWZTmQGbeQ +KS3xCYR85akqmsnYql1sFK/zLkYigj1rHkZJkuvCyPH7BkUZOmT6Z6sVVXUcxC3WTJ9VPsVgusQ0 +U4QfSyyxNFKxJPmwuQ7JfJkw47mqXr091tv/ADgPlqz6yW624/vwTiSyqCiaqeFM7WSKjaNynj1k +zJNHTJ7mXCTuCrqmQvhr7dSzL0Qu8bqUr/78FL7U0VbrvPB/teFdP6U+WFa+OM/XMD62M9vSfywz +mFxjshUcTFlRppg3IDe5xOgMACrEy+KpO/mEFEHn/NqPYw7rUb+GQOtrv8IB8NUPYxbrYP09K/DA +ftuH9S7/ACko7w3md5j11QWTCHQ0hHIEhPhMJvG4KMvJHMl5GK5IO1fu+8TSv844+j5S/mbZV+Uc +dHHKfeAJRWU43FpX8m0iRiMTPnVF3CztdZdfpBdZqsmuhiDPQ6SINgcp8FVU0E1FFMy5+QWbO45D +OtUvXp7rbf8AnAfLVn1kt1tx/fgnVt9bLqXW4RzvR9czi8v4sgg7QWbuM1YNcRC9c/HexBV+DJMi +Y/GGeI/OEW44r0qui2QVXcHtjMZhF1EEojmnH0yXSaMOllkGqKrhxmDYNs8Zvo7D/OISRxEJGKPN +qbaSzi+1UncNl0K+Ee2YkceBBgqFNtJZydS91OpO/kDvyiM/lkHdVXAAtsnNliVh6u10N5IdrDTq +y9EAfkRyTEVSRmEbCHoNFxsea020lnMjZAfZIOtzD7mMcslcYUOUYU20lnMk5rL5KDMxT7vHGQn+ +NTroywptpLOTfYQ9OIuSjzruEypzCZOLkDam2ks4V2ikhQWSHKdxqYyaHPKuwMe2vNNbLEjye1kG +rb8FXG10Otsuq2kW0svJJXIhDBswffKvy3hirND/ABewLsbP3bu+ZVzA/wAnWB0L+8V5ZfYvcF70 +v3bu+ZNzyRyJHkgdPGG5vn8MSSaNxW2otWz4Ga7WwH/4Z2xQpbW0HMctTmc23olu8a5tM41CuxDG +m2ks5k7KxTJ9wS59447zobx2AuCMqbaSzmTcpE8mrh1n/cU2TmMcCthbmm2ks4rtZJVkrklTL1qT +KPXjbwg2wc4iNEmjlxthFaD7qtp5leXZAWrYT6x9sLLIhRFiWK7Xx2xl8RE0ynM56rdQv/0v/8QA +URAAAQMBAwUJCgsFBwQDAAAAAgEDBBEABRAGEiAxURMhIjJBUlVhsxRCVHFygYKRkrIjMFNic5OU +tMPS0xUkYJXRMzRDdaGisSVjg8JFdMH/2gAIAQEACT8AxjOSH3SzG2mgUzNdgiO+tpv7KjlqiM0d +kqnuBa6pTLyhQZYy3Cc9RKQWAr3ulKru7ALuzX0rWEV2Q+6WaDLQKZmuwUHfWz5QmOSAwaE+Xlnv +iFoUu7n+SQ1Icc7ZSGwJe92AlVkxQXdAHa6z/FAosqa8LTdVoI8pGXUKJUrMjIvQxo/eLopuhbUD +mBoZJxCfM883Gc+MZFtJWVFVtcESCSjmk62FXVTYplnGWhHGLfDIG89FbEUZl04Xmd+JhorYU3eU +5wWWU61tes683++BtUjMeoanbJg/PNlfqWyXP7bK/Utkuf22V+pbJc/tsr9S0XueDFcaFlrPM81C +aEi3zUl/gy5FlTkvB9lDSS+1wBEOQDG2S5/bZX6lrsWIExmST9XnHs5WyHnkXxW2Z90d0FRETWq2 +yuueK4vePTWmy9RLbKC7plSoix5Tb3uqWhs+IaVx99wWmgTWRmuaKeuwJVoEOQ7TffeLjmWC0ROV +bTGE9NLTWPbS01j20saEJPsdgH8GdMSfcDDwWZ7wfFcWLHmvH4iYJn/k8DQQFKqSrQUSzTU+SBUO +e7vxh+iQVqdsoZcsS1NEeYyPktjQExv92VFQqlEmqshlfa3w9C1LtvrwR06i99AeHLYFF5hw2nB2 +GC5qp69NKil5Nu+dnhj/AKjgtBRKqtrwfaudHSGJDElBvcwXeIx5TL+EOmJPuBh4LM94PiWTcdcI +RbbAVIyItSCg61syoXxeDYtgyWuMxxqF88sJKhdjBq1PktlvynB1tCvyY6ThNuNmJgYrmqJDvoqL +yLZ4Uv2CCFn+Fsj3/ljhBN+6ppk/NBsalEeLjmQj3hafhhdmWHLHe91fj7plzTHjDGZN5U8eai2y +Gv6n+XP/AJLXfIiPUrucho2j9RJ8Vc82cocbuZg3qePMQrZD36Kdd3Pp/wClozrDwcZt0FA08Ylo +XTMmkOtIzBvKnsIVshr+RP8ALn/yWgyIrtK7m+2TZ08Rad1S5pjrGMwbyp7CFbIe80Feezua+oqL +bJC92ABKmZxHcxPTpT4pozLmilVtd0n6o/6WiutCq0RTBRSvpfFZM3nMbNaA4xEccBfOKUtkTeVO +pqpWuG8IQqtEWVGcZRV9NB+N6Yk+4GHgsz3g+IMIkCPRJM1wVUAUtQBzztA3efqOe+KG+u3N5iYG +QT55dxQzTWJuotT9EPiDpJgvg6KV3jHlAuok3isalHmxmn2q8bMdHOTOslUWyDc96n3zQUjO+W0N +o+5S2F36LUTEtRgvKJYsAdGoHHHrdtAjfVpaEwBJxVQERUwSqLaBG+rS0CN9WloEavckj/CTmLhC +YIyuSEpKrYkRfA2gRvq0tGBtsAhHJkENGoze4Bwitdbd7T+/kzgRwfQbXgDaGy0KcVGwQU/0sKeq +wjvXdJ7JcITkqXIPNaaBOEv9E613ksIXteVBJWF/urJfiWisx2QGgNMggAg9Qjhd0eXGcGhtyG0c +BfMVmTTMEnHrqVVPzx/yWhsqe4PZ6k0la7sdoEb6tLNAAfsNjeD6Z7BgHKLdtM8fprQI31aWgAjz +t+tAItNcM1Jl2zXdEwuGN1/4TP0vPO0RqNGaSjbLIIAAOwRHewueLOZXUjzaKQ9YlrQutLK7JugO +FJilwnoo8/54WaN154xBpoEqZGS5qCicq2ZGZPLhBd1asM+X8odojMdhsaA0yCAAj1COF1xpjBa2 +5DaOCvmKzJ8AVN+6iqfnYUvcsioqbyouME5Mt5d4B1CnKZLqER2rYUvm8qCqs6orRdQd/wCnaKzH +ZAaA0yCACD80RxuBnugxokxlNxkJ6Y75WI7xuLwhB4bGwXkH38BaILxY3aNugiXwzGsR8YWgRvq0 +tDYbOZDcBokaTgO0zgL0SSzag80ZA4BJRRIVoqLiHFQYEUusqG7g1ny4rfdkRESpbqxv0HrJKjoR +GyfviURgRhqYYqAWgRvq0sw22kRkpcnMBBq47wQHAEi3Y2VH7weGoIvNBO/O10hOnDRSmzBR5yu0 +ELeCyURORMAEwJKKJJVFtEC5ryUSUH4g0b9Nm0XgGpLGlhvtPjtEtu0cWGjIb+dRFIP+wzaBG+rS +12582Ys8GmWgoR/2NhG97zUUImNUVkvxbXRDhsiNBbYYBtE8wpYU9VhT1W6bmdqtumJPuBh4LM94 +MQdiZPAXH1HLIe8a2DzjtdMVqOwAtsgLaUERtAjfVpZqMcvhhLvIWgUGdoMbTstm0ApsuW+4vOUX +VaqXmDHiRLuKSXlyj/o18SpKd2Xg/F8xUeHtMWkFx+HJZItosGij2mN+w4AyGoQtLKeFlDzVctl5 +cf21u2V11SpbxZrTDMpszIupBXBUQRSqqvIlsvLj+2t2y8uP7a3bLa5SM4jqACS2yJSzFw6Bg9lg +0Iv3g+Dr58pq02LI+YRHQ6Pk9muDH/XrzZE3zLXHaLUyOCoiJvkq2yuiq4JkJNxhOWQqOtC3FCtl +bF3czQQbkIcZSXYO7IODItNZ7h5g7yZzpq4S+kqquHQbHbvYbbt/Gwji4cCT3THQkqguZit5/jFC +W0tqMwCVcdeNAAB+cpbyWy0gke0FNwPW2hJa/Ic5sFoax3UczfKQdXnwFCBRoqKlUVLA2bJmP7JY +Uf7nuo/C2IRbAakRLQUS2WkBXK0VGSJ/NX0EK2UcGc4I1Vpp1FcRNpBrxYFqDexkMlsR4kvWS+ng +yTj77gtNNjrIzWgonns2B3vKASvCTtP5IV5g4XipzVDPCBGTdHy2VTUCWyGNxjnvzkbP1CBWjybm +fPv3aPR0IvnjZ0HGnBExMFzkJD1Ki2ZF1l0CBxs0zkMT1oqWE1uW8auw1+SLv2Ssq7rBlA/RF4wi +vCD0ks6jseUy2+yaLVCB0c4V9S4BSLegjPZ8bvHT28QQZARxclfTu8M/ZVcWsyNu+7xERKJuD/DB +E8ni4JWRMkNR2kXUpukgj/qtt5mDFaYDxNCg1saC2yBGZLqERTOUrV/fZZuNousWh4LY+iCIls5u +7Yoi9eD3Na5AH556htFBiJHbQGmwSiCg4X9DgAXER91AIvJHWtsq6KRUQiiSRD1kFr3iz2M6iuR3 +UdRF2Fm6sIyOx3k3i79o+QwXkUbIinHKoPClAeaLiGOHTznYM4MoUuKy6yyfMB9RU83ysxNHpuZ2 +q26Yk+4GHgsz3gwjGzdSUOLCLeOV1nsas0LbLYCIACZogIahFLGLbICREZLmoIhxiJbSSauzhBKn +jvHJ2g1sax507O+1O49Exqes/iel/wAIMeZeP4Oj4YXZlh4K77q6PQMHssBV+ZIUggwxLNV4x5y8 +gDa+QuxjvGIbQDT0yQjtlxfqr/mL/wCe2W9+/wAwf/PbLK+zAkUSA576iqFrRUUrNocWIRTpA7QY +30HzngqIib5KtphMZOsGTfwZUWbtMy5nNHGab1zSjFmO44tViGXBAfILHoNjt3sNt2/jYOZkWGwb +zpUquYCZ28nKtnjCABksOAJfBMByeM9pYXg7DlslUHWloviXkVOpd5bCDU5k+55zI6heFE4Q9RIt +RwIRERqqrqRLSTayeYcIWGRWndGav9q7hJcjvtFntutGoGC7RId9LGhX1duYjx/LtHxHcOPEj92t +l1xVzywFCYuWOJh/9h+ohhmLOMhjQALlfcrQlTYKDaS5IlPmrjrzi1MyLlJcXydiyQM7sIlIiadF +Kq15BYNZ8qEBTonKSusIpEI+UODyFKuV5Y5bdxLhNFgHwt1S9yd+gk4BWLDPu+T5DFCRPOeD4d0q +yT4tV4W5CSCpetcGuEyZQZdA7w6m3gCrGuaOUj/zO8BoSwOkq9zGAz5DvCd/2YBSZetJ8lepxPgh +8wYZp37PEu5QLfRkB3ieK056VLeKrjzxKZlheLkWS2usV3iTYY6iHqWyIzPYJGZ8fmObR+YWscG0 +7pup8Wny2sP/ANCw6ec7BnCSLMOI3nmXLsRBHlIl3hSxhc8ES4FAB58x+eZ2y3vnOLkbmutB5gBR +RLZb37/MH/z2y3v3+YP/AJ7SHH5DpqTrrhKZmRayJS31W3TEn3AwCpKxM94LRE3beOHdbnebHH09 +0MJbcaIwGe884tBAbGcPJ4O81Oy1Hv3dgbA0Hand86Qy6Hlnuw+9iBqEiIcJ0utg88POSH8S0QO3 +m+9OPswXzgOLtXYUB110eZu5/wBA0fDC7MsPBXfdXR6Bg9lg7VmBdrAAHW7VxS0Qq6xCjMAXU+ZE +XZ4EoPOMDEaVCoqd0mjRKK6Lue+7BAHz57rHwJl6xw6DY7d7Dbdv42H/AMlejDDnUACT/wDyGge8 +9BakoH0B5i9pgRCawkjgo7ZRoxocSfFlxT+qV3/kMOK7c08V8RMlgFDk3uYIW0GmgwueFeDYHngE +uOD4gurOFHEKi2yCyf8A5ZG/JbILJ/8Alkb8lsgsn/5ZG/JbI25Y0lks9l5mAw042vOEhCqFgNQI +SRU2pZVVIkx+PVda7kajZ2kS+QWIfIO7a2sFoM6G6xn8wjTgl5l37NqD8d42nQXvTBc1U9aWCjt4 +v9zR/oWNZD5R4P1uth79hF9DxTLzO8PARU5MUtwJe8eHhNF7aWAgMVUSEkoqKOtFSzWZJvl8n1Ll +3EOA2OB1j3NGzC+nfoZ2JBOVIbZBV5FcJBslAaAWwTYIpmpgZK3FlFBYHmhF4HqJdB0kYveI6yoc +iuMCrwEWCIpv3VLFvZno2pBh0852DOBkiTZj759aRRT9XS6Yk+4GEQX5l2NmEPP4QNK6SER0273B +XkwmCxFa85GfIADykVjWLc7JfusEC/3u889GWgKaIL7Lg57LwjqE0saXRe50RGXi+BdL/tOYCKzW +/wB6gFsfa1D6SKo2bIHAMhICTNUVHWipyLpoSd0OVed+RZHjn6KWaRqLEZBhhsU3hBoc1E9SWltx +ozIEbrzpIAAO0iLVZgJkkeCV4vj8AP0QaztLckzJBqbzzhVIi0fDC7MsPBXfdXR6Bg9lhzIX3UNH +lau8vZJzDUzKiOH9cg6KIhuA+/6D7xmGHQbHbvYbbt/Gw6dDsHNDoCR27OHPg/emtDny/uzmHRM7 +sSw47F7yWy9MAPC6p0sJ6vIBRRBRBWs3eXOIedbJ2+fUz+pbJ2+fUz+pbJ2+fUz+pbJ2+fUz+pbJ +2+fUz+pbJ2+fUz+pYCBmZeEmS2J60B1xTRCpy2dVt9h0HWjTWJguci+tLURubEB1QrXNNU4YeiWE +VSC/1akRgDUb7q5hgPWR23whRQYzucQpwj9Jd+xIj0eKSR+t9zgN/wC6xKRKtVVVqqrYlKSrG4y/ +pmOAZelgyohlBLZfiUHllHmn6js0gR4jDcdoU70GhzUsebHgxnX3F6mhUlstZE2S7Ic8bpZ1PFYk +Ftq8orhKupBBxCXEFEwviYtF5UJ1SQvOmgJKLHdLrpD3gbgY4EItsXdKcM11IItqS4dPOdgzhzby +/B0umJPuBhMBmbNZN2I2fB3VGqIaD1jWtMITcmHIBQcbMd5f6LzV5LIcq4nzoxK5Wi+Sd05JPSIc +fd4Dx1UyZEkEmiLCKpv8a84Id/T/AB2h0obkmZINAaZbHOIlsoPX3OQVmPDqbHkZDCQoXLdj5Mg0 +JUR55taG6en4YXZlh4K77q6PQMHssOZC+6hovIAXpd5tgPOdYJHPdQsFVWJ0U45KmtM9KVHrGzCt +yorhAWwh5DHaJJvjiKq5IcRDcpUWWh47hdQpZtG40RhuOyKcgNDmp/omHQbHbvYbbt/Gw6dDsHND +oCR27OHPg/emtDny/uzmHRM7sSwdQSNGZ0fs3cGVcvC7nBmxm+U81FEw8ZDoNkbhmIiApnKSlqRE +5Vtk3ef2R3+lsm7z+yO/0xd4cB7uuL9C/wAcR8k8ABXbimOvt1SuehtKNPRNBLB3fNSnyuzaHA6B +IAZ8XywoDuDf75cyye5y27uGYudtzdY4HSRfMlBMdjDFDPEwVZcFs3EFa5ropmuD6JpTBisOegNT +vmSBGgmWwT0GVBye2jEASGi7hrNzxHgYC/eIjAYDnK/vH6gw6ec7BnDm3l+DpdMSfcDB42XmmphA +4BKJgYmFnwZv0Eoy+VACag/i4RGpMSQBA604lUJCtnycnnjoDus4pFqad/8Aw9I6C+1NA/sxniY3 +Re5rU3Wgqy79K3a4Dnxx/wAeB+8Cvojw7QJEZxdQPNk2vqJLXFPmoq0RY0Zx5P8AalgZuWHym+qO +PeZoLRVOWY0fnPcJ88NljUjMyIyXWqlrXT8MLsyw8Fd91dHoGD2WHMhfdQ0VpIgyW3g5K5q74r1E +m8tnhONMYQxRFqoFygXWK7xYNlHnspRiewg7oH5wtPuyfH7091Vg/OB2n3dd8fviQyfd8wDZk3ZT +1O6ZrtFdd6uoceg2O3ew23b+Nh06HYOaHQEjt2cOfB+9NaHPl/dnMOiZ3YlgBEMZz4ZpFpurJ7xh +aQL0SUyLrRjyoWD7V3Xk/U3ojvBjPHymPK2RWyPlPbCYUHhLrHMW2TJRQIt96U620AWkDeF9iPAJ +BoxG2q0K+/g6iTH2jjwA5SfdGiFTYPGXE82K+73HL2bk/wAGpdQlQsVRETfJVsdY7kkm4vKm4NcA +KeNEw4sSUKvdbJ8BwfYWxoYGImKpqVCxezol0gkFmhVRTb33S9vF2gPmr92kXynfs4RWpER8CbdZ +dHOAxLkJLXu022WqFO1D5Dw2Yu0B55SrT2rwdBRIYLAqkf0zLfOwIICIoIilBQdg4P5913Ophniv +Beklxz8Q8UcOnnOwZw5t5fg6XTEn3Aw8Fme8FnCBwCQhIVoqKOpUW0oQvZKBEmFql7BPY7hFbkRp +DZNusuDngYFrQhs27JyecPyzhkXeHtDmno7Zn3V3RSuitEQCVVXk+I8MLsyw8Fd91dHoGD2WHMhf +dQ0s9+4JTlXgThHGP5UE94bTWZUR4M5t5oqoqaEmm8qMRhX4WQfMBLIPdE16aaiOoBCSYgA+SmHQ +bHbvYbbt/Gw6dDsHNDoCR27OHPg/emtDny/uzmHRM7sSxVyTk7IdqbffxT5XGv8A2C15NTIzqVBx +oqp4i2L1Lv6M9GR1NM63Xi2AFk3GGwhBCia0ZAtu0y5V0Hc6WDPc0vbuzHAUi8rjYO5kyaHcMThU +XPf3iIesQ0HVKVdZLAf8TSJua+xgo0hxDNtCWiE6XBaD0jVEs4pvOmRuGWsiJaqq4uk262Ym2YLm +kKjvoqKOpbSmol8hRtmWfAZm+VyA5ouCDYDnERFmoibSW01D3VCCZeoczlCMvvHj0852DOHNvL8H +S6Yk+4GHgsz3gwVUJFqipyWlokrghAvFzU9safXn7DwZB1l0CA2zTOQhPWipZg3bjNavsazhf1a0 +JBMy4jwusuDyGNjauy/fkSKjMgtrRF7mLwNtNjnE4ZUEB2kpWmS7zMSzFKCyhh7bigKja+u55p0z +IswdwcNdiLxFLF8GWWRInHDJEAEHlJS1WeUweE2Zd5/M5QY/P8RHbfdguq4DTlUAt5R4VLZMXX7b +lsl7sFHAIVJDd0cnLudZgQ2owGZuVNGhQRUrZMXX7blojUZ+UjSE01VQHcgQO+073cjiaiTrC8Nh +3ywK2SQOl378N7Mr6BoVsm74Uv8Aw2ycjweQJElxXz9gUEbXq/NlOa3HS1JsFNQp1Ja4YEliJuuY +66Roa7q6TtsmLr9ty0BiK41DCKgMVUVEDI67/l4XXFl/tLcN03YjTN3DPpTN8u2TF1+25a5okRuP +MGSJsEaqpCBB33laEFiU69COKoP1QUEjA673kWyYuv23LXDAjMS9yz3WiNT+CdF3QityH4SmoNOV +QD3Rsm+FTyrZMXX7blsmbsAJcV2OZAbtRR0FHQvqRCdXjIBVA/LAt4rZNRpfC4b0U1YP2CQrXBfY ++SDB/iDbJu+HT2O7i17pla6IV0oQqJOkqynvMpIIWvN+ZKPjOvmprTYmxOpNG5gvGNMeB4Wze3Hc +jFKKXEK2QjP28v07XQl3R4JOmjQv7shmffFwB0LsGfGng2hsE8rNDaXeMVoVshGft5fp2uIbtY7p +B94hkq9uqBqAuAOleaToIUQYk6rwAOwFqJjbJGS0Y8sR4Hh9R5lrgvz2GP1bZImR0Kjs19PcC17q +MOtUhRh3FjzoO+fp6FzQ5bT80pRG+RoqKQCHJ5FsmLr9ty12Ron7OF8W9wI1zt3zed5GlckKWyss +5Ge8RiVXBQe9tkxdftuWuuNDWADoAjCkufuqpWud5OhCiXojHBakSiPdszkEiG2TF1+25bJO6TAk +ISEicISErXY3d7LzimERhFNpraIZ++g15NF0b4gDqZlEW6h1A7bJm81mIHBaMmwZU+sxIrTtygCV +W7vYVQYTyk78sVK+LrHvXj/eGvIctkxPel7JRNstj5wU7XmQxc7gwY9W44+h33pfxN//xAAUEQEA +AAAAAAAAAAAAAAAAAACA/9oACAECAQE/AGR//8QAFBEBAAAAAAAAAAAAAAAAAAAAgP/aAAgBAwEB +PwBkf//Z +" | base64 --decode > /tmp/plymouth-theme/bgrt.jpg + + # curl "https://static-community.frame.work/original/2X/1/191e90201ff9e3276524e10064310c3fb439cde7.jpeg" -o "/tmp/plymouth-theme/theme/bgrt.jpeg" + + bash /tmp/plymouth-theme/install.sh + + runHook postInstall + ''; + + passthru.updateScript = unstableGitUpdater { }; + + meta = with lib; { + description = "This theme uses your UEFI logo for seamless booting"; + homepage = "https://github.com/glics/plymouth-modern-bgrt"; + license = licenses.mit; + maintainers = with maintainers; [ me ]; + platforms = platforms.all; + }; +} + diff --git a/modules/portals/xdg-desktop-portal-termfilechooser.nix b/modules/portals/xdg-desktop-portal-termfilechooser.nix new file mode 100755 index 0000000..14fcce6 --- /dev/null +++ b/modules/portals/xdg-desktop-portal-termfilechooser.nix @@ -0,0 +1,74 @@ +{ lib +, stdenv +, fetchFromGitHub +, unstableGitUpdater +, pkgs +}: + +stdenv.mkDerivation { + name = "xdg-desktop-portal-termfilechooser"; + version = "1.0.0"; + + src = fetchFromGitHub { + repo = "xdg-desktop-portal-termfilechooser"; + owner = "GermainZ"; + rev = "71dc7ab06751e51de392b9a7af2b50018e40e062"; + hash = "sha256-645hoLhQNncqfLKcYCgWLbSrTRUNELh6EAdgUVq3ypM="; + }; + + dontConfigure = true; + + nativeBuildInputs = with pkgs; [ + meson + ninja + gcc + pkg-config + scdoc + inih + systemdMinimal + ]; + + buildPhase = '' + runHook preBuild + + # mv $src/meson.build $src/meson.build.old + # cat $src/meson.build.old > $src/meson.build + # + + mkdir -p /tmp/xdg-desktop-portal-termfilechooser/ + + cp -r $src/* /tmp/xdg-desktop-portal-termfilechooser + + substituteInPlace /tmp/xdg-desktop-portal-termfilechooser/meson.build --replace "'-D_POSIX_C_SOURCE=200809L'," "'-D_POSIX_C_SOURCE=200809L','-O3'" + + cd /tmp/xdg-desktop-portal-termfilechooser/ + + meson build + ninja -C build + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/{dbus-1/services,xdg-desktop-portal/portals} + + cp /tmp/xdg-desktop-portal-termfilechooser/build/*.service $out/share/dbus-1/services/ + cp /tmp/xdg-desktop-portal-termfilechooser/termfilechooser.portal $out/share/xdg-desktop-portal/portals/ + mkdir -p $out/libexec + cp /tmp/xdg-desktop-portal-termfilechooser/build/xdg-desktop-portal-termfilechooser $out/libexec + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/GermainZ/xdg-desktop-portal-termfilechooser"; + description = "xdg-desktop-portal backend for choosing files with your favorite file chooser."; + license = licenses.mit; + maintainers = with maintainers; [ SpoodyTheOne ]; + mainProgram = "xdg-desktop-portal-termfilechooser"; + platforms = platforms.linux; + }; + +} diff --git a/modules/programs/alacritty.nix b/modules/programs/alacritty.nix new file mode 100755 index 0000000..2d8aa53 --- /dev/null +++ b/modules/programs/alacritty.nix @@ -0,0 +1,18 @@ +{ ... }: + +{ + programs.alacritty = { + enable = true; + + settings = { + window = { + dynamic_padding = true; + decorations = "None"; + }; + }; + }; + + home.sessionVariables.TERM = "alacritty"; + home.sessionVariables.TERMINAL = "alacritty"; + home.sessionVariables.TERMCMD = "alacritty"; +} diff --git a/modules/programs/dunst.nix b/modules/programs/dunst.nix new file mode 100755 index 0000000..4e837f2 --- /dev/null +++ b/modules/programs/dunst.nix @@ -0,0 +1,59 @@ +{ pkgs, lib, config, ... }: +{ + services.dunst.enable = true; + services.dunst.settings = { + global = { + monitor = "mouse"; + width = "300"; + height = "(0, 300)"; + offset = "10x50"; + scale = 0; + progress_bar = true; + progress_bar_height = 10; + progress_bar_frame_width = 1; + progress_bar_corner_radius = 5; + icon_corner_radius = 0; + + # corner_radius = 4; + + seperator_height = 2; + + padding = 8; + horizontal_padding = 8; + text_icon_padding = 0; + + frame_width = 1; + gap_size = 0; + + seperator_color = "auto"; + + sort = "yes"; + + format = "%s\n%b"; + + alignment = "right"; + vertical_alignment = "center"; + + ellipsize = "middle"; + + stack_duplicates = false; + show_indicators = false; + + }; + + "[spotify-album-art-waybar]" = { + appname = "Spotify"; + script = builtins.toString (pkgs.writeShellScript "album_art.sh" '' + #!/bin/bash + album_art=$(${pkgs.playerctl}/bin/playerctl -p spotify metadata mpris:artUrl) + if [[ -z $album_art ]] + then + # spotify is dead, we should die too. + exit + fi + ${pkgs.curl}/bin/curl -s "''${album_art}" --output "/tmp/cover.jpeg" + echo "/tmp/cover.jpeg" + ''); + }; + }; +} diff --git a/modules/programs/firefox.nix b/modules/programs/firefox.nix new file mode 100755 index 0000000..811ba45 --- /dev/null +++ b/modules/programs/firefox.nix @@ -0,0 +1,129 @@ +{ config +, pkgs +, ... +}: +let + lock-false = { + Value = false; + Status = "locked"; + }; + lock-true = { + Value = true; + Status = "locked"; + }; +in +{ + programs = { + firefox = { + enable = true; + languagePacks = [ "en-US" ]; + + /* + ---- PROFILES ---- + */ + profiles.defualt = { + search.engines = { + "Google".metaData.hidden = true; + "Bing".metaData.hidden = true; + "Ecosia".metaData.hidden = true; + "Facebook".metaData.hidden = true; + "Twitter".metaData.hidden = true; + "Youtube".metaData.hidden = true; + "Wikipedia".metaData.hidden = true; + "Reddit".metaData.hidden = true; + }; + search.default = "DuckDuckGo"; + search.privateDefault = "DuckDuckGo"; + search.force = true; + }; + + /* + ---- POLICIES ---- + */ + # Check about:policies#documentation for options. + policies = { + DisableTelemetry = true; + DisableFirefoxStudies = true; + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + DisablePocket = true; + DisableFirefoxAccounts = true; + DisableAccounts = true; + DisableFirefoxScreenshots = true; + OverrideFirstRunPage = ""; + OverridePostUpdatePage = ""; + DontCheckDefaultBrowser = true; + DisplayBookmarksToolbar = "newtab"; # alternatives: "always" or "newtab" + DisplayMenuBar = "default-off"; # alternatives: "always", "never" or "default-on" + SearchBar = "unified"; # alternative: "separate" + + /* + ---- EXTENSIONS ---- + */ + # Check about:support for extension/add-on ID strings. + # Valid strings for installation_mode are "allowed", "blocked", + # "force_installed" and "normal_installed". + ExtensionSettings = { + "*".installation_mode = "blocked"; # blocks all addons except the ones specified below + # uBlock Origin: + "uBlock0@raymondhill.net" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; + installation_mode = "force_installed"; + }; + # Privacy Badger: + "jid1-MnnxcxisBPnSXQ@jetpack" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi"; + installation_mode = "force_installed"; + }; + # bitwarden + "{446900e4-71c2-419f-a6a7-df9c091e268b}" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi"; + installation_mode = "force_installed"; + }; + # FUCK youtube ai translated titles + "{458160b9-32eb-0f0c-8_d1-89ad3bdeb9dc}" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/youtube-anti-translate/latext.xpi"; + installation_mode = "force_installed"; + }; + # 1Password: + # "{d634138d-c276-4fc8-924b-40a0ea21d284}" = { + # install_url = "https://addons.mozilla.org/firefox/downloads/latest/1password-x-password-manager/latest.xpi"; + # installation_mode = "force_installed"; + # }; + }; + + /* + ---- PREFERENCES ---- + */ + # Check about:config for options. + Preferences = { + "browser.contentblocking.category" = { + Value = "strict"; + Status = "locked"; + }; + "extensions.pocket.enabled" = lock-false; + "extensions.screenshots.disabled" = lock-true; + "browser.topsites.contile.enabled" = lock-false; + "browser.formfill.enable" = lock-false; + "browser.search.suggest.enabled" = lock-false; + "browser.search.suggest.enabled.private" = lock-false; + "browser.urlbar.suggest.searches" = lock-false; + "browser.urlbar.showSearchSuggestionsFirst" = lock-false; + "browser.newtabpage.activity-stream.feeds.section.topstories" = lock-false; + "browser.newtabpage.activity-stream.feeds.snippets" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includePocket" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = lock-false; + "browser.newtabpage.activity-stream.section.highlights.includeVisited" = lock-false; + "browser.newtabpage.activity-stream.showSponsored" = lock-false; + "browser.newtabpage.activity-stream.system.showSponsored" = lock-false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = lock-false; + }; + }; + }; + }; +} diff --git a/modules/programs/hyprpaper.nix b/modules/programs/hyprpaper.nix new file mode 100755 index 0000000..9657b51 --- /dev/null +++ b/modules/programs/hyprpaper.nix @@ -0,0 +1,21 @@ +{ lib, config, ... }: +{ + options = { + hyprpaper.wallpaper = lib.mkOption { + description = "Path to the wallpaper that should be used"; + default = ""; + }; + }; + + config = { + xdg.configFile."hypr/hyprpaper.conf".text = + # if builtins.pathExists config.hyprpaper.wallpaper then + if config.stylix.enable then + " + preload = ${config.stylix.image} + wallpaper = ,${config.stylix.image} + " + else ""; + services.hyprpaper.enable = true; + }; +} diff --git a/modules/programs/keypassxc/default.nix b/modules/programs/keypassxc/default.nix new file mode 100755 index 0000000..e69de29 diff --git a/modules/programs/mangohud.nix b/modules/programs/mangohud.nix new file mode 100644 index 0000000..1df8f00 --- /dev/null +++ b/modules/programs/mangohud.nix @@ -0,0 +1,15 @@ +{ pkgs, config, lib, ... }: +{ + programs.mangohud = { + enable = true; + settings = { + font_scale = lib.mkForce 1.0; + font_size = lib.mkForce 24; + font_size_text = lib.mkForce 24; + background_alpha = lib.mkForce 0.65; + alpha = lib.mkForce 1.0; + round_corners = lib.mkForce 4; + gpu_name = true; + }; + }; +} diff --git a/modules/programs/tmux.nix b/modules/programs/tmux.nix new file mode 100644 index 0000000..f716141 --- /dev/null +++ b/modules/programs/tmux.nix @@ -0,0 +1,20 @@ +{ pkgs, lib, config, ... }: { + programs.tmux = { + enable = true; + # Enable 24-hour clock + clock24 = true; + terminal = if config.programs.alacritty.enable then "alacritty" else lib.mkDefault; + baseIndex = 1; + mouse = true; + shell = "${pkgs.zsh}/bin/zsh"; + # escapeTime = 150; + historyLimit = 50000; + + extraConfig = lib.strings.concatStringsSep "\n" [ + "set -g display-time 4000" + "set -g focus-events on" + "set-option -a terminal-features ',alacritty:RGB'" + "set-option -a terminal-overrides ',alacritty:Tc'" + ]; + }; +} diff --git a/modules/programs/tofi.nix b/modules/programs/tofi.nix new file mode 100755 index 0000000..ac260d2 --- /dev/null +++ b/modules/programs/tofi.nix @@ -0,0 +1,52 @@ +{ lib, config, ...}: { + programs.tofi.enable = true; + + # xdg.configFile."tofi/config".text = '' + # width = 100% + # height = 100% + # border-width = 0 + # outline-width = 0 + # padding-left = 35% + # padding-top = 30% + # result-spacing = 25 + # num-results = 8 + # font = monospace + # # background-color = #2a273fdd + # text-color = #e0def4 + # input-color = #e0def4 + # # text-cursor-color = #e0def4 + # # selection-color = #c4a7e7 + # prompt-background-padding = 5 + # text-cursor-style = underscore + # text-cursor-corner-radius = 1 + # # selection-match-color = #9ccfd8 + # hide-cursor = false + # text-cursor = true + # ''; + + programs.tofi.settings = { + width = "35%"; + height = "25%"; + border-width = 1; + outline-width = 0; + corner-radius = 4; + # padding-left = "35%"; + # padding-right = "30%"; + result-spacing = 16; + num-results = 7; + prompt-background-padding = 5; + # text-cursor-tyle = "underscore"; + text-cursor-corner-radius = 1; + hide-cursor = false; + text-cursor = true; + # font-size = lib.mkForce 18; + }; + + home.activation = { + # https://github.com/philj56/tofi/issues/115#issuecomment-1701748297 + regenerateTofiCache = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + tofi_cache=${config.xdg.cacheHome}/tofi-drun + [[ -f "$tofi_cache" ]] && rm "$tofi_cache" + ''; + }; +} diff --git a/modules/programs/waybar/default.nix b/modules/programs/waybar/default.nix new file mode 100755 index 0000000..3d020d1 --- /dev/null +++ b/modules/programs/waybar/default.nix @@ -0,0 +1,236 @@ +{ config, lib, pkgs, ... }: +with config.lib.stylix.colors.withHashtag; +with config.stylix.fonts; +{ + + stylix.targets.waybar.enable = false; + + services.playerctld.enable = true; + services.playerctld.package = pkgs.playerctl; + + programs.waybar = { + enable = true; + # style = ./style.css; + + style = lib.mkForce + ('' + @define-color base00 ${base00}; @define-color base01 ${base01}; @define-color base02 ${base02}; @define-color base03 ${base03}; + @define-color base04 ${base04}; @define-color base05 ${base05}; @define-color base06 ${base06}; @define-color base07 ${base07}; + + @define-color base08 ${base08}; @define-color base09 ${base09}; @define-color base0A ${base0A}; @define-color base0B ${base0B}; + @define-color base0C ${base0C}; @define-color base0D ${base0D}; @define-color base0E ${base0E}; @define-color base0F ${base0F}; + + * { + font-family: "${sansSerif.name}"; + font-size: ${builtins.toString sizes.desktop}pt; + margin:0; + } + + window#waybar { + background: transparent; + } + + tooltip { + border-color: @base0D; + background: alpha(@base00, ${with config.stylix.opacity; builtins.toString desktop}); + color: @base05; + } + '' + + (builtins.readFile ./style.css) + ); + + settings = { + + test = { + layer = "top"; + output = [ "eDP-1" ]; + position = "top"; + + width = 1920; + + modules-left = [ + "cpu" + "memory" + "hyprland/workspaces" + "hyprland/window" + ]; + modules-center = [ + # "image#album-art" + "mpris" + ]; + modules-right = [ + "privacy" + "tray" + "wireplumber" + "network" + "backlight" + "battery" + "temperature" + "clock" + # "custom/power" + ]; + + fixed-center = true; + + "custom/power" = { + format = "⏻"; + on-click = "systemctl $(echo \"poweroff\nreboot\nhibernate\" | tofi --prompt-text \"power option: \" --horizontal true --height 35 --width 20%)"; + }; + + "network" = { + format = "Not connected"; + format-wifi = "{essid} "; + format-ethernet = "{ipaddr}/{cidr} "; + format-disconnected = ""; + tooltip-format = "{ifname} via {gwaddr}"; + tooltip-format-wifi = "{essid} ({signalStrength}%)\n{ipaddr}/{cidr}"; + tooltip-format-ethernet = "{ifname}"; + tooltip-format-disconnected = "Disconnected"; + max-length = 50; + }; + + "power-profiles-daemon" = { + format = "{icon}"; + tooltip-format = "Power profile: {profile}\nDriver: {driver}"; + tooltip = true; + format-icons = { + default = ""; + performance = ""; + balanced = ""; + power-saver = ""; + }; + }; + + "temperature" = { + critical-threshold = 80; + thermal-zone = 7; + format = " {temperatureC}°C"; + }; + + "clock" = { + format = "{:%H:%M} "; + format-alt = "{:%A, %B %d, %Y (%R)} "; + tooltip-format = "{:%Y-%m-%d}"; + calendar = { + mode = "year"; + mode-mon-col = 3; + weeks-pos = "right"; + on-scroll = 1; + format = { + months = "{}"; + days = "{}"; + weeks = "W{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + 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"; + }; + }; + + "backlight" = { + format = "{percent}% 󰃠"; + tooltip = false; + }; + + "cpu" = { + interval = 3; + format = " {usage}%"; + # format-tooltip = '' + # load: {load} + # avg: {avg_frequency} GHz + # min: {min_frequency} GHz + # max: {max_frequency} GHz + # ''; + + # on-click = '' + # notify-send "CPU Stats" "avg: {avg_frequency} GHz" + # ''; + + max-length = 10; + }; + + "memory" = { + format = " {percentage}%"; + # tooltip = true; + # tooltip-format = "{used}/{total}GiB used\n{swapUsed}/{totalSwap}GiB swap used"; + }; + + "tray" = { + icon-size = 24; + spacing = 10; + }; + + "wireplumber" = { + format = "{volume}% {icon}"; + format-muted = ""; + format-icons = [ "" "" "" ]; + on-click = "wpctl set-mute @DEFAULT_SINK@ toggle"; + max-volume = 150; + scroll-step = 0.2; + }; + + "battery" = { + interval = 60; + full-at = 96; + states = { + warning = 30; + critical = 15; + }; + format = "{capacity}% {icon}"; + format-charging = "{capacity}% "; + + format-icons = [ "" "" "" "" "" ]; + max-length = 25; + }; + + "image#album-art" = { + exec = pkgs.writeShellScript "album_art.sh" '' + album_art=$(playerctl metadata | grep artUrl | awk '{ print $3 }') + if [[ -z $album_art ]] + then + # remove image + echo "/tmp/invalid.tiff"; + # spotify is dead, we should die to. + exit + fi + echo "/tmp/cover.jpeg" + ''; + size = 32; + interval = 2; + }; + + "mpris" = { + format = "{status_icon} {player_icon} {dynamic}"; + + player-icons = { + # default = ""; + spotify = ""; + firefox = "󰈹"; + }; + + status-icons = { + paused = ""; + playing = ""; + stopped = ""; + }; + + dynamic-order = [ + "artist" + "title" + "position" + "length" + ]; + dynamic-seperator = ": "; + interval = 2; + }; + }; + + }; + }; +} diff --git a/modules/programs/waybar/style.css b/modules/programs/waybar/style.css new file mode 100755 index 0000000..4131403 --- /dev/null +++ b/modules/programs/waybar/style.css @@ -0,0 +1,159 @@ +#mpris { + color: @base05; + background-color: @base00; + + border-radius: 0 0 4pt 4pt; + + padding-left: 6pt; + padding-right: 6pt; + + margin-left: 4pt; + margin-right: 4pt; + + transition: width 0.2s ease; + transition: background-color 0.1s ease; + transition: color 0.1s ease; +} + +#mpris.spotify { + background: @base0B; + color: @base00; +} + +#clock { + background-color: @base0C; + color: @base00; + padding-left: 6pt; + padding-right: 12pt; +} + +#battery { + background-color: @base0E; + color: @base00; + padding-left: 6pt; + padding-right: 12pt; +} + +#backlight { + background-color: @base06; + color: @base00; + padding-left: 6pt; + padding-right: 12pt; +} + +#wireplumber { + background-color: @base08; + color: @base00; + padding-left: 6pt; + padding-right: 12pt; +} + +#custom-power { + background-color: @base08; + color: @base00; + padding-left: 8pt; + padding-right: 12pt; +} + +#power-profiles-daemon { + background-color: @base0E; + color: @base00; + padding-left: 8pt; + padding-right: 13pt; +} + +#cpu { + background-color: @base0B; + color: @base00; + padding-left: 6pt; + padding-right: 6pt; +} + +#memory { + background-color: @base0E; + color: @base00; + padding-left: 6pt; + padding-right: 6pt; +} + +#network { + background-color: @base0D; + color: @base00; + padding-left: 6pt; + padding-right: 12pt; +} + +#tray, #privacy { + background-color: @base00; + padding-left: 6pt; + padding-right: 6pt; + transition: width 0.1s ease; +} + +#privacy { + margin-right: 2pt; + border-radius: 0 0 4pt 4pt; + transition: height 0.1s ease; +} + +#tray { + margin-left: 2pt; + border-radius: 0 0 0 4pt; +} + +#temperature { + background-color: @base0D; + color: @base00; + padding-left: 6pt; + padding-right: 6pt; + transition: background-color 0.1s linear; +} + +#temperature.critical { + background-color: @base08; +} + +#workspaces button { + border-radius: 0; + /*border-bottom: 2px solid @base0E;*/ + border-bottom: 0px; + border-bottom-style: solid; + border-bottom-color: @base0E; + + transition: color 0.1s ease; + transition: border-bottom 0.1s ease; +} + +#workspaces button.active { + color: @base0E; + border-bottom: 2px; +} + +#workspaces { + color: @base05; + background-color: @base00; + border-radius: 0 0 4pt 4pt; + padding-left: 6pt; + padding-right: 6pt; + + border-radius: 0 0 4pt 0; + + margin-right: 4pt; + + transition: width 0.2s ease; +} + +#window { + color: @base05; + background-color: @base00; + border-radius: 0 0 4pt 4pt; + padding-left: 6pt; + padding-right: 6pt; + + transition: width 0.2s ease; + transition: background-color 0.1s ease; +} + +window#waybar.empty #window { + background-color: transparent; +} diff --git a/modules/shells/zsh.nix b/modules/shells/zsh.nix new file mode 100755 index 0000000..046ee74 --- /dev/null +++ b/modules/shells/zsh.nix @@ -0,0 +1,94 @@ +{ pkgs, lib, config, ... }: { + + options = { + zsh.jump = { + enable = lib.mkEnableOption "enables jump in zsh"; + show-destination = lib.mkEnableOption "Echoes the folder jump changed to after jumping"; + }; + + zsh.extraLines = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "List of extra commands to run on zsh init"; + }; + + zsh.histFile = lib.mkOption { + type = lib.types.str; + default = "$HOME/.zsh_history"; + description = "Path to the zsh history file"; + }; + + zsh.direnv = lib.mkEnableOption "Enable direnv hook"; + }; + + config = { + programs.lsd.enable = true; + + programs.zsh.enable = true; + programs.zsh.enableCompletion = true; + + programs.zsh.dotDir = ".config/zsh"; + + programs.zsh.autosuggestion = { + enable = true; + }; + + programs.zsh.syntaxHighlighting = { + enable = true; + }; + + programs.zsh.history.path = config.zsh.histFile; + + programs.zsh.shellAliases = { + ls = "lsd"; + nix-rebuild = "nixos-rebuild --use-remote-sudo switch --flake /etc/nixos"; + nd = "nix develop -c zsh"; + }; + + programs.zsh.oh-my-zsh = { + enable = true; + theme = "robbyrussell"; + plugins = [ + "git" + "sudo" + ]; + }; + + # programs.zsh.initExtra = lib.concatStringsSep "\n" ([ + # "echo zsh" + # ] ++ lib.lists.optionals config.zsh.jump.enable + # "eval"); + + programs.zsh.initExtra = lib.concatStringsSep "\n" ( + # Add any extra lines to the zsh config + config.zsh.extraLines ++ + # Add jump shell script to list if jump is enabled + ( + if config.zsh.jump.show-destination + then [ + "eval \"$(jump shell zsh --bind=z)\"" + '' + j() { + z $1; + echo $(pwd) + } + '' + ] + else [ "eval \"$(jump shell zsh)\"" ] + ) + ++ + ( + if config.zsh.direnv then [ "eval \"$(direnv hook zsh)\"" ] + else [ ] + ) + # ++ + # ( + # if config.programs.nix-index.enable && config.programs.nix-index.enableZshIntegration then + # [ "source ${pkgs.nix-index}/etc/profile.d/command-not-found.sh" ] + # else + # [] + # ) + ); + }; +} + diff --git a/modules/stylix/cursors/posy-improved/default.nix b/modules/stylix/cursors/posy-improved/default.nix new file mode 100755 index 0000000..184cc6c --- /dev/null +++ b/modules/stylix/cursors/posy-improved/default.nix @@ -0,0 +1,42 @@ +{ lib +, stdenvNoCC +, fetchFromGitHub +, unstableGitUpdater +, pkgs +}: + +stdenvNoCC.mkDerivation { + name = "posy-cursors"; + + src = fetchFromGitHub { + repo = "posy-improved-cursor-linux"; + owner = "simtrami"; + rev = "bd2bac08bf01e25846a6643dd30e2acffa9517d4"; + hash = "sha256-ndxz0KEU18ZKbPK2vTtEWUkOB/KqA362ipJMjVEgzYQ="; + }; + + dontConfigure = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + + install -dm 755 $out/share/icons + cp -rf $src/Posy_Cursor* $out/share/icons + # cp -rf themes/* $out/share/icons/ + + runHook postInstall + ''; + + passthru.updateScript = unstableGitUpdater {}; + + meta = with lib; { + description = "Posy cursors for NixOS"; + homepage = "https://github.com/simtrami/posy-improved-cursor-linux"; + # license = licenses.mit; + maintainers = with maintainers; [ me ]; + platforms = platforms.all; + }; + +# https://github.com/ripperhowls/Posys-Cursors-Improved-by-ripperhowls.git +} diff --git a/modules/stylix/home/default.nix b/modules/stylix/home/default.nix new file mode 100755 index 0000000..94eafca --- /dev/null +++ b/modules/stylix/home/default.nix @@ -0,0 +1,34 @@ +{ pkgs, ... }: +{ + stylix.enable = true; + # stylix.image = ./nixos-wallpaper.png; + stylix.autoEnable = true; + stylix.fonts = { + serif = { + package = pkgs.dejavu_fonts; + name = "DejaVu Serif"; + }; + + sansSerif = { + package = pkgs.dejavu_fonts; + name = "DejaVu Sans"; + }; + + monospace = { + # package = (pkgs.nerdfonts.override { + # fonts = + # [ + # "Mononoki" + # ]; + # }); + package = pkgs.nerd-fonts.mononoki; + name = "Mononoki Nerd Font"; + }; + + emoji = { + package = pkgs.noto-fonts-emoji; + name = "Noto Color Emoji"; + }; + + }; +} diff --git a/modules/users/main-user.nix b/modules/users/main-user.nix new file mode 100755 index 0000000..554e70c --- /dev/null +++ b/modules/users/main-user.nix @@ -0,0 +1,56 @@ +{ pkgs, lib, config, ... }: +{ + options = { + + main-user = { + enable = lib.mkEnableOption "Enable main user"; + name = lib.mkOption { + type = lib.types.str; + default = "default-user"; + description = "Name of the user"; + }; + + groups = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "List of groups to add the user to"; + }; + + sudo = lib.mkEnableOption "Should the user be in the sudoers group or not"; + + shell = lib.mkOption { + default = pkgs.zsh; + description = "The shell of the user"; + }; + + home-manager = { + enable = lib.mkEnableOption "Enable home-manager for the user"; + import = lib.mkOption + { + description = "Import path. MUST BE SET IN CONFIGURATION.NIX"; + }; + }; + }; + + }; + + config = lib.mkIf config.main-user.enable { + users.users.${config.main-user.name} = { + isNormalUser = true; + initialPassword = "1234"; + description = "Main system user"; + extraGroups = [ + "networkmanager" + "audio" + ] + ++ config.main-user.groups + ++ (lib.lists.optional config.main-user.sudo "wheel"); + + shell = config.main-user.shell; + }; + + home-manager.users.${config.main-user.name} = + lib.mkIf config.main-user.home-manager.enable config.main-user.home-manager.import; + }; +} + diff --git a/modules/window-managers/hyprland/default.nix b/modules/window-managers/hyprland/default.nix new file mode 100755 index 0000000..d99b04a --- /dev/null +++ b/modules/window-managers/hyprland/default.nix @@ -0,0 +1,181 @@ +{ monitors ? [] +, border-radius ? 0 +}: +{ lib, pkgs, inputs, ... } @ params: +{ + imports = [ + ./exec.nix + ./env.nix + ]; + + programs.alacritty.enable = lib.mkDefault true; + + wayland.windowManager.hyprland = + let + pluginsNix = (import ./plugins.nix params); + inherit (pluginsNix) plugins; + in + { + enable = true; + + # plugins = plugins; + + settings = { + autogenerated = false; + + # monitor = [ + # "eDP-1, 1920x1080@60, auto, 1" + # ]; + + monitor = monitors; + + general = { + gaps_in = 5; + gaps_out = 10; + }; + + input = { + kb_layout = "us"; + + follow_mouse = true; + + # Maps capslock to escape + kb_options = "caps:escape"; + + sensitivity = 0.3; + accel_profile = "flat"; + touchpad.natural_scroll = true; + }; + + master = { + new_status = "master"; + }; + + animations = { + enabled = true; + + bezier = [ + "myBezier, 0.05, 0.9, 0.1, 1.05" + ]; + + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + gestures = { + workspace_swipe = true; + }; + + cursor = { + no_hardware_cursors = true; + }; + + misc = { + vfr = true; + # begone satan, why is this so fucking hard to disable 99% of the time + middle_click_paste = false; + }; + + decoration = { + blur.enabled = false; + rounding = border-radius; + }; + + binds = { + workspace_back_and_forth = true; + disable_keybind_grabbing = true; + }; + + # screencopy = { + # allow_token_by_default = true; + # }; + + # Set mod key + "$mod" = "super"; + + bind = [ + "$mod, Return, exec, alacritty" + "$mod, C, killactive" + "$mod, V, togglefloating" + "$mod, G, fullscreen" + + "$mod, D, exec, tofi-drun | bash" + "$mod, F, exec, ${pkgs.writeScriptBin "run_anything.sh" '' + package=$(echo "" | tofi --require-match=false --prompt-text=", " --height=35); + + if [[ -z "$package" ]]; then + exit 1; + fi + + notify-send "Running $package"; + error=$(, -P tofi $package 2>&1) + if [ $? -ne 0 ]; then + notify-send "Error with $package" "$error" + fi + ''}/bin/run_anything.sh" + + "$mod SHIFT, S, exec, grimblast --freeze copy area" + "$mod SHIFT, Q, exec, hyprctl kill" + + "$mod, L, exec, hyprlock" + + ] ++ ( + # Auto generate workspace switching from [0-9] and shift + [0-9] + builtins.concatLists (builtins.genList + ( + x: + let + ws = + let + c = (x + 1) / 10; + in + builtins.toString (x + 1 - (c * 10)); + in + [ + "$mod, ${ws}, workspace, ${toString (x + 1)}" + "$mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}" + ] + ) + 10) + ); + + # XF86AudioMedia + # XF86AudioPrev + # XF86AudioNext + # XF86AudioPlay + # XF86AudioStop + binde = [ + # Volume keys + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_SINK@ toggle" + ", XF86AudioPlay, exec, playerctl play-pause" + ", XF86AudioPrev, exec, playerctl previous" + ", XF86AudioNext, exec, playerctl next" + + ", XF86MonBrightnessUp, exec, brightnessctl s 5%+" + ", XF86MonBrightnessDown, exec, brightnessctl s 5%-" + ]; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + + windowrulev2 = [ + "pin, initialClass:^(zen-alpha)$, initialTitle:^(Zen)$" + ]; + }; + + extraConfig = '' + '' + # + (import ./plugins.nix { inherit pkgs; inherit inputs; }).pluginConfig + ; + }; +} diff --git a/modules/window-managers/hyprland/env.nix b/modules/window-managers/hyprland/env.nix new file mode 100755 index 0000000..76d0f56 --- /dev/null +++ b/modules/window-managers/hyprland/env.nix @@ -0,0 +1,16 @@ +{...}: + +{ + wayland.windowManager.hyprland.settings.env = [ + # "LIBVA_DRIVER_NAME,nvidia" + "LIBVA_DRIVER_NAME,iHD" + "XDG_SESSION_TYPE,wayland" + "GBM_BACKEND,wayland" + "GTK_USE_PORTAL,1" + "__GLX_VENDOR_LIBRARY_NAME,nvidia" + "QT_QPA_PLATFORM,wayland" + "XDG_CURRENT_DESKTOP,Hyprland" + "XDG_SESSION_DESKTOP,Hyprland" + # "MOZ_ENABLE_WAYLAND,0" + ]; +} diff --git a/modules/window-managers/hyprland/exec.nix b/modules/window-managers/hyprland/exec.nix new file mode 100755 index 0000000..54c660c --- /dev/null +++ b/modules/window-managers/hyprland/exec.nix @@ -0,0 +1,9 @@ +{ ... }: +{ + wayland.windowManager.hyprland.settings.exec = [ ]; + wayland.windowManager.hyprland.settings.exec-once = [ + # "hyprpaper &" + "waybar &" + "blueman-applet &" + ]; +} diff --git a/modules/window-managers/hyprland/hypridle.nix b/modules/window-managers/hyprland/hypridle.nix new file mode 100755 index 0000000..52120d8 --- /dev/null +++ b/modules/window-managers/hyprland/hypridle.nix @@ -0,0 +1,45 @@ +{ ... }: + +{ + services.hypridle = { + enable = true; + + settings = { + general = { + lock_cmd = "dunstctl set-paused true; pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances. + unlock_cmd = "dunstctl set-paused false"; + before_sleep_cmd = "loginctl lock-session"; # lock before suspend. + after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display. + }; + + listener = [ + { + timeout = 150; # 2.5min. + on-timeout = "brightnessctl -s set 10"; # set monitor backlight to minimum, avoid 0 on OLED monitor. + on-resume = "brightnessctl -r"; # monitor backlight restor. + } + + { + timeout = 300; # 5min + on-timeout = "loginctl lock-session"; # lock screen when timeout has passed + on-resume = "brightnessctl -r"; # monitor backlight restor. + } + + { + timeout = 380; # 5.5min + on-timeout = "hyprctl dispatch dpms off"; # screen off when timeout has passed + on-resume = [ + "hyprctl dispatch dpms on" # screen on when activity is detected after timeout has fired. + "brightnessctl -r" # monitor backlight restor. + ]; + } + + { + timeout = 600; + on-timeout = "systemctl suspend-then-hibernate"; + } + ]; + }; + }; + +} diff --git a/modules/window-managers/hyprland/hyprlock.nix b/modules/window-managers/hyprland/hyprlock.nix new file mode 100755 index 0000000..8d2b014 --- /dev/null +++ b/modules/window-managers/hyprland/hyprlock.nix @@ -0,0 +1,72 @@ +{ lib, inputs, config, ... }: +{ + programs.hyprlock = { + enable = true; + + settings = { + general.grace = 2; + + background = { + # path = (if config.stylix.enable then builtins.toString config.stylix.image else ""); + # color = (if config.stylix.enable then config.lib.stylix.colors.base01 else ""); + }; + + input-field = { + size = "250, 50"; + outline_thickness = 1; + dots_size = 0.33; + dots_spacing = 0.15; + dost_center = false; + dots_rounding = -1; + + # outer_color = "rgb(42, 40, 62)"; + # inner_color = "rgb(57, 53, 82)"; + # font_color = "rgb(224, 222, 244)"; + fade_on_empty = false; + fade_timeout = 4000; + + placeholder_text = "Input Password..."; + hide_input = false; + rounding = 0; + + # check_color = "rgb(246, 193, 119)"; + # fail_color = "rgb(235, 111, 146)"; + + fail_text = "$FAIL ($ATTEMPTS)"; + fail_transition = 300; + # capslock_color = "rgb(196, 167, 231)"; + numlock_color = -1; + bothlock_color = -1; + invert_numlock = false; + + position = "0, -20"; + halign = "center"; + valign = "center"; + }; + + label = [ + { + text = "cmd[update:1000] echo \"$(date +%H:%M:%S)\""; + color = "rgb(200, 200, 200)"; + font_size = 15; + font_family = "Noto Sans"; + + position = "-10, -10"; + halign = "right"; + valign = "top"; + } + + { + text = " $USER"; + color = "rgb(200, 200, 200)"; + font_size = 25; + font_family = "Noto Sans"; + + position = "0, 50"; + halign = "center"; + valign = "center"; + } + ]; + }; + }; +} diff --git a/modules/window-managers/hyprland/plugins.nix b/modules/window-managers/hyprland/plugins.nix new file mode 100644 index 0000000..53f5719 --- /dev/null +++ b/modules/window-managers/hyprland/plugins.nix @@ -0,0 +1,238 @@ +{ pkgs, inputs, ... }: + +{ + plugins = with pkgs.hyprlandPlugins; [ + hyprfocus + # inputs.hypr-dynamic-cursors.packages.${pkgs.system}.hypr-dynamic-cursors + ]; + + pluginConfig = '' + hyprfocus { + enabled = yes + animate_floating = yes + animate_workspacechange = yes + focus_animation = shrink + # Beziers for focus animations + bezier = bezIn, 0.5,0.0,1.0,0.5 + bezier = bezOut, 0.0,0.5,0.5,1.0 + bezier = overshot, 0.05, 0.9, 0.1, 1.05 + bezier = smoothOut, 0.36, 0, 0.66, -0.56 + bezier = smoothIn, 0.25, 1, 0.5, 1 + bezier = realsmooth, 0.28,0.29,.69,1.08 + # Flash settings + flash { + flash_opacity = 0.95 + in_bezier = realsmooth + in_speed = 0.5 + out_bezier = realsmooth + out_speed = 3 + } + # Shrink settings + shrink { + shrink_percentage = 0.95 + in_bezier = realsmooth + in_speed = 1 + out_bezier = realsmooth + out_speed = 2 + } + } + + plugin:dynamic-cursors { + + # enables the plugin + enabled = true + + # sets the cursor behaviour, supports these values: + # tilt - tilt the cursor based on x-velocity + # rotate - rotate the cursor based on movement direction + # stretch - stretch the cursor shape based on direction and velocity + # none - do not change the cursors behaviour + mode = tilt + + # minimum angle difference in degrees after which the shape is changed + # smaller values are smoother, but more expensive for hw cursors + threshold = 2 + + # override the mode behaviour per shape + # this is a keyword and can be repeated many times + # by default, there are no rules added + # see the dedicated `shape rules` section below! + # shaperule = , (optional), : , ... + # shaperule = , (optional), : , ... + # ... + + # for mode = rotate + rotate { + + # length in px of the simulated stick used to rotate the cursor + # most realistic if this is your actual cursor size + length = 20 + + # clockwise offset applied to the angle in degrees + # this will apply to ALL shapes + offset = 0.0 + } + + # for mode = tilt + tilt { + + # controls how powerful the tilt is, the lower, the more power + # this value controls at which speed (px/s) the full tilt is reached + limit = 5000 + + # relationship between speed and tilt, supports these values: + # linear - a linear function is used + # quadratic - a quadratic function is used (most realistic to actual air drag) + # negative_quadratic - negative version of the quadratic one, feels more aggressive + function = negative_quadratic + } + + # for mode = stretch + stretch { + + # controls how much the cursor is stretched + # this value controls at which speed (px/s) the full stretch is reached + limit = 3000 + + # relationship between speed and stretch amount, supports these values: + # linear - a linear function is used + # quadratic - a quadratic function is used + # negative_quadratic - negative version of the quadratic one, feels more aggressive + function = quadratic + } + + # configure shake to find + # magnifies the cursor if its is being shaken + shake { + + # enables shake to find + enabled = true + + # use nearest-neighbour (pixelated) scaling when shaking + # may look weird when effects are enabled + nearest = true + + # controls how soon a shake is detected + # lower values mean sooner + threshold = 6.0 + + # magnification level immediately after shake start + base = 4.0 + # magnification increase per second when continuing to shake + speed = 4.0 + # how much the speed is influenced by the current shake intensitiy + influence = 0.0 + + # maximal magnification the cursor can reach + # values below 1 disable the limit (e.g. 0) + limit = 0.0 + + # time in millseconds the cursor will stay magnified after a shake has ended + timeout = 2000 + + # show cursor behaviour `tilt`, `rotate`, etc. while shaking + effects = false + + # enable ipc events for shake + # see the `ipc` section below + ipc = false + } + + # use hyprcursor to get a higher resolution texture when the cursor is magnified + # see the `hyprcursor` section below + hyprcursor { + + # use nearest-neighbour (pixelated) scaling when magnifing beyond texture size + # this will also have effect without hyprcursor support being enabled + # 0 / false - never use pixelated scaling + # 1 / true - use pixelated when no highres image + # 2 - always use pixleated scaling + nearest = true + + # enable dedicated hyprcursor support + enabled = true + + # resolution in pixels to load the magnified shapes at + # be warned that loading a very high-resolution image will take a long time and might impact memory consumption + # -1 means we use [normal cursor size] * [shake:base option] + resolution = -1 + + # shape to use when clientside cursors are being magnified + # see the shape-name property of shape rules for possible names + # specifying clientside will use the actual shape, but will be pixelated + fallback = clientside + } +} + ''; + + # wayland.windowManager.hyprland.hyprfocus = { + # enabled = true; + # animate_floating = false; + # animate_workspacechange = false; + # + # # Possible values: + # # - shrink + # # - flash + # focus_animation = "shrink"; + # + # bezier = [ + # "bezIn, 0.5,0.0,1.0,0.5" + # "bezOut, 0.0,0.5,0.5,1.0" + # "overshot, 0.05, 0.9, 0.1, 1.05" + # "smoothOut, 0.36, 0, 0.66, -0.56" + # "smoothIn, 0.25, 1, 0.5, 1" + # "realsmooth, 0.28,0.29,.69,1.08" + # ]; + # + # # Flash animation settings + # flash = { + # flash_opacity = 0.95; + # in_bezier = "realsmooth"; + # in_speed = 0.5; + # out_bezier = "realsmooth"; + # out_speed = 3; + # }; + # + # # Shrink animation settings + # shrink = { + # shrink_percentage = 0.95; + # in_bezier = "realsmooth"; + # in_speed = 1; + # out_bezier = "realsmooth"; + # out_speed = 2; + # }; + # }; + # + # wayland.windowManager.hyprland.plugin."dynamic-cursor" = { + # enabled = true; + # + # # Possible values: + # # - rotate + # # - tilt + # # - stretch + # # - none + # mode = "tilt"; + # + # # minimum angle difference in degrees after which the shape is changed + # # smaller values are smoother, but more expensive for hw cursors + # threshold = 2; + # + # # override the mode behaviour per shape + # # this is a keyword and can be repeated many times + # # by default, there are no rules added + # # shaperule = , (optional), : , ... + # shaperule = []; + # + # tilt = { + # # controls how powerful the tilt is, the lower, the more power + # # this value controls at which speed (px/s) the full tilt is reached + # limit = 5000; + # + # # relationship between speed and tilt, supports these values: + # # linear - a linear function is used + # # quadratic - a quadratic function is used (most realistic to actual air drag) + # # negative_quadratic - negative version of the quadratic one, feels more aggressive + # function = "negative_quadratic"; + # }; + # }; +} diff --git a/templates/dotnet/flake.nix b/templates/dotnet/flake.nix new file mode 100755 index 0000000..352ebd2 --- /dev/null +++ b/templates/dotnet/flake.nix @@ -0,0 +1,20 @@ +{ + description = "Dotnet flake for dotnet development"; + outputs = { self, nixpkgs }: + let + pkgs = nixpkgs.legacyPackages.x86_64-linux; + in + { + devShells.x86_64-linux = { + default = with pkgs; mkShell { + buildInputs = with pkgs; [ + dotnet-sdk_8 + ]; + + shellHook = '' + echo "dotnet shell" + ''; + }; + }; + }; +} diff --git a/templates/dotnet/makefile b/templates/dotnet/makefile new file mode 100755 index 0000000..4d96a76 --- /dev/null +++ b/templates/dotnet/makefile @@ -0,0 +1,2 @@ +all: + dotnet run Program.fs diff --git a/templates/latex/fsharp-lang.tex b/templates/latex/fsharp-lang.tex new file mode 100755 index 0000000..b47af2a --- /dev/null +++ b/templates/latex/fsharp-lang.tex @@ -0,0 +1,32 @@ +\usepackage{listings} + +\lstdefinelanguage{FSharp}% +{morekeywords={let, new, match, with, rec, open, module, namespace, type, of, member, % +and, for, while, true, false, in, do, begin, end, fun, function, return, yield, try, % +mutable, if, then, else, cloud, async, static, use, abstract, interface, inherit, finally }, + otherkeywords={ let!, return!, do!, yield!, use!, var, from, select, where, order, by }, + keywordstyle=\color{bluekeywords}, + sensitive=true, + basicstyle=\ttfamily, + breaklines=true, + xleftmargin=\parindent, + aboveskip=\bigskipamount, + tabsize=4, + morecomment=[l][\color{greencomments}]{///}, + morecomment=[l][\color{greencomments}]{//}, + morecomment=[s][\color{greencomments}]{{(*}{*)}}, + morestring=[b]", + showstringspaces=false, + literate={`}{\`}1, + stringstyle=\color{redstrings}, +} +\lstset +{ %Formatting for code in appendix + language=FSharp, + numbers=left, + stepnumber=1, + showstringspaces=false, + tabsize=1, + breaklines=true, + breakatwhitespace=false, +} diff --git a/templates/latex/skabelon.bib b/templates/latex/skabelon.bib new file mode 100755 index 0000000..5abc2ca --- /dev/null +++ b/templates/latex/skabelon.bib @@ -0,0 +1,15 @@ +@online{traeinfo, + author = "Træinformation", + title = "kursusmateriale om clt", + url = "https://www.traeinfo.dk/kursusmateriale-om-clt/", + addendum = "Besøgt: 01.05.2020", + keywords = "Træinformation", +} + +@online{cristobal, + author = "Wikipedia", + title = "Cristobal Tapia De Veer", + url = "https://en.wikipedia.org/wiki/Cristobal_Tapia_de_Veer", + addendum = "Besøgt: 23 oct 2023", + keywords = "Cristobal", +} diff --git a/templates/latex/skabelon.tex b/templates/latex/skabelon.tex new file mode 100755 index 0000000..d9532d4 --- /dev/null +++ b/templates/latex/skabelon.tex @@ -0,0 +1,68 @@ +\documentclass[12pt, a4paper]{article} + +\usepackage{graphicx} +\usepackage{amsmath} +\usepackage{enumerate} +\usepackage{titling} + +\usepackage[ + a4paper, + includehead, + nomarginpar, +]{geometry} + +\usepackage{fancyhdr} + +\input{fsharp-lang} + +\usepackage[dvipsnames]{xcolor} +\usepackage{hyperref} +\hypersetup{ + colorlinks, + citecolor=RoyalBlue, + filecolor=black, + linkcolor=black, + urlcolor=RoyalBlue +} + +\usepackage[backend=biber,style=mla,sorting=ynt]{biblatex} +\addbibresource{skabelon.bib} + +\title{\LaTeX{} Skabelon} +\author{Snorre Ettrup Altschul} +\date{\today} + +\renewcommand*\contentsname{Indholdsfortegnelse} + +% Document begin +\begin{document} + +\pagestyle{fancy} +\fancyhead[L]{\theauthor} +\fancyhead[C]{\thetitle} + +\maketitle + +\begin{figure}[h] + \centering + \includegraphics[width=0.65\textwidth]{figur.jpg} +\end{figure} + +\newpage + +% Table of contents +% \tableofcontents + +\newpage + +\section{Information} + +\newpage + +% \printbibliography[ +% heading=bibintoc, +% title={Kildeliste} +% ] + +\end{document} +