diff --git a/flake.lock b/flake.lock index 1526e45..cf426ae 100755 --- a/flake.lock +++ b/flake.lock @@ -1,10 +1,77 @@ { "nodes": { + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1732200724, + "narHash": "sha256-+R1BH5wHhfnycySb7Sy5KbYEaTJZWm1h+LW1OtyhiTs=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "153d52373b0fb2d343592871009a286ec8837aec", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "base16-fish": { + "flake": false, + "locked": { + "lastModified": 1622559957, + "narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=", + "owner": "tomyun", + "repo": "base16-fish", + "rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe", + "type": "github" + }, + "original": { + "owner": "tomyun", + "repo": "base16-fish", + "type": "github" + } + }, + "base16-helix": { + "flake": false, + "locked": { + "lastModified": 1736852337, + "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + } + }, "clj-nix": { "inputs": { "devshell": "devshell", "nix-fetcher-data": "nix-fetcher-data", - "nixpkgs": "nixpkgs_7" + "nixpkgs": "nixpkgs_11" }, "locked": { "lastModified": 1732920288, @@ -98,6 +165,51 @@ "type": "github" } }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1741628778, + "narHash": "sha256-RsvHGNTmO2e/eVfgYK7g+eYEdwwh7SbZa+gZkT24MEA=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "5a81d390bb64afd4e81221749ec4bffcbeb5fa80", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "locked": { + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "revCount": 69, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, + "flake-compat_2": { + "locked": { + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -120,6 +232,28 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "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_3": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" }, @@ -154,7 +288,10 @@ }, "flake-utils_2": { "inputs": { - "systems": "systems" + "systems": [ + "stylix", + "systems" + ] }, "locked": { "lastModified": 1731533236, @@ -170,6 +307,105 @@ "type": "github" } }, + "flake-utils_3": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": [ + "stylix", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1741379162, + "narHash": "sha256-srpAbmJapkaqGRE3ytf3bj4XshspVR5964OX5LfjDWc=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "b5a62751225b2f62ff3147d0a334055ebadcd5cc", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "stylix", + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gnome-shell": { + "flake": false, + "locked": { + "lastModified": 1732369855, + "narHash": "sha256-JhUWbcYPjHO3Xs3x9/Z9RuqXbcp5yhPluGjwsdE2GMg=", + "owner": "GNOME", + "repo": "gnome-shell", + "rev": "dadd58f630eeea41d645ee225a63f719390829dc", + "type": "github" + }, + "original": { + "owner": "GNOME", + "ref": "47.2", + "repo": "gnome-shell", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": "nixpkgs_4" @@ -189,6 +425,27 @@ "type": "github" } }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1741635347, + "narHash": "sha256-2aYfV44h18alHXopyfL4D9GsnpE5XlSVkp4MGe586VU=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "7fb8678716c158642ac42f9ff7a18c0800fea551", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, "impermanence": { "locked": { "lastModified": 1737831083, @@ -204,9 +461,65 @@ "type": "github" } }, + "niri": { + "inputs": { + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": "nixpkgs_5", + "nixpkgs-stable": "nixpkgs-stable_2", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1742280890, + "narHash": "sha256-Kluc8ORAYjyPA5gD4HfXiv7bxmGftGAQ5eFAJ7uJwiE=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "808d8bf8cd9adb4bd20ba9411346d42ece5de4ca", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1740117926, + "narHash": "sha256-mTTHA0RAaQcdYe+9A3Jx77cmmyLFHmRoZdd8RpWa+m8=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "b94a5db8790339cf9134873d8b490be69e02ac71", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.02", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1742276600, + "narHash": "sha256-muceB5DW++WPqrGKpX3Hkii/DNSMmFs2oQrYRYHmPiU=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "e251ca7340bc71870c3a81a7ffc3d9bde58e685a", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, "nix-fetcher-data": { "inputs": { - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_3", "nixpkgs": [ "sydnix-cli", "clj-nix", @@ -227,6 +540,28 @@ "type": "github" } }, + "nixcord": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": "nixpkgs_6", + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1742438553, + "narHash": "sha256-4RYuXu2q+fgu+lDIAPEZW/C5+OMbfyOgoJ+S3OQMhcQ=", + "owner": "msyds", + "repo": "nixcord", + "rev": "8fa8852efb57d79cf1c2304a24889a413f79faec", + "type": "github" + }, + "original": { + "owner": "msyds", + "ref": "irc-colours", + "repo": "nixcord", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1680334310, @@ -270,6 +605,70 @@ "type": "github" } }, + "nixpkgs-stable_2": { + "locked": { + "lastModified": 1742136038, + "narHash": "sha256-DDe16FJk18sadknQKKG/9FbwEro7A57tg9vB5kxZ8kY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a1185f4064c18a5db37c5c84e5638c78b46e3341", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1741513245, + "narHash": "sha256-7rTAMNTY1xoBwz0h7ZMtEcd8LELk9R5TzBPoHuhNSCk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e3e32b642a31e6714ec1b712de8c91a3352ce7e1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1728492678, + "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1737632463, + "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_2": { "locked": { "lastModified": 1737879851, @@ -319,6 +718,54 @@ } }, "nixpkgs_5": { + "locked": { + "lastModified": 1742069588, + "narHash": "sha256-C7jVfohcGzdZRF6DO+ybyG/sqpo1h6bZi9T56sxLy+k=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c80f6a7e10b39afcc1894e02ef785b1ad0b0d7e5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1742169275, + "narHash": "sha256-nkH2Edu9rClcsQp2PYBe8E6fp8LDPi2uDBQ6wyMdeXI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5d9b5431f967007b3952c057fc92af49a4c5f3b2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1735554305, + "narHash": "sha256-zExSA1i/b+1NMRhGGLtNfFGXgLtgo+dcuzHzaWA6w3Q=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "0e82ab234249d8eee3e8c91437802b32c74bb3fd", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { "locked": { "lastModified": 1738517419, "narHash": "sha256-tttEXgKimgbtPvxFl+Avos4P4lssIqxHhxpLbbvNekk=", @@ -334,7 +781,7 @@ "type": "github" } }, - "nixpkgs_6": { + "nixpkgs_9": { "locked": { "lastModified": 1731763621, "narHash": "sha256-ddcX4lQL0X05AYkrkV2LMFgGdRvgap7Ho8kgon3iWZk=", @@ -350,45 +797,13 @@ "type": "github" } }, - "nixpkgs_7": { - "locked": { - "lastModified": 1728492678, - "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_8": { - "locked": { - "lastModified": 1737632463, - "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nur": { "inputs": { "flake-parts": "flake-parts", "nixpkgs": [ "nixpkgs" ], - "treefmt-nix": "treefmt-nix" + "treefmt-nix": "treefmt-nix_2" }, "locked": { "lastModified": 1741373419, @@ -404,6 +819,29 @@ "type": "github" } }, + "nur_2": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": [ + "stylix", + "nixpkgs" + ], + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1741693509, + "narHash": "sha256-emkxnsZstiJWmGACimyAYqIKz2Qz5We5h1oBVDyQjLw=", + "owner": "nix-community", + "repo": "NUR", + "rev": "5479646b2574837f1899da78bdf9a48b75a9fb27", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "root": { "inputs": { "copyparty": "copyparty", @@ -411,15 +849,18 @@ "emacs-overlay": "emacs-overlay", "home-manager": "home-manager", "impermanence": "impermanence", - "nixpkgs": "nixpkgs_5", + "niri": "niri", + "nixcord": "nixcord", + "nixpkgs": "nixpkgs_8", "nur": "nur", "sops-nix": "sops-nix", + "stylix": "stylix", "sydnix-cli": "sydnix-cli" } }, "sops-nix": { "inputs": { - "nixpkgs": "nixpkgs_6" + "nixpkgs": "nixpkgs_9" }, "locked": { "lastModified": 1738291974, @@ -435,14 +876,49 @@ "type": "github" } }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_2", + "git-hooks": "git-hooks", + "gnome-shell": "gnome-shell", + "home-manager": "home-manager_2", + "nixpkgs": "nixpkgs_10", + "nur": "nur_2", + "systems": "systems_2", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1742234510, + "narHash": "sha256-dQoo4XivjZuJiSi8ePv9CuP0ncE64RLyz2vb46blRx0=", + "owner": "danth", + "repo": "stylix", + "rev": "fa288c0dc695b49c9af38614af8da981371fe92a", + "type": "github" + }, + "original": { + "owner": "danth", + "repo": "stylix", + "type": "github" + } + }, "sydnix-cli": { "inputs": { "clj-nix": "clj-nix", - "flake-utils": "flake-utils_2", - "nixpkgs": "nixpkgs_8" + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_12" }, "locked": { - "lastModified": 1739936838, + "lastModified": 1742246510, "narHash": "sha256-h19Bg+BTV/51MiCnKa3rN3QbRC74cBWjBHhDrpVgdXM=", "path": "/persist/dots/scripts/sydnix-cli", "type": "path" @@ -453,6 +929,20 @@ } }, "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "id": "systems", + "type": "indirect" + } + }, + "systems_2": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -467,7 +957,122 @@ "type": "github" } }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tinted-foot": { + "flake": false, + "locked": { + "lastModified": 1726913040, + "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + } + }, + "tinted-kitty": { + "flake": false, + "locked": { + "lastModified": 1716423189, + "narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1741468895, + "narHash": "sha256-YKM1RJbL68Yp2vESBqeZQBjTETXo8mCTTzLZyckCfZk=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "47c8c7726e98069cade5827e5fb2bfee02ce6991", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1740877430, + "narHash": "sha256-zWcCXgdC4/owfH/eEXx26y5BLzTrefjtSLFHWVD5KxU=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "d48ee86394cbe45b112ba23ab63e33656090edb4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1725758778, + "narHash": "sha256-8P1b6mJWyYcu36WRlSVbuj575QWIFZALZMTg5ID/sM4=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "122c9e5c0e6f27211361a04fae92df97940eccf9", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + }, "treefmt-nix": { + "inputs": { + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1739829690, + "narHash": "sha256-mL1szCeIsjh6Khn3nH2cYtwO5YXG6gBiTw1A30iGeDU=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "3d0579f5cc93436052d94b73925b48973a104204", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { "inputs": { "nixpkgs": [ "nur", @@ -487,6 +1092,61 @@ "repo": "treefmt-nix", "type": "github" } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "stylix", + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733222881, + "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "49717b5af6f80172275d47a418c9719a31a78b53", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1739246919, + "narHash": "sha256-/hBM43/Gd0/tW+egrhlWgOIISeJxEs2uAOIYVpfDKeU=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "44590a416d4a3e8220e19e29e0b6efe64a80315d", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.5.1", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1742249030, + "narHash": "sha256-YZ+axsuNsgIKWfnRkt6Qa9UoKfUOIWf42vNUonXxmxM=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "cca74a5f6b23742d77dc5db4312dfc40fd4a0fcc", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 15664f9..dc0c2ad 100755 --- a/flake.nix +++ b/flake.nix @@ -12,6 +12,10 @@ sydnix-cli.url = "path:///persist/dots/scripts/sydnix-cli"; copyparty.url = "github:9001/copyparty"; emacs-overlay.url = "github:nix-community/emacs-overlay"; + niri.url = "github:sodiboo/niri-flake"; + stylix.url = "github:danth/stylix"; + # nixcord.url = "github:kaylorben/nixcord"; + nixcord.url = "github:msyds/nixcord/irc-colours"; # Used for Firefox extensions/addons. nur = { url = "github:nix-community/NUR"; @@ -61,9 +65,11 @@ nixConfig = { extra-substituters = [ "https://nix-community.cachix.org" + "https://niri.cachix.org" # WAIT4NIRI ]; extra-trusted-public-keys = [ "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + "niri.cachix.org-1:Wv0OmO7PsuocRKzfDoJ3mulSl7Z6oezYhGhR+3W2964=" # WAIT4NIRI ]; }; } diff --git a/hosts/sydpc/configuration.nix b/hosts/sydpc/configuration.nix new file mode 100644 index 0000000..ade77ed --- /dev/null +++ b/hosts/sydpc/configuration.nix @@ -0,0 +1,160 @@ +{ config, pkgs, lib, disko, sydnix-cli, ... }: + +{ + imports = [ + ./hardware.nix + ./disks.nix + ]; + + sydnix = { + filesystemType = "btrfs"; + + steam.enable = true; + niri.enable = true; + stylix.enable = true; + + users.users = [ + "crumb" + ]; + + impermanence = { + enable = true; + directories = [ + # "Warning: Neither /var/lib/nixos nor any of its parents are persisted. + # This means all users/groups without specified uids/gids will have them + # reassigned on reboot." + "/var/lib/nixos" + # We don't want to have different ssh keys on reboot, because ssh keys + # are expected to consistently identify machines... I think. I mostly + # just think it's annoying to edit ~/.ssh/known_hosts all the time. + "/etc/ssh" + ]; + rollback = { + enable = true; + device = "/dev/disk/by-partlabel/disk-bootroot-root"; + subvolume = "rootfs"; + }; + }; + }; + + # Disable systemd-sleep. Let KDE or whatever dim the screen without + # suspending the computer. + systemd.sleep.extraConfig = '' + AllowSuspend=no + AllowHibernation=no + AllowHybridSleep=no + AllowSuspendThenHibernate=no + ''; + + boot.loader = { + grub.enable = false; + systemd-boot.enable = true; + efi.canTouchEfiVariables = false; + }; + + time.timeZone = "America/Denver"; + + i18n.defaultLocale = "en_US.UTF-8"; + + console = { + font = "Lat2-Terminus16"; + useXkbConfig = true; # Use xkb.options in tty. + }; + + hardware.nvidia.open = false; + + services.xserver = { + enable = true; + videoDrivers = [ "nvidia" ]; + xkb = { + layout = "us"; + options = "ctrl:swapcaps"; + }; + }; + + services.displayManager.sddm.enable = true; # WAIT4NIRI + services.desktopManager.plasma6.enable = true; # WAIT4NIRI + + services.libinput = { + enable = true; + # Disable mouse acceleration. + mouse.accelProfile = "flat"; + # Sensitivity. + mouse.accelSpeed = "-0.5"; + }; + + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + wireplumber.enable = true; + }; + + services.pulseaudio.package = pkgs.pulseaudioFull; + + # Usually we try to delegate declarations of globally-available packages to + # separate modules. These are some exceptional essentials. + environment.systemPackages = [ + pkgs.neovim + pkgs.git + sydnix-cli.packages.x86_64-linux.default + (import ../../scripts/port-tools { inherit pkgs; }) + + # Waypipe provides the equivalent of X11 forwarding for Wayland. When + # connecting to a remote, it is required that `waypipe` is on the remote's + # PATH, thus we include it globally here. + pkgs.waypipe + pkgs.cachix + ]; + + programs.xwayland.enable = true; + + services.openssh = { + enable = true; + settings.PermitRootLogin = "yes"; + settings.X11Forwarding = true; + }; + + # TODO: Move to defaults. + users.mutableUsers = false; + + nix = { + settings = { + trusted-users = [ + "@wheel" + ]; + substituters = [ + "https://cache.deertopia.net" + "https://nix-community.cachix.org" + "https://cache.nixos.org" + ]; + trusted-public-keys = [ + (builtins.readFile ../../public-keys/deertopia-cache.pub.pem) + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + }; + + # This option defines the first version of NixOS you have installed on this + # particular machine, and is used to maintain compatibility with application + # data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any + # reason, even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are + # pulled from, so changing it will NOT upgrade your system - see + # https://nixos.org/manual/nixos/stable/#sec-upgrading for how to actually do + # that. + # + # This value being lower than the current NixOS release does NOT mean your + # system is out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes + # it would make to your configuration, and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or + # https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "24.05"; # Did you read the comment? +} diff --git a/hosts/sydpc/disks.nix b/hosts/sydpc/disks.nix new file mode 100755 index 0000000..b798b55 --- /dev/null +++ b/hosts/sydpc/disks.nix @@ -0,0 +1,73 @@ +# sudo nix --experimental-features "nix-command flakes" run github:nix-community/disko/latest -- --mode disko /persist/dots/hosts/nixos-testbed/disko-config.nix +# time sudo nixos-install --flake /persist/dots#nixos-testbed +{ lib, ... }: +{ + # imports = [ disko.nixosModules.disko ]; + boot.initrd.supportedFilesystems.btrfs = true; + boot.supportedFilesystems.btrfs = true; + + # From Impermanence's README: "Important note: Make sure your persistent + # volumes are marked with neededForBoot, otherwise you will run into + # problems." + fileSystems."/persist".neededForBoot = true; + + disko.devices = { + disk = { + bootroot = { + type = "disk"; + device = "/dev/disk/by-id/ata-Samsung_SSD_870_EVO_1TB_S75BNL0WA33853H"; + content = { + type = "gpt"; + partitions = { + ESP = { + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ "umask=0077" ]; + }; + }; + root = { + size = "100%"; + content = { + type = "btrfs"; + + mountpoint = "/partition-root"; + swap.swapfile.size = "4G"; + + # Override existing partitions. + extraArgs = [ "-f" ]; + + # Subvolumes must set a mountpoint in order to be mounted, + # *unless their parent is mounted*. + subvolumes = { + # Subvolume names do not necessarily correspond to + # mountpoints, despite the structural resemblance to a file + # path. + "/rootfs" = { + mountpoint = "/"; + }; + "/nix" = { + mountpoint = "/nix"; + }; + "/persist" = { + mountpoint = "/persist"; + }; + "/persist/home" = { + mountpoint = "/persist/home"; + }; + "/swap" = { + mountpoint = "/.swapvol"; + swap.swapfile.size = "4G"; + }; + }; + }; + }; + }; + }; + }; + }; + }; +} diff --git a/hosts/sydpc/hardware.nix b/hosts/sydpc/hardware.nix new file mode 100755 index 0000000..d05936b --- /dev/null +++ b/hosts/sydpc/hardware.nix @@ -0,0 +1,25 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/sydpc/system.nix b/hosts/sydpc/system.nix new file mode 100755 index 0000000..132026a --- /dev/null +++ b/hosts/sydpc/system.nix @@ -0,0 +1 @@ +"x86_64-linux" diff --git a/modules/home/discord.nix b/modules/home/discord.nix new file mode 100644 index 0000000..2ed5b60 --- /dev/null +++ b/modules/home/discord.nix @@ -0,0 +1,63 @@ +{ config, lib, pkgs, ... }: + +let cfg = config.sydnix.discord; +in { + options.sydnix.discord = { + enable = lib.mkEnableOption "Discord"; + fixWayland = lib.mkOption { + description = '' + Fix flickering on Wayland. + ''; + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf cfg.enable + (let + # Fixes flickering and platform detection on Wayland. + vesktop-wayland-wrapper = + pkgs.symlinkJoin { + name = "vesktop-wayland-wrapper"; + paths = [ pkgs.callPackage pkgs.vesktop ]; + buildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + wrapProgram $out/bin/vesktop \ + --add-flags "--disable-gpu-compositing" + # --add-flags "--disable-gpu-compositing --ozone-platform-hint=auto" + ''; + }; + in { + sydnix.impermanence.directories = + let xdg-config-home = + config.home.confighome + or "${config.home.homeDirectory}/.config"; + in [ + # This directory should really be written in terms of + # `config.programs.nixcord.vesktopConfigDir`, but it defaults to null + # for unknown reasons. This is in conflict with the docs, which claim + # it should be the path used here. + (lib.removePrefix + config.home.homeDirectory + "${xdg-config-home}/vesktop/sessionData") + ]; + + programs.nixcord = { + enable = true; + discord = { + # Install Vesktop without Discord. + enable = false; + # openASAR.enable = true; + vencord.enable = false; + vencord.package = pkgs.vencord; + }; + vesktop = { + enable = true; + # package = + # if cfg.fixWayland + # then vesktop-wayland-wrapper + # else pkgs.vesktop; + }; + }; + }); +} diff --git a/modules/home/steam.nix b/modules/home/steam.nix new file mode 100644 index 0000000..4dcb71f --- /dev/null +++ b/modules/home/steam.nix @@ -0,0 +1,25 @@ +{ config, pkgs, lib, inputs, system, ... }: + +let cfg = config.sydnix.steam; +in { + options.sydnix.steam = { + enable = lib.mkEnableOption "Steam"; + }; + + config = lib.mkIf cfg.enable { + sydnix.impermanence.directories = [ + # Steam has a number of mysterious issues when its state directories are + # symlinks. Most bizarrely, I've experienced complementory issues; + # everything breaks when I use bind-mounts, but not + # symlinks. Thanks, Valve! + # + # https://github.com/ValveSoftware/steam-for-linux/issues/10552 + { directory = ".local/share/Steam"; method = "symlink"; } + { directory = ".steam"; method = "symlink"; } + ]; + + home.packages = [ + pkgs.protonup-qt + ]; + }; +} diff --git a/modules/home/syncthing.nix b/modules/home/syncthing.nix index df23ee5..dd5bf90 100644 --- a/modules/home/syncthing.nix +++ b/modules/home/syncthing.nix @@ -40,6 +40,7 @@ in { }; config = lib.mkIf cfg.enable { + # TODO: sydnix.syncthing module sydnix.impermanence.directories = let xdg-state-dir = diff --git a/modules/home/users/crumb/bash.nix b/modules/home/users/crumb/bash.nix index c778b2b..a0c4928 100755 --- a/modules/home/users/crumb/bash.nix +++ b/modules/home/users/crumb/bash.nix @@ -8,6 +8,10 @@ in { programs.bash = { enable = true; }; + + home.shellAliases = { + nix2json = "nix eval --impure --json --file -"; + }; }; } diff --git a/modules/home/users/crumb/discord.nix b/modules/home/users/crumb/discord.nix new file mode 100644 index 0000000..5f7c46a --- /dev/null +++ b/modules/home/users/crumb/discord.nix @@ -0,0 +1,33 @@ +{ config, lib, pkgs, ... }: + +let cfg = config.sydnix.users.crumb.discord; +in { + options.sydnix.users.crumb.discord = { + enable = lib.mkEnableOption "Discord"; + }; + + config = lib.mkIf cfg.enable { + sydnix.discord.enable = true; + + programs.nixcord = { + config = { + themeLinks = [ + # Compact++ (Default) — Themes Discord to look more like a typical IRC + # client. + "https://gitlab.com/api/v4/projects/52800868/snippets/3628352/files/main/compactplusplus-default.theme.css/raw" + ]; + plugins = { + ircColors.enable = true; + }; + }; + vesktop = { + state.firstLaunch = false; + settings = { + discordBranch = "stable"; + minimizeToTray = false; + arRPC = true; + }; + }; + }; + }; +} diff --git a/modules/home/users/crumb/emacs.nix b/modules/home/users/crumb/emacs.nix index 9f6dd4a..409813c 100755 --- a/modules/home/users/crumb/emacs.nix +++ b/modules/home/users/crumb/emacs.nix @@ -4,12 +4,12 @@ let cfg = config.sydnix.users.crumb.emacs; in { options.sydnix.users.crumb.emacs.enable = lib.mkEnableOption ''Emacs, à la crumb''; - config = lib.mkIf cfg.enable - (let - emacsBasePackage = pkgs'.emacs-unstable-pgtk; - # Hard-coded path. }:\ - emacsConfigDir = - "/persist/dots/modules/home/users/${config.home.username}/emacs"; + config = lib.mkIf cfg.enable + (let + emacsBasePackage = pkgs'.emacs-unstable-pgtk; + # Hard-coded path. }:\ + emacsConfigDir = + "/persist/dots/modules/home/users/${config.home.username}/emacs"; # Create a new instance of nixpkgs with emacs-overlay applied. This is a # little unorthodox, but we do it @@ -17,116 +17,119 @@ in { # codebase, I want everything Emacs to stay in this file; # 2. and, there's simply no need to leak emacs-overlay's packages into the # global nixpkgs instance when nothing else is using it! - pkgs' = import inputs.nixpkgs { - system = args.system; - overlays = [ inputs.emacs-overlay.overlays.emacs ]; - }; + pkgs' = import inputs.nixpkgs { + system = args.system; + overlays = [ inputs.emacs-overlay.overlays.emacs ]; + }; - emacsDataDir = "${config.xdg.dataHome}/emacs"; - emacsCacheDir = "${emacsDataDir}/cache"; - straightBaseDir = "${emacsDataDir}/straight"; + emacsDataDir = "${config.xdg.dataHome}/emacs"; + emacsCacheDir = "${emacsDataDir}/cache"; + straightBaseDir = "${emacsDataDir}/straight"; - fontPackages = [ - pkgs.julia-mono - pkgs.nerd-fonts.victor-mono - pkgs.ibm-plex - ]; + fontPackages = [ + pkgs.julia-mono + pkgs.nerd-fonts.victor-mono + pkgs.ibm-plex + ]; - my-aspell = pkgs.aspellWithDicts - (dicts: with dicts; [ - en en-computers en-science - ]); + my-aspell = pkgs.aspellWithDicts + (dicts: with dicts; [ + en en-computers en-science + ]); - my-emacs = - let ewp = (pkgs.emacsPackagesFor emacsBasePackage).emacsWithPackages - (epkgs: with epkgs; [ - jinx - pdf-tools - treesit-grammars.with-all-grammars - ]); - in pkgs.symlinkJoin { - name = "sydmacs"; - paths = [ ewp ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; - buildInputs = [ - pkgs.git # Dependency of Straight.el. - my-aspell - pkgs.direnv - ]; - postBuild = '' - find "$out/bin" -name emacs -or -name "emacs-*" \ - | while IFS= read -r emacs; do - echo "emacs: $emacs" - wrapProgram "$emacs" \ - --add-flags "--init-directory \"${emacsConfigDir}\"" \ - --set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \ - --set EMACS_CACHE_DIR "${emacsCacheDir}" \ - --set EMACS_DATA_DIR "${emacsDataDir}" \ - --prefix PATH : "${pkgs.git}/bin" \ - --prefix PATH : "${my-aspell}/bin" \ - --prefix PATH : "${pkgs.direnv}/bin" \ - --prefix PATH : "${pkgs.texliveFull}/bin" \ - --set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell" - done - ''; - meta = emacsBasePackage.meta; - version = emacsBasePackage.version; - }; + my-emacs = + let ewp = (pkgs.emacsPackagesFor emacsBasePackage).emacsWithPackages + (epkgs: with epkgs; [ + jinx + pdf-tools + treesit-grammars.with-all-grammars + ]); + in pkgs.symlinkJoin { + name = "sydmacs"; + paths = [ ewp ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; + buildInputs = [ + pkgs.git # Dependency of Straight.el. + my-aspell + pkgs.direnv + ]; + postBuild = '' + find "$out/bin" -name emacs -or -name "emacs-*" \ + | while IFS= read -r emacs; do + echo "emacs: $emacs" + wrapProgram "$emacs" \ + --add-flags "--init-directory \"${emacsConfigDir}\"" \ + --set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \ + --set EMACS_CACHE_DIR "${emacsCacheDir}" \ + --set EMACS_DATA_DIR "${emacsDataDir}" \ + --prefix PATH : "${pkgs.git}/bin" \ + --prefix PATH : "${my-aspell}/bin" \ + --prefix PATH : "${pkgs.direnv}/bin" \ + --prefix PATH : "${pkgs.texliveFull}/bin" \ + --set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell" + done + ''; + meta = emacsBasePackage.meta; + version = emacsBasePackage.version; + }; - emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" '' - emacsclient --alternate-editor=${config.programs.emacs.finalPackage}/bin/emacs "$@" - ''; - in { - programs.emacs = { - enable = true; - package = my-emacs; - }; + emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" '' + emacsclient --alternate-editor=${config.programs.emacs.finalPackage}/bin/emacs "$@" + ''; + in { + programs.emacs = { + enable = true; + package = my-emacs; + }; - sydnix.impermanence.cache.directories = + sydnix.impermanence.cache.directories = # Impermanence expects the path to be relative to ~. - map (lib.removePrefix config.home.homeDirectory) [ - straightBaseDir - emacsCacheDir - emacsDataDir - ]; + map (lib.removePrefix config.home.homeDirectory) [ + straightBaseDir + emacsCacheDir + emacsDataDir + ]; # Set emacsclient as the default editor for the time being. - home.sessionVariables = - let e = "${emacsclient-or-emacs}/bin/emacsclient-or-emacs"; - in { - "EDITOR" = e; - "VISUAL" = e; - }; + home.sessionVariables = + let e = "${emacsclient-or-emacs}/bin/emacsclient-or-emacs"; + in { + "EDITOR" = e; + "VISUAL" = e; + }; - home.file = - let default = - lib.removePrefix "${config.home.homeDirectory}/" - "${straightBaseDir}/straight/versions/default.el"; - in { - ${default}.source = - config.lib.file.mkOutOfStoreSymlink - "${emacsConfigDir}/straight-lockfile.el"; - }; + home.file = + let default = + lib.removePrefix "${config.home.homeDirectory}/" + "${straightBaseDir}/straight/versions/default.el"; + in { + ${default}.source = + config.lib.file.mkOutOfStoreSymlink + "${emacsConfigDir}/straight-lockfile.el"; + }; - home.packages = [ - emacsclient-or-emacs - ] ++ fontPackages; + home.packages = [ + emacsclient-or-emacs + ] ++ fontPackages; # There's probably a better place to put this, but the current setup demands # Fontconfig for Emacs to find my fonts. - fonts.fontconfig.enable = true; + fonts.fontconfig.enable = true; # TODO: Make sure this is using the right package for Emacs... - services.emacs = { - enable = true; + services.emacs = { + enable = true; # Generate a desktop entry for emacsclient. - client.enable = true; - }; + client.enable = true; + }; + + # We do this ourselves. + stylix.targets.emacs.enable = false; home.shellAliases = { e = "emacsclient-or-emacs"; ec = "emacsclient"; em = "emacs"; }; - }); + }); } diff --git a/modules/home/users/crumb/emacs/cool-deer.org b/modules/home/users/crumb/emacs/cool-deer.org new file mode 100644 index 0000000..7454d9b --- /dev/null +++ b/modules/home/users/crumb/emacs/cool-deer.org @@ -0,0 +1 @@ +[cool-deer goes here] diff --git a/modules/home/users/crumb/emacs/early-init.el b/modules/home/users/crumb/emacs/early-init.el index 8b3d3ed..a97bfee 100755 --- a/modules/home/users/crumb/emacs/early-init.el +++ b/modules/home/users/crumb/emacs/early-init.el @@ -10,8 +10,11 @@ (setq use-package-compute-statistics t) (setq gc-cons-threshold - ;; (6 gibibytes) - (* 6 (expt 1024 3))) + ;; (8 gibibytes) + (* 8 (expt 1024 3))) + +(set-frame-parameter nil 'drag-with-header-line t) +(set-frame-parameter nil 'undecorated t) ;; By default, Emacs will cache compilation artifacts in my personal config ;; directory — I'm not keen on that! Redirect it to a dedicated cache directory. diff --git a/modules/home/users/crumb/emacs/modules/lang/syd-lang-kdl.el b/modules/home/users/crumb/emacs/modules/lang/syd-lang-kdl.el new file mode 100644 index 0000000..9641c3f --- /dev/null +++ b/modules/home/users/crumb/emacs/modules/lang/syd-lang-kdl.el @@ -0,0 +1,9 @@ +;;; syd-lang-kdl.el -*- lexical-binding: t; -*- + +(use-package kdl-ts-mode + :mode "\\.kdl\\'" + :straight (:type git + :host github + :repo "dataphract/kdl-ts-mode")) + +(provide 'syd-lang-kdl) diff --git a/modules/home/users/crumb/emacs/modules/lang/syd-lang-nix.el b/modules/home/users/crumb/emacs/modules/lang/syd-lang-nix.el index 4698c6a..80fa25d 100644 --- a/modules/home/users/crumb/emacs/modules/lang/syd-lang-nix.el +++ b/modules/home/users/crumb/emacs/modules/lang/syd-lang-nix.el @@ -13,8 +13,16 @@ (nix-repl) (current-buffer)) +(evil-define-text-object syd-nix-obj-outer-binding (count _beg _end _type) + "TODO" + :type 'inclusive + (let* ((cleanup-p (memq evil-this-operator '(evil-delete))) + (node (treesit-thing-at-point "binding" "nested"))) + (list (treesit-node-start node) + (treesit-node-end node)))) + (use-package nix-mode - :mode "\\.nix\\'" + ;; :mode "\\.nix\\'" :init (add-to-list 'auto-mode-alist (cons (rx "/flake.lock'") @@ -24,17 +32,30 @@ :config (add-hook 'nix-mode-hook #'lsp) (set-popup-rule! (rx bol "*nixos-options-doc*" eol) :ttl 0 :quit t) - (set-repl-handler! 'nix-mode #'syd-nix-open-nix-repl) + (set-repl-handler! '(nix-mode nix-ts-mode) #'syd-nix-open-nix-repl) (dolist (c '(?- ?_)) (modify-syntax-entry c "w" nix-mode-syntax-table)) - + ;; Inform Smartparens and Evil-surround of Nix's alternative string syntax. (with-eval-after-load 'smartparens - (sp-local-pair 'nix-mode "''" "''")) - (syd-add-hook 'nix-mode-hook + (sp-local-pair '(nix-mode nix-ts-mode) "''" "''")) + (syd-add-hook '(nix-mode-hook nix-ts-mode-hook) (defun syd-nix--configure-evil-surround-h () (with-eval-after-load 'evil-surround (push '(?Q . ("''" . "''")) evil-surround-pairs-alist))))) +(use-package nix-ts-mode + :mode "\\.nix\\'" + :config + (require 'nix-mode) + (general-def + :keymaps 'nix-ts-mode-map + :states '(visual operator) + "ad" #'syd-nix-obj-outer-binding) + (syd-add-hook 'nix-ts-mode-hook + (defun syd-nix-set-syntax-table-h () + "Set the syntax table in `nix-ts-mode' buffers to `nix-mode-syntax-table'." + (set-syntax-table nix-mode-syntax-table)))) + (provide 'syd-lang-nix) diff --git a/modules/home/users/crumb/emacs/modules/syd-evil.el b/modules/home/users/crumb/emacs/modules/syd-evil.el index 86a1ffc..9a3b15d 100755 --- a/modules/home/users/crumb/emacs/modules/syd-evil.el +++ b/modules/home/users/crumb/emacs/modules/syd-evil.el @@ -352,14 +352,14 @@ interactive call to `eval-expression' is stored.") (advice-add #'evil-indent :around #'syd-evil-dont-move-point-a)) -(use-package evil-leap - :hook (on-first-input . evil-leap-mode) - :load-path "/home/crumb/src/evil-leap" - :straight nil - ;; :straight (:type git - ;; :host gitlab - ;; :repo "msyds/evil-leap") - :config - (evil-leap-install-default-keybindings)) +;(use-package evil-leap +; :hook (on-first-input . evil-leap-mode) +; :load-path "/home/crumb/src/evil-leap" +; :straight nil +; ;; :straight (:type git +; ;; :host gitlab +; ;; :repo "msyds/evil-leap") +; :config +; (evil-leap-install-default-keybindings)) (provide 'syd-evil) diff --git a/modules/home/users/crumb/emacs/modules/syd-lang.el b/modules/home/users/crumb/emacs/modules/syd-lang.el index 57e0d5d..5ee184c 100644 --- a/modules/home/users/crumb/emacs/modules/syd-lang.el +++ b/modules/home/users/crumb/emacs/modules/syd-lang.el @@ -2,6 +2,7 @@ (file-name-concat user-emacs-directory "modules" "lang")) (require 'syd-lang-agda) +(require 'syd-lang-kdl) (require 'syd-lang-emacs-lisp) (require 'syd-lang-clojure) (require 'syd-lang-nix) diff --git a/modules/home/users/crumb/emacs/modules/syd-scratch.el b/modules/home/users/crumb/emacs/modules/syd-scratch.el index fb1013d..1fedee5 100755 --- a/modules/home/users/crumb/emacs/modules/syd-scratch.el +++ b/modules/home/users/crumb/emacs/modules/syd-scratch.el @@ -30,7 +30,8 @@ (use-package emacs :custom ((initial-scratch-message (with-temp-buffer - (insert-file-contents "/persist/vault/crumb/cool-deer.org") + (insert-file-contents (file-name-concat user-emacs-directory + "cool-deer.org")) (buffer-string))) ;; Initial major mode for scratch buffer. (initial-major-mode 'fundamental-mode) diff --git a/modules/home/users/crumb/firefox.nix b/modules/home/users/crumb/firefox.nix index 71232ed..2091b4d 100644 --- a/modules/home/users/crumb/firefox.nix +++ b/modules/home/users/crumb/firefox.nix @@ -7,6 +7,38 @@ in { lib.mkEnableOption "Firefox, à la crumb"; config = lib.mkIf cfg.enable { + # We are very granular about which Firefox files are persisted. While there + # is a lot of mutable state (e.g. search history), it is mixed with less + # mutable configuration that we force ourselves to manage declaratively. + # + # For an overview of important files in the profile directory, see + # https://support.mozilla.org/en-US/kb/recovering-important-data-from-an-old-profile. + sydnix.impermanence = + { directories = [ ".mozilla/firefox/msyds" ]; }; + # let p = ".mozilla/firefox/msyds"; + # in { + # files = [ + # # Passwords + # "${p}/key4.db" + # "${p}/logins.json" + # "${p}/logins-backup.json" + # # Site-specific permissions + # "${p}/permissions.sqlite" + # # Bookmarks, downloads and browsing history + # "${p}/places.sqlite" + # # Cached favicons for use in the history menu. + # "${p}/favicons.sqlite" + # # Cookies + # "${p}/cookies.sqlite" + # # Security certificate settings + # "${p}/cert9.db" + # # Form history (for completions) + # "${p}/formhistory.sqlite" + # ]; + # }; + + stylix.targets.firefox.profileNames = [ "msyds" ]; + programs.firefox = { enable = true; @@ -80,6 +112,7 @@ in { overlays = [ inputs.nur.overlays.default ]; }; in + # https://nur.nix-community.org/repos/rycee/ with pkgs'.nur.repos.rycee.firefox-addons; [ ublock-origin darkreader @@ -87,12 +120,68 @@ in { vimium kagi-search duckduckgo-privacy-essentials - edit-with-emacs + textern copy-as-org-mode clearurls + sidebery + adaptive-tab-bar-colour + adnauseam + # tree-style-tab + # tab-unload-for-tree-style-tab + # tst-tab-search + # tst-more-tree-commands + # tst-lock-tree-collapsed + # tst-fade-old-tabs + # tst-bookmarks-subpanel + # move-unloaded-tabs-for-tst + tab-stash + unpaywall + sourcegraph + sponsorblock + cookies-txt + copy-selected-tabs-to-clipboard + copy-link-text + df-youtube ]; }; + # https://github.com/mbnuqw/sidebery/wiki/Firefox-Styles-Snippets-(via-userChrome.css) + userChrome = '' + /* Hide the tab bar in favour of that provided by the tree-style tabs + * addon */ + /** + * Dynamic Horizontal Tabs Toolbar (with animations) + * sidebar.verticalTabs: false (with native horizontal tabs) + */ + #main-window #TabsToolbar > .toolbar-items { + overflow: hidden; + transition: height 0.3s 0.3s !important; + } + /* Default state: Set initial height to enable animation */ + #main-window #TabsToolbar > .toolbar-items { height: 3em !important; } + #main-window[uidensity="touch"] #TabsToolbar > .toolbar-items { height: 3.35em !important; } + #main-window[uidensity="compact"] #TabsToolbar > .toolbar-items { height: 2.7em !important; } + /* Hidden state: Hide native tabs strip */ + #main-window[titlepreface*="\200b"] #TabsToolbar > .toolbar-items { height: 0 !important; } + /* Hidden state: Fix z-index of active pinned tabs */ + #main-window[titlepreface*="\200b"] #tabbrowser-tabs { z-index: 0 !important; } + /* Hidden state: Hide window buttons in tabs-toolbar */ + #main-window[titlepreface*="\200b"] #TabsToolbar .titlebar-spacer, + #main-window[titlepreface*="\200b"] #TabsToolbar .titlebar-buttonbox-container { + display: none !important; + } + /* [Optional] Uncomment block below to show window buttons in nav-bar + * (maybe, I didn't test it on non-linux-i3wm env) */ + /* #main-window[titlepreface*="\200b"] #nav-bar > .titlebar-buttonbox-container, + #main-window[titlepreface*="\200b"] #nav-bar > .titlebar-buttonbox-container > .titlebar-buttonbox { + display: flex !important; + } */ + /* [Optional] Uncomment one of the line below if you need space near + * window buttons */ + /* #main-window[titlepreface*="\200b"] #nav-bar > .titlebar-spacer[type="pre-tabs"] { display: flex !important; } */ + /* #main-window[titlepreface*="\200b"] #nav-bar > .titlebar-spacer[type="post-tabs"] { display: flex !important; } */ + ''; + search = { # Override non-declared settings. force = true; @@ -101,6 +190,14 @@ in { default = "Kagi"; privateDefault = "DuckDuckGo"; engines = { + "Kagi" = { + urls = [{ + template = "https://kagi.com/search"; + params = [ + { name = "q"; value = "{searchTerms}"; } + ]; + }]; + }; "Nixpkgs" = { urls = [{ template = "https://search.nixos.org/packages"; @@ -132,9 +229,13 @@ in { "browser.newtabpage.activity-stream.showSponsored" = false; "browser.urlbar.sponsoredTopSites" = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsored" - = false; + = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.showSponsoredTopSites" - = false; + = false; + "browser.sessionstore.persist_closed_tabs_between_sessions" = true; + "browser.download.always_ask_before_handling_new_types" = true; + # Enable userChrome.css. + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; }; }; }; diff --git a/modules/home/users/crumb/ghostty.nix b/modules/home/users/crumb/ghostty.nix new file mode 100644 index 0000000..1ec5e6c --- /dev/null +++ b/modules/home/users/crumb/ghostty.nix @@ -0,0 +1,13 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.sydnix.users.crumb.ghostty; +in { + options.sydnix.users.crumb.ghostty.enable = + lib.mkEnableOption "Ghostty, à la crumb"; + + config = lib.mkIf cfg.enable { + programs.ghostty.enable = true; + }; +} + diff --git a/modules/home/users/crumb/mpd.nix b/modules/home/users/crumb/mpd.nix index 923cbfd..0db09cc 100644 --- a/modules/home/users/crumb/mpd.nix +++ b/modules/home/users/crumb/mpd.nix @@ -30,7 +30,10 @@ in { # mpdscribble uses our password files, so it is imperative that the service # runs only after said password files are brought into existence. }:) - systemd.user.services.mpdscribble.Unit.After = [ "sops-nix.service" ]; + systemd.user.services.mpdscribble.Unit = { + After = [ "sops-nix.service" ]; + WantedBy = [ "mpd.service" ]; + }; }; } diff --git a/modules/home/users/crumb/niri.nix b/modules/home/users/crumb/niri.nix new file mode 100644 index 0000000..f69982e --- /dev/null +++ b/modules/home/users/crumb/niri.nix @@ -0,0 +1,209 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.sydnix.users.crumb.niri; +in { + options.sydnix.users.crumb.niri = { + enable = lib.mkEnableOption "Niri, à la crumb"; + wallpaper = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = config.stylix.image; + }; + # xwayland-satellite implements rootless Xwayland in a separate application, + # without the host compositor's involvement. It makes X11 windows appear as + # normal windows, just like a native Xwayland integration. While it is still + # somewhat experimental, it handles a lot of applications correctly, like + # Steam, games and Discord. + xwayland-satellite.enable = + lib.mkEnableOption "xwayland-satellite starting with Niri" + // { default = true; }; + }; + + config = lib.mkIf cfg.enable { + stylix.targets.swaylock.enable = true; + + programs.niri = { + # Activates some Nixpkgs patches to help run Electron applications under + # Wayland. + settings = { + environment."NIXOS_OZONE_WL" = "1"; + environment."DISPLAY" = ":0"; + + spawn-at-startup = + [{ command = [ "${pkgs.swaynotificationcenter}/bin/swaync" ]; }] + ++ lib.optional + cfg.xwayland-satellite.enable + { command = [ "${pkgs.xwayland-satellite}/bin/xwayland-satellite" ]; } + ++ lib.optional + (! builtins.isNull cfg.wallpaper) + { command = [ "${pkgs.wbg}/bin/wbg" "${cfg.wallpaper}" ]; }; + input = { + keyboard.xkb = { + layout = "us"; + options = "ctrl:swapcaps,compose:menu"; + }; + mouse = { + accel-speed = -0.5; + accel-profile = "flat"; + }; + focus-follows-mouse.enable = true; + }; + outputs."DP-1" = { + mode.width = 2560; + mode.height = 1440; + mode.refresh = 144.0; + scale = 1; + }; + layout = { + gaps = 8; + # center-focused-column = "always"; + center-focused-column = "on-overflow"; + preset-column-widths = [ + { proportion = 1.0 / 3.0; } + { proportion = 1.0 / 2.0; } + { proportion = 2.0 / 3.0; } + ]; + default-column-width.proportion = 0.5; + # default-column-width.proportion = {}; + focus-ring = { + enable = false; + width = 2; + }; + border = { + enable = true; + width = 2; + # Override Niri's Stylix integration. Default uses Crystal Blue; we + # override it with Old White. + active.color = config.lib.stylix.colors.withHashtag.base06; + }; + shadow = { + enable = true; + softness = 30; + spread = 5; + offset.x = 5; + offset.y = 5; + }; + }; + prefer-no-csd = true; + screenshot-path = "~/Pictures/Screenshots/%Y-%m-%d %H-%M-%S.png"; + cursor = { + theme = "default"; + size = 24; + }; + window-rules = [ + { + # This regular expression is intentionally made as specific as + # possible, since this is the default config, and we want no false + # positives. You can get away with just app-id="wezterm" if you + # want. + matches = [ + { app-id = "^org\\.wezfurlong\\.wezterm$"; } + ]; + default-column-width = {}; + } + { + # Open the Firefox picture-in-picture player as floating by default. + matches = [ + { app-id = "firefox$"; title = "^Picture-in-Picture$"; } + ]; + open-floating = true; + } + { + # Enable rounded corners for all windows. + geometry-corner-radius = + let r = 8.0; + in { + bottom-left = r; + top-left = r; + bottom-right = r; + top-right = r; + }; + clip-to-geometry = true; + } + ]; + binds = with config.lib.niri.actions; { + "Mod+Q".action.close-window = []; + "Mod+Shift+Q".action.quit = []; + "Mod+Ctrl+L".action.spawn = ["${pkgs.swaylock}/bin/swaylock"]; + "Mod+D".action.spawn = ["${pkgs.fuzzel}/bin/fuzzel"]; + "Mod+Shift+Slash".action.show-hotkey-overlay = []; + + # Powers off the monitors. To turn them back on, do any input like + # moving the mouse or pressing any other key. + "Mod+Shift+P".action.power-off-monitors = []; + + "Mod+BracketLeft".action.consume-or-expel-window-left = []; + "Mod+BracketRight".action.consume-or-expel-window-right = []; + "Mod+Comma".action.consume-window-into-column = []; + "Mod+Period".action.expel-window-from-column = []; + + "Mod+Minus".action.set-column-width = ["-10%"]; + "Mod+Equal".action.set-column-width = ["+10%"]; + + "Mod+Shift+Minus".action.set-window-height = ["-10%"]; + "Mod+Shift+Equal".action.set-window-height = ["+10%"]; + + "Mod+C".action.center-column = []; + "Mod+M".action.maximize-column = []; + "Mod+Shift+M".action.fullscreen-window = []; + # Currently unreleased }:(. + # "Mod+Ctrl+M".action.toggle-windowed-fullscreen = []; + + "Mod+Shift+S".action.screenshot = []; + "Print".action.screenshot-screen = []; + "Mod+Print".action.screenshot-window = []; + + "Mod+X".action.spawn = [ + "emacsclient-or-emacs" + "-ce" + "(eshell t)" + ]; + + "Mod+Shift+F".action.toggle-window-floating = []; + "Mod+F".action.switch-focus-between-floating-and-tiling = []; + "Mod+Shift+T".action.toggle-column-tabbed-display = []; + + "Alt+Tab".action.focus-window-previous = []; + + "Mod+H".action.focus-column-left = []; + "Mod+J".action.focus-window-down = []; + "Mod+K".action.focus-window-up = []; + "Mod+L".action.focus-column-right = []; + + "Mod+Shift+H".action.move-column-left = []; + "Mod+Shift+J".action.move-window-down = []; + "Mod+Shift+K".action.move-window-up = []; + "Mod+Shift+L".action.move-column-right = []; + + "Mod+1".action.focus-workspace = [1]; + "Mod+2".action.focus-workspace = [2]; + "Mod+3".action.focus-workspace = [3]; + "Mod+4".action.focus-workspace = [4]; + "Mod+5".action.focus-workspace = [5]; + "Mod+6".action.focus-workspace = [6]; + "Mod+7".action.focus-workspace = [7]; + "Mod+8".action.focus-workspace = [8]; + "Mod+9".action.focus-workspace = [9]; + "Mod+Shift+1".action.move-column-to-workspace = [1]; + "Mod+Shift+2".action.move-column-to-workspace = [2]; + "Mod+Shift+3".action.move-column-to-workspace = [3]; + "Mod+Shift+4".action.move-column-to-workspace = [4]; + "Mod+Shift+5".action.move-column-to-workspace = [5]; + "Mod+Shift+6".action.move-column-to-workspace = [6]; + "Mod+Shift+7".action.move-column-to-workspace = [7]; + "Mod+Shift+8".action.move-column-to-workspace = [8]; + "Mod+Shift+9".action.move-column-to-workspace = [9]; + + "Mod+Shift+R".action.switch-preset-window-height = []; + "Mod+Ctrl+R".action.reset-window-height = []; + + "XF86AudioRaiseVolume".action = + spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; + "XF86AudioLowerVolume".action = + spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; + }; + }; + }; + }; +} + diff --git a/modules/home/users/crumb/waybar.nix b/modules/home/users/crumb/waybar.nix new file mode 100644 index 0000000..0d275f1 --- /dev/null +++ b/modules/home/users/crumb/waybar.nix @@ -0,0 +1,27 @@ +{ config, lib, pkgs, ... }: + +let cfg = config.sydnix.users.crumb.waybar; +in { + options.sydnix.users.crumb.waybar = { + enable = lib.mkEnableOption "Waybar, à la crumb"; + }; + + config = lib.mkIf cfg.enable { + home.packages = [ + pkgs.martian-mono + pkgs.nerd-fonts.symbols-only + ]; + + stylix.targets.waybar.enable = false; + programs.waybar = { + enable = true; + style = ./waybar/src/waybar.css; + systemd.enable = true; + systemd.target = "niri.service"; + settings.sydbar = import ./waybar/src/waybar.nix { + niri-gaps = config.programs.niri.settings.layout.gaps; + inherit pkgs lib; + }; + }; + }; +} diff --git a/modules/home/users/crumb/waybar/.envrc b/modules/home/users/crumb/waybar/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/modules/home/users/crumb/waybar/.envrc @@ -0,0 +1 @@ +use nix diff --git a/modules/home/users/crumb/waybar/dev.sh b/modules/home/users/crumb/waybar/dev.sh new file mode 100755 index 0000000..00cdacf --- /dev/null +++ b/modules/home/users/crumb/waybar/dev.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p inotify-tools waybar mako swaynotificationcenter libnotify pavucontrol + +# This script will watch waybar.nix and compile it to /tmp/waybar.json. Offers +# a much tighter feedback loop than that offered by the Nix module. + +# Inotify will sometimes double-fire events. We avoid unnecessary recompilation +# by putting a cooldown on builds. +last_build=0 +waybar_pid="" + +update () { + last_build="$(date +%s)" + + if [ ! -z "$waybar_pid" ]; then + kill "$waybar_pid" + echo >&2 "Killed waybar..." + waybar_pid="" + fi + + echo >&2 "Building waybar.json..." + nix eval --impure --json --expr "import ./waybar.nix {}" \ + > /tmp/waybar.json \ + && echo >&2 "Built waybar.json!" + waybar -c waybar.json -b sydbar -s waybar.css 2>&1 >/dev/null & + waybar_pid=$! + echo >&2 "Started Waybar [$waybar_pid]" +} + +update + +inotifywait -me modify waybar.nix waybar.css cycle_notifications.clj | + while read _ _ file_name; do + ct="$(date +%s)" + if (( ct - last_build < 1 )); then + echo >&2 "Ignoring event (on cooldown)" + else + update + fi + done diff --git a/modules/home/users/crumb/waybar/shell.nix b/modules/home/users/crumb/waybar/shell.nix new file mode 100644 index 0000000..90b5c3f --- /dev/null +++ b/modules/home/users/crumb/waybar/shell.nix @@ -0,0 +1,14 @@ +{ pkgs ? import {} +}: + +pkgs.mkShell { + packages = with pkgs; [ + inotify-tools + waybar + mako + swaynotificationcenter + libnotify + babashka + pavucontrol + ]; +} diff --git a/modules/home/users/crumb/waybar/src/cputemp b/modules/home/users/crumb/waybar/src/cputemp new file mode 100755 index 0000000..35cafb0 --- /dev/null +++ b/modules/home/users/crumb/waybar/src/cputemp @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +check() { + command -v "$1" 1>/dev/null +} + +check sensors || exit + +data="$(sensors coretemp-isa-0000 | sed 's/+//g')" +package="$(echo "$data" | awk -e '/Package/ {print $4}')" +coretemp="$(echo "$data" | awk -e '/Core/ {print $3}')" + +tooltip="Core Temp: $package \n" + +# "format-icons" : [ "", "", "", "", "" ] , +tempint=''${package%.*} +temp="''${tempint}󰔄" +# icon="" +class="cool" +[ "$tempint" -gt 50 ] && { + # icon="" + class="normal" +} +[ "$tempint" -gt 70 ] && { + # icon=" " + class="warm" +} +[ "$tempint" -gt 85 ] && { + # icon=" " + class="warn" +} +[ "$tempint" -gt 95 ] && { + # icon=" " + class="critical" +} + +j=0 +for i in $coretemp; do + tooltip+="Core $j: $i\n" + ((j = j + 1)) +done +tooltip="''${tooltip::-2}" +cat < (case (:out (p/shell {:out :string} "swaync-client -D")) + "false" {:text "" :tooltip "Notify"} + "true" {:text "" :tooltip "Do not disturb"}) + json/generate-string + println)) + +(defn -main [& args] + (case (first args) + "toggle" (toggle!) + nil (status))) diff --git a/modules/home/users/crumb/waybar/src/waybar.css b/modules/home/users/crumb/waybar/src/waybar.css new file mode 100644 index 0000000..7bd23a0 --- /dev/null +++ b/modules/home/users/crumb/waybar/src/waybar.css @@ -0,0 +1,312 @@ +/* !!!!!!! Shamelessly stolen from Niksingh710 */ +/* https://github.com/niksingh710/gdots/blob/d97c544a9d73a34d12770ba20b6b80d14e964aa1/.config/waybar/style.css */ +@define-color fuji-white #DCD7BA; +@define-color old-white #C8C093; +@define-color sumi-ink-0 #16161D; +@define-color sumi-ink-1 #1F1F28; +@define-color sumi-ink-2 #2A2A37; +@define-color sumi-ink-3 #363646; +@define-color sumi-ink-4 #54546D; +@define-color wave-blue-1 #223249; +@define-color wave-blue-2 #2D4F67; +@define-color winter-green #2B3328; +@define-color winter-yellow #49443C; +@define-color winter-red #43242B; +@define-color winter-blue #252535; +@define-color autumn-green #76946A; +@define-color autumn-red #C34043; +@define-color autumn-yellow #DCA561; +@define-color samurai-red #E82424; +@define-color ronin-yellow #FF9E3B; +@define-color wave-aqua-1 #6A9589; +@define-color dragon-blue #658594; +@define-color fuji-gray #727169; +@define-color spring-violet-1 #938AA9; +@define-color oni-violet #957FB8; +@define-color crystal-blue #7E9CD8; +@define-color spring-violet-2 #9CABCA; +@define-color spring-blue #7FB4CA; +@define-color light-blue #A3D4D5; +@define-color wave-aqua-2 #7AA89F; +@define-color spring-green #98BB6C; +@define-color boat-yellow-1 #938056; +@define-color boat-yellow-2 #C0A36E; +@define-color carp-yellow #E6C384; +@define-color sakura-pink #D27E99; +@define-color wave-red #E46876; +@define-color peach-red #FF5D62; +@define-color surimi-orange #FFA066; + +@define-color background @sumi-ink-1; +@define-color foreground @fuji-white; +@define-color border @sumi-ink-4; +@define-color active @old-white; + +* +{ font-size: 16px +; font-family: "Symbols Nerd Font" +; min-width: 8px +; min-height: 0px +; border: none +; border-radius: 0 +; box-shadow: none +; text-shadow: none +; padding: 0px +} + +window#waybar +{ transition-property: background-color +; transition-duration: 0.5s +; border-radius: 8px +; border: 2px solid @active +; background: @background +; background: alpha(@background, 0.7) +; color: lighter(@active) +} + +menu, +tooltip +{ border-radius: 8px +; padding: 2px +; border: 1px solid lighter(@active) +; background: alpha(@background, 0.6) +; color: lighter(@active) +} + +menu label, +tooltip label +{ font-size: 14px +; color: lighter(@active) +} + +#submap, +#tray>.needs-attention +{ animation-name: blink-active +; animation-duration: 1s +; animation-timing-function: linear +; animation-iteration-count: infinite +; animation-direction: alternate +} + +.modules-right +{ margin: 0px 6px 6px 6px +; border-radius: 4px +; background: alpha(@background, 0.4) +; color: lighter(@active) +} + +.modules-left +{ transition-property: background-color +; transition-duration: 0.5s +; margin: 6px 6px 6px 6px +; border-radius: 4px +; background: alpha(@background, 0.4) +; color: lighter(@active) +} + +#gcpu, +#custom-github, +#memory, +#disk, +#together, +#submap, +#custom-weather, +#custom-recorder, +#connection, +#cnoti, +#brightness, +#power, +#custom-updates, +#tray, +#audio, +#privacy, +#sound +{ border-radius: 4px +; margin: 2px 2px 4px 2px +; background: alpha(darker(@active), 0.3) +} + +#custom-notifications +{ padding-left: 4px +} + +#custom-hotspot, +#custom-github, +#custom-notifications +{ font-size: 14px +} + +#custom-hotspot +{ padding-right: 2px +} + +#custom-vpn, +#custom-hotspot +{ background: alpha(darker(@active), 0.3) +} + +#privacy-item +{ padding: 6px 0px 6px 6px +} + +#gcpu +{ padding: 8px 0px 8px 0px +} + +#custom-cpu-icon +{ font-size: 25px +} + +#custom-cputemp, +#disk, +#memory, +#cpu +{ font-size: 14px +; font-weight: bold +} + +#custom-github +{ padding-top: 2px +; padding-right: 4px +} + +#custom-dmark +{ color: alpha(@foreground, 0.3) +} + +#submap +{ margin-bottom: 0px +} + +#workspaces +{ margin: 0px 2px +; padding: 4px 0px 0px 0px +; border-radius: 8px +} + +#workspaces button +{ transition-property: background-color +; transition-duration: 0.5s +; color: @foreground +; background: transparent +; border-radius: 4px +; color: alpha(@foreground, 0.3) +} + +#workspaces button.urgent +{ font-weight: bold +; color: @foreground +} + +#workspaces button.active +{ padding: 4px 2px +; background: alpha(@active, 0.4) +; color: lighter(@active) +; border-radius: 4px +} + +#network.wifi +{ padding-right: 4px +} + +#submap +{ min-width: 0px +; margin: 4px 6px 4px 6px +} + +#custom-weather, +#tray +{ padding: 4px 0px 4px 0px +} + +#bluetooth +{ padding-top: 2px +} + +#battery +{ border-radius: 8px +; padding: 4px 0px +; margin: 4px 2px 4px 2px +} + +#battery.discharging.warning +{ animation-name: blink-yellow +; animation-duration: 1s +; animation-timing-function: linear +; animation-iteration-count: infinite +; animation-direction: alternate +} + +#battery.discharging.critical +{ animation-name: blink-red +; animation-duration: 1s +; animation-timing-function: linear +; animation-iteration-count: infinite +; animation-direction: alternate +} + +#clock +{ font-weight: bold +; padding: 4px 2px 2px 2px +; font-family: "MartianMono" +} + +#pulseaudio.mic +{ border-radius: 4px +; color: @background +; background: alpha(darker(@foreground), 0.6) +; padding-left: 4px +} + +#backlight-slider slider, +#pulseaudio-slider slider +{ background-color: transparent +; box-shadow: none +} + +#backlight-slider trough, +#pulseaudio-slider trough +{ margin-top: 4px +; min-width: 6px +; min-height: 60px +; border-radius: 8px +; background-color: alpha(@background, 0.6) +} + +#backlight-slider highlight, +#pulseaudio-slider highlight +{ border-radius: 8px +; background-color: lighter(@active) +} + +#bluetooth.discoverable, +#bluetooth.discovering, +#bluetooth.pairable +{ border-radius: 8px +; animation-name: blink-active +; animation-duration: 1s +; animation-timing-function: linear +; animation-iteration-count: infinite +; animation-direction: alternate +} + +@keyframes blink-active +{ to + { background-color: @active + ; color: @foreground + } +} + +@keyframes blink-red +{ to + { background-color: @samurai-red + ; color: @foreground + } +} + +@keyframes blink-yellow +{ to + { background-color: @autumn-yellow + ; color: @foreground + } +} diff --git a/modules/home/users/crumb/waybar/src/waybar.nix b/modules/home/users/crumb/waybar/src/waybar.nix new file mode 100644 index 0000000..703419b --- /dev/null +++ b/modules/home/users/crumb/waybar/src/waybar.nix @@ -0,0 +1,485 @@ +# !!!!!! Shamelessly stolen from Niksingh710's config! +# https://github.com/niksingh710/gdots/blob/d97c544a9d73a34d12770ba20b6b80d14e964aa1/.config/waybar/bars/top.jsonc +{ niri-gaps ? 8 +, pkgs ? import {} +, lib ? pkgs.lib +}: + +let + cputemp = pkgs.writeShellApplication { + name = "cputemp"; + runtimeInputs = with pkgs; [ + lm_sensors + ]; + text = builtins.readFile ./cputemp; + }; + cycle-notifications = pkgs.writeShellApplication { + name = "cycle-notifications"; + runtimeInputs = with pkgs; [ + swaynotificationcenter + ]; + text = '' + ${pkgs.babashka}/bin/bb -cp ${./.} -m cycle-notifications -- "$@" + ''; + }; +in { + layer = "top"; + # Left margin will be provided by Niri's gaps. + margin = + let i = builtins.toString niri-gaps; + in "${i} ${i} ${i} 0"; + + modules-left = [ + # "custom/updates" + "niri/workspaces" + "group/info" + ]; + modules-right = [ + "custom/recorder" + "privacy" + "group/brightness" + "group/sound" + "group/together" + # "group/cnoti" + "tray" + # "group/power" + ]; + + backlight = { + device = "intel_backlight"; + format = "{icon}"; + format-icons = + [ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ]; + on-scroll-down = "brightnessctl s 5%-"; + on-scroll-up = "brightnessctl s +5%"; + smooth-scrolling-threshold = 1; + tooltip = true; + tooltip-format = "Brightness: {percent}% "; + }; + "backlight/slider" = { + device = "intel_backlight"; + max = 100; + min = 5; + orientation = "vertical"; + }; + battery = { + format = "{icon}"; + format-charging = "{icon} "; + format-full = "{icon}"; + format-icons = [ "󰁻" "󰁼" "󰁾" "󰂀" "󰂂" "󰁹" ]; + rotate = 270; + states = { + critical = 15; + good = 95; + warning = 30; + }; + tooltip-format = "{timeTo} {capacity} % | {power} W"; + }; + bluetooth = { + format-connected = ""; + format-disabled = ""; + format-off = "󰂲"; + format-on = ""; + on-click = "rofi-bluetooth -config ~/.config/rofi/menu.d/network.rasi -i"; + tooltip-format = '' + {controller_alias} {controller_address} + + {num_connections} connected''; + tooltip-format-connected = '' + {controller_alias} {controller_address} + + {num_connections} connected + + {device_enumerate}''; + tooltip-format-enumerate-connected = "{device_alias} {device_address}"; + tooltip-format-enumerate-connected-battery = + "{device_alias} {device_address} {device_battery_percentage}%"; + }; + "bluetooth#status" = { + format-connected = "{num_connections}"; + format-connected-battery = + "{device_battery_percentage}%"; + format-disabled = ""; + format-off = ""; + format-on = ""; + on-click = "rofi-bluetooth -config ~/.config/rofi/menu.d/network.rasi -i"; + tooltip-format = '' + {controller_alias} {controller_address} + + {num_connections} connected''; + tooltip-format-connected = '' + {controller_alias} {controller_address} + + {num_connections} connected + + {device_enumerate}''; + tooltip-format-enumerate-connected = "{device_alias} {device_address}"; + tooltip-format-enumerate-connected-battery = + "{device_alias} {device_address} {device_battery_percentage}%"; + }; + clock = { + calendar = { + format = { today = "{}"; }; + mode = "month"; + mode-mon-col = 3; + on-click-right = "mode"; + on-scroll = 1; + weeks-pos = "right"; + }; + format = '' + {:%H + %M}''; + tooltip-format = "{calendar}"; + }; + cpu = { + format = "{usage}󱉸"; + on-click = "foot btop"; + }; + "custom/colorpicker" = { + exec = "colorpicker -j"; + format = "{}"; + interval = "once"; + on-click = "sleep 1 && colorpicker"; + return-type = "json"; + signal = 1; + }; + "custom/cpu-icon" = { + format = "󰻠"; + tooltip = false; + }; + "custom/cputemp" = { + exec = "${cputemp}/bin/cputemp"; + format = "{}"; + interval = 10; + return-type = "json"; + }; + "custom/dmark" = { + format = ""; + tooltip = false; + }; + "custom/github" = { + exec = "$HOME/.config/waybar/bin/github.sh"; + format = "{}"; + interval = 3600; + on-click = + "xdg-open https://github.com/notifications;pkill -RTMIN+9 waybar"; + return-type = "json"; + signal = 9; + }; + "custom/hotspot" = { + exec = "~/.config/waybar/bin/hotspot"; + format = "{} "; + interval = 5; + on-click = "hash wihotspot && wihotspot"; + return-type = "json"; + }; + "custom/hyprkill" = { + exec = '' + echo ' + Kill clients using hyrpctl kill' + ''; + format = "{}"; + interval = "once"; + on-click = "sleep 1 && hyprctl kill"; + }; + "custom/hyprshade" = { + exec = "toggle-hyprshade status"; + format = "{}"; + on-click = "toggle-hyprshade"; + return-type = "json"; + signal = 11; + tooltip = true; + }; + "custom/mark" = { + format = ""; + tooltip = false; + }; + "custom/notifications" = { + exec = "${cycle-notifications}/bin/cycle-notifications"; + format = "{} "; + interval = "once"; + on-click = "swaync-client -t"; + on-click-right = "~/scratch/waybar/cycle-notifications toggle"; + return-type = "json"; + signal = 2; + }; + "custom/recorder" = { + exec = "echo ''"; + exec-if = "pgrep 'wl-screenrec'"; + format = "{}"; + interval = "once"; + on-click = "recorder"; + signal = 4; + tooltip = "false"; + }; + "custom/updates" = { + exec = "~/.config/waybar/bin/updatecheck"; + exec-if = "exit 0"; + format = "{}"; + interval = 10800; + return-type = "json"; + signal = 8; + }; + "custom/vpn" = { + exec = "~/.config/waybar/bin/vpn"; + format = "{} "; + interval = 5; + return-type = "json"; + }; + "custom/weather" = { + exec = '' + wttrbar --custom-indicator '{ICON} + {temp_C}' --location noida + ''; + format = "{}"; + interval = 3600; + return-type = "json"; + tooltip = true; + }; + disk = { + format = '' + 󰋊 + {percentage_used}󱉸 + ''; + interval = 600; + path = "/"; + }; + "group/audio" = { + drawer = { + transition-duration = 500; + transition-left-to-right = false; + }; + modules = [ "pulseaudio" "pulseaudio#mic" "pulseaudio/slider" ]; + orientation = "inherit"; + }; + "group/bluetooth" = { + drawer = { + transition-duration = 500; + transition-left-to-right = true; + }; + modules = [ "bluetooth" "bluetooth#status" ]; + orientation = "inherit"; + }; + "group/brightness" = { + drawer = { + transition-duration = 500; + transition-left-to-right = false; + }; + modules = [ + "backlight" + "backlight/slider" + ]; + orientation = "inherit"; + }; + "group/cnoti" = { + modules = [ "custom/github" ]; + orientation = "inherit"; + }; + "group/connection" = { + modules = + [ "custom/vpn" "custom/hotspot" "group/network" "group/bluetooth" ]; + orientation = "inherit"; + }; + "group/gcpu" = { + modules = [ "custom/cpu-icon" "custom/cputemp" "cpu" ]; + orientation = "inherit"; + }; + "group/info" = { + drawer = { + transition-duration = 500; + transition-left-to-right = false; + }; + modules = [ "custom/dmark" "group/gcpu" "memory" "disk" ]; + orientation = "inherit"; + }; + "group/network" = { + drawer = { + transition-duration = 500; + transition-left-to-right = true; + }; + modules = [ "network" "network#speed" ]; + orientation = "inherit"; + }; + "group/power" = { + drawer = { + transition-duration = 500; + transition-left-to-right = false; + }; + modules = [ "battery" "power-profiles-daemon" ]; + orientation = "inherit"; + }; + "group/sound" = { + modules = [ "group/audio" "custom/notifications" ]; + orientation = "inherit"; + }; + "group/together" = { + modules = [ + "group/utils" + "clock" + ]; + orientation = "inherit"; + }; + "group/utils" = { + drawer = { + transition-duration = 500; + transition-left-to-right = true; + }; + modules = [ + "custom/mark" + # "custom/weather" + # "custom/colorpicker" + # "custom/hyprshade" + "idle_inhibitor" + "custom/hyprkill" + ]; + orientation = "inherit"; + }; + "hyprland/submap" = { + format = "󰇘"; + max-length = 8; + tooltip = true; + }; + "hyprland/workspaces" = { + all-outputs = true; + format = "{icon}"; + format-icons = { + "1" = "१"; + "10" = "०"; + "2" = "२"; + "3" = "३"; + "4" = "४"; + "5" = "५"; + "6" = "६"; + "7" = "७"; + "8" = "८"; + "9" = "९"; + }; + on-click = "activate"; + }; + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = "󱎴"; + deactivated = "󰍹"; + }; + tooltip-format-activated = "Idle Inhibitor is active"; + tooltip-format-deactivated = "Idle Inhibitor is not active"; + }; + memory = { + format = '' +  + {:2}󱉸''; + }; + network = { + format = "{icon}"; + format-disconnected = "󰖪"; + format-ethernet = "󰈀"; + format-icons = { + disconnected = [ "󰖪" ]; + ethernet = [ "󰈀" ]; + wifi = [ "󰤨" ]; + }; + format-linked = "󰈁"; + format-wifi = "󰤨"; + on-click = + "pgrep -x rofi &>/dev/null && notify-send rofi || networkmanager_dmenu"; + tooltip = false; + }; + "network#speed" = { + format = " {bandwidthDownBits} "; + interval = 5; + on-click = + "pgrep -x rofi &>/dev/null && notify-send rofi || networkmanager_dmenu"; + rotate = 90; + tooltip = true; + tooltip-format = "{ipaddr}"; + tooltip-format-disconnected = "Not Connected to any type of Network"; + tooltip-format-ethernet = '' + {ifname} 󰈀 + {ipaddr} | {frequency} MHz{icon} ''; + tooltip-format-wifi = '' + {essid} ({signalStrength}%)  + {ipaddr} | {frequency} MHz{icon} ''; + }; + "niri/workspaces" = { + all-outputs = true; + format = "{icon}"; + format-icons = { + "1" = "१"; + "10" = "०"; + "2" = "२"; + "3" = "३"; + "4" = "४"; + "5" = "५"; + "6" = "६"; + "7" = "७"; + "8" = "८"; + "9" = "९"; + }; + on-click = "activate"; + }; + position = "right"; + power-profiles-daemon = { + format = "{icon}"; + format-icons = { + balanced = ""; + default = ""; + performance = ""; + power-saver = ""; + }; + tooltip = true; + tooltip-format = '' + Power profile: {profile} + Driver: {driver}''; + }; + privacy = { + icon-size = 14; + icon-spacing = 4; + modules = [{ + tooltip = true; + tooltip-icon-size = 24; + type = "screenshare"; + }]; + orientation = "vertical"; + transition-duration = 250; + }; + pulseaudio = { + format = "{icon}"; + format-bluetooth = "{icon}"; + format-icons = { + car = " "; + default = [ "󰕿" "󰖀" "󰕾" ]; + handsfree = "󰋌"; + headphones = "󰋌"; + headset = "󰋌"; + phone = ""; + portable = ""; + }; + format-muted = "󰖁"; + on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; + on-click-right = "volume mute"; + on-scroll-down = "pactl set-sink-volume @DEFAULT_SINK@ -5%"; + on-scroll-up = "pactl set-sink-volume @DEFAULT_SINK@ +5%"; + smooth-scrolling-threshold = 1; + tooltip-format = "{volume}% {icon} | {desc}"; + }; + "pulseaudio#mic" = { + format = "{format_source}"; + format-source = ""; + format-source-muted = ""; + on-click = "pactl set-source-mute 0 toggle"; + on-scroll-down = "pactl set-source-volume 0 -1%"; + on-scroll-up = "pactl set-source-volume 0 +1%"; + tooltip-format = "{volume}% {format_source} "; + }; + "pulseaudio/slider" = { + max = 140; + min = 0; + orientation = "vertical"; + }; + reload_style_on_change = true; + tray = { + icon-size = 18; + spacing = 10; + }; +} diff --git a/modules/nixos/niri.nix b/modules/nixos/niri.nix new file mode 100644 index 0000000..6fd22fa --- /dev/null +++ b/modules/nixos/niri.nix @@ -0,0 +1,13 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.sydnix.niri; +in { + options.sydnix.niri.enable = + lib.mkEnableOption "Niri"; + + config = lib.mkIf cfg.enable { + programs.niri.enable = true; + }; +} + diff --git a/modules/nixos/steam.nix b/modules/nixos/steam.nix new file mode 100644 index 0000000..5f9c50b --- /dev/null +++ b/modules/nixos/steam.nix @@ -0,0 +1,32 @@ +{ config, pkgs, lib, inputs, system, ... }: + +let cfg = config.sydnix.steam; +in { + options.sydnix.steam = { + enable = lib.mkEnableOption "Steam"; + }; + + config = lib.mkIf cfg.enable { + programs.steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + gamescopeSession.enable = true; + extraPackages = with pkgs; [ + mono gtk3 gtk3-x11 libgdiplus zlib + ]; + }; + + programs.gamemode = { + enable = true; + enableRenice = true; + }; + + # This fixes the "glXChooseVisual failed" bug, see: + # https://github.com/NixOS/nixpkgs/issues/47932. + hardware.graphics = { + enable = true; + enable32Bit = true; + }; + }; +} diff --git a/modules/nixos/stylix.nix b/modules/nixos/stylix.nix new file mode 100644 index 0000000..33ef41c --- /dev/null +++ b/modules/nixos/stylix.nix @@ -0,0 +1,35 @@ + +{ config, lib, pkgs, ... }: + +let + cfg = config.sydnix.stylix; +in { + options.sydnix.stylix.enable = + lib.mkEnableOption "Stylix"; + + config = lib.mkIf cfg.enable { + stylix = { + enable = true; + base16Scheme = "${pkgs.base16-schemes}/share/themes/kanagawa.yaml"; + image = ./stylix/kanagawa.jpg; + # fonts = { + # serif = { + # package = pkgs.ibm-plex; + # name = "IBM Plex"; + # }; + # sansSerif = { + # package = pkgs.dejavu_fonts; + # name = "DejaVu Sans"; + # }; + # monospace = { + # package = pkgs.nerd-fonts.victor-mono; + # name = "VictorMono"; + # }; + # emoji = { + # package = pkgs.twemoji-color-font; + # name = "Noto Color Emoji"; + # }; + # }; + }; + }; +} diff --git a/modules/nixos/stylix/kanagawa.jpg b/modules/nixos/stylix/kanagawa.jpg new file mode 100644 index 0000000..e0108f8 Binary files /dev/null and b/modules/nixos/stylix/kanagawa.jpg differ diff --git a/outputs/homeConfigurations.nix b/outputs/homeConfigurations.nix index 51e942a..7a19f76 100755 --- a/outputs/homeConfigurations.nix +++ b/outputs/homeConfigurations.nix @@ -9,6 +9,7 @@ let users = builtins.readDir ../users; inputs.sops-nix.homeManagerModules.sops inputs.impermanence.homeManagerModules.impermanence + inputs.nixcord.homeManagerModules.nixcord # Directory name should always match username. ({ ... }: { home.username = username; }) diff --git a/outputs/nixosConfigurations.nix b/outputs/nixosConfigurations.nix index 69f143b..8fd6df1 100755 --- a/outputs/nixosConfigurations.nix +++ b/outputs/nixosConfigurations.nix @@ -34,6 +34,8 @@ let inputs.sops-nix.nixosModules.sops inputs.impermanence.nixosModules.impermanence inputs.copyparty.nixosModules.default + inputs.niri.nixosModules.niri + inputs.stylix.nixosModules.stylix # Directory name should always match host name. ({ ... }: { networking.hostName = hostName; }) diff --git a/result b/result deleted file mode 120000 index 9108714..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/pg4zdcr9ylpydl15k3h78crp84gifzvq-nixos-minimal-25.05.20250202.8532db2-x86_64-linux.iso \ No newline at end of file diff --git a/users/crumb/default.nix b/users/crumb/default.nix index 9a2f6d1..408bc0c 100755 --- a/users/crumb/default.nix +++ b/users/crumb/default.nix @@ -14,7 +14,6 @@ homeConfiguration = { config, lib, pkgs, ... }: { imports = [ - # ./programs.nix ./files.nix ]; @@ -22,8 +21,8 @@ xdg.enable = true; # Not yet in my version of HM. # xdg.preferXdgDirectories = true; - qt.style.name = "breeze-dark"; - qt.style.package = pkgs.libsForQt5.breeze-qt5; + # qt.style.name = "breeze-dark"; + # qt.style.package = pkgs.libsForQt5.breeze-qt5; sydnix = { gpg.enable = true; @@ -42,7 +41,12 @@ mpd.enable = true; nvim.enable = true; emacs.enable = true; + niri.enable = true; + waybar.enable = true; + discord.enable = true; + ghostty.enable = true; }; + steam.enable = true; }; # Don't touch! diff --git a/users/crumb/files.nix b/users/crumb/files.nix index 7f9789a..0e1ac4a 100755 --- a/users/crumb/files.nix +++ b/users/crumb/files.nix @@ -33,6 +33,7 @@ in lib.mkMerge [ "Videos" "src" # My projects. "scratch" # My playgrounds. + "git" # Other peoples' projects. # Should "org" be declared in emacs.nix? I don't think so. I # conjecture that my org files are extremely valuable with or without # Emacs. @@ -40,27 +41,15 @@ in lib.mkMerge [ # REVIEW: I think it may be preferable to persist a few individual files # under ~/.ssh, rather than the whole directory. ".ssh" - { - directory = ".local/share/Steam"; - method = "symlink"; - } - ".passage" + # FIXME: This is only temporary. KDE Plasma can be a PITA, + # unpredictably scattering configuration files all about the file + # system. Until we switch to Niri, we'll just persist the whole + # directory. WAIT4NIRI + # ".config" ]; }; } - { - # ~/git — other peoples' code - systemd.user.tmpfiles.rules = [ - "v ${config.home.homeDirectory}/git 755 ${config.home.username} users - -" - ]; - - sydnix.impermanence.directories = [ - "git/doomemacs" - "git/publish-org-roam-ui" - ]; - } - { ### Syncthing @@ -79,6 +68,13 @@ in lib.mkMerge [ ]; ignorePerms = true; }; + "Music" = { + path = "~/Music"; + devices = [ + "deertopia" + ]; + ignorePerms = true; + }; }; }; }