From b7147ec26e9f0eb5299a23b4c0aca9b544f6f3a5 Mon Sep 17 00:00:00 2001 From: Jurn Wubben Date: Fri, 14 Feb 2025 19:40:27 +0000 Subject: [PATCH] Working config for fw13 amd --- flake.lock | 450 ++++++++++++++++++++++++ flake.nix | 42 +++ home/default.nix | 14 + home/shell/default.nix | 8 + home/shell/fish.nix | 3 + home/shell/starship.nix | 3 + home/shell/yazi.nix | 3 + home/shell/zoxide.nix | 3 + home/style/background.png | Bin 0 -> 83751 bytes home/style/default.nix | 6 + home/style/pointer.nix | 12 + home/style/stylix.nix | 27 ++ home/wayland/default.nix | 21 ++ home/wayland/fuzzel.nix | 13 + home/wayland/hyprland/binds.nix | 102 ++++++ home/wayland/hyprland/default.nix | 28 ++ home/wayland/hyprland/settings.nix | 88 +++++ home/wayland/hyprlock.nix | 88 +++++ home/wayland/waybar.nix | 328 +++++++++++++++++ hosts/default.nix | 61 ++++ hosts/laptop/default.nix | 23 ++ hosts/laptop/hardware-configuration.nix | 44 +++ system/core/boot.nix | 33 ++ system/core/default.nix | 6 + system/core/users.nix | 14 + system/default.nix | 10 + system/hardware/bluetooth.nix | 6 + system/hardware/commonGraphics.nix | 16 + system/hardware/default.nix | 9 + system/hardware/fwupd.nix | 3 + system/network/avahi.nix | 12 + system/network/default.nix | 28 ++ system/network/tailscale.nix | 13 + system/nix/default.nix | 44 +++ system/nix/nh.nix | 11 + system/nix/nixpkgs.nix | 5 + system/nix/substituters.nix | 28 ++ system/programs/default.nix | 10 + system/programs/fish.nix | 3 + system/programs/fonts.nix | 42 +++ system/programs/games.nix | 22 ++ system/programs/home-manager.nix | 15 + system/programs/hyprland.nix | 10 + system/programs/xdg.nix | 14 + system/services/default.nix | 8 + system/services/greetd.nix | 23 ++ system/services/kanata.nix | 39 ++ system/services/pipewire.nix | 11 + system/services/power.nix | 10 + 49 files changed, 1812 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 home/default.nix create mode 100644 home/shell/default.nix create mode 100644 home/shell/fish.nix create mode 100644 home/shell/starship.nix create mode 100644 home/shell/yazi.nix create mode 100644 home/shell/zoxide.nix create mode 100644 home/style/background.png create mode 100644 home/style/default.nix create mode 100644 home/style/pointer.nix create mode 100644 home/style/stylix.nix create mode 100644 home/wayland/default.nix create mode 100644 home/wayland/fuzzel.nix create mode 100644 home/wayland/hyprland/binds.nix create mode 100644 home/wayland/hyprland/default.nix create mode 100644 home/wayland/hyprland/settings.nix create mode 100644 home/wayland/hyprlock.nix create mode 100644 home/wayland/waybar.nix create mode 100644 hosts/default.nix create mode 100644 hosts/laptop/default.nix create mode 100644 hosts/laptop/hardware-configuration.nix create mode 100644 system/core/boot.nix create mode 100644 system/core/default.nix create mode 100644 system/core/users.nix create mode 100644 system/default.nix create mode 100644 system/hardware/bluetooth.nix create mode 100644 system/hardware/commonGraphics.nix create mode 100644 system/hardware/default.nix create mode 100644 system/hardware/fwupd.nix create mode 100644 system/network/avahi.nix create mode 100644 system/network/default.nix create mode 100644 system/network/tailscale.nix create mode 100644 system/nix/default.nix create mode 100644 system/nix/nh.nix create mode 100644 system/nix/nixpkgs.nix create mode 100644 system/nix/substituters.nix create mode 100644 system/programs/default.nix create mode 100644 system/programs/fish.nix create mode 100644 system/programs/fonts.nix create mode 100644 system/programs/games.nix create mode 100644 system/programs/home-manager.nix create mode 100644 system/programs/hyprland.nix create mode 100644 system/programs/xdg.nix create mode 100644 system/services/default.nix create mode 100644 system/services/greetd.nix create mode 100644 system/services/kanata.nix create mode 100644 system/services/pipewire.nix create mode 100644 system/services/power.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..a10d2fb --- /dev/null +++ b/flake.lock @@ -0,0 +1,450 @@ +{ + "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": 1736852337, + "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + } + }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1736899990, + "narHash": "sha256-S79Hqn2EtSxU4kp99t8tRschSifWD4p/51++0xNWUxw=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "91ca1f82d717b02ceb03a3f423cbe8082ebbb26d", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1738453229, + "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "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": [ + "stylix", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "stylix", + "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" + } + }, + "gitignore": { + "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" + } + }, + "hm": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1739470101, + "narHash": "sha256-NxNe32VB4XI/xIXrsKmIfrcgtEx5r/5s52pL3CpEcA4=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "5031c6d2978109336637977c165f82aa49fa16a7", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1737630279, + "narHash": "sha256-wJQCxyMRc4P26zDrHmZiRD5bbfcJpqPG3e2djdGG3pk=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "0db5c8bfcce78583ebbde0b2abbc95ad93445f7c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1739478914, + "narHash": "sha256-qljqSeAWOFbd6HNg8Ey28RdZYdVN8bMb6HJK7uqCKZ0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "6f9b8ea84c04411c48ab5aab4620ab204936d9fc", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1738452942, + "narHash": "sha256-vJzFZGaCpnmo7I6i416HaBLpC+hvcURh/BQwROcGIp8=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1736798957, + "narHash": "sha256-qwpCtZhSsSNQtK4xYGzMiyEDhkNzOCz/Vfu4oL2ETsQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9abb87b552b7f55ac8916b6fc9e5cb486656a2f3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "hm": "hm", + "nixpkgs": "nixpkgs", + "stylix": "stylix" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "git-hooks": "git-hooks", + "gnome-shell": "gnome-shell", + "home-manager": "home-manager", + "nixpkgs": "nixpkgs_2", + "systems": "systems", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1739375014, + "narHash": "sha256-0fNbvZ1Dod4rDIfwGnC7CzJ3wRFSF1v5AvNCmNkVgXo=", + "owner": "danth", + "repo": "stylix", + "rev": "e86de61bb8f5f2b6459d0be3e3291ad16db4b777", + "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" + } + }, + "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-schemes": { + "flake": false, + "locked": { + "lastModified": 1737565458, + "narHash": "sha256-y+9cvOA6BLKT0WfebDsyUpUa/YxKow9hTjBp6HpQv68=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "ae31625ba47aeaa4bf6a98cf11a8d4886f9463d9", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1735737224, + "narHash": "sha256-FO2hRBkZsjlIRqzNHCPc/52yxg11kHGA8MEtSun9RwE=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "aead506a9930c717ebf81cc83a2126e9ca08fa64", + "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" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..dd80b50 --- /dev/null +++ b/flake.nix @@ -0,0 +1,42 @@ +{ + description = "Nix is here, nix is everywhere, nix is everything."; + + outputs = inputs: + inputs.flake-parts.lib.mkFlake {inherit inputs;} { + systems = ["x86_64-linux"]; + imports = [ + ./hosts + ]; + + perSystem = { + config, + pkgs, + ... + }: { + devShells.default = pkgs.mkShell { + packages = [ + pkgs.alejandra + pkgs.git + ]; + name = "dots"; + DIRENV_LOG_FORMAT = ""; + }; + + formatter = pkgs.alejandra; + }; + }; + + inputs = { + # Nixpkgs and other core shit + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable-small"; # build error unrelated to config. + flake-parts.url = "github:hercules-ci/flake-parts"; + + hm = { + url = "github:nix-community/home-manager/master"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + # Ricing + stylix.url = "github:danth/stylix"; + }; +} diff --git a/home/default.nix b/home/default.nix new file mode 100644 index 0000000..7a64878 --- /dev/null +++ b/home/default.nix @@ -0,0 +1,14 @@ +{osConfig, ...}: { + imports = [ + ./wayland + ./shell + ./style + ]; + + home = { + inherit (osConfig.system) stateVersion; + username = "jsw"; + }; + + programs.home-manager.enable = true; +} diff --git a/home/shell/default.nix b/home/shell/default.nix new file mode 100644 index 0000000..799dac2 --- /dev/null +++ b/home/shell/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./fish.nix + ./starship.nix + ./yazi.nix + ./zoxide.nix + ]; +} diff --git a/home/shell/fish.nix b/home/shell/fish.nix new file mode 100644 index 0000000..958da57 --- /dev/null +++ b/home/shell/fish.nix @@ -0,0 +1,3 @@ +{ + programs.fish.enable = true; +} diff --git a/home/shell/starship.nix b/home/shell/starship.nix new file mode 100644 index 0000000..796f0ea --- /dev/null +++ b/home/shell/starship.nix @@ -0,0 +1,3 @@ +{ + programs.starship.enable = true; +} diff --git a/home/shell/yazi.nix b/home/shell/yazi.nix new file mode 100644 index 0000000..2ae4438 --- /dev/null +++ b/home/shell/yazi.nix @@ -0,0 +1,3 @@ +{ + programs.yazi.enable = true; +} diff --git a/home/shell/zoxide.nix b/home/shell/zoxide.nix new file mode 100644 index 0000000..c4b4530 --- /dev/null +++ b/home/shell/zoxide.nix @@ -0,0 +1,3 @@ +{ + programs.zoxide.enable = true; +} diff --git a/home/style/background.png b/home/style/background.png new file mode 100644 index 0000000000000000000000000000000000000000..08041dc4e30ce8e1d820d6674c13abfcac61a0ee GIT binary patch literal 83751 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 Mp00i_>zopr0P+dA$N&HU literal 0 HcmV?d00001 diff --git a/home/style/default.nix b/home/style/default.nix new file mode 100644 index 0000000..003aa8f --- /dev/null +++ b/home/style/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + #./pointer.nix + ./stylix.nix + ]; +} diff --git a/home/style/pointer.nix b/home/style/pointer.nix new file mode 100644 index 0000000..2367ce0 --- /dev/null +++ b/home/style/pointer.nix @@ -0,0 +1,12 @@ +# Migrated to stylix. +#{pkgs, ...}: { + # home.pointerCursor = { + # gtk.enable = true; + # x11.enable = true; + # + # name = "Bibata-Modern-Ice"; + # package = pkgs.bibata-cursors; + # size = 21; + # }; + +#} diff --git a/home/style/stylix.nix b/home/style/stylix.nix new file mode 100644 index 0000000..2213ec3 --- /dev/null +++ b/home/style/stylix.nix @@ -0,0 +1,27 @@ +{ + config, + inputs, + pkgs, + ... +}: { + imports = [ + inputs.stylix.homeManagerModules.stylix + ]; + + stylix = { + enable = true; + polarity = "dark"; + cursor = { + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Ice"; + size = 21; + }; + fonts.monospace = { + name = "DejaVuSansMNerdFontMono-Regular"; + package = pkgs.nerd-fonts.dejavu-sans-mono; + }; + + # base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-frappe.yaml"; + image = ./background.png; + }; +} diff --git a/home/wayland/default.nix b/home/wayland/default.nix new file mode 100644 index 0000000..19458c3 --- /dev/null +++ b/home/wayland/default.nix @@ -0,0 +1,21 @@ +{pkgs, ...}: { + imports = [ + ./fuzzel.nix + ./hyprlock.nix + ./hyprland + ./waybar.nix + ]; + + home.packages = with pkgs; [ + grim + slurp + wl-clipboard + wlr-randr + ]; + + home.sessionVariables = { + QT_QPA_PLATFORM = "wayland"; + SDL_VIDEODRIVER = "wayland"; + XDG_SESSION_TYPE = "wayland"; + }; +} diff --git a/home/wayland/fuzzel.nix b/home/wayland/fuzzel.nix new file mode 100644 index 0000000..ba6b182 --- /dev/null +++ b/home/wayland/fuzzel.nix @@ -0,0 +1,13 @@ +{ + config, + pkgs, + lib, + ... +}: { + programs.fuzzel = { + enable = true; + settings.main = { + launch-prefix = "${lib.getExe pkgs.uwsm} app --"; + }; + }; +} diff --git a/home/wayland/hyprland/binds.nix b/home/wayland/hyprland/binds.nix new file mode 100644 index 0000000..2069904 --- /dev/null +++ b/home/wayland/hyprland/binds.nix @@ -0,0 +1,102 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib) getExe; + + runOnce = program: "pgrep ${program} || uwsm app -- ${program}"; + uwsm = getExe pkgs.uwsm; + hyprlock = runOnce (getExe pkgs.hyprlock); + + #TODO: Move these functions into a separate lib file. + #TODO: Possibly migrate some of these applications into an option. + #TODO: Stylix + app = app: "${uwsm} app -- ${app}"; + appE = appE: app (getExe appE); + termapp = termapp: "${foot} '${termapp}'"; + termappE = termappE: termapp (getExe termappE); + + foot = appE pkgs.foot; + fuzzel = appE config.programs.fuzzel.package; + firefox = appE pkgs.firefox; + playerctl = appE pkgs.playerctl; + brightnessctl = appE pkgs.brightnessctl; + wpctl = app "${pkgs.wireplumber}/bin/wpctl"; + + pulsemixer = termappE pkgs.pulsemixer; + bluetui = termappE pkgs.bluetui; + nmtui = termapp "${pkgs.networkmanager}/bin/nmtui"; + + # toggle = program: let + # prog = builtins.substring 0 14 program; + # in "pkill ${prog} || ${uwsm} app -- ${program}"; + + workspaces = 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); +in { + wayland.windowManager.hyprland.settings = { + "$mod" = "ALT"; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + "$mod ALT, mouse:272, resizewindow" + ]; + + bind = + [ + "$mod SHIFT, E, exec, uwsm stop" + "$mod, Q, killactive," + "$mod, F, fullscreen," + "$mod, SPACE, togglefloating," + "$mod, O, pseudo," + "$mod ALT, ,resizeactive," + + "$mod, D, exec, ${fuzzel}" + "$mod, Return, exec, ${foot}" + "$mod Shift, Return, exec, ${firefox}" + "$mod, Escape, exec, ${hyprlock}" + + "$mod, A, exec, ${pulsemixer}" + "$mod, B, exec, ${bluetui}" + "$mod, N, exec, ${nmtui}" + + "$mod, h, movefocus, l" + "$mod, l, movefocus, r" + "$mod, k, movefocus, u" + "$mod, j, movefocus, d" + ] + ++ workspaces; + + bindl = [ + # media controls + ", XF86AudioPlay, exec, ${playerctl} play-pause" + ", XF86AudioPrev, exec, ${playerctl} previous" + ", XF86AudioNext, exec, ${playerctl} next" + + # volume + ", XF86AudioMute, exec, ${wpctl} set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", XF86AudioMicMute, exec, ${wpctl} set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + ]; + + bindle = [ + # volume + ", XF86AudioRaiseVolume, exec, ${wpctl} set-volume -l '1.0' @DEFAULT_AUDIO_SINK@ 6%+" + ", XF86AudioLowerVolume, exec, ${wpctl} set-volume -l '1.0' @DEFAULT_AUDIO_SINK@ 6%-" + ",XF86MonBrightnessUp, exec, ${brightnessctl} s 10%+" + ",XF86MonBrightnessDown, exec, ${brightnessctl} s 10%-" + ]; + }; +} diff --git a/home/wayland/hyprland/default.nix b/home/wayland/hyprland/default.nix new file mode 100644 index 0000000..8364acf --- /dev/null +++ b/home/wayland/hyprland/default.nix @@ -0,0 +1,28 @@ +{ + lib, + pkgs, + ... +}: let + inherit (lib) getExe; + + uwsm = getExe pkgs.uwsm; + hyprlock = getExe pkgs.hyprlock; +in { + imports = [ + ./binds.nix + ./settings.nix + ]; + + wayland.windowManager.hyprland = { + enable = true; + settings = { + env = [ + "QT_WAYLAND_DISABLE_WINDOWDECORATION,1" + ]; + exec-once = [ + "${uwsm} finalize" + "${hyprlock}" # Lock screen + ]; + }; + }; +} diff --git a/home/wayland/hyprland/settings.nix b/home/wayland/hyprland/settings.nix new file mode 100644 index 0000000..beba136 --- /dev/null +++ b/home/wayland/hyprland/settings.nix @@ -0,0 +1,88 @@ +{ + wayland.windowManager.hyprland.settings = { + general = { + gaps_in = 5; + gaps_out = 5; + border_size = 1; + + resize_on_border = true; + }; + + decoration = { + rounding = 10; + rounding_power = 3; + blur = { + enabled = true; + brightness = 1.0; + contrast = 1.0; + noise = 0.01; + + vibrancy = 0.2; + vibrancy_darkness = 0.5; + + passes = 4; + size = 7; + + popups = true; + popups_ignorealpha = 0.2; + }; + + shadow = { + enabled = true; + ignore_window = true; + offset = "0 15"; + range = 100; + render_power = 2; + scale = 0.97; + }; + }; + + animations = { + enabled = true; + animation = [ + "border, 1, 2, default" + "fade, 1, 4, default" + "windows, 1, 3, default, popin 80%" + "workspaces, 1, 2, default, slide" + ]; + }; + + group = { + groupbar = { + font_size = 10; + gradients = false; + }; + }; + + input = { + repeat_rate = 60; + repeat_delay = 200; + kb_layout = "us"; + follow_mouse = 1; + sensitivity = 0; # -1.0 - 1.0, 0 means no modification. + kb_options = "compose:ralt"; + + touchpad = { + natural_scroll = false; + }; + }; + + gestures = { + workspace_swipe = true; + workspace_swipe_forever = true; + workspace_swipe_direction_lock = false; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + }; + + misc = { + disable_autoreload = true; + force_default_wallpaper = 0; + animate_mouse_windowdragging = false; + vrr = 1; + }; + }; +} diff --git a/home/wayland/hyprlock.nix b/home/wayland/hyprlock.nix new file mode 100644 index 0000000..f79f7eb --- /dev/null +++ b/home/wayland/hyprlock.nix @@ -0,0 +1,88 @@ +{ + config, + inputs, + pkgs, + ... +}: { + programs.hyprlock = { + enable = true; + + settings = { + general = { + disable_loading_bar = true; + immediate_render = true; + hide_cursor = false; + no_fade_in = true; + }; + + # background = [ + # { + # monitor = ""; + # path = config.theme.wallpaper; + # } + # ]; + + # input-field = [ + # { + # size = "300, 50"; + # valign = "bottom"; + # position = "0%, 10%"; + # + # outline_thickness = 1; + # + # # font_color = "rgb(b6c4ff)"; + # # outer_color = "rgba(180, 180, 180, 0.5)"; + # # inner_color = "rgba(200, 200, 200, 0.1)"; + # # check_color = "rgba(247, 193, 19, 0.5)"; + # # fail_color = "rgba(255, 106, 134, 0.5)"; + # + # fade_on_empty = false; + # placeholder_text = "Enter Password"; + # + # dots_spacing = 0.2; + # dots_center = true; + # dots_fade_time = 100; + # + # # shadow_color = "rgba(0, 0, 0, 0.1)"; + # shadow_size = 7; + # shadow_passes = 2; + # } + # ]; + + label = [ + { + monitor = ""; + text = "$TIME"; + font_size = 150; + color = "rgb(b6c4ff)"; + + position = "0%, 30%"; + + valign = "center"; + halign = "center"; + + shadow_color = "rgba(0, 0, 0, 0.1)"; + shadow_size = 20; + shadow_passes = 2; + shadow_boost = 0.3; + } + { + monitor = ""; + text = "cmd[update:3600000] date +'%a %b %d'"; + font_size = 20; + color = "rgb(b6c4ff)"; + + position = "0%, 40%"; + + valign = "center"; + halign = "center"; + + shadow_color = "rgba(0, 0, 0, 0.1)"; + shadow_size = 20; + shadow_passes = 2; + shadow_boost = 0.3; + } + ]; + }; + }; +} diff --git a/home/wayland/waybar.nix b/home/wayland/waybar.nix new file mode 100644 index 0000000..313eceb --- /dev/null +++ b/home/wayland/waybar.nix @@ -0,0 +1,328 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib) getExe; + + #TODO: UWSM library mentioned in binds.nix. + hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl"; + fuzzel = getExe pkgs.fuzzel; + kitty = getExe pkgs.kitty; + + pulsemixer = "${kitty} ${getExe pkgs.pulsemixer}"; + nmtui = "${kitty} ${pkgs.networkmanager}/bin/nmtui"; +in { + programs.waybar = { + enable = true; + systemd.enable = true; + settings = { + mainBar = { + layer = "bottom"; + position = "bottom"; + mod = "dock"; + exclusive = true; + gtk-layer-shell = true; + margin-bottom = -1; + passthrough = false; + height = 41; + modules-left = [ + "custom/os_button" + "hyprland/workspaces" + "wlr/taskbar" + ]; + modules-center = [ + ]; + modules-right = [ + "cpu" + "memory" + "disk" + "tray" + "pulseaudio" + "network" + "battery" + "clock" + ]; + "hyprland/language" = { + format = "{}"; + format-en = "ENG"; + format-ru = "РУС"; + }; + "hyprland/workspaces" = { + icon-size = 32; + spacing = 14; + align = "center"; + justify = "center"; + on-scroll-up = "${hyprctl} dispatch workspace r+1"; + on-scroll-down = "${hyprctl} dispatch workspace r-1"; + }; + "custom/os_button" = { + format = ""; + on-click = fuzzel; + tooltip = false; + }; + cpu = { + interval = 5; + format = " {usage}%"; + max-length = 10; + }; + disk = { + interval = 30; + format = "󰋊 {percentage_used}%"; + path = "/"; + tooltip = true; + unit = "GB"; + tooltip-format = "Available {free} of {total}"; + }; + memory = { + interval = 10; + format = " {percentage}%"; + max-length = 10; + tooltip = true; + tooltip-format = "RAM - {used:0.1f}GiB used"; + }; + "wlr/taskbar" = { + format = "{icon} {title:.17}"; + icon-size = 28; + spacing = 3; + on-click-middle = "close"; + tooltip-format = "{title}"; + ignore-list = [ + ]; + on-click = "activate"; + }; + tray = { + icon-size = 18; + spacing = 3; + }; + clock = { + format = " {:%R\n %d.%m.%Y}"; + tooltip-format = "{calendar}"; + calendar = { + mode = "year"; + mode-mon-col = 3; + weeks-pos = "right"; + on-scroll = 1; + on-click-right = "mode"; + 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"; + }; + }; + network = { + format-wifi = " {icon}"; + format-ethernet = " "; + format-disconnected = "󰌙"; + format-icons = [ + "󰤯 " + "󰤟 " + "󰤢 " + "󰤢 " + "󰤨 " + ]; + on-click = nmtui; + }; + battery = { + states = { + good = 95; + warning = 30; + critical = 20; + }; + format = "{icon} {capacity}%"; + format-charging = " {capacity}%"; + format-plugged = " {capacity}%"; + format-alt = "{time} {icon}"; + format-icons = [ + "󰂎" + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + }; + pulseaudio = { + max-volume = 150; + scroll-step = 10; + format = "{icon}"; + tooltip-format = "{volume}%"; + format-muted = " "; + format-icons = { + default = [ + " " + " " + " " + ]; + }; + on-click = pulsemixer; + }; + }; + }; + style = '' + * { + text-shadow: none; + box-shadow: none; + border: none; + border-radius: 0; + font-family: "DejaVuSansM Nerd Font:style=Regular"; + font-weight: 600; + font-size: 12.7px; + } + + window#waybar { + background: @base00; + border-top: 1px solid @base01; + color: @base05; + } + + tooltip { + background: @base01; + border-radius: 5px; + border-width: 1px; + border-style: solid; + border-color: @base01; + } + tooltip label{ + color: @base05; + } + + #custom-os_button { + font-size: 24px; + padding-left: 12px; + padding-right: 20px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + #custom-os_button:hover { + background: @base03; + color: @base05; + } + + #workspaces { + color: transparent; + margin-right: 1.5px; + margin-left: 1.5px; + } + #workspaces button { + padding: 3px; + color: @base04; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + #workspaces button.active { + color: @base05; + border-bottom: 3px solid white; + } + #workspaces button.focused { + color: @base02; + } + #workspaces button.urgent { + background: rgba(255, 200, 0, 0.35); + border-bottom: 3px dashed @warning_color; + color: @warning_color; + } + #workspaces button:hover { + background: @base03; + color: @base05; + } + + + #taskbar button { + min-width: 130px; + border-bottom: 3px solid rgba(255, 255, 255, 0.3); + margin-left: 2px; + margin-right: 2px; + padding-left: 8px; + padding-right: 8px; + color: white; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + #taskbar button.active { + border-bottom: 3px solid white; + background: @base02; + } + + #taskbar button:hover { + border-bottom: 3px solid white; + background: @base03; + color: @base05; + } + + #cpu, #disk, #memory { + padding:3px; + } + + + #window { + border-radius: 10px; + margin-left: 20px; + margin-right: 20px; + } + + #tray{ + margin-left: 5px; + margin-right: 5px; + } + #tray > .passive { + border-bottom: none; + } + #tray > .active { + border-bottom: 3px solid white; + } + #tray > .needs-attention { + border-bottom: 3px solid @warning_color; + } + #tray > widget { + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + #tray > widget:hover { + background: @base03; + } + + #pulseaudio { + font-family: "JetBrainsMono Nerd Font"; + padding-left: 3px; + padding-right: 3px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + #pulseaudio:hover { + background: @base03; + } + + #network { + padding-left: 3px; + padding-right: 3px; + } + + #language { + padding-left: 5px; + padding-right: 5px; + } + + #clock { + padding-right: 5px; + padding-left: 5px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + #clock:hover { + background: @base03; + } + ''; + }; +} diff --git a/hosts/default.nix b/hosts/default.nix new file mode 100644 index 0000000..58832fd --- /dev/null +++ b/hosts/default.nix @@ -0,0 +1,61 @@ +{ + self, + inputs, + lib, + ... +}: let + inherit (inputs.nixpkgs.lib) nixosSystem genAttrs; + + specialArgs = {inherit inputs self;}; + modules = [ + inputs.hm.nixosModules.home-manager + + ../system + ]; +in { + flake = let + systems = [ + "laptop" + ]; + in { + # Systems + nixosConfigurations = genAttrs systems (hostName: + nixosSystem { + inherit specialArgs; + modules = + modules + ++ [ + { + imports = [./${hostName}]; + networking = {inherit hostName;}; + } + ]; + }); + }; + + perSystem = { + # Allows running 'nix run github:jsw08/NixOS' and it'll spin up a vm. + config, + pkgs, + ... + }: let + nixos-vm = nixosSystem { + inherit specialArgs; + modules = + modules + ++ [ + { + networking.hostName = "vm"; + nixpkgs.hostPlatform = pkgs.system; + + boot.plymouth.enable = lib.mkForce false; + } + ]; + }; + in { + apps.default = { + type = "app"; + program = "${nixos-vm.config.system.build.vm}/bin/run-vm-vm"; + }; + }; +} diff --git a/hosts/laptop/default.nix b/hosts/laptop/default.nix new file mode 100644 index 0000000..2fecfd8 --- /dev/null +++ b/hosts/laptop/default.nix @@ -0,0 +1,23 @@ +{ + imports = [ + ./hardware-configuration.nix + ]; + + services = { + fprintd.enable = true; + udev.extraRules = '' + # Ethernet expansion card support + ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0bda", ATTR{idProduct}=="8156", ATTR{power/autosuspend}="20" + ''; + }; + hardware.sensor.iio.enable = true; # brightness sensor + + boot.kernelParams = [ + # There seems to be an issue with panel self-refresh (PSR) that + # causes hangs for users. + # + # https://community.frame.work/t/fedora-kde-becomes-suddenly-slow/58459 + # https://gitlab.freedesktop.org/drm/amd/-/issues/3647 + "amdgpu.dcdebugmask=0x10" + ]; +} diff --git a/hosts/laptop/hardware-configuration.nix b/hosts/laptop/hardware-configuration.nix new file mode 100644 index 0000000..e7192b8 --- /dev/null +++ b/hosts/laptop/hardware-configuration.nix @@ -0,0 +1,44 @@ +# 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 = ["nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/59540469-ecb9-4a68-829b-4cd3ad6e95c3"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/83C9-84B1"; + fsType = "vfat"; + options = ["fmask=0077" "dmask=0077"]; + }; + + swapDevices = [ + {device = "/dev/disk/by-uuid/65190d84-4e34-4905-a317-d750591933e2";} + ]; + + # 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.wlp1s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/system/core/boot.nix b/system/core/boot.nix new file mode 100644 index 0000000..3851a18 --- /dev/null +++ b/system/core/boot.nix @@ -0,0 +1,33 @@ +{ + pkgs, + config, + ... +}: { + boot = { + bootspec.enable = true; + + initrd = { + systemd.enable = true; + supportedFilesystems = ["ext4"]; + }; + + # use latest kernel + kernelPackages = pkgs.linuxPackages_latest; + + consoleLogLevel = 3; + kernelParams = [ + "quiet" + "systemd.show_status=auto" + "rd.udev.log_level=3" + "plymouth.use-simpledrm" + ]; + + loader = { + # systemd-boot on UEFI + efi.canTouchEfiVariables = true; + systemd-boot.enable = true; + }; + + plymouth.enable = true; + }; +} diff --git a/system/core/default.nix b/system/core/default.nix new file mode 100644 index 0000000..cfc0580 --- /dev/null +++ b/system/core/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./boot.nix + ./users.nix + ]; +} diff --git a/system/core/users.nix b/system/core/users.nix new file mode 100644 index 0000000..aec816d --- /dev/null +++ b/system/core/users.nix @@ -0,0 +1,14 @@ +{pkgs, ...}: { + users.users.jsw = { + isNormalUser = true; + shell = pkgs.fish; + initialPassword = "changeme"; + extraGroups = [ + "libvirtd" + "NetworkManager" + "plugdev" + "dialout" + "wheel" + ]; + }; +} diff --git a/system/default.nix b/system/default.nix new file mode 100644 index 0000000..32849dd --- /dev/null +++ b/system/default.nix @@ -0,0 +1,10 @@ +{ + imports = [ + ./core + ./hardware + ./network + ./nix + ./programs + ./services + ]; +} diff --git a/system/hardware/bluetooth.nix b/system/hardware/bluetooth.nix new file mode 100644 index 0000000..b53e260 --- /dev/null +++ b/system/hardware/bluetooth.nix @@ -0,0 +1,6 @@ +{pkgs, ...}: { + hardware.bluetooth = { + enable = true; + }; + environment.systemPackages = [pkgs.bluetui]; +} diff --git a/system/hardware/commonGraphics.nix b/system/hardware/commonGraphics.nix new file mode 100644 index 0000000..33907ba --- /dev/null +++ b/system/hardware/commonGraphics.nix @@ -0,0 +1,16 @@ +{pkgs, ...}: { + hardware.graphics = { + enable = true; + enable32Bit = true; + + extraPackages = with pkgs; [ + libva + vaapiVdpau + libvdpau-va-gl + ]; + extraPackages32 = with pkgs.pkgsi686Linux; [ + vaapiVdpau + libvdpau-va-gl + ]; + }; +} diff --git a/system/hardware/default.nix b/system/hardware/default.nix new file mode 100644 index 0000000..ba5e415 --- /dev/null +++ b/system/hardware/default.nix @@ -0,0 +1,9 @@ +{ + hardware.enableRedistributableFirmware = true; + + imports = [ + ./bluetooth.nix + ./commonGraphics.nix + ./fwupd.nix + ]; +} diff --git a/system/hardware/fwupd.nix b/system/hardware/fwupd.nix new file mode 100644 index 0000000..a62f709 --- /dev/null +++ b/system/hardware/fwupd.nix @@ -0,0 +1,3 @@ +{ + services.fwupd.enable = true; +} diff --git a/system/network/avahi.nix b/system/network/avahi.nix new file mode 100644 index 0000000..c885e9c --- /dev/null +++ b/system/network/avahi.nix @@ -0,0 +1,12 @@ +{ + # network discovery, mDNS + services.avahi = { + enable = true; + nssmdns4 = true; + publish = { + enable = true; + domain = true; + userServices = true; + }; + }; +} diff --git a/system/network/default.nix b/system/network/default.nix new file mode 100644 index 0000000..c169ca9 --- /dev/null +++ b/system/network/default.nix @@ -0,0 +1,28 @@ +# networking configuration +{pkgs, ...}: { + networking = { + # use quad9 with DNS over TLS + nameservers = ["9.9.9.9#dns.quad9.net"]; + + networkmanager = { + enable = true; + dns = "systemd-resolved"; + wifi.powersave = true; + }; + }; + + services = { + openssh = { + enable = true; + settings.UseDns = true; + }; + + # DNS resolver + resolved = { + enable = true; + dnsovertls = "opportunistic"; + }; + }; + + systemd.services.NetworkManager-wait-online.serviceConfig.ExecStart = ["" "${pkgs.networkmanager}/bin/nm-online -q"]; +} diff --git a/system/network/tailscale.nix b/system/network/tailscale.nix new file mode 100644 index 0000000..7ac6b3a --- /dev/null +++ b/system/network/tailscale.nix @@ -0,0 +1,13 @@ +{ + networking.firewall = { + trustedInterfaces = ["tailscale0"]; + # required to connect to Tailscale exit nodes + checkReversePath = "loose"; + }; + + # inter-machine VPN + services.tailscale = { + enable = true; + openFirewall = true; + }; +} diff --git a/system/nix/default.nix b/system/nix/default.nix new file mode 100644 index 0000000..cfcdec5 --- /dev/null +++ b/system/nix/default.nix @@ -0,0 +1,44 @@ +{ + config, + pkgs, + inputs, + lib, + ... +}: { + imports = [ + ./nh.nix + ./nixpkgs.nix + ./substituters.nix + ]; + + # we need git for flakes + environment.systemPackages = [pkgs.git]; + + nix = let + flakeInputs = lib.filterAttrs (_: v: lib.isType "flake" v) inputs; + in { + package = pkgs.lix; + + # pin the registry to avoid downloading and evaling a new nixpkgs version every time + registry = lib.mapAttrs (_: v: {flake = v;}) flakeInputs; + + # set the path for channels compat + nixPath = lib.mapAttrsToList (key: _: "${key}=flake:${key}") config.nix.registry; + + settings = { + auto-optimise-store = true; + builders-use-substitutes = true; + experimental-features = ["nix-command" "flakes"]; + flake-registry = "/etc/nix/registry.json"; + + # for direnv GC roots + keep-derivations = true; + keep-outputs = true; + + trusted-users = ["root" "@wheel"]; + + accept-flake-config = false; + }; + }; + system.stateVersion = "25.05"; +} diff --git a/system/nix/nh.nix b/system/nix/nh.nix new file mode 100644 index 0000000..df849b8 --- /dev/null +++ b/system/nix/nh.nix @@ -0,0 +1,11 @@ +{ + programs.nh = { + enable = true; + # weekly cleanup + clean = { + enable = true; + extraArgs = "--keep-since 30d"; + }; + flake = "/home/jsw/NixOS"; + }; +} diff --git a/system/nix/nixpkgs.nix b/system/nix/nixpkgs.nix new file mode 100644 index 0000000..d3422e6 --- /dev/null +++ b/system/nix/nixpkgs.nix @@ -0,0 +1,5 @@ +{self, ...}: { + nixpkgs = { + config.allowUnfree = true; + }; +} diff --git a/system/nix/substituters.nix b/system/nix/substituters.nix new file mode 100644 index 0000000..f9d38ef --- /dev/null +++ b/system/nix/substituters.nix @@ -0,0 +1,28 @@ +{ + nix.settings = { + substituters = [ + # high priority since it's almost always used + "https://cache.nixos.org?priority=10" + + # "https://anyrun.cachix.org" + # "https://fufexan.cachix.org" + # "https://helix.cachix.org" + # "https://hyprland.cachix.org" + # "https://nix-community.cachix.org" + # "https://nix-gaming.cachix.org" + # "https://yazi.cachix.org" + ]; + + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + + # "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s=" + # "fufexan.cachix.org-1:LwCDjCJNJQf5XD2BV+yamQIMZfcKWR9ISIFy5curUsY=" + # "helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs=" + # "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" + # "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + # "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4=" + # "yazi.cachix.org-1:Dcdz63NZKfvUCbDGngQDAZq6kOroIrFoyO064uvLh8k=" + ]; + }; +} diff --git a/system/programs/default.nix b/system/programs/default.nix new file mode 100644 index 0000000..452a60c --- /dev/null +++ b/system/programs/default.nix @@ -0,0 +1,10 @@ +{ + imports = [ + ./fish.nix + ./fonts.nix + ./games.nix + ./home-manager.nix + ./hyprland.nix + ./xdg.nix + ]; +} diff --git a/system/programs/fish.nix b/system/programs/fish.nix new file mode 100644 index 0000000..958da57 --- /dev/null +++ b/system/programs/fish.nix @@ -0,0 +1,3 @@ +{ + programs.fish.enable = true; +} diff --git a/system/programs/fonts.nix b/system/programs/fonts.nix new file mode 100644 index 0000000..0db7b78 --- /dev/null +++ b/system/programs/fonts.nix @@ -0,0 +1,42 @@ +{} +# Migrated to home-manager stylix. +# {pkgs, ...}: { +# fonts = { +# packages = with pkgs; [ +# # icon fonts +# material-symbols +# +# # Sans(Serif) fonts +# libertinus +# noto-fonts +# noto-fonts-cjk-sans +# noto-fonts-emoji +# roboto +# (google-fonts.override {fonts = ["Inter"];}) +# +# # monospace fonts +# jetbrains-mono +# +# # nerdfonts +# nerd-fonts.jetbrains-mono +# nerd-fonts.symbols-only +# ]; +# +# # causes more issues than it solves +# enableDefaultPackages = false; +# +# # user defined fonts +# # the reason there's Noto Color Emoji everywhere is to override DejaVu's +# # B&W emojis that would sometimes show instead of some Color emojis +# fontconfig.defaultFonts = let +# addAll = builtins.mapAttrs (_: v: v ++ ["Noto Color Emoji"]); +# in +# addAll { +# serif = ["Libertinus Serif"]; +# sansSerif = ["Inter"]; +# monospace = ["JetBrains Mono Nerd Font"]; +# emoji = []; +# }; +# }; +# } + diff --git a/system/programs/games.nix b/system/programs/games.nix new file mode 100644 index 0000000..bc9d3ec --- /dev/null +++ b/system/programs/games.nix @@ -0,0 +1,22 @@ +{pkgs, ...}: { + programs = { + gamescope = { + enable = true; + capSysNice = true; + args = [ + "--rt" + "--expose-wayland" + ]; + }; + + steam = { + enable = true; + + extraCompatPackages = [ + pkgs.proton-ge-bin + ]; + + gamescopeSession.enable = true; + }; + }; +} diff --git a/system/programs/home-manager.nix b/system/programs/home-manager.nix new file mode 100644 index 0000000..35db2a1 --- /dev/null +++ b/system/programs/home-manager.nix @@ -0,0 +1,15 @@ +{inputs, specialArgs, config, ...}: { + imports = [ + inputs.hm.nixosModules.default + ]; + + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = specialArgs; + + users.jsw = import ../../home; + }; + + programs.dconf.enable = true; # else gtk-managed stuff won't work +} diff --git a/system/programs/hyprland.nix b/system/programs/hyprland.nix new file mode 100644 index 0000000..6b132c1 --- /dev/null +++ b/system/programs/hyprland.nix @@ -0,0 +1,10 @@ +{pkgs, ...}: { + programs.hyprland = { + enable = true; + withUWSM = true; + }; + environment.systemPackages = [ + pkgs.kitty # This is the default config's terminal and also my main one. + ]; + environment.sessionVariables.NIXOS_OZONE_WL = "1"; # Makes electron apps use wayland. +} diff --git a/system/programs/xdg.nix b/system/programs/xdg.nix new file mode 100644 index 0000000..209796f --- /dev/null +++ b/system/programs/xdg.nix @@ -0,0 +1,14 @@ +{pkgs, ...}: { + xdg.portal = { + enable = true; + xdgOpenUsePortal = true; + config = { + common.default = ["gtk"]; + hyprland.default = ["gtk" "hyprland"]; + }; + + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + ]; + }; +} diff --git a/system/services/default.nix b/system/services/default.nix new file mode 100644 index 0000000..401cbb3 --- /dev/null +++ b/system/services/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./greetd.nix + ./kanata.nix + ./pipewire.nix + ./power.nix + ]; +} diff --git a/system/services/greetd.nix b/system/services/greetd.nix new file mode 100644 index 0000000..47a5684 --- /dev/null +++ b/system/services/greetd.nix @@ -0,0 +1,23 @@ +{ + config, + lib, + ... +}: { + # greetd display manager + services.greetd = let + session = { + command = "${lib.getExe config.programs.uwsm.package} start hyprland-uwsm.desktop"; + user = "jsw"; + }; + in { + enable = true; + + settings = { + terminal.vt = 1; + default_session = session; + initial_session = session; + }; + }; + + programs.uwsm.enable = true; +} diff --git a/system/services/kanata.nix b/system/services/kanata.nix new file mode 100644 index 0000000..22143a1 --- /dev/null +++ b/system/services/kanata.nix @@ -0,0 +1,39 @@ +{ + # keyboard remapping + services.kanata = { + enable = true; + + keyboards.default = { + # i know this config is aweful but it does the job. + config = '' + (defsrc + caps d w e b h j k l + ) + + (deflayer default + @cap _ _ _ _ _ _ _ _ + ) + + (deflayer arrows + _ @tablayer @nextword @nextword @prevword left down up right + ) + + (deflayer tabs + _ _ _ _ _ @tableft _ _ @tabright + ) + + + (defalias + cap (tap-hold-press 170 170 esc (layer-toggle arrows)) + + nextword (multi lctrl right) + prevword (multi lctrl left) + + tablayer (layer-while-held tabs) + tableft (multi lctrl lshift tab) + tabright (multi lctrl tab) + ) + ''; + }; + }; +} diff --git a/system/services/pipewire.nix b/system/services/pipewire.nix new file mode 100644 index 0000000..c715467 --- /dev/null +++ b/system/services/pipewire.nix @@ -0,0 +1,11 @@ +{lib, ...}: { + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + jack.enable = true; + pulse.enable = true; + }; + + services.pulseaudio.enable = lib.mkForce false; +} diff --git a/system/services/power.nix b/system/services/power.nix new file mode 100644 index 0000000..390611b --- /dev/null +++ b/system/services/power.nix @@ -0,0 +1,10 @@ +{ + services = { + logind = { + powerKey = "suspend-then-hibernate"; + powerKeyLongPress = "poweroff"; + }; + upower.enable = true; + power-profiles-daemon.enable = true; + }; +}