From cdffe66d720dbc1b42bbeb1fae1b729b2c4a2e6e Mon Sep 17 00:00:00 2001 From: Hadi <112569860+anotherhadi@users.noreply.github.com> Date: Mon, 29 Jun 2026 17:48:21 +0200 Subject: [PATCH] It's moving --- flake.lock | 930 +++--------------- flake.nix | 32 +- home/programs/desktop-actions/default.nix | 85 ++ home/programs/focus-mode/default.nix | 25 + home/programs/group/basic-apps.nix | 8 +- .../programs/group/cybersecurity-packages.nix | 5 +- home/programs/group/cybersecurity.nix | 3 +- home/programs/group/flake.nix | 3 +- home/programs/group/misc.nix | 7 +- home/programs/nightshift/default.nix | 6 +- home/programs/nvf/default.nix | 6 +- home/programs/nvf/picker.nix | 2 +- home/programs/nvf/utils.nix | 8 - home/programs/proton/auto-start-vpn.nix | 2 +- home/programs/proton/default.nix | 6 +- home/programs/shell/direnv.nix | 8 +- home/programs/shell/eza.nix | 3 +- home/programs/shell/fzf.nix | 2 + home/programs/shell/starship.nix | 2 + home/programs/shell/zoxide.nix | 3 +- home/programs/shell/zsh.nix | 20 +- home/programs/spotatui/default.nix | 4 +- home/programs/thunar/default.nix | 20 +- home/programs/yazi/default.nix | 4 +- home/rofi/default.nix | 186 ---- home/system/caelestia-shell/appearance.nix | 50 - home/system/caelestia-shell/bar.nix | 68 -- home/system/caelestia-shell/default.nix | 80 -- home/system/caelestia-shell/launcher.nix | 188 ---- home/system/caelestia-shell/scheme.nix | 137 --- .../session-gif-hacker-cat.gif | Bin 52409 -> 0 bytes home/system/caelestia-shell/swappy.nix | 11 - home/system/hyprland/bindings.nix | 9 +- home/system/hyprland/default.nix | 59 +- .../default.nix => hyprland/hyprpaper.nix} | 3 +- home/system/hyprland/keyboard-backlight.nix | 44 - home/system/hyprland/polkitagent.nix | 4 +- home/system/hyprlock/default.nix | 85 ++ home/system/mime/default.nix | 55 +- home/system/rofi/default.nix | 136 +++ home/{ => system}/swaync/default.nix | 88 +- home/system/swayosd/default.nix | 68 ++ home/system/waybar/default.nix | 24 +- home/system/waybar/settings.nix | 167 +--- home/system/waybar/style.nix | 141 +-- hosts/laptop/configuration.nix | 2 +- hosts/laptop/flake.nix | 1 + hosts/laptop/home.nix | 11 +- hosts/laptop/secrets/default.nix | 5 +- hosts/work/home.nix | 2 +- hosts/work/secrets/default.nix | 5 +- nixos/amd-graphics.nix | 1 - nixos/audio.nix | 14 +- nixos/home-manager.nix | 1 - nixos/hyprland.nix | 11 +- nixos/nix.nix | 23 - nixos/nvidia.nix | 66 +- nixos/systemd-boot.nix | 10 - nixos/usbguard.nix | 8 +- nixos/utils.nix | 125 +-- themes/nixy.nix | 8 +- todo | 10 + 62 files changed, 953 insertions(+), 2147 deletions(-) create mode 100644 home/programs/desktop-actions/default.nix create mode 100644 home/programs/focus-mode/default.nix delete mode 100644 home/rofi/default.nix delete mode 100644 home/system/caelestia-shell/appearance.nix delete mode 100644 home/system/caelestia-shell/bar.nix delete mode 100644 home/system/caelestia-shell/default.nix delete mode 100644 home/system/caelestia-shell/launcher.nix delete mode 100644 home/system/caelestia-shell/scheme.nix delete mode 100644 home/system/caelestia-shell/session-gif-hacker-cat.gif delete mode 100644 home/system/caelestia-shell/swappy.nix rename home/system/{hyprpaper/default.nix => hyprland/hyprpaper.nix} (86%) delete mode 100644 home/system/hyprland/keyboard-backlight.nix create mode 100644 home/system/hyprlock/default.nix create mode 100644 home/system/rofi/default.nix rename home/{ => system}/swaync/default.nix (77%) create mode 100644 home/system/swayosd/default.nix create mode 100644 todo diff --git a/flake.lock b/flake.lock index 3203282..91e426c 100644 --- a/flake.lock +++ b/flake.lock @@ -1,38 +1,5 @@ { "nodes": { - "aquamarine": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1780756231, - "narHash": "sha256-tXQxKdG5716uB9/LIkLQqQwHKf5mRSpHoZhz3lyI2Cg=", - "owner": "hyprwm", - "repo": "aquamarine", - "rev": "6ecde03f47172753fe5a2f334f9d3facfb7e6784", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "aquamarine", - "type": "github" - } - }, "awesome-wallpapers": { "inputs": { "nixpkgs": "nixpkgs" @@ -196,7 +163,7 @@ "iknowyou", "nixpkgs" ], - "systems": "systems_4", + "systems": "systems_3", "treefmt-nix": "treefmt-nix_3" }, "locked": { @@ -213,100 +180,6 @@ "type": "github" } }, - "caelestia-cli": { - "inputs": { - "caelestia-shell": "caelestia-shell", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1782104807, - "narHash": "sha256-/7jbIblpgaeNuVlAqhJr8vA7Y9DGKb+o2xeLqU5BK70=", - "owner": "caelestia-dots", - "repo": "cli", - "rev": "3c537b90e120f1b4a3e0985239fbcd5de07a3d9f", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "cli", - "type": "github" - } - }, - "caelestia-cli_2": { - "inputs": { - "caelestia-shell": [ - "caelestia-shell" - ], - "nixpkgs": [ - "caelestia-shell", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1781930126, - "narHash": "sha256-AopjjM6497f3Usb6IAZgensjtzGlYGGpJLw7DRtP67I=", - "owner": "caelestia-dots", - "repo": "cli", - "rev": "b00dabaa9351d1383dfba162f5b3575b49a126e1", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "cli", - "type": "github" - } - }, - "caelestia-shell": { - "inputs": { - "caelestia-cli": [ - "caelestia-cli" - ], - "m3shapes": "m3shapes", - "nixpkgs": [ - "caelestia-cli", - "nixpkgs" - ], - "quickshell": "quickshell" - }, - "locked": { - "lastModified": 1782048179, - "narHash": "sha256-8RSk3Jr5Ud+zJKinu4400dz7J0wWBIuqZ2Ulst7IPuI=", - "owner": "caelestia-dots", - "repo": "shell", - "rev": "ddcfd10661e02b53705c0264e982debac04e215e", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "shell", - "type": "github" - } - }, - "caelestia-shell_2": { - "inputs": { - "caelestia-cli": "caelestia-cli_2", - "m3shapes": "m3shapes_2", - "nixpkgs": [ - "nixpkgs" - ], - "quickshell": "quickshell_2" - }, - "locked": { - "lastModified": 1782048179, - "narHash": "sha256-8RSk3Jr5Ud+zJKinu4400dz7J0wWBIuqZ2Ulst7IPuI=", - "owner": "caelestia-dots", - "repo": "shell", - "rev": "ddcfd10661e02b53705c0264e982debac04e215e", - "type": "github" - }, - "original": { - "owner": "caelestia-dots", - "repo": "shell", - "type": "github" - } - }, "crane": { "locked": { "lastModified": 1780532242, @@ -358,22 +231,6 @@ } }, "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1767039857, - "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", - "owner": "NixOS", - "repo": "flake-compat", - "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_2": { "flake": false, "locked": { "lastModified": 1777699697, @@ -444,6 +301,27 @@ } }, "flake-parts_4": { + "inputs": { + "nixpkgs-lib": [ + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733312601, + "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { "inputs": { "nixpkgs-lib": [ "nvf", @@ -464,7 +342,7 @@ "type": "github" } }, - "flake-parts_5": { + "flake-parts_6": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -501,28 +379,6 @@ "type": "github" } }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "hyprland", - "pre-commit-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": { @@ -542,7 +398,9 @@ }, "helium-browser": { "inputs": { - "nixpkgs": "nixpkgs_4" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { "lastModified": 1781783441, @@ -578,331 +436,10 @@ "type": "github" } }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1776511930, - "narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "39435900785d0c560c6ae8777d29f28617d031ef", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, - "hyprgraphics": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1776426399, - "narHash": "sha256-RUESLKNikIeEq9ymGJ6nmcDXiSFQpUW1IhJ245nL3xM=", - "owner": "hyprwm", - "repo": "hyprgraphics", - "rev": "68d064434787cf1ed4a2fe257c03c5f52f33cf84", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprgraphics", - "type": "github" - } - }, - "hyprland": { - "inputs": { - "aquamarine": "aquamarine", - "hyprcursor": "hyprcursor", - "hyprgraphics": "hyprgraphics", - "hyprland-guiutils": "hyprland-guiutils", - "hyprland-protocols": "hyprland-protocols", - "hyprlang": "hyprlang", - "hyprutils": "hyprutils", - "hyprwayland-scanner": "hyprwayland-scanner", - "hyprwire": "hyprwire", - "nixpkgs": "nixpkgs_5", - "pre-commit-hooks": "pre-commit-hooks", - "systems": "systems_3", - "xdph": "xdph" - }, - "locked": { - "lastModified": 1782070887, - "narHash": "sha256-AZvkraDtbqlrWbmmUk+pL2OL7G/L3WEV/Y65ZkAJZNo=", - "ref": "refs/heads/main", - "rev": "5a7078d20a14bb199ef9bb81faa4faeaf5e92117", - "revCount": 7490, - "submodules": true, - "type": "git", - "url": "https://github.com/hyprwm/Hyprland" - }, - "original": { - "submodules": true, - "type": "git", - "url": "https://github.com/hyprwm/Hyprland" - } - }, - "hyprland-guiutils": { - "inputs": { - "aquamarine": [ - "hyprland", - "aquamarine" - ], - "hyprgraphics": [ - "hyprland", - "hyprgraphics" - ], - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "hyprtoolkit": "hyprtoolkit", - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1776426575, - "narHash": "sha256-KI6nIfVihn/DPaeB5Et46Xg3dkNHrrEtUd5LBBVomB0=", - "owner": "hyprwm", - "repo": "hyprland-guiutils", - "rev": "a968d211048e3ed538e47b84cb3649299578f19d", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-guiutils", - "type": "github" - } - }, - "hyprland-protocols": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1772460177, - "narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=", - "owner": "hyprwm", - "repo": "hyprland-protocols", - "rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-protocols", - "type": "github" - } - }, - "hyprlang": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1777320127, - "narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "090117506ddc3d7f26e650ff344d378c2ec329cc", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprtoolkit": { - "inputs": { - "aquamarine": [ - "hyprland", - "hyprland-guiutils", - "aquamarine" - ], - "hyprgraphics": [ - "hyprland", - "hyprland-guiutils", - "hyprgraphics" - ], - "hyprlang": [ - "hyprland", - "hyprland-guiutils", - "hyprlang" - ], - "hyprutils": [ - "hyprland", - "hyprland-guiutils", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprland-guiutils", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "hyprland-guiutils", - "nixpkgs" - ], - "systems": [ - "hyprland", - "hyprland-guiutils", - "systems" - ] - }, - "locked": { - "lastModified": 1772462885, - "narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=", - "owner": "hyprwm", - "repo": "hyprtoolkit", - "rev": "9af245a69fa6b286b88ddfc340afd288e00a6998", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprtoolkit", - "type": "github" - } - }, - "hyprutils": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1780251518, - "narHash": "sha256-fG9xbb1SOAAJ+2kJRakp3ch+BmA/3dEg/K3PoAZTKkw=", - "owner": "hyprwm", - "repo": "hyprutils", - "rev": "40ede2e7bdec80ba5d4c443160d905e9f841ae5f", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprutils", - "type": "github" - } - }, - "hyprwayland-scanner": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1777159683, - "narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=", - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "type": "github" - } - }, - "hyprwire": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1778410714, - "narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=", - "owner": "hyprwm", - "repo": "hyprwire", - "rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwire", - "type": "github" - } - }, "iknowyou": { "inputs": { "bun2nix": "bun2nix_3", - "nixpkgs": "nixpkgs_6", + "nixpkgs": "nixpkgs_4", "nur-osint": "nur-osint" }, "locked": { @@ -964,40 +501,6 @@ "type": "github" } }, - "m3shapes": { - "flake": false, - "locked": { - "lastModified": 1781017666, - "narHash": "sha256-kfHyzZaPHgqZML48OA+5JwBOsLdQJ2ci/aGPShvUB4Y=", - "owner": "soramanew", - "repo": "m3shapes", - "rev": "bdc327b29f95394a732baf3c9b19658ba23755b6", - "type": "github" - }, - "original": { - "owner": "soramanew", - "repo": "m3shapes", - "rev": "bdc327b29f95394a732baf3c9b19658ba23755b6", - "type": "github" - } - }, - "m3shapes_2": { - "flake": false, - "locked": { - "lastModified": 1781017666, - "narHash": "sha256-kfHyzZaPHgqZML48OA+5JwBOsLdQJ2ci/aGPShvUB4Y=", - "owner": "soramanew", - "repo": "m3shapes", - "rev": "bdc327b29f95394a732baf3c9b19658ba23755b6", - "type": "github" - }, - "original": { - "owner": "soramanew", - "repo": "m3shapes", - "rev": "bdc327b29f95394a732baf3c9b19658ba23755b6", - "type": "github" - } - }, "mnw": { "locked": { "lastModified": 1780772958, @@ -1035,7 +538,7 @@ }, "nixarr": { "inputs": { - "nixpkgs": "nixpkgs_7", + "nixpkgs": "nixpkgs_5", "treefmt-nix": "treefmt-nix_4", "vpnconfinement": "vpnconfinement", "website-builder": "website-builder" @@ -1056,19 +559,18 @@ }, "nixos-hardware": { "inputs": { - "nixpkgs": "nixpkgs_8" + "nixpkgs": "nixpkgs_6" }, "locked": { - "lastModified": 1781622756, - "narHash": "sha256-JrPh4M6S7aPsEE9tOENuZrxC6o2szSLlK+t4+nLke9s=", + "lastModified": 1782166108, + "narHash": "sha256-/EtnQBcKbsaCAGQ5VRcplrHRkR4ryqyLMpBfkVuG9Xw=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "08018c72174a4df5657f8d94178ac69fb9c243e5", + "rev": "875776f0252fcb8618bb948640a0d1f7a5b362be", "type": "github" }, "original": { "owner": "NixOS", - "ref": "master", "repo": "nixos-hardware", "type": "github" } @@ -1136,59 +638,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1781509190, - "narHash": "sha256-uJZs9Di8I6ciTp6jiojj0HzlNpBkud8ax5aT/O5aJkw=", + "lastModified": 1782116945, + "narHash": "sha256-G3tw/IXmaH6IQ2upZvhuN9sG8CkuX+BLuJDpE8hz0Ds=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d6df3513510aa548c83868fd22bfddd0a8c0a0d4", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-25.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_10": { - "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_11": { - "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_12": { - "locked": { - "lastModified": 1781216227, - "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "rev": "34268251cf5547d39063f2c5ea9a196246f7f3a6", "type": "github" }, "original": { @@ -1198,38 +652,6 @@ "type": "github" } }, - "nixpkgs_13": { - "locked": { - "lastModified": 1775888245, - "narHash": "sha256-nwASzrRDD1JBEu/o8ekKYEXm/oJW6EMCzCRdrwcLe90=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "13043924aaa7375ce482ebe2494338e058282925", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_14": { - "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs_2": { "locked": { "lastModified": 1776548001, @@ -1263,38 +685,6 @@ } }, "nixpkgs_4": { - "locked": { - "lastModified": 1777578337, - "narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "15f4ee454b1dce334612fa6843b3e05cf546efab", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_5": { - "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_6": { "locked": { "lastModified": 1775710090, "narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=", @@ -1310,7 +700,7 @@ "type": "github" } }, - "nixpkgs_7": { + "nixpkgs_5": { "locked": { "lastModified": 1775595990, "narHash": "sha256-OEf7YqhF9IjJFYZJyuhAypgU+VsRB5lD4DuiMws5Ltc=", @@ -1326,7 +716,7 @@ "type": "github" } }, - "nixpkgs_8": { + "nixpkgs_6": { "locked": { "lastModified": 1767892417, "narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=", @@ -1339,7 +729,7 @@ "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz" } }, - "nixpkgs_9": { + "nixpkgs_7": { "locked": { "lastModified": 1781577229, "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", @@ -1355,10 +745,28 @@ "type": "github" } }, + "nixpkgs_8": { + "locked": { + "lastModified": 1781216227, + "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, "notashelf-tuigreet": { "inputs": { "crane": "crane", - "nixpkgs": "nixpkgs_10", + "nixpkgs": [ + "nixpkgs" + ], "rust-overlay": "rust-overlay" }, "locked": { @@ -1377,44 +785,22 @@ }, "nur": { "inputs": { - "flake-parts": [ - "stylix", - "flake-parts" - ], + "flake-parts": "flake-parts_4", "nixpkgs": [ - "stylix", "nixpkgs" ] }, "locked": { - "lastModified": 1780281641, - "narHash": "sha256-M/+hUKoKbHXpV0xGVfELbN1Ds1aoe3pL5p5/t46YhVo=", + "lastModified": 1782288426, + "narHash": "sha256-SNJtZSWJ4/ZGmD2PCpbpOggNugnNs917knMbmUi+1oU=", "owner": "nix-community", - "repo": "NUR", - "rev": "30f9ae2f04174de63ba8bcf3580ca90843b28a01", + "repo": "nur", + "rev": "b944f4918bc67344f4c9253ea4b72cddda85a9d7", "type": "github" }, "original": { "owner": "nix-community", - "repo": "NUR", - "type": "github" - } - }, - "nur-anotherhadi": { - "inputs": { - "nixpkgs": "nixpkgs_11" - }, - "locked": { - "lastModified": 1781028989, - "narHash": "sha256-wN9iKLIUrD1xOTKB2GXsTBlXYsByL/Tk0hk/KPh0/vw=", - "owner": "anotherhadi", - "repo": "nur-packages", - "rev": "afedd9b527fc7f0e418e6384fa581d8bb7564675", - "type": "github" - }, - "original": { - "owner": "anotherhadi", - "repo": "nur-packages", + "repo": "nur", "type": "github" } }, @@ -1439,13 +825,38 @@ "type": "github" } }, + "nur_2": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1780281641, + "narHash": "sha256-M/+hUKoKbHXpV0xGVfELbN1Ds1aoe3pL5p5/t46YhVo=", + "owner": "nix-community", + "repo": "NUR", + "rev": "30f9ae2f04174de63ba8bcf3580ca90843b28a01", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "nvf": { "inputs": { - "flake-compat": "flake-compat_2", - "flake-parts": "flake-parts_4", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts_5", "mnw": "mnw", - "nixpkgs": "nixpkgs_12", - "systems": "systems_5" + "nixpkgs": "nixpkgs_8", + "systems": "systems_4" }, "locked": { "lastModified": 1781997110, @@ -1461,90 +872,21 @@ "type": "github" } }, - "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat", - "gitignore": "gitignore", - "nixpkgs": [ - "hyprland", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1778507602, - "narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, - "quickshell": { - "inputs": { - "nixpkgs": [ - "caelestia-cli", - "caelestia-shell", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1781847791, - "narHash": "sha256-Mo2YtNEGlcySnbq0YuP3nUKMAQCMAfE+TcCffo5vzD8=", - "ref": "refs/heads/master", - "rev": "68c2c85c33845385f7ab8147b32f1450b1e468e0", - "revCount": 824, - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - }, - "original": { - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - } - }, - "quickshell_2": { - "inputs": { - "nixpkgs": [ - "caelestia-shell", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1781847791, - "narHash": "sha256-Mo2YtNEGlcySnbq0YuP3nUKMAQCMAfE+TcCffo5vzD8=", - "ref": "refs/heads/master", - "rev": "68c2c85c33845385f7ab8147b32f1450b1e468e0", - "revCount": 824, - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - }, - "original": { - "type": "git", - "url": "https://git.outfoxxed.me/outfoxxed/quickshell" - } - }, "root": { "inputs": { "awesome-wallpapers": "awesome-wallpapers", "blog": "blog", - "caelestia-cli": "caelestia-cli", - "caelestia-shell": "caelestia-shell_2", "default-creds": "default-creds", "helium-browser": "helium-browser", "home-manager": "home-manager", - "hyprland": "hyprland", "iknowyou": "iknowyou", "nix-index-database": "nix-index-database", "nixarr": "nixarr", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_9", + "nixpkgs": "nixpkgs_7", "nixpkgs-stable": "nixpkgs-stable", "notashelf-tuigreet": "notashelf-tuigreet", - "nur-anotherhadi": "nur-anotherhadi", + "nur": "nur", "nvf": "nvf", "sops-nix": "sops-nix", "stylix": "stylix" @@ -1573,7 +915,9 @@ }, "sops-nix": { "inputs": { - "nixpkgs": "nixpkgs_13" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { "lastModified": 1781943681, @@ -1596,11 +940,13 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_5", + "flake-parts": "flake-parts_6", "gnome-shell": "gnome-shell", - "nixpkgs": "nixpkgs_14", - "nur": "nur", - "systems": "systems_6", + "nixpkgs": [ + "nixpkgs" + ], + "nur": "nur_2", + "systems": "systems_5", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", "tinted-tmux": "tinted-tmux", @@ -1609,13 +955,13 @@ "locked": { "lastModified": 1781997134, "narHash": "sha256-muBZG4O/agq/ljgHr6c3AsobIWgODAS6vf50xIS7o+Q=", - "owner": "danth", + "owner": "nix-community", "repo": "stylix", "rev": "a6a493119e492e15874caf6f7f8c7e572e64c655", "type": "github" }, "original": { - "owner": "danth", + "owner": "nix-community", "repo": "stylix", "type": "github" } @@ -1652,16 +998,16 @@ }, "systems_3": { "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { "owner": "nix-systems", - "repo": "default-linux", + "repo": "default", "type": "github" } }, @@ -1695,21 +1041,6 @@ "type": "github" } }, - "systems_6": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "tinted-kitty": { "flake": false, "locked": { @@ -1896,47 +1227,6 @@ "repo": "website-builder", "type": "github" } - }, - "xdph": { - "inputs": { - "hyprland-protocols": [ - "hyprland", - "hyprland-protocols" - ], - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1780133819, - "narHash": "sha256-0YPKIY3dlnR7SPq7Z8ekFVvzFsfeiAtEj+QUI3KHrlI=", - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "rev": "4a170c0ba96fd37374f93d8f91c9ed91814828ac", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index a35bc0a..3170a61 100644 --- a/flake.nix +++ b/flake.nix @@ -7,16 +7,13 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.11"; - nixos-hardware.url = "github:NixOS/nixos-hardware/master"; - hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; - stylix.url = "github:danth/stylix"; - sops-nix.url = "github:Mic92/sops-nix"; + nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-26.05"; + nixos-hardware.url = "github:NixOS/nixos-hardware"; nvf.url = "github:notashelf/nvf"; - notashelf-tuigreet.url = "github:NotAShelf/tuigreet"; - helium-browser.url = "github:oxcl/nix-flake-helium-browser"; - nur-anotherhadi.url = "github:anotherhadi/nur-packages"; - + nur = { + url = "github:nix-community/nur"; + inputs.nixpkgs.follows = "nixpkgs"; + }; nix-index-database = { url = "github:nix-community/nix-index-database"; inputs.nixpkgs.follows = "nixpkgs"; @@ -25,12 +22,20 @@ url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; - caelestia-shell = { - url = "github:caelestia-dots/shell"; + stylix = { + url = "github:nix-community/stylix"; inputs.nixpkgs.follows = "nixpkgs"; }; - caelestia-cli = { - url = "github:caelestia-dots/cli"; + sops-nix = { + url = "github:Mic92/sops-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + notashelf-tuigreet = { + url = "github:NotAShelf/tuigreet"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + helium-browser = { + url = "github:oxcl/nix-flake-helium-browser"; inputs.nixpkgs.follows = "nixpkgs"; }; @@ -57,7 +62,6 @@ pkgs ; pkgs-stable = nixpkgs-stable.legacyPackages.${system}; - pkgs-nur-hadi = inputs.nur-anotherhadi.packages.${system}; }; merge = nixpkgs.lib.foldl nixpkgs.lib.recursiveUpdate {}; in diff --git a/home/programs/desktop-actions/default.nix b/home/programs/desktop-actions/default.nix new file mode 100644 index 0000000..d7aaffb --- /dev/null +++ b/home/programs/desktop-actions/default.nix @@ -0,0 +1,85 @@ +{pkgs, ...}: let + waybar-toggle = pkgs.writeShellScriptBin "waybar-toggle" '' + if pidof waybar > /dev/null; then + pkill waybar + else + hyprctl dispatch exec waybar + fi + ''; +in { + home.packages = [waybar-toggle]; + + xdg.desktopEntries = { + focus-toggle = { + name = "Focus Mode"; + exec = "focus-toggle"; + icon = "do-not-disturb-symbolic"; + comment = "Toggle focus mode"; + categories = ["System"]; + terminal = false; + }; + + nightshift-toggle = { + name = "Night Shift"; + exec = "nightshift-toggle"; + icon = "night-light-symbolic"; + comment = "Toggle night shift"; + categories = ["System"]; + terminal = false; + }; + + mic-mute = { + name = "Mute Microphone"; + exec = "swayosd-client --input-volume mute-toggle"; + icon = "microphone-sensitivity-muted-symbolic"; + comment = "Toggle microphone mute"; + categories = ["System"]; + terminal = false; + }; + + lock = { + name = "Lock"; + exec = "hyprlock"; + icon = "system-lock-screen-symbolic"; + comment = "Lock the screen"; + categories = ["System"]; + terminal = false; + }; + + reboot = { + name = "Reboot"; + exec = "systemctl reboot"; + icon = "system-restart-symbolic"; + comment = "Restart the system"; + categories = ["System"]; + terminal = false; + }; + + shutdown = { + name = "Shutdown"; + exec = "systemctl poweroff"; + icon = "system-shutdown-symbolic"; + comment = "Power off the system"; + categories = ["System"]; + terminal = false; + }; + + hibernate = { + name = "Hibernate"; + exec = "systemctl hibernate"; + icon = "drive-harddisk-symbolic"; + comment = "Hibernate the system"; + categories = ["System"]; + terminal = false; + }; + + waybar-toggle = { + name = "Toggle Waybar"; + exec = "waybar-toggle"; + icon = "panel-applets-symbolic"; + comment = "Show or hide the status bar"; + categories = ["System"]; + terminal = false; + }; + }; +} diff --git a/home/programs/focus-mode/default.nix b/home/programs/focus-mode/default.nix new file mode 100644 index 0000000..3c8fad4 --- /dev/null +++ b/home/programs/focus-mode/default.nix @@ -0,0 +1,25 @@ +{pkgs, ...}: let + focus-toggle = + pkgs.writeShellScriptBin "focus-toggle" + # bash + '' + if test -f /tmp/hypr-focus-mode; then + rm /tmp/hypr-focus-mode + hyprctl reload + hyprctl dispatch exec waybar + swayosd-client --custom-message "Focus Mode Off" --custom-icon "do-not-disturb-symbolic" + else + touch /tmp/hypr-focus-mode + pkill waybar || true + hyprctl keyword animations:enabled false + hyprctl keyword general:gaps_in 0 + hyprctl keyword general:gaps_out 0 + hyprctl keyword decoration:active_opacity 1 + hyprctl keyword decoration:inactive_opacity 1 + hyprctl keyword decoration:rounding 0 + swayosd-client --custom-message "Focus Mode On" --custom-icon "do-not-disturb-symbolic" + fi + ''; +in { + home.packages = [focus-toggle]; +} diff --git a/home/programs/group/basic-apps.nix b/home/programs/group/basic-apps.nix index 769cea0..1ede123 100644 --- a/home/programs/group/basic-apps.nix +++ b/home/programs/group/basic-apps.nix @@ -1,7 +1,6 @@ { pkgs, pkgs-stable, - pkgs-nur-hadi, ... }: { home.packages = with pkgs-stable; [ @@ -20,7 +19,6 @@ # I love TUIs caligula # User-friendly, lightweight TUI for disk imaging (ISO, USB BOOT) - browsh # A modern text-based browser that renders anything that a modern browser can. It runs in a terminal and can be used remotely over SSH dysk # A terminal-based disk usage analyzer wikiman # Offline search engine for manual pages (arch wiki, tldr) tealdeer # Fast tldr client @@ -28,9 +26,11 @@ wiremix # Simple TUI mixer for PipeWire slides # A terminal-based presentation tool that allows you to create and deliver presentations directly from the command line pom # Pomodoro timer in your terminal + tabiew # A terminal-based CSV viewer and manipulator + jless # A pager for JSON pkgs.wifitui # TUI for managing wifi - pkgs-nur-hadi.usbguard-tui # TUI for managing USBGuard rules - pkgs-nur-hadi.sheets # Terminal based spreadsheet tool + pkgs.nur.repos.anotherhadi.usbguard-tui # TUI for managing USBGuard rules + pkgs.nur.repos.anotherhadi.sheets # Terminal based spreadsheet tool # I love CLIs httpie # Command-line HTTP client, a user-friendly cURL replacement diff --git a/home/programs/group/cybersecurity-packages.nix b/home/programs/group/cybersecurity-packages.nix index c0e9af5..33501e6 100644 --- a/home/programs/group/cybersecurity-packages.nix +++ b/home/programs/group/cybersecurity-packages.nix @@ -1,7 +1,6 @@ { pkgs, pkgs-stable, - pkgs-nur-hadi, }: (with pkgs-stable; [ # Web @@ -25,7 +24,6 @@ # Network inetutils termshark # wireshark in TUI - dnsrecon whois dig nmap @@ -42,7 +40,8 @@ # Forensics binwalk ]) -++ (with pkgs-nur-hadi; [ +++ [ pkgs.dnsrecon ] +++ (with pkgs.nur.repos.anotherhadi; [ spilltea jwt-tui ]) diff --git a/home/programs/group/cybersecurity.nix b/home/programs/group/cybersecurity.nix index cc569cb..afc37da 100644 --- a/home/programs/group/cybersecurity.nix +++ b/home/programs/group/cybersecurity.nix @@ -1,11 +1,10 @@ { pkgs, pkgs-stable, - pkgs-nur-hadi, ... }: { home.packages = import ./cybersecurity-packages.nix { - inherit pkgs pkgs-stable pkgs-nur-hadi; + inherit pkgs pkgs-stable; }; systemd.user.tmpfiles.rules = [ diff --git a/home/programs/group/flake.nix b/home/programs/group/flake.nix index 934e475..148de11 100644 --- a/home/programs/group/flake.nix +++ b/home/programs/group/flake.nix @@ -2,12 +2,11 @@ inputs, pkgs, pkgs-stable, - pkgs-nur-hadi, system, ... }: let devPackages = import ./dev-packages.nix {inherit pkgs pkgs-stable;}; - cyberPackages = import ./cybersecurity-packages.nix {inherit pkgs pkgs-stable pkgs-nur-hadi;}; + cyberPackages = import ./cybersecurity-packages.nix {inherit pkgs pkgs-stable;}; in { packages.${system} = { dev = pkgs.buildEnv { diff --git a/home/programs/group/misc.nix b/home/programs/group/misc.nix index 436a462..ddf112b 100644 --- a/home/programs/group/misc.nix +++ b/home/programs/group/misc.nix @@ -1,9 +1,4 @@ -{ - pkgs-stable, - pkgs-nur-hadi, - inputs, - ... -}: { +{pkgs-stable, ...}: { home.packages = with pkgs-stable; [ tty-solitaire bastet diff --git a/home/programs/nightshift/default.nix b/home/programs/nightshift/default.nix index 749adc3..07101c3 100644 --- a/home/programs/nightshift/default.nix +++ b/home/programs/nightshift/default.nix @@ -3,12 +3,12 @@ pkgs.writeShellScriptBin "nightshift-toggle" # bash '' - if pidof "hyprsunset"; then + if pidof "hyprsunset" > /dev/null; then pkill hyprsunset - ${pkgs.libnotify}/bin/notify-send "Night Shift Disabled" "Returning to full spectrum light. Filter disabled." + swayosd-client --custom-message "Night Shift Off" --custom-icon "night-light-symbolic" else ${pkgs.hyprsunset}/bin/hyprsunset -t 4500 & - ${pkgs.libnotify}/bin/notify-send "Night Shift Activated" "Welcome to the warm side. Blue light filtering is now active." + swayosd-client --custom-message "Night Shift On" --custom-icon "night-light-symbolic" fi ''; in { diff --git a/home/programs/nvf/default.nix b/home/programs/nvf/default.nix index e400962..d0acf43 100644 --- a/home/programs/nvf/default.nix +++ b/home/programs/nvf/default.nix @@ -1,12 +1,16 @@ { inputs, - pkgs, config, ... }: let c = config.lib.stylix.colors; in { imports = [inputs.nvf.homeManagerModules.default]; + + home.sessionVariables = { + EDITOR = "nvim"; + }; + programs.nvf = { enable = true; settings = { diff --git a/home/programs/nvf/picker.nix b/home/programs/nvf/picker.nix index eae7de3..8ef37d6 100644 --- a/home/programs/nvf/picker.nix +++ b/home/programs/nvf/picker.nix @@ -18,7 +18,7 @@ desc = "Smart Find Files"; } { - key = "E"; + key = "e"; mode = "n"; silent = true; action = "lua Snacks.explorer()"; diff --git a/home/programs/nvf/utils.nix b/home/programs/nvf/utils.nix index 57647fa..200ffde 100644 --- a/home/programs/nvf/utils.nix +++ b/home/programs/nvf/utils.nix @@ -5,15 +5,7 @@ vim.keymap.del("n", "tdt") ''; undoFile.enable = true; - utility.yazi-nvim = { - enable = true; - mappings.openYazi = "e"; - }; notes.todo-comments.enable = true; - assistant.copilot = { - enable = true; - cmp.enable = true; - }; autocomplete = { nvim-cmp = { diff --git a/home/programs/proton/auto-start-vpn.nix b/home/programs/proton/auto-start-vpn.nix index 6222d7f..3ce0e98 100644 --- a/home/programs/proton/auto-start-vpn.nix +++ b/home/programs/proton/auto-start-vpn.nix @@ -1,5 +1,5 @@ { wayland.windowManager.hyprland.settings.exec-once = [ - "protonvpn-app --start-minimized &" + "protonvpn-app --start-minimized" ]; } diff --git a/home/programs/proton/default.nix b/home/programs/proton/default.nix index 2473a57..e39af53 100644 --- a/home/programs/proton/default.nix +++ b/home/programs/proton/default.nix @@ -1,9 +1,9 @@ { - pkgs, + pkgs-stable, config, ... }: { - home.packages = with pkgs; [ + home.packages = with pkgs-stable; [ proton-vpn proton-pass proton-authenticator @@ -13,7 +13,7 @@ xdg.desktopEntries = { "Proton Authenticator" = { name = "Proton Authenticator"; - exec = "env WEBKIT_DISABLE_COMPOSITING_MODE=1 ${pkgs.proton-authenticator}/bin/proton-authenticator"; + exec = "env WEBKIT_DISABLE_COMPOSITING_MODE=1 ${pkgs-stable.proton-authenticator}/bin/proton-authenticator"; icon = "proton-authenticator"; type = "Application"; categories = ["Utility"]; diff --git a/home/programs/shell/direnv.nix b/home/programs/shell/direnv.nix index 2b51c9d..eddd32f 100644 --- a/home/programs/shell/direnv.nix +++ b/home/programs/shell/direnv.nix @@ -1,6 +1,10 @@ -{ +{pkgs-stable, ...}: { programs.direnv = { enable = true; - nix-direnv.enable = true; + package = pkgs-stable.direnv; + nix-direnv = { + enable = true; + package = pkgs-stable.nix-direnv; + }; }; } diff --git a/home/programs/shell/eza.nix b/home/programs/shell/eza.nix index dbf4c51..d0ff56d 100644 --- a/home/programs/shell/eza.nix +++ b/home/programs/shell/eza.nix @@ -1,7 +1,8 @@ # Eza is a ls replacement -{ +{pkgs-stable, ...}: { programs.eza = { enable = true; + package = pkgs-stable.eza; icons = "auto"; extraOptions = [ diff --git a/home/programs/shell/fzf.nix b/home/programs/shell/fzf.nix index 9ad8965..bc53ef0 100644 --- a/home/programs/shell/fzf.nix +++ b/home/programs/shell/fzf.nix @@ -1,5 +1,6 @@ # Fzf is a general-purpose command-line fuzzy finder. { + pkgs-stable, config, lib, ... @@ -10,6 +11,7 @@ in { programs.fzf = { enable = true; + package = pkgs-stable.fzf; enableZshIntegration = true; colors = lib.mkForce { "fg+" = accent; diff --git a/home/programs/shell/starship.nix b/home/programs/shell/starship.nix index bffc163..90088ea 100644 --- a/home/programs/shell/starship.nix +++ b/home/programs/shell/starship.nix @@ -1,5 +1,6 @@ # starship is a minimal, fast, and extremely customizable prompt for any shell! { + pkgs-stable, config, lib, ... @@ -9,6 +10,7 @@ in { programs.starship = { enable = true; + package = pkgs-stable.starship; settings = { add_newline = true; format = lib.concatStrings [ diff --git a/home/programs/shell/zoxide.nix b/home/programs/shell/zoxide.nix index 4bf8749..0308ca6 100644 --- a/home/programs/shell/zoxide.nix +++ b/home/programs/shell/zoxide.nix @@ -1,7 +1,8 @@ # Zoxide is a cd replacement -{ +{pkgs-stable, ...}: { programs.zoxide = { enable = true; + package = pkgs-stable.zoxide; enableZshIntegration = true; }; } diff --git a/home/programs/shell/zsh.nix b/home/programs/shell/zsh.nix index f7055be..f043388 100644 --- a/home/programs/shell/zsh.nix +++ b/home/programs/shell/zsh.nix @@ -1,20 +1,20 @@ # My shell configuration { - pkgs, + pkgs-stable, lib, config, ... }: { - home.packages = with pkgs; [ + home.packages = with pkgs-stable; [ bat ripgrep ]; - # Add go binaries to the PATH - home.sessionPath = ["$HOME/go/bin"]; - - home.sessionVariables = { - COLORTERM = "truecolor"; + home = { + sessionPath = ["$HOME/go/bin"]; + sessionVariables = { + COLORTERM = "truecolor"; + }; }; programs.zsh = { @@ -59,7 +59,7 @@ v = "nvim"; c = "clear"; e = "exit"; - open = "${pkgs.xdg-utils}/bin/xdg-open"; + open = "${pkgs-stable.xdg-utils}/bin/xdg-open"; notes = "nvim ~/notes/index.md --cmd 'cd ~/notes' -c ':lua Snacks.picker.smart()'"; nix-shell = "nix-shell --command zsh"; @@ -99,7 +99,9 @@ bindkey '^X' edit-command-line # Suffix Aliases - alias -s {nix,md,txt,json,yml,yaml,go}=nvim + alias -s {nix,md,txt,yml,yaml,go}=nvim + alias -s {json,jsonl}=jless + alias -s {csv,tsv,parquet,pqt,arrow,db,sqlite,xls,xlsx,xlsm,xlsb,fwf}=tw alias -s {png,jpg,jpeg,gif,pdf}=xdg-open # 3. Global Aliases (Remplacés n'importe où dans la commande, pas seulement au début) diff --git a/home/programs/spotatui/default.nix b/home/programs/spotatui/default.nix index 70c61ab..8555728 100644 --- a/home/programs/spotatui/default.nix +++ b/home/programs/spotatui/default.nix @@ -1,13 +1,13 @@ # Spotatui is a terminal user interface for Spotify, written in Rust. It allows you to control your Spotify playback and manage your playlists directly from the terminal. { config, - pkgs, + pkgs-stable, ... }: let c = config.lib.stylix.colors; rgb = base: "${c."${base}-rgb-r"}, ${c."${base}-rgb-g"}, ${c."${base}-rgb-b"}"; in { - home.packages = with pkgs; [ + home.packages = with pkgs-stable; [ spotatui ]; diff --git a/home/programs/thunar/default.nix b/home/programs/thunar/default.nix index b977f6b..32157f6 100644 --- a/home/programs/thunar/default.nix +++ b/home/programs/thunar/default.nix @@ -1,6 +1,5 @@ # Thunar is a file explorer { - pkgs, pkgs-stable, config, lib, @@ -11,17 +10,16 @@ in { # ctrl + m to toggle the menubar home.packages = (with pkgs-stable; [ - xfce.thunar - xfce.xfconf - xfce.tumbler - xfce.thunar-archive-plugin - xfce.thunar-volman - xfce.thunar-media-tags-plugin + thunar + xfconf + tumbler + thunar-archive-plugin + thunar-volman + thunar-media-tags-plugin p7zip xarchiver ]) - ++ (with pkgs; [ - # Icon themes: keep on global pkgs to avoid conflicts with other modules + ++ (with pkgs-stable; [ papirus-icon-theme material-icons material-design-icons @@ -32,7 +30,7 @@ in { enable = true; iconTheme = { name = "Papirus-Dark"; - package = pkgs.papirus-icon-theme; + package = pkgs-stable.papirus-icon-theme; }; # bookmarks for the side pane @@ -47,7 +45,7 @@ in { qt.enable = true; home.sessionVariables = { - XDG_ICON_DIR = "${pkgs.papirus-icon-theme}/share/icons/Papirus"; + XDG_ICON_DIR = "${pkgs-stable.papirus-icon-theme}/share/icons/Papirus"; QS_ICON_THEME = "Papirus"; QT_STYLE_OVERRIDE = lib.mkForce "Fusion"; }; diff --git a/home/programs/yazi/default.nix b/home/programs/yazi/default.nix index 1c72124..40460e0 100644 --- a/home/programs/yazi/default.nix +++ b/home/programs/yazi/default.nix @@ -1,4 +1,4 @@ -{pkgs, ...}: { +{pkgs, pkgs-stable, ...}: { programs.yazi = { enable = true; shellWrapperName = "y"; @@ -108,7 +108,7 @@ ]; }; - home.packages = with pkgs; [glow ouch hexyl exiftool fzf wl-clipboard]; + home.packages = with pkgs-stable; [glow ouch hexyl exiftool wl-clipboard]; xdg.configFile."yazi/plugins/toggle-parent.yazi/main.lua".text = '' --- @sync entry diff --git a/home/rofi/default.nix b/home/rofi/default.nix deleted file mode 100644 index de65905..0000000 --- a/home/rofi/default.nix +++ /dev/null @@ -1,186 +0,0 @@ -{ config, pkgs, ... }: let - c = config.lib.stylix.colors; - font = config.stylix.fonts.sansSerif.name; - theme = pkgs.writeText "launcher.rasi" '' - configuration { - modi: "drun,run,window"; - case-sensitive: false; - cycle: true; - normalize-match: true; - show-icons: true; - matching: "normal"; - tokenize: true; - kb-cancel: "Escape,MousePrimary"; - drun-match-fields: "name,exec,generic,comment"; - drun-display-format: "{name} \n[{comment}]"; - drun-url-launcher: "xdg-open"; - drun-show-actions: false; - disable-history: false; - sorting-method: "normal"; - terminal: "ghostty"; - hover-select: true; - me-select-entry: ""; - me-accept-entry: [ "MousePrimary" ]; - timeout { - action: "kb-cancel"; - delay: 0; - } - } - - * { - background: #${c.base00}e5; - background-alt: #${c.base01}ff; - background-sec: #${c.base03}ff; - foreground: #${c.base05}ff; - selected: #${c.base05}ff; - active: #${c.base0B}ff; - urgent: #${c.base08}ff; - highlight: #${c.base03}28; - font: "${font}, bold 12"; - } - - window { - transparency: "real"; - location: west; - anchor: west; - padding: 0; - margin: 5px; - border-radius: 15px; - width: 450px; - height: 100%; - background-color: @background; - } - - mainbox { - border-radius: 0; - margin: 0; - spacing: 10px; - padding: 10px; - background-color: transparent; - children: [ "inputbar", "message", "listview", "mode-switcher" ]; - } - - inputbar { - spacing: 10px; - margin: 0px; - padding: 10px 15px; - border-radius: 16px; - background-color: @background-alt; - color: @foreground; - children: [ "entry" ]; - } - - entry { - background-color: inherit; - color: inherit; - placeholder-color: inherit; - placeholder: "Search..."; - } - - listview { - columns: 1; - dynamic: true; - scrollbar: false; - layout: vertical; - reverse: false; - fixed-height: true; - fixed-columns: true; - spacing: 5px; - margin: 0px; - padding: 10px 8px; - border-radius: 16px; - background-color: @background-alt; - color: @foreground; - } - - element { - enabled: true; - spacing: 8px; - margin: 0px; - padding: 3px 10px; - border-radius: 16px; - background-color: transparent; - color: @foreground; - cursor: pointer; - } - - element selected.normal { - background-color: @highlight; - } - - element-icon { - background-color: transparent; - size: 26px; - margin: 0 5px 0 0; - color: inherit; - cursor: inherit; - } - - element-text { - background-color: transparent; - color: inherit; - cursor: inherit; - padding: 10px 0; - vertical-align: 0.5; - } - - mode-switcher { - enabled: true; - spacing: 8px; - margin: 0px; - border-radius: 16px; - padding: 8px 18px; - background-color: @background-alt; - color: @foreground; - } - - button { - padding: 10px; - margin: 0; - border: 0px solid; - border-radius: 16px; - background-color: @highlight; - color: inherit; - cursor: pointer; - } - - button selected { - background-color: @foreground; - color: @background; - } - - message { - enabled: true; - margin: 0px; - padding: 0px; - border-radius: 0px; - background-color: transparent; - color: @foreground; - } - - textbox { - padding: 8px; - border-radius: 4px; - background-color: @background-alt; - color: @foreground; - placeholder-color: @foreground; - vertical-align: 0.5; - blink: true; - markup: true; - } - - error-message { - padding: 10px; - border-radius: 0px; - background-color: @background; - color: @foreground; - } - ''; -in { - stylix.targets.rofi.enable = false; - - programs.rofi = { - enable = true; - theme = "${theme}"; - }; -} diff --git a/home/system/caelestia-shell/appearance.nix b/home/system/caelestia-shell/appearance.nix deleted file mode 100644 index f80a0c9..0000000 --- a/home/system/caelestia-shell/appearance.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ - pkgs, - config, - ... -}: let - inherit (config.theme) bar-rounding bar-thickness; - inherit (config.stylix) fonts; -in { - home.packages = with pkgs; [ - papirus-icon-theme - ]; - - programs.caelestia.settings = { - paths.sessionGif = ./session-gif-hacker-cat.gif; - background.enabled = false; - appearance = { - transparency = { - enabled = true; - base = config.theme.active-opacity; - layers = config.theme.inactive-opacity; - }; - font.family = { - material = "Material Symbols Rounded"; - mono = fonts.monospace.name; - sans = fonts.sansSerif.name; - }; - }; - utilities = { - enabled = true; - maxToasts = 4; - toasts = { - audioInputChanged = false; - audioOutputChanged = false; - capsLockChanged = false; - chargingChanged = true; - configLoaded = false; - dndChanged = true; - gameModeChanged = true; - numLockChanged = false; - nowPlaying = false; - kbLayoutChanged = false; - }; - }; - dashboard.showOnHover = false; - border = { - rounding = bar-rounding; - thickness = bar-thickness; - }; - }; -} diff --git a/home/system/caelestia-shell/bar.nix b/home/system/caelestia-shell/bar.nix deleted file mode 100644 index 532c4f4..0000000 --- a/home/system/caelestia-shell/bar.nix +++ /dev/null @@ -1,68 +0,0 @@ -{ - programs.caelestia.settings.bar = { - clock.showIcon = false; - popouts.activeWindow = false; - persistent = true; - status = { - showBattery = true; - showMicrophone = false; - showLockStatus = false; - showBluetooth = true; - showAudio = true; - showKbLayout = false; - showNetwork = true; - }; - workspaces = { - activeIndicator = true; - activeLabel = "󰪥 "; - activeTrail = false; - label = " "; - occupiedBg = true; - occupiedLabel = "󰪥 "; - showWindows = false; - shown = 5; - }; - entries = [ - { - id = "logo"; - enabled = true; - } - { - id = "workspaces"; - enabled = true; - } - { - id = "spacer"; - enabled = true; - } - { - id = "activeWindow"; - enabled = true; - } - { - id = "spacer"; - enabled = true; - } - { - id = "tray"; - enabled = true; - } - { - id = "clock"; - enabled = true; - } - { - id = "statusIcons"; - enabled = true; - } - { - id = "power"; - enabled = true; - } - ]; - tray = { - background = false; - recolour = false; - }; - }; -} diff --git a/home/system/caelestia-shell/default.nix b/home/system/caelestia-shell/default.nix deleted file mode 100644 index b7c4e94..0000000 --- a/home/system/caelestia-shell/default.nix +++ /dev/null @@ -1,80 +0,0 @@ -# Caelestia Shell Home Manager Configuration -# See https://github.com/caelestia-dots/shell -{ - pkgs, - inputs, - lib, - ... -}: { - imports = [ - inputs.caelestia-shell.homeManagerModules.default - ./bar.nix - ./launcher.nix - ./appearance.nix - ./scheme.nix - ./swappy.nix - ]; - - programs.caelestia = { - enable = true; - systemd.enable = false; - settings = { - services.weatherLocation = "Paris"; - general = { - apps = { - terminal = ["ghostty"]; - audio = ["pavucontrol"]; - explorer = ["thunar"]; - }; - idle = { - timeouts = []; - }; - }; - }; - cli = { - enable = true; - settings.theme = { - enableTerm = false; - enableDiscord = false; - enableSpicetify = false; - enableBtop = false; - enableCava = false; - enableHypr = false; - enableGtk = false; - enableQt = false; - }; - }; - }; - - home.packages = with pkgs; [ - gpu-screen-recorder - ]; - - wayland.windowManager.hyprland.settings.exec-once = [ - "uwsm app -- caelestia resizer -d" - "uwsm app -- caelestia shell -d" - "caelestia scheme set -n onedark" - "caelestia scheme set -n custom" - ]; - - # shell.json is managed by home-manager (read-only symlink) but caelestia - # needs to write to it at runtime: replace the symlink with a mutable copy. - # The stale .hm-backup must be removed before linkGeneration so HM can - # back up the runtime-modified shell.json without hitting a conflict. - home.activation.caelestiaCleanBackup = lib.hm.dag.entryBefore ["linkGeneration"] '' - $DRY_RUN_CMD rm -f "$HOME/.config/caelestia/shell.json.hm-backup" - ''; - - home.activation.caelestiaWritableShellConfig = lib.hm.dag.entryAfter ["linkGeneration"] '' - if [ -L "$HOME/.config/caelestia/shell.json" ]; then - $DRY_RUN_CMD cp --remove-destination \ - "$(readlink -f "$HOME/.config/caelestia/shell.json")" \ - "$HOME/.config/caelestia/shell.json" - fi - ''; - - services.cliphist = { - enable = true; - allowImages = true; - }; -} diff --git a/home/system/caelestia-shell/launcher.nix b/home/system/caelestia-shell/launcher.nix deleted file mode 100644 index cf90a48..0000000 --- a/home/system/caelestia-shell/launcher.nix +++ /dev/null @@ -1,188 +0,0 @@ -{ - programs.caelestia.settings = { - session.commands = { - shutdown = [ - "systemctl" - "poweroff" - ]; - logout = [ - "loginctl" - "lock-session" - ]; - hibernate = [ - "systemctl" - "hibernate" - ]; - reboot = [ - "systemctl" - "reboot" - ]; - }; - launcher = { - actionPrefix = "/"; - actions = [ - { - name = "Calculator"; - icon = "calculate"; - description = "Do simple math equations (powered by Qalc)"; - command = [ - "autocomplete" - "calc" - ]; - enabled = true; - dangerous = false; - } - { - name = "Shutdown"; - icon = "power_settings_new"; - description = "Shutdown the system"; - command = [ - "systemctl" - "poweroff" - ]; - enabled = true; - dangerous = true; - } - { - name = "Reboot"; - icon = "cached"; - description = "Reboot the system"; - command = [ - "systemctl" - "reboot" - ]; - enabled = true; - dangerous = true; - } - { - name = "Logout"; - icon = "exit_to_app"; - description = "Log out of the current session"; - command = [ - "loginctl" - "terminate-user" - "" - ]; - enabled = true; - dangerous = true; - } - { - name = "Lock"; - icon = "lock"; - description = "Lock the current session"; - command = [ - "loginctl" - "lock-session" - ]; - enabled = true; - dangerous = false; - } - { - name = "Sleep"; - icon = "bedtime"; - description = "Suspend then hibernate"; - command = [ - "systemctl" - "suspend-then-hibernate" - ]; - enabled = true; - dangerous = false; - } - { - name = "Restart caelestia"; - icon = "cached"; - description = "Restart caelestia"; - command = [ - "hyprctl" - "dispatch" - "exec" - "caelestia-shell kill | sleep 1 | caelestia-shell" - ]; - enabled = true; - dangerous = false; - } - { - name = "Emoji Picker"; - icon = "mood"; - description = "Toggle the emoji picker"; - command = [ - "caelestia" - "emoji" - "-p" - ]; - enabled = true; - dangerous = false; - } - { - name = "Clipboard History"; - icon = "content_paste"; - description = "Toggle the clipboard history"; - command = [ - "caelestia" - "clipboard" - ]; - enabled = true; - dangerous = false; - } - { - name = "Delete from Clipboard History"; - icon = "content_paste_off"; - description = "Delete a line from the clipboard history"; - command = [ - "caelestia" - "clipboard" - ]; - enabled = true; - dangerous = false; - } - { - name = "Night Shift"; - icon = "moon_stars"; - description = "Toggle Night Shift, the blue light filter"; - command = ["nightshift-toggle"]; - enabled = true; - dangerous = false; - } - { - name = "Hyprpicker"; - icon = "colorize"; - description = "Pick an hex color"; - command = [ - "hyprpicker" - "-a" - ]; - enabled = true; - dangerous = false; - } - { - name = "Run in background"; - icon = "play_circle"; - description = "Type and run any shell command in the background"; - command = [ - "ghostty" - "--title=run-bg" - "-e" - "bash" - "-c" - "printf 'Run: '; read -r cmd; [ -n \"$cmd\" ] && hyprctl dispatch exec \"$cmd\"" - ]; - enabled = true; - dangerous = false; - } - ]; - dragThreshold = 50; - enableDangerousActions = false; - maxShown = 7; - specialPrefix = "@"; - useFuzzy = { - apps = false; - actions = false; - schemes = false; - variants = false; - wallpapers = false; - }; - showOnHover = false; - hiddenApps = []; - }; - }; -} diff --git a/home/system/caelestia-shell/scheme.nix b/home/system/caelestia-shell/scheme.nix deleted file mode 100644 index e8c6e5b..0000000 --- a/home/system/caelestia-shell/scheme.nix +++ /dev/null @@ -1,137 +0,0 @@ -# This Nix module customizes the color scheme of the Caelestia CLI application using the Stylix base16 color palette. -{ - pkgs, - inputs, - config, - ... -}: let - colors = config.lib.stylix.colors; - - customSchemeFile = pkgs.writeText "custom-dark.txt" '' - primary_paletteKeyColor ${colors.base0D} - secondary_paletteKeyColor ${colors.base04} - tertiary_paletteKeyColor ${colors.base08} - neutral_paletteKeyColor ${colors.base03} - neutral_variant_paletteKeyColor ${colors.base03} - background ${colors.base00} - onBackground ${colors.base05} - surface ${colors.base00} - surfaceDim ${colors.base00} - surfaceBright ${colors.base02} - surfaceContainerLowest ${colors.base01} - surfaceContainerLow ${colors.base01} - surfaceContainer ${colors.base01} - surfaceContainerHigh ${colors.base02} - surfaceContainerHighest ${colors.base02} - onSurface ${colors.base05} - surfaceVariant ${colors.base02} - onSurfaceVariant ${colors.base04} - inverseSurface ${colors.base05} - inverseOnSurface ${colors.base00} - outline ${colors.base03} - outlineVariant ${colors.base02} - shadow ${colors.base00} - scrim ${colors.base00} - surfaceTint ${colors.base0D} - primary ${colors.base0D} - onPrimary ${colors.base00} - primaryContainer ${colors.base0D} - onPrimaryContainer ${colors.base05} - inversePrimary ${colors.base0D} - secondary ${colors.base0C} - onSecondary ${colors.base00} - secondaryContainer ${colors.base02} - onSecondaryContainer ${colors.base0C} - tertiary ${colors.base08} - onTertiary ${colors.base00} - tertiaryContainer ${colors.base08} - onTertiaryContainer ${colors.base00} - error ${colors.base08} - onError ${colors.base00} - errorContainer ${colors.base08} - onErrorContainer ${colors.base05} - primaryFixed ${colors.base0D} - primaryFixedDim ${colors.base0D} - onPrimaryFixed ${colors.base00} - onPrimaryFixedVariant ${colors.base00} - secondaryFixed ${colors.base0C} - secondaryFixedDim ${colors.base0C} - onSecondaryFixed ${colors.base00} - onSecondaryFixedVariant ${colors.base02} - tertiaryFixed ${colors.base08} - tertiaryFixedDim ${colors.base08} - onTertiaryFixed ${colors.base00} - onTertiaryFixedVariant ${colors.base00} - term0 ${colors.base00} - term1 ${colors.base08} - term2 ${colors.base0B} - term3 ${colors.base0A} - term4 ${colors.base0D} - term5 ${colors.base0E} - term6 ${colors.base0C} - term7 ${colors.base05} - term8 ${colors.base03} - term9 ${colors.base08} - term10 ${colors.base0B} - term11 ${colors.base0A} - term12 ${colors.base0D} - term13 ${colors.base0E} - term14 ${colors.base0C} - term15 ${colors.base07} - rosewater ${colors.base06} - flamingo ${colors.base0F} - pink ${colors.base0E} - mauve ${colors.base0D} - red ${colors.base08} - maroon ${colors.base08} - peach ${colors.base09} - yellow ${colors.base0A} - green ${colors.base0B} - teal ${colors.base0C} - sky ${colors.base0C} - sapphire ${colors.base0C} - blue ${colors.base0D} - lavender ${colors.base0D} - klink ${colors.base0D} - klinkSelection ${colors.base0D} - kvisited ${colors.base0E} - kvisitedSelection ${colors.base0E} - knegative ${colors.base08} - knegativeSelection ${colors.base08} - kneutral ${colors.base0A} - kneutralSelection ${colors.base0A} - kpositive ${colors.base0B} - kpositiveSelection ${colors.base0B} - text ${colors.base05} - subtext1 ${colors.base04} - subtext0 ${colors.base03} - overlay2 ${colors.base03} - overlay1 ${colors.base03} - overlay0 ${colors.base02} - surface2 ${colors.base02} - surface1 ${colors.base01} - surface0 ${colors.base01} - base ${colors.base00} - mantle ${colors.base00} - crust ${colors.base00} - success ${colors.base0B} - onSuccess ${colors.base00} - successContainer ${colors.base0B} - onSuccessContainer ${colors.base05} - ''; - - colorsHash = builtins.hashString "sha256" (builtins.toJSON colors); - - customCli = - inputs.caelestia-cli.packages.${pkgs.stdenv.hostPlatform.system}.default.overrideAttrs - (oldAttrs: { - name = "${oldAttrs.name or "caelestia-cli"}-themed-${colorsHash}"; - postUnpack = '' - mkdir -p $sourceRoot/src/caelestia/data/schemes/custom/main - cp ${customSchemeFile} $sourceRoot/src/caelestia/data/schemes/custom/main/dark.txt - echo "Custom scheme added to source" - ''; - }); -in { - programs.caelestia.cli.package = customCli; -} diff --git a/home/system/caelestia-shell/session-gif-hacker-cat.gif b/home/system/caelestia-shell/session-gif-hacker-cat.gif deleted file mode 100644 index 4cc58d5ef52501ff07b184cdb6b202a7f4586656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52409 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 TZ1P-P;+v)Bxw?RZfx#L8e)nJq diff --git a/home/system/caelestia-shell/swappy.nix b/home/system/caelestia-shell/swappy.nix deleted file mode 100644 index 8a25049..0000000 --- a/home/system/caelestia-shell/swappy.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ - xdg.configFile."swappy/config".text = '' - [Default] - save_dir=~/Pictures/Screenshots - save_filename_format=screenshot-%Y%m%d-%H%M%S.png - show_panel=false - line_size=5 - text_size=20 - text_font=sans-serif - ''; -} diff --git a/home/system/hyprland/bindings.nix b/home/system/hyprland/bindings.nix index 9a88359..5c26b26 100644 --- a/home/system/hyprland/bindings.nix +++ b/home/system/hyprland/bindings.nix @@ -1,5 +1,6 @@ { pkgs, + pkgs-stable, lib, config, ... @@ -63,17 +64,17 @@ in { { key = "o"; desc = "Obsidian"; - cmd = "${pkgs.obsidian}/bin/obsidian"; + cmd = "${pkgs-stable.obsidian}/bin/obsidian"; } { key = "s"; desc = "Signal"; - cmd = "${pkgs.signal-desktop}/bin/signal-desktop"; + cmd = "${pkgs-stable.signal-desktop}/bin/signal-desktop"; } { key = "t"; desc = "TickTick"; - cmd = "${pkgs.ticktick}/bin/ticktick"; + cmd = "${pkgs-stable.ticktick}/bin/ticktick"; } { key = "b"; @@ -124,7 +125,7 @@ in { # Quick launch "$mod,RETURN, exec, uwsm app -- ${pkgs.ghostty}/bin/ghostty" # Ghostty (terminal) - "$mod,E, exec, uwsm app -- ${pkgs.thunar}/bin/thunar" # Thunar + "$mod,E, exec, uwsm app -- ${pkgs-stable.thunar}/bin/thunar" # Thunar "$mod, SPACE, exec, rofi -show drun" # Launcher "$mod, N, exec, swaync-client -t" # Notification center diff --git a/home/system/hyprland/default.nix b/home/system/hyprland/default.nix index aa158bb..4096667 100644 --- a/home/system/hyprland/default.nix +++ b/home/system/hyprland/default.nix @@ -1,6 +1,7 @@ # Hyprland is a dynamic tiling Wayland compositor that is highly customizable and performant. { pkgs, + pkgs-stable, config, lib, ... @@ -19,49 +20,43 @@ in { ./animations.nix ./bindings.nix ./polkitagent.nix - ./keyboard-backlight.nix # CHANGEME: This is for omen laptop only + ./hyprpaper.nix ]; - home.packages = with pkgs; [ - qt5.qtwayland - qt6.qtwayland - libsForQt5.qt5ct - qt6Packages.qt6ct - xcb-util-cursor - libxcb - hyprland-qtutils - adw-gtk3 - hyprshot - hyprpicker - swappy - imv - wf-recorder - wlr-randr - brightnessctl - gnome-themes-extra - dconf - wayland-utils - wayland-protocols - ]; + home.packages = + (with pkgs; [ + qt5.qtwayland + qt6.qtwayland + libsForQt5.qt5ct + qt6Packages.qt6ct + hyprland-qtutils + ]) + ++ (with pkgs-stable; [ + xcb-util-cursor + libxcb + adw-gtk3 + hyprshot + hyprpicker + swappy + imv + wf-recorder + wlr-randr + brightnessctl + gnome-themes-extra + dconf + wayland-utils + wayland-protocols + ]); wayland.windowManager.hyprland = { enable = true; configType = "hyprlang"; xwayland.enable = true; - systemd = { - enable = false; - variables = [ - "--all" - ]; # https://wiki.hyprland.org/Nix/Hyprland-on-Home-Manager/#programs-dont-work-in-systemd-services-but-do-on-the-terminal - }; + systemd.enable = false; package = null; portalPackage = null; settings = { - exec-once = [ - "dbus-update-activation-environment --systemd --all &" - ]; - monitor = [ ",prefered,auto,1" # default ]; diff --git a/home/system/hyprpaper/default.nix b/home/system/hyprland/hyprpaper.nix similarity index 86% rename from home/system/hyprpaper/default.nix rename to home/system/hyprland/hyprpaper.nix index be04dbd..547ec12 100644 --- a/home/system/hyprpaper/default.nix +++ b/home/system/hyprland/hyprpaper.nix @@ -1,8 +1,9 @@ # Hyprpaper is used to set the wallpaper on the system -{lib, ...}: { +{pkgs-stable, lib, ...}: { # The wallpaper is set by stylix services.hyprpaper = { enable = true; + package = pkgs-stable.hyprpaper; settings = { ipc = "on"; splash = false; diff --git a/home/system/hyprland/keyboard-backlight.nix b/home/system/hyprland/keyboard-backlight.nix deleted file mode 100644 index 53b72ca..0000000 --- a/home/system/hyprland/keyboard-backlight.nix +++ /dev/null @@ -1,44 +0,0 @@ -# Turn the keyboard red/off when the battery is low -# Include this one only if you have a omen laptop with RGB keyboard -{ - pkgs, - config, - ... -}: let - alert-when-low-battery = false; - keyboard-backlight = pkgs.writeShellScriptBin "keyboard-backlight" '' - function set_keyboard_backlight { - local color=$1 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone00 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone01 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone02 - echo $color > /sys/devices/platform/hp-wmi/rgb_zones/zone03 - } - state="white" - set_keyboard_backlight ${config.lib.stylix.colors.base0D} - if [ "${toString alert-when-low-battery}" = "false" ]; then - exit 0 - fi - while true; do - BATTERY_LEVEL=$(cat /sys/class/power_supply/BAT*/capacity) - IS_CHARGING=$(cat /sys/class/power_supply/BAT*/status) - if [[ $BATTERY_LEVEL -le 10 && $IS_CHARGING != "Charging" ]]; then - if [[ $state == "red" ]];then - state="white" - set_keyboard_backlight "000000" - else - state="red" - set_keyboard_backlight "FF0000" - fi - else - state="white" - set_keyboard_backlight ${config.lib.stylix.colors.base0D} - fi - sleep 2 - done - ''; - - command = "bash ${keyboard-backlight}/bin/keyboard-backlight &"; -in { - wayland.windowManager.hyprland.settings.exec-once = [command]; -} diff --git a/home/system/hyprland/polkitagent.nix b/home/system/hyprland/polkitagent.nix index 221d359..b4f7a39 100644 --- a/home/system/hyprland/polkitagent.nix +++ b/home/system/hyprland/polkitagent.nix @@ -1,6 +1,6 @@ # HyprPolkitAgent is a simple polkit agent for wayland compositors -{pkgs, ...}: { - home.packages = with pkgs; [hyprpolkitagent]; +{pkgs-stable, ...}: { + home.packages = with pkgs-stable; [hyprpolkitagent]; wayland.windowManager.hyprland.settings.exec-once = ["systemctl --user start hyprpolkitagent"]; } diff --git a/home/system/hyprlock/default.nix b/home/system/hyprlock/default.nix new file mode 100644 index 0000000..5a8503a --- /dev/null +++ b/home/system/hyprlock/default.nix @@ -0,0 +1,85 @@ +{config, ...}: let + c = config.lib.stylix.colors; +in { + stylix.targets.hyprlock.enable = false; + + programs.hyprlock = { + enable = true; + settings = { + background = [ + { + monitor = ""; + color = "rgba(${c.base00}FF)"; + } + ]; + + label = [ + { + monitor = ""; + text = ''cmd[update:0] echo "[$USER@$(hostname) ~]"''; + color = "rgb(${c.base0D})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -48"; + halign = "left"; + valign = "top"; + } + { + monitor = ""; + text = ''cmd[update:1000] echo "$(date +'%H:%M:%S')"''; + color = "rgb(${c.base05})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -70"; + halign = "left"; + valign = "top"; + } + { + monitor = ""; + text = ''cmd[update:60000] echo "$(date +'%A %d %B %Y')"''; + color = "rgb(${c.base04})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -92"; + halign = "left"; + valign = "top"; + } + { + monitor = ""; + text = "passwd:"; + color = "rgb(${c.base0D})"; + font_size = 13; + font_family = "Maple Mono NF"; + position = "48, -141"; + halign = "left"; + valign = "top"; + } + ]; + + "input-field" = [ + { + monitor = ""; + size = "200, 20"; + outline_thickness = 0; + dots_size = 0.3; + dots_spacing = 0.2; + dots_center = false; + outer_color = "rgba(00000000)"; + inner_color = "rgba(00000000)"; + font_color = "rgb(${c.base05})"; + fade_on_empty = false; + placeholder_text = ""; + hide_input = true; + rounding = 0; + check_color = "rgb(${c.base0B})"; + fail_color = "rgb(${c.base08})"; + fail_text = ''auth failed''; + capslock_color = "rgb(${c.base0A})"; + position = "116, -138"; + halign = "left"; + valign = "top"; + } + ]; + }; + }; +} diff --git a/home/system/mime/default.nix b/home/system/mime/default.nix index c94805d..f8a1e6c 100644 --- a/home/system/mime/default.nix +++ b/home/system/mime/default.nix @@ -1,24 +1,17 @@ -# Mime type associations for the system. { lib, pkgs, ... -}: -with lib; let +}: let defaultApps = { - # check desktop files here: `ls $(echo $XDG_DATA_DIRS| sed "s/:/ /g")` - text = [ - # "org.gnome.TextEditor.desktop" - "nvim-ghostty.desktop" - ]; + text = ["nvim-ghostty.desktop"]; code = ["nvim-ghostty.desktop"]; image = ["imv-dir.desktop"]; - audio = ["mpv.desktop"]; - video = ["mpv.desktop"]; + audio = ["vlc.desktop"]; + video = ["vlc.desktop"]; directory = ["thunar.desktop"]; - office = ["libreoffice.desktop"]; - pdf = ["zathura.desktop"]; - terminal = ["ghostty.desktop"]; + office = ["onlyoffice-desktopeditors.desktop"]; + pdf = ["onlyoffice-desktopeditors.desktop"]; archive = ["xarchiver.desktop"]; browser = ["helium.desktop"]; }; @@ -34,7 +27,6 @@ with lib; let "text/x-go" "text/x-java" "text/x-csharp" - "text/x-python" "application/x-shellscript" "text/javascript" @@ -42,7 +34,6 @@ with lib; let "text/css" "text/x-php" "text/x-ruby" - "application/json" "application/xml" "text/xml" @@ -51,11 +42,8 @@ with lib; let "application/toml" "text/x-nix" "text/markdown" - "text/x-dockerfile" - "application/x-yaml" "text/x-terraform" - "application/x-perl" "text/x-lua" "text/x-haskell" @@ -104,12 +92,17 @@ with lib; let "application/rtf" ]; pdf = ["application/pdf"]; - terminal = ["terminal"]; archive = [ "application/zip" - "application/rar" - "application/7z" - "application/*tar" + "application/x-rar-compressed" + "application/vnd.rar" + "application/x-7z-compressed" + "application/x-tar" + "application/gzip" + "application/x-bzip2" + "application/x-xz" + "application/x-zstd" + "application/x-compressed-tar" ]; browser = [ "text/html" @@ -125,17 +118,17 @@ with lib; let desktopName = "Neovim (Ghostty)"; exec = ''ghostty --title="Neovim Editor" -e nvim %F''; terminal = false; - categories = [ - "Development" - "TextEditor" - ]; + categories = ["Development" "TextEditor"]; mimeTypes = mimeMap.code ++ mimeMap.text; }; - associations = with lists; - listToAttrs ( - flatten (mapAttrsToList (key: map (type: attrsets.nameValuePair type defaultApps."${key}")) mimeMap) - ); + associations = lib.listToAttrs ( + lib.flatten ( + lib.mapAttrsToList + (key: map (type: lib.nameValuePair type defaultApps.${key})) + mimeMap + ) + ); in { home.packages = [nvim-ghostty]; @@ -144,7 +137,7 @@ in { mimeApps = { enable = true; associations.added = associations; - defaultApplications = associations; + defaultApplications = lib.mapAttrs (_: lib.mkForce) associations; }; }; } diff --git a/home/system/rofi/default.nix b/home/system/rofi/default.nix new file mode 100644 index 0000000..6b27a46 --- /dev/null +++ b/home/system/rofi/default.nix @@ -0,0 +1,136 @@ +{ config, pkgs, ... }: let + c = config.lib.stylix.colors; + font = config.stylix.fonts.sansSerif.name; + fontSize = toString config.stylix.fonts.sizes.applications; + gaps = toString config.theme.gaps-out; + theme = pkgs.writeText "launcher.rasi" '' + configuration { + modi: "drun,run"; + case-sensitive: false; + cycle: true; + normalize-match: true; + show-icons: false; + matching: "normal"; + tokenize: true; + kb-cancel: "Escape,MousePrimary"; + drun-match-fields: "name,exec,generic,comment"; + drun-display-format: "{name}"; + drun-url-launcher: "xdg-open"; + drun-show-actions: false; + disable-history: false; + sorting-method: "normal"; + terminal: "ghostty"; + hover-select: true; + me-select-entry: ""; + me-accept-entry: [ "MousePrimary" ]; + } + + * { + background: transparent; + background-alt: #${c.base01}ff; + foreground: #${c.base05}ff; + active: #${c.base0D}ff; + inactive: #${c.base03}ff; + selected-fg: #${c.base00}ff; + font: "${font}, Bold ${fontSize}"; + } + + window { + transparency: "real"; + location: north; + anchor: north; + padding: ${gaps}px ${gaps}px 0; + margin: 0; + width: 100%; + background-color: transparent; + border: 0px; + } + + mainbox { + orientation: horizontal; + spacing: 0; + padding: 6px 14px; + border-radius: 100px; + background-color: @background-alt; + children: [ "inputbar", "listview" ]; + } + + inputbar { + expand: false; + spacing: 8px; + padding: 0; + background-color: transparent; + color: @foreground; + children: [ "prompt", "entry" ]; + } + + prompt { + background-color: transparent; + color: @active; + padding: 0 2px 0 0; + vertical-align: 0.5; + } + + entry { + background-color: transparent; + color: inherit; + placeholder-color: @inactive; + placeholder: "Search..."; + vertical-align: 0.5; + width: 180px; + } + + listview { + layout: horizontal; + lines: 1; + dynamic: true; + scrollbar: false; + spacing: 0; + padding: 0 0 0 14px; + background-color: transparent; + color: @foreground; + } + + element { + enabled: true; + spacing: 0; + padding: 2px 10px; + border-radius: 100px; + background-color: transparent; + color: @foreground; + cursor: pointer; + children: [ "element-text" ]; + } + + element selected.normal { + background-color: @active; + color: @selected-fg; + } + + element-text { + background-color: transparent; + color: inherit; + vertical-align: 0.5; + } + + message { + padding: 0; + background-color: transparent; + color: @foreground; + } + + error-message { + padding: 10px; + border-radius: 100px; + background-color: @background-alt; + color: @foreground; + } + ''; +in { + stylix.targets.rofi.enable = false; + + programs.rofi = { + enable = true; + theme = "${theme}"; + }; +} diff --git a/home/swaync/default.nix b/home/system/swaync/default.nix similarity index 77% rename from home/swaync/default.nix rename to home/system/swaync/default.nix index 883100c..ef441c2 100644 --- a/home/swaync/default.nix +++ b/home/system/swaync/default.nix @@ -1,6 +1,17 @@ -{ config, ... }: let +{config, ...}: let c = config.lib.stylix.colors; font = config.stylix.fonts.sansSerif.name; + monofont = config.stylix.fonts.monospace.name; + rounding = config.theme.rounding; + border-size = config.theme.border-size; + gaps-in = config.theme.gaps-in; + opacityToHex = opacity: let + val = builtins.floor (opacity * 255); + high = val / 16; + low = val - high * 16; + digits = "0123456789abcdef"; + in "${builtins.substring high 1 digits}${builtins.substring low 1 digits}"; + alphaHex = opacityToHex config.theme.inactive-opacity; in { services.swaync = { enable = true; @@ -26,43 +37,41 @@ in { "hide-on-clear" = false; "hide-on-action" = false; "script-fail-notify" = true; - widgets = [ "mpris" "dnd" "buttons-grid" "notifications" ]; + widgets = ["mpris" "dnd" "buttons-grid" "notifications"]; "widget-config" = { dnd.text = "Do not disturb"; mpris = { "image-size" = 100; "image-radius" = 10; autohide = false; - blacklist = [ "org.mpris.MediaPlayer2.playerctld" ]; + blacklist = ["org.mpris.MediaPlayer2.playerctld"]; }; "buttons-grid" = { actions = [ { - label = "󰌪"; + label = "󰖔"; type = "toggle"; - command = "powerprofilesctl set power-saver"; - "update-command" = "powerprofilesctl get | grep -q power-saver && echo true || echo false"; + command = "nightshift-toggle"; + "update-command" = "pidof hyprsunset > /dev/null && echo true || echo false"; } { - label = ""; + label = "󰈈"; type = "toggle"; - command = "wpctl set-mute @DEFAULT_SOURCE@ toggle"; + command = "focus-toggle"; + "update-command" = "test -f /tmp/hypr-focus-mode && echo true || echo false"; + } + { + label = "󰍭"; + type = "toggle"; + command = "swayosd-client --input-volume mute-toggle"; "update-command" = "wpctl get-volume @DEFAULT_SOURCE@ | grep -q MUTED && echo true || echo false"; } { - label = ""; - command = "ghostty -- htop ; swaync-client -cp"; - } - { - label = ""; - command = "nwg-look ; swaync-client -cp"; - } - { - label = ""; + label = "󰌾"; command = "swaync-client -cp ; hyprlock"; } { - label = ""; + label = "󰐥"; command = "swaync-client -cp ; systemctl poweroff"; } ]; @@ -71,10 +80,10 @@ in { }; style = '' - @define-color center-bg #${c.base00}cc; - @define-color notification-bg #${c.base00}e5; + @define-color center-bg #${c.base00}${alphaHex}; + @define-color notification-bg #${c.base00}${alphaHex}; @define-color center-notification-bg #${c.base01}; - @define-color background #${c.base00}e5; + @define-color background #${c.base00}${alphaHex}; @define-color background-alt #${c.base01}; @define-color text #${c.base05}; @define-color text-alt #${c.base03}; @@ -83,36 +92,46 @@ in { @define-color urgent #${c.base08}; * { + all: unset; font-family: "${font}"; font-weight: 700; - all: unset; - --border-radius: 16px; - --border-radius-s: 8px; - --border-radius-xl: 18px; + --border-radius: ${toString rounding}px; + --border-radius-s: ${toString gaps-in}px; + --border-radius-xl: ${toString (rounding - 2)}px; --shadow: 2px 4px 10px rgba(0,0,0,0.15); } .notification { padding: 5px; } + .notification-row { background: transparent; border: none; box-shadow: none; } + + .control-center .notification { padding: 0; } + .notification-background { background: @notification-bg; border-radius: var(--border-radius); - margin: 8px; + border: ${toString border-size}px solid @selected; + box-shadow: none; + outline: none; + margin: ${toString gaps-in}px; padding: 0; } .notification-background .close-button { margin: 6px; padding: 2px; - border-radius: 6px; + border-radius: ${toString (gaps-in - 2)}px; background: transparent; color: @text; } .notification-background .close-button:hover { background: @hover; } + .notification.low, + .notification.normal { border: none; } + .notification.critical { - border: 2px solid @urgent; + border: ${toString border-size}px solid @urgent; border-radius: var(--border-radius); } @@ -120,6 +139,7 @@ in { color: @text; margin: 10px; font-weight: 700; + border: none; } .notification-content .text-box { margin: 0 0 0 15px; } @@ -170,6 +190,7 @@ in { .control-center { background: @center-bg; border-radius: var(--border-radius); + border: ${toString border-size}px solid @selected; margin: 5px; padding: 5px 5px 0 5px; } @@ -184,7 +205,7 @@ in { .notification-group { transition: 200ms; } - .notification-group:not(.collapsed) { margin: 8px; } + .notification-group:not(.collapsed) { margin: ${toString gaps-in}px; } .notification-group-headers, .notification-group-buttons { @@ -306,14 +327,17 @@ in { padding: 10px; margin: 3px; min-width: 2rem; + font-family: "${monofont}"; background: @hover; border-radius: var(--border-radius); transition: 200ms; } .widget-buttons-grid button > label { - font-family: "Maple Mono NF"; - font-size: 16px; + font-family: "${monofont}"; + font-size: 18px; + font-weight: normal; + font-style: normal; color: @text; } @@ -328,4 +352,6 @@ in { .blank-window { background: transparent; } ''; }; + + stylix.targets.swaync.enable = false; } diff --git a/home/system/swayosd/default.nix b/home/system/swayosd/default.nix new file mode 100644 index 0000000..7285498 --- /dev/null +++ b/home/system/swayosd/default.nix @@ -0,0 +1,68 @@ +{ + config, + pkgs, + ... +}: let + c = config.lib.stylix.colors; + rounding = config.theme.rounding; + border-size = config.theme.border-size; + gaps-in = config.theme.gaps-in; + opacityToHex = opacity: let + val = builtins.floor (opacity * 255); + high = val / 16; + low = val - high * 16; + digits = "0123456789abcdef"; + in "${builtins.substring high 1 digits}${builtins.substring low 1 digits}"; + alphaHex = opacityToHex config.theme.inactive-opacity; + + style = pkgs.writeText "swayosd-style.css" '' + window#osd { + background: #${c.base00}${alphaHex}; + border-radius: ${toString rounding}px; + border: ${toString border-size}px solid #${c.base03}66; + } + + window#osd #container { + margin: ${toString gaps-in}px; + padding: 4px; + } + + window#osd image, + window#osd label { + color: #${c.base05}; + } + + window#osd progressbar, + window#osd segmentedprogress { + min-height: 6px; + border-radius: 999px; + background: transparent; + border: none; + } + + window#osd trough, + window#osd segment { + min-height: inherit; + border-radius: inherit; + border: none; + background: #${c.base03}66; + } + + window#osd progress, + window#osd segment.active { + min-height: inherit; + border-radius: inherit; + border: none; + background: #${c.base0D}; + } + + window#osd segment { margin-left: 4px; } + window#osd segment:first-child { margin-left: 0; } + ''; +in { + services.swayosd = { + enable = true; + stylePath = style; + topMargin = 0.5; + }; +} diff --git a/home/system/waybar/default.nix b/home/system/waybar/default.nix index 7b07323..73eeab5 100644 --- a/home/system/waybar/default.nix +++ b/home/system/waybar/default.nix @@ -1,9 +1,28 @@ -{ pkgs, ... }: { +{pkgs, ...}: let + networkScript = pkgs.writeShellScript "waybar-network" '' + for iface in $(${pkgs.iproute2}/bin/ip -br link show | awk '$2 == "UP" {print $1}' | grep -vE '^(lo|tun|proton|wg[0-9]|ppp|vpn|docker|br-|veth|virbr)'); do + ip=$(${pkgs.iproute2}/bin/ip addr show "$iface" 2>/dev/null | grep 'inet ' | awk '{print $2}' | cut -d/ -f1 | head -1) + if [ -n "$ip" ]; then + if [[ "$iface" == wl* ]]; then + ssid=$(${pkgs.iw}/bin/iw dev "$iface" link 2>/dev/null | grep SSID | sed 's/.*SSID: //') + signal=$(${pkgs.iw}/bin/iw dev "$iface" link 2>/dev/null | grep signal | awk '{print $2}') + printf '{"text": "󰤨", "class": "wifi", "tooltip": " %s\\n %s dBm"}\n' "$ssid" "$signal" + else + printf '{"text": "󰛳", "class": "ethernet", "tooltip": " %s\\n %s"}\n' "$iface" "$ip" + fi + exit 0 + fi + done + printf '{"text": "󰤭", "class": "disconnected", "tooltip": "Disconnected"}\n' + ''; +in { imports = [ ./settings.nix ./style.nix ]; + _module.args.networkScript = networkScript; + programs.waybar.enable = true; stylix.targets.waybar.enable = false; @@ -11,11 +30,10 @@ playerctl pavucontrol blueman - swayosd + iw ]; wayland.windowManager.hyprland.settings.exec-once = [ "waybar" - "swayosd-server" ]; } diff --git a/home/system/waybar/settings.nix b/home/system/waybar/settings.nix index 2e6a9cb..318f743 100644 --- a/home/system/waybar/settings.nix +++ b/home/system/waybar/settings.nix @@ -1,60 +1,23 @@ -{ osConfig ? {}, lib, ... }: let - hasBluetooth = osConfig.hardware.bluetooth.enable or false; +{config, networkScript, ...}: let + gaps-out = config.theme.gaps-out; + c = config.lib.stylix.colors; in { programs.waybar.settings = [ { layer = "top"; position = "top"; height = 25; - margin = "5 0"; + margin = "${toString gaps-out} ${toString gaps-out} 0"; + modules-center = ["clock" "tray" "hyprland/workspaces" "custom/network" "bluetooth" "battery" "group/right-hidden"]; - modules-left = [ "group/left-hidden-top" "group/left" ]; - modules-center = [ "clock" ]; - modules-right = [ "group/right" "group/right-hidden-top" ]; - - # ── Groups ──────────────────────────────────────────────────────── - - "group/left" = { - orientation = "horizontal"; - modules = [ "hyprland/workspaces" "mpris" ]; - }; - - # power-profiles-daemon visible + hidden drawer (arrow → battery cpu load) - "group/left-hidden-top" = { - orientation = "horizontal"; - modules = [ "power-profiles-daemon" "group/left-hidden" ]; - }; - - "group/left-hidden" = { + "group/right-hidden" = { orientation = "horizontal"; drawer = { transition-duration = 500; transition-left-to-right = false; click-to-reveal = true; }; - modules = [ "custom/arrow-right" "battery" "cpu" "load" ]; - }; - - # bluetooth volume network tray (visible) - "group/right" = { - orientation = "horizontal"; - modules = lib.optional hasBluetooth "bluetooth" ++ [ "group/group-volume" "network" "tray" ]; - }; - - # hidden drawer (arrow ← memory temp) + ctlcenter visible - "group/right-hidden-top" = { - orientation = "horizontal"; - modules = [ "group/right-hidden" "custom/ctlcenter" ]; - }; - - "group/right-hidden" = { - orientation = "horizontal"; - drawer = { - transition-duration = 500; - transition-left-to-right = true; - click-to-reveal = true; - }; - modules = [ "custom/arrow-left" "memory" "temperature" ]; + modules = ["custom/arrow-right" "power-profiles-daemon" "mpris" "group/group-volume"]; }; "group/group-volume" = { @@ -64,65 +27,47 @@ in { transition-left-to-right = true; reveal-delay = 450; }; - modules = [ "pulseaudio" "pulseaudio/slider" ]; + modules = ["pulseaudio" "pulseaudio/slider"]; }; # ── Modules ───────────────────────────────────────────────────────── "hyprland/workspaces" = { - format = "{icon}"; + format = "{id}"; on-scroll-down = "hyprctl dispatch workspace e+1"; on-scroll-up = "hyprctl dispatch workspace e-1"; - persistent-workspaces."*" = 5; + persistent-workspaces."*" = 4; cursor = true; - format-icons = { - active = "󰮯"; - persistent = ""; - empty = ""; - }; }; mpris = { - format = "{artist} - {title}"; - tooltip-format = "{album}"; - format-paused = " {artist} - {title}"; + format = "󰐊"; + format-paused = "󰏤"; + tooltip-format = "{title}"; + tooltip-format-paused = "{title}"; on-click = "playerctl play-pause"; on-scroll-up = "playerctl previous"; on-scroll-down = "playerctl next"; - max-length = 45; }; battery = { + bat = "BAT1"; interval = 20; full-at = 100; tooltip = true; format-full = ""; - format = "{icon} {capacity}%"; - format-time = "{H}:{M:02}"; - format-charging = " {capacity}% ({time})"; - format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂂" "󰁹" ]; + format = "{icon} "; + format-charging = " {icon} "; + format-icons = ["" "" "" "" ""]; + tooltip-format = "{capacity}% · {time}"; + tooltip-format-full = "Full\n{capacity}%"; + tooltip-format-charging = "Charging\n{capacity}% · {time}"; states = { warning = 30; critical = 15; }; }; - cpu = { - interval = 30; - format = " {usage}%"; - cursor = true; - states = { - warning = 80; - critical = 90; - }; - }; - - load = { - interval = 30; - format = " {load1}%"; - cursor = true; - }; - "power-profiles-daemon" = { format = "{icon}"; tooltip-format = "Power profile: {profile}"; @@ -133,22 +78,6 @@ in { }; }; - memory = { - interval = 10; - format = " {used:0.1f}G/{total:0.1f}G"; - states = { - warning = 80; - critical = 90; - }; - }; - - temperature = { - interval = 10; - format = "{icon} {temperatureC}°"; - critical-threshold = 90; - format-icons = [ "" "" "" "" "" ]; - }; - bluetooth = { format = "{}"; format-on = "󰂰"; @@ -156,9 +85,10 @@ in { format-disabled = ""; format-connected = "{device_alias}"; format-connected-battery = "{device_alias}"; - tooltip-format = "{device_enumerate}"; - tooltip-format-enumerate-connected = "{device_alias}"; - tooltip-format-enumerate-connected-battery = "{device_alias} {device_battery_percentage}%"; + tooltip-format = "Bluetooth {status}"; + tooltip-format-connected = "Bluetooth {status}\n{device_enumerate}"; + tooltip-format-enumerate-connected = " {device_alias}"; + tooltip-format-enumerate-connected-battery = " {device_alias} {device_battery_percentage}%"; on-click-right = "blueman-manager &"; }; @@ -178,9 +108,9 @@ in { portable = ""; car = ""; default = [ - "󰕿" - "󰖀" - "󰕾" + "󰕿" + "󰖀" + "󰕾" ]; }; }; @@ -191,19 +121,11 @@ in { cursor = true; }; - network = { + "custom/network" = { + exec = "${networkScript}"; + return-type = "json"; interval = 10; - format-disabled = ""; - format-disconnected = ""; - format-wifi = ""; - format-ethernet = ""; - tooltip-format = "{essid} - -Frequency: {frequency}GHz -Strength: {signalStrength}% - -{bandwidthUpBytes} {bandwidthDownBytes}"; - on-click-right = "ghostty -e nmtui &"; + on-click-right = "ghostty -e wifitui &"; }; tray = { @@ -213,38 +135,29 @@ Strength: {signalStrength}% }; clock = { - timezone = "Europe/Paris"; + timezone = config.var.timeZone; tooltip-format = "{calendar}"; format = "{:%H:%M}"; format-alt = "{:%H:%M %d %B %Y}"; calendar = { - mode = "year"; - weeks-pos = "right"; - mode-mon-col = 3; + mode = "month"; format = { - months = "{}"; - weeks = "W{}"; - weekdays = "{}"; - days = "{}"; - today = "{}"; + months = "{}"; + weekdays = "{}"; + days = "{}"; + today = "{}"; }; }; }; - "custom/ctlcenter" = { - format = ""; - tooltip = false; - on-click = "swaync-client -t &"; - }; - "custom/arrow-left" = { - format = ""; + format = " "; tooltip = false; cursor = true; }; "custom/arrow-right" = { - format = ""; + format = " "; tooltip = false; cursor = true; }; diff --git a/home/system/waybar/style.nix b/home/system/waybar/style.nix index 4370ce9..7abf5c0 100644 --- a/home/system/waybar/style.nix +++ b/home/system/waybar/style.nix @@ -1,4 +1,4 @@ -{ config, ... }: let +{config, ...}: let c = config.lib.stylix.colors; fg = "#${c.base05}"; module-bg = "#${c.base01}"; @@ -7,12 +7,16 @@ yellow = "#${c.base0A}"; green = "#${c.base0B}"; blue = "#${c.base0D}"; + cyan = "#${c.base0C}"; + mauve = "#${c.base0E}"; inactive = "#${c.base03}"; highlight = "#${c.base02}"; + font-size = "${toString config.stylix.fonts.sizes.applications}px"; + font-size-clock = "${toString (config.stylix.fonts.sizes.applications + 2)}px"; in { programs.waybar.style = '' * { - font-family: 'CaskaydiaCove Nerd Font Propo'; + font-family: '${config.stylix.fonts.sansSerif.name}'; border: none; border-radius: 0; min-height: 0; @@ -24,81 +28,78 @@ in { #waybar { font-weight: 700; background: transparent; - font-size: 14px; + font-size: ${font-size}; color: ${fg}; } - #temperature, + .modules-center { + background: ${module-bg}; + border-radius: 100px; + padding: 6px 14px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35); + } + + #clock, + #tray, + #custom-network, #bluetooth, #battery, - #memory, - #mpris, - #cpu, - #load { - padding: 1px 7px; - min-width: 0; + #mpris { + padding: 1px 14px; } - #network, - #tray { - padding: 1px 6px; + #clock { + font-size: ${font-size-clock}; } - #backlight, - #pulseaudio { + #workspaces { padding: 1px 8px; } #pulseaudio { - padding-left: 4px; + padding: 1px 8px 1px 6px; } - #backlight-slider, #pulseaudio-slider { - padding: 0 7px 0 2px; + padding: 0 8px 0 2px; } - #workspaces, - #bluetooth, - #battery, - #memory, - #temperature, - #cpu, - #mpris, - #load { - margin: 0 3px; + #workspaces button { + color: ${fg}; + font-size: ${font-size}; + border-radius: 100px; + padding: 0 5px; + margin: 0 1px; } - #right, - #left, - #right-hidden-top, - #left-hidden-top { - padding: 2px 10px; - border-radius: 15px; - background: ${module-bg}; + #workspaces button.empty { + color: ${inactive}; } - #right-hidden-top, - #left-hidden-top { + #workspaces button:hover { + background: transparent; + color: ${fg}; + } + + #workspaces button.active { + color: ${module-bg}; + background: ${blue}; + border-radius: 60px; padding: 0 12px; + margin: 0 1px; } - #right, #left { - margin: 0 8px; + #right-hidden { + padding: 0 6px; } - #clock { - background: ${module-bg}; - padding: 1px 18px; - border-radius: 15px; - } - - #custom-ctlcenter { - margin-left: 7px; + #custom-arrow-right { + padding: 0 5px; + font-size: ${toString (config.stylix.fonts.sizes.applications + 2)}px; } #power-profiles-daemon { - margin-right: 7px; + margin-right: 4px; } #network.disabled, @@ -108,42 +109,42 @@ in { min-width: 0; } - #cpu.critical, - #memory.critical, + #battery { + color: ${green}; + } + + #battery.charging, + #battery.full { + color: ${green}; + } + + #network.ethernet, + #network.wifi { + color: ${cyan}; + } + + #bluetooth.on, + #bluetooth.connected, + #bluetooth { + color: ${blue}; + } + #battery.critical, - #temperature.critical, #network.disconnected, #power-profiles-daemon.performance { color: ${red}; } - #cpu.warning, - #memory.warning, - #battery.warning, - #temperature.warning { + #battery.warning { color: ${yellow}; - background: unset; } #power-profiles-daemon.power-saver { color: ${green}; } - #custom-start, - #custom-ctlcenter { - color: ${blue}; - } - - #workspaces button { - color: ${fg}; - font-size: 14px; - border-radius: 100%; - padding: 0 2px; - margin: 0 3px; - } - - #workspaces button:hover { - background: transparent; + #mpris { + color: ${mauve}; } #mpris.paused { diff --git a/hosts/laptop/configuration.nix b/hosts/laptop/configuration.nix index f333438..f372233 100644 --- a/hosts/laptop/configuration.nix +++ b/hosts/laptop/configuration.nix @@ -54,5 +54,5 @@ home-manager.users."${config.var.username}" = import ./home.nix; # Don't touch this - system.stateVersion = "24.05"; + system.stateVersion = "26.05"; } diff --git a/hosts/laptop/flake.nix b/hosts/laptop/flake.nix index 916c6e7..656fc2b 100644 --- a/hosts/laptop/flake.nix +++ b/hosts/laptop/flake.nix @@ -7,6 +7,7 @@ nixpkgs.lib.nixosSystem { modules = [ { nixpkgs.overlays = [ + inputs.nur.overlays.default ]; _module.args = {inherit inputs;}; } diff --git a/hosts/laptop/home.nix b/hosts/laptop/home.nix index 4ed5f33..b0c4707 100644 --- a/hosts/laptop/home.nix +++ b/hosts/laptop/home.nix @@ -16,6 +16,8 @@ ../../home/programs/nix-utils ../../home/programs/spotatui ../../home/programs/yazi + ../../home/programs/desktop-actions # TODO: + ../../home/programs/focus-mode # TODO: Rename ../../home/programs/group/basic-apps.nix ../../home/programs/group/cybersecurity.nix @@ -23,9 +25,12 @@ ../../home/programs/group/misc.nix # System (Desktop environment like stuff) + ../../home/system/hyprlock ../../home/system/hyprland - ../../home/system/caelestia-shell - ../../home/system/hyprpaper + ../../home/system/waybar + ../../home/system/swaync + ../../home/system/swayosd + ../../home/system/rofi ../../home/system/mime ../../home/system/udiskie @@ -45,7 +50,7 @@ }; # Don't touch this - stateVersion = "24.05"; + stateVersion = "26.05"; }; wayland.windowManager.hyprland.settings.monitor = [ diff --git a/hosts/laptop/secrets/default.nix b/hosts/laptop/secrets/default.nix index eac568f..0b18108 100644 --- a/hosts/laptop/secrets/default.nix +++ b/hosts/laptop/secrets/default.nix @@ -3,6 +3,7 @@ { inputs, pkgs, + lib, config, ... }: let @@ -57,5 +58,7 @@ in { age ]; - wayland.windowManager.hyprland.settings.exec-once = ["systemctl --user start sops-nix"]; + wayland.windowManager.hyprland.settings.exec-once = [ + "systemctl --user start sops-nix" + ]; } diff --git a/hosts/work/home.nix b/hosts/work/home.nix index 0c2fabe..5a86498 100644 --- a/hosts/work/home.nix +++ b/hosts/work/home.nix @@ -21,8 +21,8 @@ ../../home/programs/group/misc.nix # System (Desktop environment like stuff) + ../../home/system/hyprlock ../../home/system/hyprland - # ../../home/system/caelestia-shell ../../home/system/waybar ../../home/system/hyprpaper ../../home/system/mime diff --git a/hosts/work/secrets/default.nix b/hosts/work/secrets/default.nix index 093d5f0..c2bf4cf 100644 --- a/hosts/work/secrets/default.nix +++ b/hosts/work/secrets/default.nix @@ -3,6 +3,7 @@ { inputs, pkgs, + lib, config, ... }: let @@ -54,5 +55,7 @@ in { age ]; - wayland.windowManager.hyprland.settings.exec-once = ["systemctl --user start sops-nix"]; + wayland.windowManager.hyprland.settings.exec-once = [ + "systemctl --user start sops-nix" + ]; } diff --git a/nixos/amd-graphics.nix b/nixos/amd-graphics.nix index c2886a9..1758fe3 100644 --- a/nixos/amd-graphics.nix +++ b/nixos/amd-graphics.nix @@ -3,7 +3,6 @@ enable = true; extraPackages = with pkgs; [ rocmPackages.clr.icd - # Support VA-API pour AMD libvdpau-va-gl libva-vdpau-driver ]; diff --git a/nixos/audio.nix b/nixos/audio.nix index 1fe3078..053d567 100644 --- a/nixos/audio.nix +++ b/nixos/audio.nix @@ -1,23 +1,11 @@ # Audio configuration for NixOS using PipeWire { - security.rtkit.enable = true; - services.pulseaudio.enable = false; - services.pipewire = { enable = true; alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; jack.enable = true; - wireplumber = { - enable = true; - extraConfig = { - "10-disable-camera" = { - "wireplumber.profiles" = { - main."monitor.libcamera" = "disabled"; - }; - }; - }; - }; }; + security.rtkit.enable = true; } diff --git a/nixos/home-manager.nix b/nixos/home-manager.nix index 69369eb..a4fd838 100644 --- a/nixos/home-manager.nix +++ b/nixos/home-manager.nix @@ -14,7 +14,6 @@ system = pkgs.stdenv.hostPlatform.system; config.allowUnfree = true; }; - pkgs-nur-hadi = inputs.nur-anotherhadi.packages.${pkgs.stdenv.hostPlatform.system}; }; }; } diff --git a/nixos/hyprland.nix b/nixos/hyprland.nix index 0a4943b..056c8f6 100644 --- a/nixos/hyprland.nix +++ b/nixos/hyprland.nix @@ -1,14 +1,9 @@ # Hyprland is a dynamic tiling Wayland compositor. -{ - inputs, - pkgs, - ... -}: { +{...}: { programs.hyprland = { enable = true; withUWSM = true; - package = inputs.hyprland.packages."${pkgs.stdenv.hostPlatform.system}".hyprland; - portalPackage = - inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; }; + + security.pam.services.hyprlock = {}; } diff --git a/nixos/nix.nix b/nixos/nix.nix index 5ee8294..30db75b 100644 --- a/nixos/nix.nix +++ b/nixos/nix.nix @@ -6,22 +6,6 @@ }: let autoGarbageCollector = config.var.autoGarbageCollector; in { - # Ask for password once per SSH session (tied to the tty, expires when session closes) - security.sudo.extraConfig = '' - Defaults timestamp_type=tty,timestamp_timeout=-1 - ''; - - security.sudo.extraRules = [ - { - users = [config.var.username]; - commands = [ - { - command = "/run/current-system/sw/bin/nixos-rebuild"; - options = ["NOPASSWD"]; - } - ]; - } - ]; nixpkgs.config = { allowUnfree = true; allowBroken = false; @@ -40,17 +24,10 @@ in { "flakes" ]; substituters = [ - # high priority since it's almost always used - "https://cache.nixos.org?priority=10" - - "https://hyprland.cachix.org" "https://nix-community.cachix.org" - "https://numtide.cachix.org" ]; trusted-public-keys = [ - "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" - "numtide.cachix.org-1:2ps1kLBUWjxIneOy1Ik6cQjb41X0iXVXeHigGmycPPE=" ]; }; gc = { diff --git a/nixos/nvidia.nix b/nixos/nvidia.nix index 2c35464..919b5b7 100644 --- a/nixos/nvidia.nix +++ b/nixos/nvidia.nix @@ -5,67 +5,49 @@ config, ... }: let - # Using beta driver for recent GPUs like RTX 4070 nvidiaDriverChannel = config.boot.kernelPackages.nvidiaPackages.production; in { - # Video drivers configuration for Xorg and Wayland - services.xserver.videoDrivers = ["nvidia"]; # Simplified - other modules are loaded automatically + services.xserver.videoDrivers = ["nvidia"]; - # Kernel parameters for better Wayland and Hyprland integration boot.kernelParams = [ - "nvidia-drm.modeset=1" # Enable mode setting for Wayland "nvidia.NVreg_PreserveVideoMemoryAllocations=1" # Improves resume after sleep ]; - # Blacklist nouveau to avoid conflicts - boot.blacklistedKernelModules = ["nouveau"]; - - # Environment variables for better compatibility environment.variables = { - LIBVA_DRIVER_NAME = "nvidia"; # Hardware video acceleration - GBM_BACKEND = "nvidia-drm"; # Graphics backend for Wayland - __GLX_VENDOR_LIBRARY_NAME = "nvidia"; # Use Nvidia driver for GLX - NIXOS_OZONE_WL = "1"; # Wayland support for Electron apps - __GL_GSYNC_ALLOWED = "1"; # Enable G-Sync if available - __GL_VRR_ALLOWED = "1"; # Enable VRR (Variable Refresh Rate) - NVD_BACKEND = "direct"; # Configuration for new driver - MOZ_ENABLE_WAYLAND = "1"; # Wayland support for Firefox + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + NIXOS_OZONE_WL = "1"; + __GL_GSYNC_ALLOWED = "1"; + __GL_VRR_ALLOWED = "1"; + NVD_BACKEND = "direct"; + MOZ_ENABLE_WAYLAND = "1"; }; - # Configuration for proprietary packages - nixpkgs.config = { - nvidia.acceptLicense = true; - }; + nixpkgs.config.nvidia.acceptLicense = true; - # Nvidia configuration hardware = { nvidia = { - open = false; # Proprietary driver for better performance - nvidiaSettings = true; # Nvidia settings utility + open = true; # Open kernel modules, recommended for Turing and newer (RTX 4070 = Ada Lovelace) + nvidiaSettings = true; powerManagement = { - enable = true; # Power management - finegrained = true; # More precise power consumption control + enable = true; + finegrained = true; }; - modesetting.enable = true; # Required for Wayland + modesetting.enable = true; package = nvidiaDriverChannel; - forceFullCompositionPipeline = true; # Prevents screen tearing + # forceFullCompositionPipeline = true; # Only useful when display is connected directly to Nvidia GPU, not in PRIME offload mode - # Configuration for hybrid AMD+Nvidia laptop prime = { - # Optimized configuration for switchable graphics laptops offload = { - enable = true; # Mode optimized for power saving - enableOffloadCmd = true; # Allows running applications with dedicated GPU + enable = true; + enableOffloadCmd = true; }; - # sync.enable disabled as offload is generally better for laptops - sync.enable = false; - # PCI IDs verified for your hardware - amdgpuBusId = "PCI:5:0:0"; # Integrated AMD GPU - nvidiaBusId = "PCI:1:0:0"; # Dedicated Nvidia GPU + sync.enable = false; # offload mode is better for battery life + amdgpuBusId = "PCI:5:0:0"; + nvidiaBusId = "PCI:1:0:0"; }; }; - # Enhanced graphics support graphics = { enable = true; enable32Bit = true; @@ -73,10 +55,8 @@ in { nvidia-vaapi-driver libva-vdpau-driver libvdpau-va-gl - mesa egl-wayland vulkan-loader - vulkan-validation-layers libva ]; }; @@ -90,13 +70,9 @@ in { ]; }; - # Additional useful packages environment.systemPackages = with pkgs; [ vulkan-tools mesa-demos - libva-utils # VA-API debugging tools + libva-utils ]; - - # Enable Nvidia container toolkit for GPU acceleration in containers (docker) - hardware.nvidia-container-toolkit.enable = false; } diff --git a/nixos/systemd-boot.nix b/nixos/systemd-boot.nix index bac23a6..10e708c 100644 --- a/nixos/systemd-boot.nix +++ b/nixos/systemd-boot.nix @@ -23,16 +23,6 @@ ]; consoleLogLevel = 0; initrd.verbose = false; - - # plymouth = { - # enable = true; - # theme = lib.mkForce "cuts_alt"; - # themePackages = with pkgs; [ - # (adi1090x-plymouth-themes.override { - # selected_themes = ["cuts_alt"]; - # }) - # ]; - # }; }; # To avoid systemd services hanging on shutdown diff --git a/nixos/usbguard.nix b/nixos/usbguard.nix index a1567d1..165e8f6 100644 --- a/nixos/usbguard.nix +++ b/nixos/usbguard.nix @@ -1,10 +1,14 @@ -{config, ...}: { +# USBGuard: +# The following line allow all USB devices until a proper policy is configured. +# Run `sudo usbguard generate-policy` with your devices plugged in, +# then set rules = "" and switch implicitPolicyTarget to "block". +# services.usbguard.implicitPolicyTarget = lib.mkForce "allow"; +{ services.usbguard = { enable = true; implicitPolicyTarget = "block"; IPCAllowedUsers = [ "root" - config.var.username ]; }; } diff --git a/nixos/utils.nix b/nixos/utils.nix index 44d6a4c..6e62989 100644 --- a/nixos/utils.nix +++ b/nixos/utils.nix @@ -12,11 +12,12 @@ extraLocale = config.var.extraLocale; autoUpgrade = config.var.autoUpgrade; in { - networking.hostName = hostname; + networking = { + hostName = hostname; + networkmanager.enable = true; + }; - networking.networkmanager.enable = true; systemd.services.NetworkManager-wait-online.enable = false; - system.autoUpgrade = { enable = autoUpgrade; dates = "04:00"; @@ -32,49 +33,34 @@ in { time = { timeZone = timeZone; }; - i18n.defaultLocale = defaultLocale; - i18n.inputMethod = { - enable = true; - type = "fcitx5"; - fcitx5.addons = with pkgs; [fcitx5-gtk]; - }; - i18n.extraLocaleSettings = { - LC_ADDRESS = extraLocale; - LC_IDENTIFICATION = extraLocale; - LC_MEASUREMENT = extraLocale; - LC_MONETARY = extraLocale; - LC_NAME = extraLocale; - LC_NUMERIC = extraLocale; - LC_PAPER = extraLocale; - LC_TELEPHONE = extraLocale; - LC_TIME = extraLocale; + + i18n = { + defaultLocale = defaultLocale; + extraLocaleSettings = { + LC_ADDRESS = extraLocale; + LC_IDENTIFICATION = extraLocale; + LC_MEASUREMENT = extraLocale; + LC_MONETARY = extraLocale; + LC_NAME = extraLocale; + LC_NUMERIC = extraLocale; + LC_PAPER = extraLocale; + LC_TELEPHONE = extraLocale; + LC_TIME = extraLocale; + }; }; services = { + libinput.enable = true; xserver = { enable = true; xkb.layout = keyboardLayout; - xkb.variant = ""; }; gnome.gnome-keyring.enable = true; psd = { enable = true; resyncTimer = "10m"; }; - }; - console.keyMap = keyboardLayout; - - environment.variables = { - XDG_DATA_HOME = "$HOME/.local/share"; - PASSWORD_STORE_DIR = "$HOME/.local/share/password-store"; - EDITOR = "nvim"; - }; - - services.libinput.enable = true; - programs.dconf.enable = true; - services = { dbus = { - enable = true; implementation = "broker"; packages = with pkgs; [ gcr @@ -86,46 +72,50 @@ in { power-profiles-daemon.enable = true; udisks2.enable = true; }; + console.keyMap = keyboardLayout; - # enable zsh autocompletion for system packages (systemd, etc) - environment.pathsToLink = ["/share/zsh"]; + environment = { + variables = { + PASSWORD_STORE_DIR = "$HOME/.local/share/password-store"; + }; + # enable zsh autocompletion for system packages (systemd, etc) + pathsToLink = ["/share/zsh"]; + systemPackages = with pkgs; [ + fd + bc + gcc + file + git-ignore + xdg-utils + wget + curl + gnupg + openssl + vim + go + comma + zip + unzip + optipng + jpegoptim + pfetch + btop + unrar + p7zip + ]; + }; + + programs.dconf.enable = true; # Faster rebuilding documentation = { - enable = true; doc.enable = false; - man.enable = true; dev.enable = false; info.enable = false; nixos.enable = false; }; - environment.systemPackages = with pkgs; [ - fd - bc - gcc - file - git-ignore - xdg-utils - wget - curl - gnupg - openssl - vim - go - comma - zip - unzip - optipng - jpegoptim - pfetch - btop - unrar - p7zip - ]; - xdg.portal = { - enable = true; xdgOpenUsePortal = true; config = { common.default = ["gtk"]; @@ -138,14 +128,5 @@ in { extraPortals = [pkgs.xdg-desktop-portal-gtk]; }; - security = { - # allow wayland lockers to unlock the screen - pam.services.hyprlock.text = "auth include login"; - - # userland niceness - rtkit.enable = true; - - # don't ask for password for wheel group - sudo.wheelNeedsPassword = false; - }; + security.rtkit.enable = true; } diff --git a/themes/nixy.nix b/themes/nixy.nix index e1d5b25..9f4e9d4 100644 --- a/themes/nixy.nix +++ b/themes/nixy.nix @@ -57,8 +57,8 @@ name = "Maple Mono NF"; }; sansSerif = { - package = pkgs.source-sans-pro; - name = "Source Sans Pro"; + package = pkgs.rubik; + name = "Rubik"; }; serif = config.stylix.fonts.sansSerif; emoji = { @@ -75,8 +75,8 @@ polarity = "dark"; image = pkgs.fetchurl { - url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/black-moutains-and-a-city.png"; - sha256 = "sha256-RTTA3Lf+hnPpo9hwS075kbnIouz12ul2GKO3EIgP6AU="; + url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/main/app/static/wallpapers/another-one.png"; + sha256 = "sha256-zthfsd4QLShPPApV8RoPANaymMC5IiCrmp8QwyyhCcY="; }; }; } diff --git a/todo b/todo new file mode 100644 index 0000000..92230b9 --- /dev/null +++ b/todo @@ -0,0 +1,10 @@ +- [ ] Configuration waybar +- [ ] Configuration sway-nc +- [ ] Configuration sway-osd +- [ ] Configuration hyprlock +- [ ] Gaming/Focus mode +- [ ] Configuration Rofi/Drun +- [ ] Helium plus rapide ? service/deamon ? +- [ ] Ghostty service/deamon ? +- [ ] Clean files +- [ ] Check claude: Sécu, mots en français, faute, ...