diff --git a/flake.lock b/flake.lock index 91f8b76..8c67553 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1652712410, - "narHash": "sha256-hMJ2TqLt0DleEnQFGUHK9sV2aAzJPU8pZeiZoqRozbE=", + "lastModified": 1665870395, + "narHash": "sha256-Tsbqb27LDNxOoPLh0gw2hIb6L/6Ow/6lIBvqcHzEKBI=", "owner": "ryantm", "repo": "agenix", - "rev": "7e5e58b98c3dcbf497543ff6f22591552ebfe65b", + "rev": "a630400067c6d03c9b3e0455347dc8559db14288", "type": "github" }, "original": { @@ -23,11 +23,11 @@ "arkenfox-userjs": { "flake": false, "locked": { - "lastModified": 1659264624, - "narHash": "sha256-iONF1YbWlW99k71lIUA/hw5+Rv1kf5M3mCItW6JmjbI=", + "lastModified": 1670682948, + "narHash": "sha256-yFg8U4D+qD9UQXhpAXrl9Ksj16zrCLOgahMtT9QS2Y8=", "owner": "arkenfox", "repo": "user.js", - "rev": "6e53e841f78c512f4d1eedb6a2409df746eea979", + "rev": "7135907b2fe13fa55eb8ebf162603037f83e353c", "type": "github" }, "original": { @@ -53,65 +53,6 @@ "type": "github" } }, - "base16": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1658847131, - "narHash": "sha256-X6Mml7cT0YR3WCD5fkUhpRVV5ZPcwdcDsND8r8xMqTE=", - "owner": "SenchoPens", - "repo": "base16.nix", - "rev": "6b404cda2e04ca3cf5ca7b877af9c469e1386acb", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "base16.nix", - "type": "github" - } - }, - "comma": { - "inputs": { - "flake-compat": "flake-compat", - "naersk": "naersk", - "nixpkgs": [ - "nixpkgs" - ], - "utils": "utils" - }, - "locked": { - "lastModified": 1656989878, - "narHash": "sha256-SvK+H9M62lhPvVRWfl7HGG0oRO90r1E8ju3PPp6A6N8=", - "owner": "nix-community", - "repo": "comma", - "rev": "f5732a6e8871348bafa3139a2f0d9bb7bc34c076", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "comma", - "type": "github" - } - }, - "dracula-fish": { - "flake": false, - "locked": { - "lastModified": 1657833273, - "narHash": "sha256-WywEGAGaRwfHJpT+B3oKoyrnLJZxURTQ+MK9e5Asxl0=", - "owner": "dracula", - "repo": "fish", - "rev": "610147cc384ff161fbabb9a9ebfd22b743f82b67", - "type": "github" - }, - "original": { - "owner": "dracula", - "repo": "fish", - "type": "github" - } - }, "emacs-overlay": { "inputs": { "flake-utils": "flake-utils", @@ -120,11 +61,11 @@ ] }, "locked": { - "lastModified": 1660732240, - "narHash": "sha256-u3/pq8k7t9FHFEtArNinHs8ovY4hkFFuwB+zFX7FfIQ=", + "lastModified": 1672567750, + "narHash": "sha256-Hz1b1TUJbzuLj0eR+LTSUqoGR2gkQdrm3uxru+0rVuY=", "owner": "nix-community", "repo": "emacs-overlay", - "rev": "8a8ab5655af3e7a741b8230a2c36453622ea330d", + "rev": "524c884484c312b76cb4bc9fbf37eec66e2f8406", "type": "github" }, "original": { @@ -136,11 +77,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1650374568, - "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "lastModified": 1668681692, + "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", "owner": "edolstra", "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "rev": "009399224d5e398d03b22badca40a37ac85412a1", "type": "github" }, "original": { @@ -150,6 +91,21 @@ } }, "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { "locked": { "lastModified": 1659877975, "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", @@ -164,13 +120,13 @@ "type": "github" } }, - "flake-utils_2": { + "flake-utils_3": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -179,7 +135,7 @@ "type": "github" } }, - "flake-utils_3": { + "flake-utils_4": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -197,11 +153,11 @@ "forgit-git": { "flake": false, "locked": { - "lastModified": 1660668993, - "narHash": "sha256-TSF4Vr5uf/+MVU4yCdIHNnwB7kkp4mF+hkhKtLqQvmk=", + "lastModified": 1671476278, + "narHash": "sha256-guAjxFhtybbRyRRXDELDHrM2Xzmi96wPxD2nhL9Ifmk=", "owner": "wfxr", "repo": "forgit", - "rev": "3f50933f047510020428114551da0ee5cdfb32a3", + "rev": "ffda73bac3a435a9bbc6f29f2fd98517fbe5d9db", "type": "github" }, "original": { @@ -210,19 +166,40 @@ "type": "github" } }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ "nixpkgs" ], - "utils": "utils_2" + "utils": "utils" }, "locked": { - "lastModified": 1660574517, - "narHash": "sha256-Lp5D2pAPrM3iAc1eeR0iGwz5rM+SYOWzVxI3p17nlrU=", + "lastModified": 1672349765, + "narHash": "sha256-Ul3lSGglgHXhgU3YNqsNeTlRH1pqxbR64h+2hM+HtnM=", "owner": "nix-community", "repo": "home-manager", - "rev": "688e5c85b7537f308b82167c8eb4ecfb70a49861", + "rev": "dd99675ee81fef051809bc87d67eb07f5ba022e8", "type": "github" }, "original": { @@ -231,13 +208,124 @@ "type": "github" } }, + "howdy": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": [ + "nixpkgs" + ], + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1665343480, + "narHash": "sha256-mMaZFrDDiBcHDe8+lA87P3iMPea+RGfik5/E4Dyzk8U=", + "owner": "~moritzboehme", + "repo": "howdy", + "rev": "24a7cfb8c2fef1873275dbdf7c8ad562c22083de", + "type": "sourcehut" + }, + "original": { + "owner": "~moritzboehme", + "repo": "howdy", + "type": "sourcehut" + } + }, + "hypr-contrib": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1672071700, + "narHash": "sha256-Z0pbBVtijv4xbL42rPzMoYFSOqALFRYDMN9iOumSEso=", + "owner": "hyprwm", + "repo": "contrib", + "rev": "37c8121f98d76f57caa00dd7106877876e0d7483", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "contrib", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "hyprland-protocols": "hyprland-protocols", + "nixpkgs": "nixpkgs_2", + "wlroots": "wlroots", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1672510982, + "narHash": "sha256-fxpb2GM2Zi4DU119b7c1g8RN/jF7WXD5UcjXN7lxPJ8=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "7525818097f92a99b2b8d02ea43bd0f8ccabd51c", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "flake": false, + "locked": { + "lastModified": 1670703428, + "narHash": "sha256-4KUW5SKR0Y9uaYGcYwy53YJ3B/sgiprCL4fRGO+mpOA=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "d0d6db8cb5bef6d93ca3ad8fb2124964173396da", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprland-protocols_2": { + "flake": false, + "locked": { + "lastModified": 1670703428, + "narHash": "sha256-4KUW5SKR0Y9uaYGcYwy53YJ3B/sgiprCL4fRGO+mpOA=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "d0d6db8cb5bef6d93ca3ad8fb2124964173396da", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprpaper": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1672266418, + "narHash": "sha256-Xxooxjoymgl65dIMtcBB4/bZx0OcqPZ52G/fw4rozYE=", + "owner": "hyprwm", + "repo": "hyprpaper", + "rev": "aefd63876d0353e4b25e473708903e6c30054931", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprpaper", + "type": "github" + } + }, "master": { "locked": { - "lastModified": 1660737173, - "narHash": "sha256-GIoZbN7ZWzQZu0NnnNgawIivtZlA8gER2gOrniZXyic=", + "lastModified": 1672582743, + "narHash": "sha256-BcHOaoxnUL+DzjGZV+vm8rIDGOFL6DvbPxeCLvzDrN0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c085fe3e5ae411bcce050e61a84b418e38c8235b", + "rev": "3d9c0b6bdb5d6ee7126b6362167550c74590d612", "type": "github" }, "original": { @@ -246,35 +334,77 @@ "type": "github" } }, - "naersk": { - "inputs": { - "nixpkgs": [ - "comma", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1653413650, - "narHash": "sha256-wojDHjb+eU80MPH+3HQaK0liUy8EgR95rvmCl24i58Y=", - "owner": "nix-community", - "repo": "naersk", - "rev": "69daaceebe12c070cd5ae69ba38f277bbf033695", - "type": "github" - }, - "original": { - "owner": "nix-community", - "ref": "master", - "repo": "naersk", - "type": "github" - } - }, "nixpkgs": { "locked": { - "lastModified": 1660639432, - "narHash": "sha256-2WDiboOCfB0LhvnDVMXOAr8ZLDfm3WdO54CkoDPwN1A=", + "lastModified": 1658161305, + "narHash": "sha256-X/nhnMCa1Wx4YapsspyAs6QYz6T/85FofrI6NpdPDHg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e4d49de45a3b5dbcb881656b4e3986e666141ea9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1671271954, + "narHash": "sha256-cSvu+bnvN08sOlTBWbBrKaBHQZq8mvk8bgpt0ZJ2Snc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d513b448cc2a6da2c8803e3c197c9fc7e67b19e3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1671722432, + "narHash": "sha256-ojcZUekIQeOZkHHzR81st7qxX99dB1Eaaq6PU5MNeKc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "652e92b8064949a11bc193b90b74cb727f2a1405", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1658826464, + "narHash": "sha256-94ZTF0uIX/iZdiD4RJ5f933ak/OM4XLl7hF+gCa4Iuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ce49cb7792a7ffd65ef352dda1110a4e4a204eac", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1672428209, + "narHash": "sha256-eejhqkDz2cb2vc5VeaWphJz8UXNuoNoM8/Op8eWv2tQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "6c6409e965a6c883677be7b9d87a95fab6c3472e", + "rev": "293a28df6d7ff3dec1e61e37cc4ee6e6c0fb0847", "type": "github" }, "original": { @@ -284,31 +414,61 @@ "type": "github" } }, - "nixpkgs_2": { + "nixpkgs_5": { "locked": { - "lastModified": 1645655918, - "narHash": "sha256-ZfbEFRW7o237+A1P7eTKhXje435FCAoe0blj2n20Was=", - "owner": "nixos", + "lastModified": 1671271357, + "narHash": "sha256-xRJdLbWK4v2SewmSStYrcLa0YGJpleufl44A19XSW8k=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "77a7a4197740213879b9a1d2e1788c6c8ade4274", + "rev": "40f79f003b6377bd2f4ed4027dde1f8f922995dd", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" } }, "pre-commit-hooks": { "inputs": { - "flake-utils": "flake-utils_2", - "nixpkgs": "nixpkgs_2" + "flake-utils": [ + "howdy", + "flake-utils" + ], + "nixpkgs": [ + "howdy", + "nixpkgs" + ] }, "locked": { - "lastModified": 1659629599, - "narHash": "sha256-c9rvaqaH3HZo/C70E7rB18YSywa4ryTtN7CZ3cuCmoA=", + "lastModified": 1664708386, + "narHash": "sha256-aCD8UUGNYb5nYzRmtsq/0yP9gFOQQHr/Lsb5vW+mucw=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "6a9402e8f233de16536349d1dd3f4595c23386a4", + "rev": "2e4a708918e14fdbd534cc94aaa9470cd19b2464", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "pre-commit-hooks_2": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "gitignore": "gitignore", + "nixpkgs": "nixpkgs_5", + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1672050129, + "narHash": "sha256-GBQMcvJUSwAVOpDjVKzB6D5mmHI7Y4nFw+04bnS9QrM=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "67d98f02443b9928bc77f1267741dcfdd3d7b65c", "type": "github" }, "original": { @@ -322,42 +482,43 @@ "agenix": "agenix", "arkenfox-userjs": "arkenfox-userjs", "asus-touchpad-numpad-driver": "asus-touchpad-numpad-driver", - "base16": "base16", - "comma": "comma", - "dracula-fish": "dracula-fish", "emacs-overlay": "emacs-overlay", "forgit-git": "forgit-git", "home-manager": "home-manager", + "howdy": "howdy", + "hypr-contrib": "hypr-contrib", + "hyprland": "hyprland", + "hyprpaper": "hyprpaper", "master": "master", - "nixpkgs": "nixpkgs", - "pre-commit-hooks": "pre-commit-hooks", + "nixpkgs": "nixpkgs_4", + "pre-commit-hooks": "pre-commit-hooks_2", "stable": "stable", - "utils": "utils_3" + "utils": "utils_2" } }, "stable": { "locked": { - "lastModified": 1660581366, - "narHash": "sha256-et+bi9/jlSF/pHx5AYB9ZP2XDdZEQ0vnF7xlvs4503Y=", + "lastModified": 1672353432, + "narHash": "sha256-oZfgp/44/o2tWiylV30cR+DLyWTJ+5dhsdWZVpzs3e4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "3d47bbaa26e7a771059d828eecf3bd8bf28a8b0f", + "rev": "913a47cd064cc06440ea84e5e0452039a85781f0", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-22.05", + "ref": "nixos-22.11", "repo": "nixpkgs", "type": "github" } }, "utils": { "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -367,23 +528,8 @@ } }, "utils_2": { - "locked": { - "lastModified": 1653893745, - "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "utils_3": { "inputs": { - "flake-utils": "flake-utils_3" + "flake-utils": "flake-utils_4" }, "locked": { "lastModified": 1657226504, @@ -398,6 +544,46 @@ "repo": "flake-utils-plus", "type": "github" } + }, + "wlroots": { + "flake": false, + "locked": { + "host": "gitlab.freedesktop.org", + "lastModified": 1671723353, + "narHash": "sha256-G1jiI0SA7eiZusO+iJytErMRNbKbwqJJJGL+sNoBNoQ=", + "owner": "wlroots", + "repo": "wlroots", + "rev": "b28a9afd4b0b86e9a66a40f6b44b69f59947b7d6", + "type": "gitlab" + }, + "original": { + "host": "gitlab.freedesktop.org", + "owner": "wlroots", + "repo": "wlroots", + "type": "gitlab" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": "hyprland-protocols_2", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1671837878, + "narHash": "sha256-OmFDyktTc/l+3wHboHeFpAQgPt3r7jjqZf8MrwuUGMo=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "e47f4cec698080768821b271510985ab94a37e91", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index b833ccf..e95fcb4 100644 --- a/flake.nix +++ b/flake.nix @@ -8,14 +8,11 @@ inputs = { master.url = "github:nixos/nixpkgs"; nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; - stable.url = "github:nixos/nixpkgs/nixos-22.05"; + stable.url = "github:nixos/nixpkgs/nixos-22.11"; pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix"; - utils = { - url = "github:gytis-ivaskevicius/flake-utils-plus"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + utils.url = "github:gytis-ivaskevicius/flake-utils-plus"; agenix = { url = "github:ryantm/agenix"; @@ -32,17 +29,6 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - comma = { - url = "github:nix-community/comma"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - - # Fish specific - dracula-fish = { - url = "github:dracula/fish"; - flake = false; - }; - # Zsh specific forgit-git = { url = "github:wfxr/forgit"; @@ -60,35 +46,50 @@ flake = false; }; - # Theming - base16 = { - url = "github:SenchoPens/base16.nix"; + howdy = { + url = "sourcehut:~moritzboehme/howdy"; inputs.nixpkgs.follows = "nixpkgs"; }; + + + # Hyprland + hyprland.url = "github:hyprwm/Hyprland"; + hyprpaper.url = "github:hyprwm/hyprpaper"; + hypr-contrib.url = "github:hyprwm/contrib"; }; outputs = - inputs @ { self - , nixpkgs - , utils - , ... - }: + inputs@{ self, nixpkgs, utils, ... }: utils.lib.mkFlake { inherit self inputs; + supportedSystems = [ "x86_64-linux" ]; + channelsConfig.allowUnfree = true; ################ ### Overlays ### ################ - overlays.default = import ./overlays { inherit inputs; }; + overlay = import ./overlays { inherit inputs; }; + channels.nixpkgs.overlaysBuilder = channels: [ - self.overlays.default - inputs.utils.overlay + inputs.agenix.overlay inputs.emacs-overlay.overlay + inputs.howdy.overlays.default + inputs.hypr-contrib.overlays.default + inputs.hyprland.overlays.default + inputs.hyprpaper.overlays.default + inputs.utils.overlay + self.overlay ]; + # overlays = utils.lib.exportOverlays { + # inherit (self) pkgs inputs; + # }; + + overlays.default = self.overlay; + ############### ### Modules ### ############### @@ -98,6 +99,7 @@ ./modules/profiles/gaming.nix ./modules/profiles/desktop.nix ]; + hostDefaults.modules = [ ./modules/default.nix self.nixosModules.base @@ -109,14 +111,18 @@ extraSpecialArgs = { inherit inputs self; }; }; } + inputs.hyprland.nixosModules.default inputs.agenix.nixosModules.age - inputs.base16.nixosModule + inputs.howdy.nixosModules.default ]; hosts.nixos-laptop.modules = [ ./hosts/nixos-laptop self.nixosModules.desktop + self.nixosModules.gaming ]; + + hosts.nixos-desktop.modules = [ ./hosts/nixos-desktop self.nixosModules.desktop @@ -139,6 +145,7 @@ cachix ]; }; + checks.pre-commit-check = inputs.pre-commit-hooks.lib."${system}".run { src = ./.; hooks = { @@ -147,6 +154,8 @@ shellcheck.enable = true; }; }; + + packages = utils.lib.exportPackages self.overlays channels; }; }; } diff --git a/hosts/nixos-desktop/default.nix b/hosts/nixos-desktop/default.nix index 9a1fa86..377c478 100644 --- a/hosts/nixos-desktop/default.nix +++ b/hosts/nixos-desktop/default.nix @@ -4,6 +4,7 @@ { lib , config , pkgs +, inputs , ... }: { imports = [ @@ -11,15 +12,11 @@ ./hardware-configuration.nix ]; + my.programs.hyprland.nvidiaSupport = true; + # KERNEL boot.kernelPackages = pkgs.linuxPackages_latest; - # MY MODULES - my.email = { - enable = true; - passwordFile = ../../secrets/email-desktop.age; - }; - # BOOT boot = { supportedFilesystems = [ "btrfs" "ntfs" ]; @@ -63,13 +60,13 @@ nohook resolv.conf ''; }; - + hardware.nvidia.modesetting.enable = true; services.xserver.videoDrivers = [ "nvidia" ]; hardware.opengl = { enable = true; driSupport32Bit = true; + driSupport = true; }; - hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_470; services.xserver.xrandrHeads = [ { output = "HDMI-1"; } { diff --git a/hosts/nixos-desktop/hardware-configuration.nix b/hosts/nixos-desktop/hardware-configuration.nix index dc6bd93..fab68a6 100644 --- a/hosts/nixos-desktop/hardware-configuration.nix +++ b/hosts/nixos-desktop/hardware-configuration.nix @@ -17,7 +17,7 @@ fileSystems."/" = { device = "/dev/disk/by-uuid/668a49b3-d169-461f-861d-0c3e6a1642d1"; fsType = "btrfs"; - options = [ "subvol=root" ]; + options = [ "subvol=root" "compress=zstd" ]; }; boot.initrd.luks.devices."enc".device = "/dev/disk/by-uuid/30025a9f-44cf-4074-8ae2-d4925efd67dd"; @@ -25,25 +25,19 @@ fileSystems."/home" = { device = "/dev/disk/by-uuid/668a49b3-d169-461f-861d-0c3e6a1642d1"; fsType = "btrfs"; - options = [ "subvol=home" ]; + options = [ "subvol=home" "compress=zstd" ]; }; fileSystems."/nix" = { device = "/dev/disk/by-uuid/668a49b3-d169-461f-861d-0c3e6a1642d1"; fsType = "btrfs"; - options = [ "subvol=nix" ]; - }; - - fileSystems."/persist" = { - device = "/dev/disk/by-uuid/668a49b3-d169-461f-861d-0c3e6a1642d1"; - fsType = "btrfs"; - options = [ "subvol=persist" ]; + options = [ "subvol=nix" "compress=zstd" ]; }; fileSystems."/var/log" = { device = "/dev/disk/by-uuid/668a49b3-d169-461f-861d-0c3e6a1642d1"; fsType = "btrfs"; - options = [ "subvol=log" ]; + options = [ "subvol=log" "compress=zstd" ]; neededForBoot = true; }; diff --git a/hosts/nixos-laptop/default.nix b/hosts/nixos-laptop/default.nix index f6012e9..d89009d 100644 --- a/hosts/nixos-laptop/default.nix +++ b/hosts/nixos-laptop/default.nix @@ -11,11 +11,10 @@ ./hardware-configuration.nix ]; - # MY MODULES - my.email = { - enable = true; - passwordFile = ../../secrets/email-desktop.age; - }; + # services.howdy = { + # enable = true; + # certainty = 3.0; + # }; # BOOT boot = { diff --git a/hosts/nixos-laptop/hardware-configuration.nix b/hosts/nixos-laptop/hardware-configuration.nix index b0c8aa8..0a7d47b 100644 --- a/hosts/nixos-laptop/hardware-configuration.nix +++ b/hosts/nixos-laptop/hardware-configuration.nix @@ -17,7 +17,7 @@ fileSystems."/" = { device = "/dev/disk/by-uuid/4a91d3eb-1633-42d9-8304-c10e49a61154"; fsType = "btrfs"; - options = [ "subvol=root" ]; + options = [ "subvol=root" "compress=zstd" ]; }; boot.initrd.luks.devices."enc".device = "/dev/disk/by-uuid/078b81ba-238e-471d-9951-b743588532b8"; @@ -25,14 +25,14 @@ fileSystems."/log" = { device = "/dev/disk/by-uuid/4a91d3eb-1633-42d9-8304-c10e49a61154"; fsType = "btrfs"; - options = [ "subvol=log" ]; + options = [ "subvol=log" "compress=zstd" ]; neededForBoot = true; }; fileSystems."/nix" = { device = "/dev/disk/by-uuid/4a91d3eb-1633-42d9-8304-c10e49a61154"; fsType = "btrfs"; - options = [ "subvol=nix" ]; + options = [ "subvol=nix" "compress=zstd" ]; }; fileSystems."/boot" = { @@ -43,13 +43,13 @@ fileSystems."/persist" = { device = "/dev/disk/by-uuid/4a91d3eb-1633-42d9-8304-c10e49a61154"; fsType = "btrfs"; - options = [ "subvol=persist" ]; + options = [ "subvol=persist" "compress=zstd" ]; }; fileSystems."/home" = { device = "/dev/disk/by-uuid/4a91d3eb-1633-42d9-8304-c10e49a61154"; fsType = "btrfs"; - options = [ "subvol=home" ]; + options = [ "subvol=home" "compress=zstd" ]; }; swapDevices = [{ device = "/dev/disk/by-uuid/29ebf65f-e6ca-4625-9f72-a9321152be1b"; }]; diff --git a/modules/config/bin/default.nix b/modules/config/bin/default.nix index f001be9..7f4520e 100644 --- a/modules/config/bin/default.nix +++ b/modules/config/bin/default.nix @@ -14,13 +14,7 @@ let sxhkdHelp = import ./sxhkdHelp.nix { inherit pkgs; }; in { - options.my.bin = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - }; + options.my.bin.enable = mkEnableOption "bin"; config = mkIf cfg.enable { environment.systemPackages = with pkgs; [ diff --git a/modules/config/default.nix b/modules/config/default.nix index 2e34077..7312bcb 100644 --- a/modules/config/default.nix +++ b/modules/config/default.nix @@ -7,7 +7,6 @@ { imports = [ ./bin - ./email.nix ./nix.nix ./shell.nix ./theming diff --git a/modules/config/email.nix b/modules/config/email.nix deleted file mode 100644 index 0801a75..0000000 --- a/modules/config/email.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ config -, lib -, pkgs -, ... -}: - -with lib; -let - cfg = config.my.email; - name = "Moritz Böhme"; - email = "mail@moritzboeh.me"; - mailDirectory = "/home/moritz/.mail"; -in -{ - options.my.email = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - passwordFile = mkOption { - default = null; - type = types.path; - description = "File containing the email password."; - }; - }; - - config = mkIf cfg.enable { - # Protonbridge Setup - environment.systemPackages = with pkgs; [ protonmail-bridge ]; - systemd.user.services.protonmail-bridge = { - description = "Protonmail Bridge"; - enable = true; - script = "${pkgs.protonmail-bridge}/bin/protonmail-bridge --log-level debug"; - path = [ - pkgs.gnome3.gnome-keyring - ]; # HACK: https://github.com/ProtonMail/proton-bridge/issues/176 - wantedBy = [ "graphical-session.target" ]; - partOf = [ "graphical-session.target" ]; - }; - age.secrets.email = { - file = cfg.passwordFile; - owner = "1000"; - }; - - # Email Applications - home-manager.users.moritz.home.packages = with pkgs; [ thunderbird ]; - networking.firewall.allowedTCPPorts = [ 33728 1025 1143 ]; - }; -} diff --git a/modules/config/nix.nix b/modules/config/nix.nix index 3d1aa60..a932cbb 100644 --- a/modules/config/nix.nix +++ b/modules/config/nix.nix @@ -1,6 +1,7 @@ { config , lib , pkgs +, inputs , ... }: @@ -10,22 +11,21 @@ let in { options.my.nix = { - gc.enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - optimise.enable = mkOption { - default = true; - type = types.bool; - example = false; + gc = { + enable = mkEnableOption "nix-gc"; + minimumFreedGB = mkOption { + default = 32; + type = types.int; + apply = number: toString (number * 1024 * 1024 * 1024); + }; }; + optimise.enable = mkEnableOption "nix-optimise"; }; config.nix = { gc = { automatic = cfg.gc.enable; - options = "--max-freed $((32 * 1024**3)) --delete-older-than 14d"; + options = "--max-freed ${cfg.gc.minimumFreedGB} --delete-older-than 14d"; dates = "weekly"; }; @@ -34,18 +34,31 @@ in dates = [ "weekly" ]; }; + registry = { + master-upstream.to = { + type = "github"; + owner = "nixos"; + repo = "nixpkgs"; + }; + master.flake = inputs.master; + nixpkgs.flake = inputs.nixpkgs; + stable.flake = inputs.stable; + }; + settings = { substituters = [ "https://cache.nixos.org/" "https://jupyterwith.cachix.org" "https://nix-community.cachix.org" "https://pre-commit-hooks.cachix.org" + "https://hyprland.cachix.org" ]; trusted-public-keys = [ "jupyterwith.cachix.org-1:/kDy2B6YEhXGJuNguG1qyqIodMyO4w8KwWH4/vAc7CI=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" "pre-commit-hooks.cachix.org-1:Pkk3Panw5AW24TOv6kz3PvLhlH8puAsJTBbOPmBo7Rc=" + "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ]; trusted-users = [ "root" "@wheel" ]; diff --git a/modules/config/theming/catppuccin-frappe.nix b/modules/config/theming/catppuccin-frappe.nix new file mode 100644 index 0000000..b7d8169 --- /dev/null +++ b/modules/config/theming/catppuccin-frappe.nix @@ -0,0 +1,39 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.my.theming; +in +{ + config = mkIf (cfg.scheme == "catppuccin-frappe") + (import ./catppuccin.nix + { + inherit config lib pkgs; + rosewater = "f2d5cf"; + flamingo = "eebebe"; + pink = "f4b8e4"; + mauve = "ca9ee6"; + red = "e78284"; + maroon = "ea999c"; + peach = "ef9f76"; + yellow = "e5c890"; + green = "a6d189"; + teal = "81c8be"; + sky = "99d1db"; + sapphire = "85c1dc"; + blue = "8caaee"; + lavender = "babbf1"; + text = "c6d0f5"; + subtext1 = "b5bfe2"; + subtext0 = "a5adce"; + overlay2 = "949cbb"; + overlay1 = "838ba7"; + overlay0 = "737994"; + surface2 = "626880"; + surface1 = "51576d"; + surface0 = "414559"; + base = "303446"; + mantle = "292c3c"; + crust = "232634"; + }); +} diff --git a/modules/config/theming/catppuccin-latte.nix b/modules/config/theming/catppuccin-latte.nix new file mode 100644 index 0000000..6743ed9 --- /dev/null +++ b/modules/config/theming/catppuccin-latte.nix @@ -0,0 +1,39 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.my.theming; +in +{ + config = mkIf (cfg.scheme == "catppuccin-latte") + (import ./catppuccin.nix + { + inherit config lib pkgs; + rosewater = "dc8a78"; + flamingo = "dd7878"; + pink = "ea76cb"; + mauve = "8839ef"; + red = "d20f39"; + maroon = "e64553"; + peach = "fe640b"; + yellow = "df8e1d"; + green = "40a02b"; + teal = "179299"; + sky = "04a5e5"; + sapphire = "209fb5"; + blue = "1e66f5"; + lavender = "7287fd"; + text = "4c4f69"; + subtext1 = "5c5f77"; + subtext0 = "6c6f85"; + overlay2 = "7c7f93"; + overlay1 = "8c8fa1"; + overlay0 = "9ca0b0"; + surface2 = "acb0be"; + surface1 = "bcc0cc"; + surface0 = "ccd0da"; + base = "eff1f5"; + mantle = "e6e9ef"; + crust = "dce0e8"; + }); +} diff --git a/modules/config/theming/catppuccin-macchiato.nix b/modules/config/theming/catppuccin-macchiato.nix new file mode 100644 index 0000000..70b4dd8 --- /dev/null +++ b/modules/config/theming/catppuccin-macchiato.nix @@ -0,0 +1,39 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.my.theming; +in +{ + config = mkIf (cfg.scheme == "catppuccin-macchiato") + (import ./catppuccin.nix + { + inherit config lib pkgs; + rosewater = "f4dbd6"; + flamingo = "f0c6c6"; + pink = "f5bde6"; + mauve = "c6a0f6"; + red = "ed8796"; + maroon = "ee99a0"; + peach = "f5a97f"; + yellow = "eed49f"; + green = "a6da95"; + teal = "8bd5ca"; + sky = "91d7e3"; + sapphire = "7dc4e4"; + blue = "8aadf4"; + lavender = "b7bdf8"; + text = "cad3f5"; + subtext1 = "b8c0e0"; + subtext0 = "a5adcb"; + overlay2 = "939ab7"; + overlay1 = "8087a2"; + overlay0 = "6e738d"; + surface2 = "5b6078"; + surface1 = "494d64"; + surface0 = "363a4f"; + base = "24273a"; + mantle = "1e2030"; + crust = "181926"; + }); +} diff --git a/modules/config/theming/catppuccin-mocha.nix b/modules/config/theming/catppuccin-mocha.nix new file mode 100644 index 0000000..ab35068 --- /dev/null +++ b/modules/config/theming/catppuccin-mocha.nix @@ -0,0 +1,39 @@ +{ config, lib, pkgs, ... }: + +with lib; +let + cfg = config.my.theming; +in +{ + config = mkIf (cfg.scheme == "catppuccin-mocha") + (import ./catppuccin.nix + { + inherit config lib pkgs; + rosewater = "f5e0dc"; + flamingo = "f2cdcd"; + pink = "f5c2e7"; + mauve = "cba6f7"; + red = "f38ba8"; + maroon = "eba0ac"; + peach = "fab387"; + yellow = "f9e2af"; + green = "a6e3a1"; + teal = "94e2d5"; + sky = "89dceb"; + sapphire = "74c7ec"; + blue = "89b4fa"; + lavender = "b4befe"; + text = "cdd6f4"; + subtext1 = "bac2de"; + subtext0 = "a6adc8"; + overlay2 = "9399b2"; + overlay1 = "7f849c"; + overlay0 = "6c7086"; + surface2 = "585b70"; + surface1 = "45475a"; + surface0 = "494d64"; + base = "1e1e2e"; + mantle = "181825"; + crust = "11111b"; + }); +} diff --git a/modules/config/theming/catppuccin.nix b/modules/config/theming/catppuccin.nix index 0f77639..99ecea9 100644 --- a/modules/config/theming/catppuccin.nix +++ b/modules/config/theming/catppuccin.nix @@ -1,272 +1,326 @@ -{ config, lib, pkgs, ... }: +{ config +, lib +, pkgs +, rosewater +, flamingo +, pink +, mauve +, red +, maroon +, peach +, yellow +, green +, teal +, sky +, sapphire +, blue +, lavender +, text +, subtext1 +, subtext0 +, overlay2 +, overlay1 +, overlay0 +, surface2 +, surface1 +, surface0 +, base +, mantle +, crust +}: with lib; let cfg = config.my.theming; - - rosewater = "#f2d5cf"; - flamingo = "#eebebe"; - pink = "#f4b8e4"; - mauve = "#ca9ee6"; - red = "#e78284"; - maroon = "#ea999c"; - peach = "#ef9f76"; - yellow = "#e5c890"; - green = "#a6d189"; - teal = "#81c8be"; - sky = "#99d1db"; - sapphire = "#85c1dc"; - blue = "#8caaee"; - lavender = "#babbf1"; - text = "#c6d0f5"; - subtext1 = "#b5bfe2"; - subtext0 = "#a5adce"; - overlay2 = "#949cbb"; - overlay1 = "#838ba7"; - overlay0 = "#737994"; - surface2 = "#626880"; - surface1 = "#51576d"; - surface0 = "#414559"; - base = "#303446"; - mantle = "#292c3c"; - crust = "#232634"; in { - config = mkIf (cfg.scheme == "catppuccin") { - home-manager.users.moritz = { - programs = { - kitty.extraConfig = - '' - # vim:ft=kitty + home-manager.users.moritz = { + programs = { + kitty.extraConfig = '' + # vim:ft=kitty - ## name: Catppuccin-Frappe - ## author: Pocco81 (https://github.com/Pocco81) - ## license: MIT - ## upstream: https://github.com/catppuccin/kitty/blob/main/frappe.conf - ## blurb: Soothing pastel theme for the high-spirited! + ## name: Catppuccin-Frappe + ## author: Pocco81 (https://github.com/Pocco81) + ## license: MIT + ## upstream: https://github.com/catppuccin/kitty/blob/main/frappe.conf + ## blurb: Soothing pastel theme for the high-spirited! - # The basic colors - foreground #C6D0F5 - background #303446 - selection_foreground #303446 - selection_background ${rosewater} + # The basic colors + foreground #${text} + background #${base} + selection_foreground #${base} + selection_background #${rosewater} - # Cursor colors - cursor ${rosewater} - cursor_text_color #303446 + # Cursor colors + cursor #${rosewater} + cursor_text_color #${base} - # URL underline color when hovering with mouse - url_color ${rosewater} + # URL underline color when hovering with mouse + url_color #${rosewater} - # Kitty window border colors - active_border_color #BABBF1 - inactive_border_color #737994 - bell_border_color #E5C890 + # Kitty window border colors + active_border_color #${lavender} + inactive_border_color #${overlay0} + bell_border_color #${yellow} - # OS Window titlebar colors - wayland_titlebar_color system - macos_titlebar_color system + # OS Window titlebar colors + wayland_titlebar_color system + macos_titlebar_color system - # Tab bar colors - active_tab_foreground #232634 - active_tab_background ${mauve} - inactive_tab_foreground #C6D0F5 - inactive_tab_background #292C3C - tab_bar_background #232634 + # Tab bar colors + active_tab_foreground #${crust} + active_tab_background #${mauve} + inactive_tab_foreground #${text} + inactive_tab_background #${mantle} + tab_bar_background #${crust} - # Colors for marks (marked text in the terminal) - mark1_foreground #303446 - mark1_background #BABBF1 - mark2_foreground #303446 - mark2_background ${mauve} - mark3_foreground #303446 - mark3_background #85C1DC + # Colors for marks (marked text in the terminal) + mark1_foreground #${base} + mark1_background #${lavender} + mark2_foreground #${base} + mark2_background #${mauve} + mark3_foreground #${base} + mark3_background #${sapphire} - # The 16 terminal colors + # The 16 terminal colors - # black - color0 #51576D - color8 #626880 + # black + color0 #${surface1} + color8 #${surface2} - # red - color1 ${red} - color9 ${red} + # red + color1 #${red} + color9 #${red} - # green - color2 #A6D189 - color10 #A6D189 + # green + color2 #${green} + color10 #${green} - # yellow - color3 #E5C890 - color11 #E5C890 + # yellow + color3 #${yellow} + color11 #${yellow} - # blue - color4 #8CAAEE - color12 #8CAAEE + # blue + color4 #${blue} + color12 #${blue} - # magenta - color5 ${pink} - color13 ${pink} + # magenta + color5 #${pink} + color13 #${pink} - # cyan - color6 #81C8BE - color14 #81C8BE + # cyan + color6 #${teal} + color14 #${teal} - # white - color7 #B5BFE2 - color15 #A5ADCE - ''; - zathura.extraConfig = '' - set window-title-basename "true" - set selection-clipboard "clipboard" + # white + color7 #${subtext1} + color15 #${subtext0} + ''; + zathura.extraConfig = '' + set window-title-basename "true" + set selection-clipboard "clipboard" - set default-fg "#C6D0F5" - set default-bg "#303446" + set default-fg "#${text}" + set default-bg "#${base}" - set completion-bg "#414559" - set completion-fg "#C6D0F5" - set completion-highlight-bg "#575268" - set completion-highlight-fg "#C6D0F5" - set completion-group-bg "#414559" - set completion-group-fg "#8CAAEE" + set completion-bg "#${surface0}" + set completion-fg "#${text}" + set completion-highlight-bg "#575268" + set completion-highlight-fg "#${text}" + set completion-group-bg "#${surface0}" + set completion-group-fg "#${blue}" - set statusbar-fg "#C6D0F5" - set statusbar-bg "#414559" + set statusbar-fg "#${text}" + set statusbar-bg "#${surface0}" - set notification-bg "#414559" - set notification-fg "#C6D0F5" - set notification-error-bg "#414559" - set notification-error-fg "${red}" - set notification-warning-bg "#414559" - set notification-warning-fg "#FAE3B0" + set notification-bg "#${surface0}" + set notification-fg "#${text}" + set notification-error-bg "#${surface0}" + set notification-error-fg "#${red}" + set notification-warning-bg "#${surface0}" + set notification-warning-fg "#FAE3B0" - set inputbar-fg "#C6D0F5" - set inputbar-bg "#414559" + set inputbar-fg "#${text}" + set inputbar-bg "#${surface0}" - set recolor-lightcolor "#303446" - set recolor-darkcolor "#C6D0F5" + set recolor-lightcolor "#${base}" + set recolor-darkcolor "#${text}" - set index-fg "#C6D0F5" - set index-bg "#303446" - set index-active-fg "#C6D0F5" - set index-active-bg "#414559" + set index-fg "#${text}" + set index-bg "#${base}" + set index-active-fg "#${text}" + set index-active-bg "#${surface0}" - set render-loading-bg "#303446" - set render-loading-fg "#C6D0F5" + set render-loading-bg "#${base}" + set render-loading-fg "#${text}" - set highlight-color "#575268" - set highlight-fg "${pink}" - set highlight-active-color "${pink}" - ''; - rofi = { - theme = "custom"; - extraConfig = { - show-icons = true; - terminal = "alacritty"; - drun-display-format = "{icon} {name}"; - location = 0; - disable-history = false; - hide-scrollbar = true; - display-drun = "  Apps "; - display-run = "  Run "; - display-window = " 﩯 Window"; - display-Network = " 󰤨 Network"; - sidebar-mode = true; + set highlight-color "#575268" + set highlight-fg "#${pink}" + set highlight-active-color "#${pink}" + ''; + rofi = { + theme = "custom"; + extraConfig = { + show-icons = true; + terminal = "alacritty"; + drun-display-format = "{icon} {name}"; + location = 0; + disable-history = false; + hide-scrollbar = true; + display-drun = "  Apps "; + display-run = "  Run "; + display-window = " 﩯 Window"; + display-Network = " 󰤨 Network"; + sidebar-mode = true; + }; + }; + }; + xsession.windowManager.bspwm.settings = { + focused_border_color = "#${mauve}"; + normal_border_color = "#${base}"; + active_border_color = "#${base}"; + }; + services = { + dunst.settings = { + global = { + # Defines color of the frame around the notification window. + frame_color = "#${blue}"; + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = "frame"; + }; + + urgency_low = { + background = "#${base}"; + foreground = "#${text}"; + }; + urgency_normal = { + background = "#${base}"; + foreground = "#${text}"; + }; + urgency_critical = { + background = "#${base}"; + foreground = "#${text}"; + frame_color = "#${peach}"; + }; + }; + polybar = { + config = { + "bar/bottom" = { + background = base; + foreground = text; + border-color = base; + }; + "module/bspwm" = { + label-focused-foreground = pink; + label-occupied-foreground = overlay1; + label-urgent-foreground = maroon; + label-empty-foreground = overlay1; + label-separator-foreground = base; + }; + "module/cpu" = { + format-foreground = base; + format-background = green; + }; + "module/time" = { + format-foreground = base; + format-background = blue; + }; + "module/date" = { + format-foreground = base; + format-background = peach; + }; + "module/memory" = { + format-foreground = base; + format-background = blue; + }; + "module/pulseaudio" = { + format-volume-foreground = base; + format-volume-background = mauve; + label-muted = "婢 muted"; + format-muted-foreground = base; + format-muted-background = red; + }; + "module/network" = { + format-connected-foreground = base; + format-connected-background = mauve; + }; + "module/battery" = { + format-charging-foreground = base; + format-charging-background = green; + format-full-foreground = base; + format-full-background = green; + format-discharging-foreground = base; + format-discharging-background = red; }; }; }; - xsession.windowManager.bspwm = { - settings = { - focused_border_color = mauve; - normal_border_color = base; - active_border_color = base; - }; - }; - services = { - dunst.settings = { - global = { - # Defines color of the frame around the notification window. - frame_color = blue; + }; + xdg.configFile = { + "fish/conf.d/theme.fish".text = '' + # Catppuccin color palette - # Define a color for the separator. - # possible values are: - # * auto: dunst tries to find a color fitting to the background; - # * foreground: use the same color as the foreground; - # * frame: use the same color as the frame; - # * anything else will be interpreted as a X color. - separator_color = "frame"; - }; + # --> special + set -l foreground ${text} + set -l selection ${surface0} - urgency_low = { - background = base; - foreground = text; - }; - urgency_normal = { - background = base; - foreground = text; - }; - urgency_critical = { - background = base; - foreground = text; - frame_color = peach; - }; - }; - polybar = { - config = { - "bar/bottom" = { - background = base; - foreground = text; - border-color = base; - }; - "module/bspwm" = { - label-focused-foreground = pink; - label-occupied-foreground = overlay1; - label-urgent-foreground = maroon; - label-empty-foreground = overlay1; - label-separator-foreground = base; - }; - "module/cpu" = { - format-foreground = base; - format-background = green; - }; - "module/time" = { - format-foreground = base; - format-background = blue; - }; - "module/date" = { - format-foreground = base; - format-background = peach; - }; - "module/memory" = { - format-foreground = base; - format-background = blue; - }; - "module/pulseaudio" = { - format-volume-foreground = base; - format-volume-background = mauve; - label-muted = "%{F${red}}婢 %{F${base}}muted"; - format-muted-foreground = base; - format-muted-background = red; - }; - "module/network" = { - format-connected-foreground = base; - format-connected-background = mauve; - }; - }; - }; - }; - xdg.configFile."rofi/custom.rasi".text = '' + # --> palette + set -l teal ${teal} + set -l flamingo ${flamingo} + set -l mauve ${mauve} + set -l pink ${pink} + set -l red ${red} + set -l peach ${peach} + set -l green ${green} + set -l yellow ${yellow} + set -l blue ${blue} + set -l gray ${overlay0} + + # Syntax Highlighting + set -g fish_color_normal $foreground + set -g fish_color_command $blue + set -g fish_color_param $flamingo + set -g fish_color_keyword $red + set -g fish_color_quote $green + set -g fish_color_redirection $pink + set -g fish_color_end $peach + set -g fish_color_error $red + set -g fish_color_gray $gray + set -g fish_color_selection --background=$selection + set -g fish_color_search_match --background=$selection + set -g fish_color_operator $pink + set -g fish_color_escape $flamingo + set -g fish_color_autosuggestion $gray + set -g fish_color_cancel $red + + # Prompt + set -g fish_color_cwd $yellow + set -g fish_color_user $teal + set -g fish_color_host $blue + + # Completion Pager + set -g fish_pager_color_progress $gray + set -g fish_pager_color_prefix $pink + set -g fish_pager_color_completion $foreground + set -g fish_pager_color_description $gray + ''; + "rofi/custom.rasi".text = '' * { - bg-col: #303446; - bg-col-light: #303446; - border-col: #303446; - selected-col: #303446; - blue: #8caaee; - fg-col: #c6d0f5; - fg-col2: ${red}; - grey: #737994; + bg-col: #${base}; + bg-col-light: #${base}; + border-col: #${base}; + selected-col: #${base}; + blue: #${blue}; + fg-col: #${text}; + fg-col2: #${red}; + grey: #${overlay0}; width: 900; font: "JetBrainsMono Nerd Font 14"; diff --git a/modules/config/theming/default.nix b/modules/config/theming/default.nix index 61165df..deedad2 100644 --- a/modules/config/theming/default.nix +++ b/modules/config/theming/default.nix @@ -10,17 +10,25 @@ let cfg = config.my.theming; in { - imports = [ ./dracula.nix ./catppuccin.nix ]; + imports = [ + ./dracula.nix + ./catppuccin-frappe.nix + ./catppuccin-latte.nix + ./catppuccin-macchiato.nix + ./catppuccin-mocha.nix + ]; options.my.theming = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; + enable = mkEnableOption "theming"; scheme = mkOption { - default = "catppuccin"; - type = types.enum [ "dracula" "catppuccin" ]; + default = "catppuccin-macchiato"; + type = types.enum [ + "dracula" + "catppuccin-latte" + "catppuccin-frappe" + "catppuccin-macchiato" + "catppuccin-mocha" + ]; }; }; @@ -33,15 +41,15 @@ in monitor = "\${env:MONITOR}"; bottom = true; width = "100%"; - heigth = 20; + heigth = 15; - border-size = 5; + border-size = 2; separator = " "; - font-0 = "FiraCode Nerd Font:size=9;0"; - font-1 = "FiraCode Nerd Font:size=9;1"; - font-2 = "FiraCode Nerd Font:size=9;2"; + font-0 = "FiraCode Nerd Font:size=8;0"; + font-1 = "FiraCode Nerd Font:size=8;1"; + font-2 = "FiraCode Nerd Font:size=8;2"; modules-left = "cpu memory network battery"; modules-center = "bspwm"; @@ -62,8 +70,11 @@ in time-format = "%H:%M"; format-charging = " "; + format-charging-padding = 1; format-discharging = " "; + format-discharging-padding = 1; format-full = " "; + format-full-padding = 1; label-charging = "%percentage%% %time% remaining"; label-discharging = "%percentage%% %time% remaining"; diff --git a/modules/config/theming/dracula.nix b/modules/config/theming/dracula.nix index 7e5cbb1..235e0c3 100644 --- a/modules/config/theming/dracula.nix +++ b/modules/config/theming/dracula.nix @@ -149,16 +149,18 @@ in }; services = { dunst.settings = { - # Defines color of the frame around the notification window. - frame_color = "#282a36"; + global = { + # Defines color of the frame around the notification window. + frame_color = "#282a36"; - # Define a color for the separator. - # possible values are: - # * auto: dunst tries to find a color fitting to the background; - # * foreground: use the same color as the foreground; - # * frame: use the same color as the frame; - # * anything else will be interpreted as a X color. - separator_color = "frame"; + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = "frame"; + }; urgency_low = { background = "#282a36"; @@ -219,148 +221,202 @@ in }; }; }; - xdg.configFile."rofi/dracula.rasi".text = '' - * { - /* Dracula theme colour palette */ - drac-bgd: #282a36; - drac-cur: #44475a; - drac-fgd: #f8f8f2; - drac-cmt: #6272a4; - drac-cya: #8be9fd; - drac-grn: #50fa7b; - drac-ora: #ffb86c; - drac-pnk: #ff79c6; - drac-pur: #bd93f9; - drac-red: #ff5555; - drac-yel: #f1fa8c; + xdg.configFile = { + "fish/conf.d/theme.fish".text = '' + # Dracula Color Palette + set -l foreground f8f8f2 + set -l selection 44475a + set -l comment 6272a4 + set -l red ff5555 + set -l orange ffb86c + set -l yellow f1fa8c + set -l green 50fa7b + set -l purple bd93f9 + set -l cyan 8be9fd + set -l pink ff79c6 - font: "FiraCode Nerd Font Mono 13"; + # Syntax Highlighting Colors + set -gx fish_color_normal $foreground + set -gx fish_color_command $cyan + set -gx fish_color_keyword $pink + set -gx fish_color_quote $yellow + set -gx fish_color_redirection $foreground + set -gx fish_color_end $orange + set -gx fish_color_error $red + set -gx fish_color_param $purple + set -gx fish_color_comment $comment + set -gx fish_color_selection --background=$selection + set -gx fish_color_search_match --background=$selection + set -gx fish_color_operator $green + set -gx fish_color_escape $pink + set -gx fish_color_autosuggestion $comment + set -gx fish_color_cancel $red --reverse + set -gx fish_color_option $orange - foreground: @drac-fgd; - background-color: @drac-bgd; - active-background: @drac-pnk; - urgent-foreground: @foreground; - urgent-background: @drac-red; + # Default Prompt Colors + set -gx fish_color_cwd $green + set -gx fish_color_host $purple + set -gx fish_color_host_remote $purple + set -gx fish_color_user $cyan - selected-background: @active-background; - selected-urgent-background: @urgent-background; - selected-active-background: @active-background; - separatorcolor: @active-background; - bordercolor: #6272a4; - } + # Completion Pager Colors + set -gx fish_pager_color_progress $comment + set -gx fish_pager_color_background + set -gx fish_pager_color_prefix $cyan + set -gx fish_pager_color_completion $foreground + set -gx fish_pager_color_description $comment + set -gx fish_pager_color_selected_background --background=$selection + set -gx fish_pager_color_selected_prefix $cyan + set -gx fish_pager_color_selected_completion $foreground + set -gx fish_pager_color_selected_description $comment + set -gx fish_pager_color_secondary_background + set -gx fish_pager_color_secondary_prefix $cyan + set -gx fish_pager_color_secondary_completion $foreground + set -gx fish_pager_color_secondary_description $comment + ''; + "rofi/dracula.rasi".text = '' + * { + /* Dracula theme colour palette */ + drac-bgd: #282a36; + drac-cur: #44475a; + drac-fgd: #f8f8f2; + drac-cmt: #6272a4; + drac-cya: #8be9fd; + drac-grn: #50fa7b; + drac-ora: #ffb86c; + drac-pnk: #ff79c6; + drac-pur: #bd93f9; + drac-red: #ff5555; + drac-yel: #f1fa8c; - #window { - background-color: @background-color; - border: 3; - border-radius: 6; - border-color: @bordercolor; - padding: 5; - } - #mainbox { - border: 0; - padding: 5; - } - #message { - border: 1px dash 0px 0px ; - border-color: @separatorcolor; - padding: 1px ; - } - #textbox { - text-color: @foreground; - } - #listview { - fixed-height: 0; - border: 2px dash 0px 0px ; - border-color: @bordercolor; - spacing: 2px ; - scrollbar: false; - padding: 2px 0px 0px ; - } - #element { - border: 0; - padding: 1px ; - } - #element.normal.normal { - background-color: @background-color; - text-color: @foreground; - } - #element.normal.urgent { - background-color: @urgent-background; - text-color: @urgent-foreground; - } - #element.normal.active { - background-color: @active-background; - text-color: @background-color; - } - #element.selected.normal { - background-color: @selected-background; - text-color: @foreground; - } - #element.selected.urgent { - background-color: @selected-urgent-background; - text-color: @foreground; - } - #element.selected.active { - background-color: @selected-active-background; - text-color: @background-color; - } - #element.alternate.normal { - background-color: @background-color; - text-color: @foreground; - } - #element.alternate.urgent { - background-color: @urgent-background; - text-color: @foreground; - } - #element.alternate.active { - background-color: @active-background; - text-color: @foreground; - } - #scrollbar { - width: 2px ; - border: 0; - handle-width: 8px ; - padding: 0; - } - #sidebar { - border: 2px dash 0px 0px ; - border-color: @separatorcolor; - } - #button.selected { - background-color: @selected-background; - text-color: @foreground; - } - #inputbar { - spacing: 0; - text-color: @foreground; - padding: 1px ; - } - #case-indicator { - spacing: 0; - text-color: @foreground; - } - #entry { - spacing: 0; - text-color: @drac-cya; - } - #prompt { - spacing: 0; - text-color: @drac-grn; - } - #inputbar { - children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; - } - #textbox-prompt-colon { - expand: false; - str: ":"; - margin: 0px 0.3em 0em 0em ; - text-color: @drac-grn; - } - element-text, element-icon { - background-color: inherit; - text-color: inherit; - } - ''; + font: "FiraCode Nerd Font Mono 13"; + + foreground: @drac-fgd; + background-color: @drac-bgd; + active-background: @drac-pnk; + urgent-foreground: @foreground; + urgent-background: @drac-red; + + selected-background: @active-background; + selected-urgent-background: @urgent-background; + selected-active-background: @active-background; + separatorcolor: @active-background; + bordercolor: #6272a4; + } + + #window { + background-color: @background-color; + border: 3; + border-radius: 6; + border-color: @bordercolor; + padding: 5; + } + #mainbox { + border: 0; + padding: 5; + } + #message { + border: 1px dash 0px 0px ; + border-color: @separatorcolor; + padding: 1px ; + } + #textbox { + text-color: @foreground; + } + #listview { + fixed-height: 0; + border: 2px dash 0px 0px ; + border-color: @bordercolor; + spacing: 2px ; + scrollbar: false; + padding: 2px 0px 0px ; + } + #element { + border: 0; + padding: 1px ; + } + #element.normal.normal { + background-color: @background-color; + text-color: @foreground; + } + #element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; + } + #element.normal.active { + background-color: @active-background; + text-color: @background-color; + } + #element.selected.normal { + background-color: @selected-background; + text-color: @foreground; + } + #element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @foreground; + } + #element.selected.active { + background-color: @selected-active-background; + text-color: @background-color; + } + #element.alternate.normal { + background-color: @background-color; + text-color: @foreground; + } + #element.alternate.urgent { + background-color: @urgent-background; + text-color: @foreground; + } + #element.alternate.active { + background-color: @active-background; + text-color: @foreground; + } + #scrollbar { + width: 2px ; + border: 0; + handle-width: 8px ; + padding: 0; + } + #sidebar { + border: 2px dash 0px 0px ; + border-color: @separatorcolor; + } + #button.selected { + background-color: @selected-background; + text-color: @foreground; + } + #inputbar { + spacing: 0; + text-color: @foreground; + padding: 1px ; + } + #case-indicator { + spacing: 0; + text-color: @foreground; + } + #entry { + spacing: 0; + text-color: @drac-cya; + } + #prompt { + spacing: 0; + text-color: @drac-grn; + } + #inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; + } + #textbox-prompt-colon { + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em ; + text-color: @drac-grn; + } + element-text, element-icon { + background-color: inherit; + text-color: inherit; + } + ''; + }; }; }; } diff --git a/modules/config/wallpapers.nix b/modules/config/wallpapers.nix index 0ea8f62..526a017 100644 --- a/modules/config/wallpapers.nix +++ b/modules/config/wallpapers.nix @@ -9,13 +9,7 @@ let cfg = config.my.wallpapers; in { - options.my.wallpapers = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.wallpapers.enable = mkEnableOption "wallpapers"; config = mkIf cfg.enable { home-manager.users.moritz.xdg = { diff --git a/modules/config/yubikey.nix b/modules/config/yubikey.nix index 889c7a5..4695434 100644 --- a/modules/config/yubikey.nix +++ b/modules/config/yubikey.nix @@ -9,13 +9,7 @@ let cfg = config.my.yubikey; in { - options.my.yubikey = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.yubikey = mkEnableOption "yubikey"; config = { services.udev.packages = [ pkgs.yubikey-personalization ]; diff --git a/modules/profiles/base.nix b/modules/profiles/base.nix index 921cb2c..e8b9533 100644 --- a/modules/profiles/base.nix +++ b/modules/profiles/base.nix @@ -9,7 +9,7 @@ with lib; users.users.moritz = { isNormalUser = true; home = "/home/moritz"; - extraGroups = [ "wheel" ]; # "networkmanager" "video" "dialout" + extraGroups = [ "wheel" "networkmanager" "video" ]; initialPassword = "password"; # CHANGE ME PLEASE openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGoAqa2m7hIzZ2LS96Z+RCIlRvhBM/j7h27tMBCwMT+a" # Moritz @@ -22,10 +22,15 @@ with lib; time.timeZone = "Europe/Berlin"; my = { + nix = { + gc.enable = true; + optimise.enable = true; + }; + bin.enable = true; shell = { abbreviations = { us = "systemctl --user"; - rs = "doas systemctl"; + rs = "sudo systemctl"; }; aliases = { ls = "exa -lh --icons --git"; @@ -34,18 +39,22 @@ with lib; rm = "rm -i"; mv = "mv -i"; - nix-switch = "doas nixos-rebuild switch --flake ~/.dotfiles"; - nix-boot = "doas nixos-rebuild boot --flake ~/.dotfiles"; - nix-lock = "pushd ~/.dotfiles && nix flake update && popd"; + nixos-switch = "sudo nixos-rebuild switch --flake ~/.dotfiles"; + nixos-boot = "sudo nixos-rebuild boot --flake ~/.dotfiles"; + nixos-update = "pushd ~/.dotfiles && nix flake update && popd"; latexwatch = ''find -type f -name "*.tex" | entr -c latexmk -pdf -silent''; }; variables = { EDITOR = "vim"; }; }; programs = { - vim.enable = true; + direnv.enable = true; + fish.enable = true; + git.enable = true; + gpg.enable = true; helix.enable = true; kakoune.enable = true; + vim.enable = true; }; }; @@ -81,25 +90,27 @@ with lib; entr exa gparted - hub + hut + lazygit neofetch + ripgrep tmux ttyper up viu wget - hut ]; fonts.fonts = with pkgs; [ (nerdfonts.override { - fonts = [ "FiraCode" "DroidSansMono" "JetBrainsMono" ]; + fonts = [ "FiraCode" ]; }) ]; programs = { mtr.enable = true; command-not-found.enable = true; + starship.enable = true; }; services = { @@ -110,22 +121,21 @@ with lib; (builtins.attrValues config.fileSystems)); }; + i18n.extraLocaleSettings = { + LC_NUMERIC = "de_DE.UTF-8"; + LC_PAPER = "de_DE.UTF-8"; + LC_TIME = "de_DE.UTF-8"; + }; + home-manager.users.moritz = { programs = { # Let Home Manager install and manage itself. home-manager.enable = true; fzf.enable = true; - starship.enable = true; }; home = { username = "moritz"; homeDirectory = "/home/moritz"; - language = { - base = "en_US.UTF-8"; - time = "de_DE.UTF-8"; - numeric = "de_DE.UTF-8"; - paper = "de_DE.UTF-8"; - }; stateVersion = "21.05"; }; xdg.userDirs.enable = true; diff --git a/modules/profiles/desktop.nix b/modules/profiles/desktop.nix index 0588d7e..cc97e51 100644 --- a/modules/profiles/desktop.nix +++ b/modules/profiles/desktop.nix @@ -20,7 +20,7 @@ with lib; { programs = { adb.enable = true; - bspwm.enable = true; + hyprland.enable = true; code.enable = true; emacs.enable = true; firefox = { @@ -78,19 +78,23 @@ with lib; { hub.enable = true; kitty.enable = true; ledger.enable = true; + logseq.enable = true; python.enable = true; rofi.enable = true; + ssh = { + enable = true; + includeSecrets = [ ../../secrets/ssh-home.age ]; + }; spotify.enable = true; thunar.enable = true; zathura.enable = true; }; - services = { dunst.enable = true; kdeconnect.enable = true; + mullvad.enable = true; openconnect.enable = true; openvpn.enable = true; - picom.enable = true; printing.enable = true; redshift.enable = true; }; @@ -111,15 +115,21 @@ with lib; { jellyfin-media-player keepassxc libreoffice - logseq pavucontrol signal-desktop tlaplusToolbox vlc + thunderbird + plantuml + + jetbrains.pycharm-professional + + synology-drive-client ]; + programs.chromium.enable = true; + home-manager.users.moritz = { - services.unclutter.enable = true; services.nextcloud-client = { enable = true; startInBackground = true; diff --git a/modules/profiles/gaming.nix b/modules/profiles/gaming.nix index e5b542d..f6d6ac2 100644 --- a/modules/profiles/gaming.nix +++ b/modules/profiles/gaming.nix @@ -8,5 +8,6 @@ lutris legendary-gl heroic + mangohud ]; } diff --git a/modules/programs/adb.nix b/modules/programs/adb.nix index e52d43d..c839ce6 100644 --- a/modules/programs/adb.nix +++ b/modules/programs/adb.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.adb; in { - options.my.programs.adb = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.adb.enable = mkEnableOption "adb"; config = mkIf cfg.enable { programs.adb.enable = true; diff --git a/modules/programs/bspwm/default.nix b/modules/programs/bspwm/default.nix index 7c0d4a4..78c64a6 100644 --- a/modules/programs/bspwm/default.nix +++ b/modules/programs/bspwm/default.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.bspwm; in { - options.my.programs.bspwm = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.bspwm.enable = mkEnableOption "true"; config = lib.mkIf cfg.enable { services = { @@ -51,13 +45,13 @@ in focus_follows_pointer = true; }; startupPrograms = [ - "${pkgs.systemd}/bin/systemctl --user start polybar.service" "randomWallpaper" "${pkgs.synology-drive-client}/bin/synology-drive" ]; extraConfig = builtins.readFile ./bspwmrc; }; services = { + unclutter.enable = true; sxhkd = { enable = true; extraConfig = builtins.readFile ./sxhkdrc; @@ -72,16 +66,30 @@ in ''; }; }; - - home.packages = with pkgs; [ - bc # HACK to get bsp-layout to work - brightnessctl - bsp-layout - feh - pamixer - playerctl - synology-drive-client - ]; + systemd.user.targets.tray = { + Unit = { + Description = "Bspwm Tray Target"; + After = [ "graphical-session.target" ]; + }; + Install = { + WantedBy = [ "graphical-session.target" ]; + }; + }; }; + + programs.xss-lock = { + enable = true; + lockerCommand = "${pkgs.i3lock-fancy-rapid}/bin/i3lock-fancy-rapid 10 5"; + }; + + environment.systemPackages = with pkgs; [ + bc # HACK to get bsp-layout to work + brightnessctl + bsp-layout + feh + pamixer + playerctl + synology-drive-client + ]; }; } diff --git a/modules/programs/bspwm/sxhkdrc b/modules/programs/bspwm/sxhkdrc index 52f51f3..1f25526 100755 --- a/modules/programs/bspwm/sxhkdrc +++ b/modules/programs/bspwm/sxhkdrc @@ -30,7 +30,7 @@ alt + shift + c alt + {t,shift + t,s,f} bspc node -t {tiled,pseudo_tiled,floating,fullscreen} -# switch layout +# switch window layout alt + space bsp-layout next --layouts wide,tall,tiled @@ -107,6 +107,10 @@ super + h super + s share +# switch keyboard layout +super + l + setxkbmap -query | grep -Eq "layout:\s+de" && setxkbmap us && dunstify "Layout US"|| (setxkbmap de && dunstify "Layout DE") + # Apps # start firefox super + {_,shift} + f diff --git a/modules/programs/code.nix b/modules/programs/code.nix index 0f58530..93cda16 100644 --- a/modules/programs/code.nix +++ b/modules/programs/code.nix @@ -9,13 +9,8 @@ let cfg = config.my.programs.code; in { - options.my.programs.code = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.code.enable = mkEnableOption "code"; + config = mkIf cfg.enable { home-manager.users.moritz = { programs.vscode = { diff --git a/modules/programs/default.nix b/modules/programs/default.nix index bdc63b1..abc4c23 100644 --- a/modules/programs/default.nix +++ b/modules/programs/default.nix @@ -21,14 +21,17 @@ ./kakoune.nix ./kitty.nix ./ledger + ./logseq.nix ./python.nix ./rofi ./spotify.nix + ./ssh.nix ./sway.nix ./thunar.nix ./vim.nix ./xmonad ./zathura.nix ./zsh.nix + ./hyprland ]; } diff --git a/modules/programs/direnv.nix b/modules/programs/direnv.nix index 83489cc..1235326 100644 --- a/modules/programs/direnv.nix +++ b/modules/programs/direnv.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.direnv; in { - options.my.programs.direnv = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - }; + options.my.programs.direnv.enable = mkEnableOption "direnv"; config = mkIf cfg.enable { home-manager.users.moritz.programs.direnv = { diff --git a/modules/programs/emacs.nix b/modules/programs/emacs.nix index 1a2a7d1..c754558 100644 --- a/modules/programs/emacs.nix +++ b/modules/programs/emacs.nix @@ -8,94 +8,40 @@ with lib; let cfg = config.my.programs.emacs; - myEmacs = with pkgs; ((emacsPackagesFor emacsUnstable).emacsWithPackages + myEmacs = with pkgs; ((emacsPackagesFor emacsPgtk).emacsWithPackages (epkgs: [ epkgs.vterm ])); in { - options.my.programs.emacs = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.emacs.enable = mkEnableOption "emacs"; + config = mkIf cfg.enable { my.shell.aliases = { - emacs = "emacsclient -t -a 'emacs -t'"; + emacs = "emacsclient -nw -a 'emacs -nw'"; }; - fonts.fonts = [ pkgs.emacs-all-the-icons-fonts ]; + fonts.fonts = with pkgs; [ + emacs-all-the-icons-fonts + (iosevka-bin.override { variant = "aile"; }) + ]; + users.users.moritz.packages = with pkgs; [ + myEmacs + (ripgrep.override { withPCRE2 = true; }) + # flyspell + (hunspellWithDicts [ + hunspellDicts.en_GB-ize + hunspellDicts.en_US + hunspellDicts.de_DE + ]) + + # language servers + nil + ]; home-manager.users.moritz = { home.sessionPath = [ "/home/moritz/.config/emacs/bin/" ]; services.emacs = { enable = true; package = myEmacs; }; - - home.packages = with pkgs; [ - ### Emacs itself - binutils # native-comp needs 'as', provided by this - myEmacs - - ### Doom dependencies - git - (ripgrep.override { withPCRE2 = true; }) - gnutls # for TLS connectivity - - ### Optional dependencies - fd # faster projectile indexing - imagemagick # for image-dired - zstd # for undo-fu-session/undo-tree compression - - ### Module dependencies - ## :checkers - # spell - (hunspellWithDicts [ - hunspellDicts.en_GB-ize - hunspellDicts.en_US - hunspellDicts.de_DE - ]) - - # grammar - languagetool - - ## : tools - # lookup & org +roam - sqlite - gcc # HACK to get emacsqlite binary - wordnet - graphviz - - ## :lang - # latex & org (latex previews) - stable.texlive.combined.scheme-full # HACK to fix broken perl package - texlab - - # nix - nixfmt # for formating nix - rnix-lsp - - # markdown & org +pandoc - pandoc - - # python - nodePackages.pyright - - # sh - nodePackages.bash-language-server - - ## :email - # mu4e - mu - isync - - ## :app - # everywhere - xdotool - xorg.xwininfo - xclip - xorg.xprop - ]; }; }; } diff --git a/modules/programs/firefox.nix b/modules/programs/firefox.nix index ee4cab0..d0f8e4d 100644 --- a/modules/programs/firefox.nix +++ b/modules/programs/firefox.nix @@ -12,11 +12,7 @@ let in { options.my.programs.firefox = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; + enable = mkEnableOption "firefox"; arkenfox = { enable = mkEnableOption "arkenfox"; overrides = mkOption { diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix index d38f6d5..c143217 100644 --- a/modules/programs/fish.nix +++ b/modules/programs/fish.nix @@ -14,17 +14,12 @@ let exportedVariables = lib.concatStringsSep "\n" exportVariables; in { - options.my.programs.fish = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - }; + options.my.programs.fish.enable = mkEnableOption "fish"; config = lib.mkIf cfg.enable { # set as default shell users.users.moritz.shell = pkgs.fish; + environment.systemPackages = with pkgs.fishPlugins; [ fzf-fish pisces ]; # needed for nix completions programs.fish.enable = true; @@ -78,17 +73,10 @@ in fish_greeting = ""; cheat = "cht.sh $argv | bat -p"; }; - plugins = [ - { - name = "dracula"; - src = inputs.dracula-fish; - } - ]; }; fzf.enableFishIntegration = true; starship.enableFishIntegration = true; }; - home.packages = with pkgs.fishPlugins; [ fzf-fish pisces ]; }; }; } diff --git a/modules/programs/git.nix b/modules/programs/git.nix index 46c2885..42497af 100644 --- a/modules/programs/git.nix +++ b/modules/programs/git.nix @@ -10,11 +10,7 @@ let in { options.my.programs.git = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; + enable = mkEnableOption "git"; signing = mkOption { default = false; type = types.bool; diff --git a/modules/programs/gnome.nix b/modules/programs/gnome.nix index 8e7c2ee..f60df75 100644 --- a/modules/programs/gnome.nix +++ b/modules/programs/gnome.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.gnome; in { - options.my.programs.gnome = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.gnome.enable = mkEnableOption "gnome"; config = lib.mkIf cfg.enable { hardware = { diff --git a/modules/programs/gpg.nix b/modules/programs/gpg.nix index eb2c845..5371d62 100644 --- a/modules/programs/gpg.nix +++ b/modules/programs/gpg.nix @@ -9,13 +9,8 @@ let cfg = config.my.programs.gpg; in { - options.my.programs.gpg = { - enable = mkOption { - default = true; - type = types.bool; - example = true; - }; - }; + options.my.programs.gpg.enable = mkEnableOption "gpg"; + config = mkIf cfg.enable { home-manager.users.moritz.programs.gpg.enable = true; environment.shellInit = '' diff --git a/modules/programs/helix.nix b/modules/programs/helix.nix index 93bb5ab..821a09c 100644 --- a/modules/programs/helix.nix +++ b/modules/programs/helix.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.helix; in { - options.my.programs.helix = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - }; + options.my.programs.helix.enable = mkEnableOption "helix"; config = mkIf cfg.enable { home-manager.users.moritz.programs.helix = { diff --git a/modules/programs/hub.nix b/modules/programs/hub.nix index 8759d23..14b9c60 100644 --- a/modules/programs/hub.nix +++ b/modules/programs/hub.nix @@ -9,13 +9,8 @@ let cfg = config.my.programs.hub; in { - options.my.programs.hub = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - }; + options.my.programs.hub.enable = mkEnableOption "hub"; + config = mkIf cfg.enable { age.secrets = { github = { diff --git a/modules/programs/hyprland/config.nix b/modules/programs/hyprland/config.nix new file mode 100644 index 0000000..0ffe5d1 --- /dev/null +++ b/modules/programs/hyprland/config.nix @@ -0,0 +1,201 @@ +{ config +, lib +, pkgs +, ... +}: + +with lib; +let + mkRule = rule: windowRegexes: "windowrulev2 = ${rule},${concatStringsSep "," windowRegexes}"; + mkRules = rules: windowRegexes: concatStringsSep "\n" (map (flip mkRule windowRegexes) rules); +in +'' + # + # Please note not all available settings / options are set here. + # For a full list, see the wiki + # + + # See https://wiki.hyprland.org/Configuring/Monitors/ + monitor=,preferred,auto,1 + + # See https://wiki.hyprland.org/Configuring/Keywords/ for more + + # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ + input { + kb_layout = de,us + kb_variant = + kb_model = + kb_options = grp:win_space_toggle,caps:escape + kb_rules = + + follow_mouse = 1 + + touchpad { + natural_scroll = yes + } + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + } + + general { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + gaps_in = 5 + gaps_out = 5 + border_size = 2 + col.active_border = rgba(1affffee) + col.inactive_border = rgba(595959aa) + + cursor_inactive_timeout = 1 + + layout = dwindle + } + + decoration { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + rounding = 3 + blur = yes + blur_size = 3 + blur_passes = 3 + blur_new_optimizations = on + + drop_shadow = yes + shadow_range = 10 + shadow_render_power = 2 + + # col.shadow = rgba(1a1a1aee) + } + + animations { + enabled = yes + + # Some default Lanimations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = myBezier, 0.45, 0, 0.55, 1 + + animation = windows, 1, 3, myBezier + animation = windowsOut, 1, 3, myBezier + animation = border, 1, 3, myBezier + animation = fade, 1, 3, myBezier + animation = workspaces, 1, 3, myBezier + } + + dwindle { + # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more + pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = yes # you probably want this + no_gaps_when_only = true + } + + master { + # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more + no_gaps_when_only = true + new_is_master = false + } + + gestures { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + workspace_swipe = on + } + + # Example per-device config + # See https://wiki.hyprland.org/Configuring/Keywords/#executing for more + device:epic mouse V1 { + sensitivity = -0.5 + } + + # Example windowrule v2 + # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ + # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more + + # Kitty + windowrulev2 = opacity 0.95 0.95, class:^kitty$ + + windowrulev2 = opacity 0.85 0.85, floating:1 + + # Firefox Sharing Indicator + ${mkRules ["float" "move 49% 40" "noborder"] ["title:^(.*Sharing Indicator)$"]} + + # Rofi + ${mkRules ["float" "opacity 0.85 0.85" "noborder"] ["class:^([rR]ofi)$"]} + + # Emacs + windowrulev2 = opaque, class:^emacs$ + + + # Fullscreen Applications + # ${mkRules ["opaque" "noblur" "noborder" "noshadow" "forceinput"] ["fullscreen:1"]} + + # See https://wiki.hyprland.org/Configuring/Keywords/ for more + $mainMod = SUPER + $windowMod = ALT + + # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more + bind = $mainMod, D, exec, hyprctl keyword general:layout dwindle + bind = $mainMod, E, exec, emacsclient -c -a emacs + bind = $mainMod, F, togglefloating, + bind = $mainMod SHIFT, F, fullscreen, + bind = $mainMod, M, exec, hyprctl keyword general:layout master + bind = $mainMod, P, pseudo, # dwindle + bind = $mainMod, Q, killactive, + bind = $mainMod, R, exec, rofi -x11 -show combi + bind = $mainMod, C, exec, rofi -x11 -show calc -modi calc -no-show-match -no-sort | wl-copy + bind = $mainMod, B, exec, rofi-bluetooth + bind = $mainMod, RETURN, exec, kitty + bind = $mainMod, T, togglesplit, # dwindle + bind = , XF86AudioLowerVolume, exec, pamixer -d 5 + bind = , XF86AudioMute, exec, pamixer -t + bind = , XF86AudioNext, exec, playerctl -p "spotifyd,firefox" next + bind = , XF86AudioPlay, exec, playerctl -p "spotifyd,firefox" play-pause + bind = , XF86AudioPrev, exec, playerctl -p "spotifyd,firefox" previous + bind = , XF86AudioRaiseVolume, exec, pamixer -i 5 + bind = , XF86MonBrightnessDown, exec, brightnessctl s 10%- + bind = , XF86MonBrightnessUp, exec, brightnessctl s 10%+ + + # Move focus with mainMod + hjkl + bind = $mainMod, H, movefocus, l + bind = $mainMod, L, movefocus, r + bind = $mainMod, K, movefocus, u + bind = $mainMod, J, movefocus, d + + # Change current active window size with mainMod + hjkl + bind = $mainMod SHIFT, H, resizeactive, -10 0 + bind = $mainMod SHIFT, L, resizeactive, 10 0 + bind = $mainMod SHIFT, K, resizeactive, 0 -10 + bind = $mainMod SHIFT, J, resizeactive, 0 10 + + # Switch workspaces with mainMod + [0-9] + bind = $mainMod, 1, workspace, 1 + bind = $mainMod, 2, workspace, 2 + bind = $mainMod, 3, workspace, 3 + bind = $mainMod, 4, workspace, 4 + bind = $mainMod, 5, workspace, 5 + bind = $mainMod, 6, workspace, 6 + bind = $mainMod, 7, workspace, 7 + bind = $mainMod, 8, workspace, 8 + bind = $mainMod, 9, workspace, 9 + bind = $mainMod, 0, workspace, 10 + + # Move active window to a workspace with mainMod + SHIFT + [0-9] + bind = $mainMod SHIFT, 1, movetoworkspace, 1 + bind = $mainMod SHIFT, 2, movetoworkspace, 2 + bind = $mainMod SHIFT, 3, movetoworkspace, 3 + bind = $mainMod SHIFT, 4, movetoworkspace, 4 + bind = $mainMod SHIFT, 5, movetoworkspace, 5 + bind = $mainMod SHIFT, 6, movetoworkspace, 6 + bind = $mainMod SHIFT, 7, movetoworkspace, 7 + bind = $mainMod SHIFT, 8, movetoworkspace, 8 + bind = $mainMod SHIFT, 9, movetoworkspace, 9 + bind = $mainMod SHIFT, 0, movetoworkspace, 10 + + # Scroll through existing workspaces with mainMod + scroll + bind = $mainMod, mouse_down, workspace, e+1 + bind = $mainMod, mouse_up, workspace, e-1 + + # Move/resize windows with mainMod + LMB/RMB and dragging + bindm = $mainMod, mouse:272, movewindow + bindm = $mainMod, mouse:273, resizewindow + + exec-once=synology-drive +'' diff --git a/modules/programs/hyprland/default.nix b/modules/programs/hyprland/default.nix new file mode 100644 index 0000000..f869398 --- /dev/null +++ b/modules/programs/hyprland/default.nix @@ -0,0 +1,173 @@ +{ config +, lib +, pkgs +, inputs +, ... +} @ args: + +with lib; +let + cfg = config.my.programs.hyprland; + + hyprland = pkgs.hyprland.override { nvidiaPatches = cfg.nvidiaSupport; }; +in +{ + options.my.programs.hyprland = { + enable = mkEnableOption "hyprland"; + nvidiaSupport = mkEnableOption "enable nvidia Support"; + }; + + config = mkIf cfg.enable { + home-manager.users.moritz = { + imports = [ inputs.hyprland.homeManagerModules.default ]; + + programs.waybar = { + enable = true; + package = pkgs.waybar-hyprland; + systemd = { + enable = true; + target = "hyprland-session.target"; + }; + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 30; + output = [ + "eDP-1" + "HDMI-A-1" + "HDMI-A-2" + ]; + modules-left = [ "wlr/workspaces" ]; + modules-center = [ "hyprland/window" ]; + modules-right = [ "network" "memory" "cpu" "battery" "clock" ]; + modules = { + "wlr/workspaces" = { + on-click = "activate"; + }; + }; + }; + }; + }; + + wayland.windowManager.hyprland = { + enable = true; + package = hyprland; + extraConfig = import ./config.nix args; + }; + + services.swayidle = { + enable = true; + events = [ + { + event = "before-sleep"; + command = "${pkgs.swaylock-effects}/bin/swaylock -fF"; + } + { + event = "lock"; + command = "${pkgs.swaylock-effects}/bin/swaylock -fF"; + } + ]; + timeouts = [ + { + timeout = 300; + command = "${hyprland}/bin/hyprctl dispatch dpms off"; + resumeCommand = "${hyprland}/bin/hyprctl dispatch dpms on"; + } + { + timeout = 310; + command = "${pkgs.systemd}/bin/loginctl lock-session"; + } + ]; + }; + # start swayidle as part of hyprland, not sway + systemd.user.services.swayidle.Install.WantedBy = lib.mkForce [ "hyprland-session.target" ]; + + xdg.configFile."hypr/hyprpaper.conf" = { + text = + let + setWallpaper = wallpaper: '' + preload = ${wallpaper} + wallpaper = ,${wallpaper} + ''; + in + setWallpaper "/home/moritz/.config/wallpapers/a_short_walk.png"; + onChange = "${pkgs.systemd}/bin/systemctl restart --user hyprpaper.service"; + }; + }; + systemd.user.services.hyprpaper = { + enable = true; + path = [ pkgs.hyprpaper ]; + wantedBy = [ "hyprland-session.target" ]; + after = [ "display-manager.service" ]; + script = "hyprpaper"; + }; + + users.users.moritz.packages = with pkgs; [ + swayidle + swaylock-effects + pamixer + playerctl + brightnessctl + grimblast + wl-clipboard + ]; + + security.pam.services.swaylock = { }; + + programs.hyprland = { + enable = true; + package = null; + }; + + environment.sessionVariables = + { + XDG_CURRENT_DESKTOP = "Hyprland"; + XDG_SESSION_TYPE = "wayland"; + XDG_SESSION_DESKTOP = "Hyprland"; + QT_AUTO_SCREEN_SCALE_FACTOR = "1"; + QT_QPA_PLATFORM = "wayland;xcb"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + QT_QPA_PLATFORMTHEME = "qt5ct"; + _JAVA_AWT_WM_NONEREPARENTING = "1"; + } // + (if cfg.nvidiaSupport then + { + LIBVA_DRIVER_NAME = "nvidia"; + XDG_SESSION_TYPE = "wayland"; + GBM_BACKEND = "nvidia-drm"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + WLR_NO_HARDWARE_CURSORS = "1"; + __GL_VRR_ALLOWED = "0"; + } else { }); + + services = { + dbus.enable = true; + pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + xserver = { + enable = true; + displayManager = { + lightdm.enable = true; + autoLogin = { + enable = true; + user = "moritz"; + }; + defaultSession = "hyprland"; + sessionPackages = [ hyprland ]; + }; + }; + }; + security.rtkit.enable = true; + + xdg.portal = { + enable = true; + wlr.enable = true; + extraPortals = [ pkgs.xdg-desktop-portal-hyprland ]; + }; + }; +} diff --git a/modules/programs/kakoune.nix b/modules/programs/kakoune.nix index a4efa50..874ef2d 100644 --- a/modules/programs/kakoune.nix +++ b/modules/programs/kakoune.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.kakoune; in { - options.my.programs.kakoune = { - enable = mkOption { - default = true; - type = types.bool; - example = false; - }; - }; + options.my.programs.kakoune.enable = mkEnableOption "kakoune"; config = mkIf cfg.enable { home-manager.users.moritz = { diff --git a/modules/programs/kitty.nix b/modules/programs/kitty.nix index f55f40f..76c4a10 100644 --- a/modules/programs/kitty.nix +++ b/modules/programs/kitty.nix @@ -9,16 +9,10 @@ let cfg = config.my.programs.kitty; in { - options.my.programs.kitty = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.kitty.enable = mkEnableOption "kitty"; config = mkIf cfg.enable { - my.shell.aliases.ssh = "kitty +kitten ssh"; + my.shell.aliases.ssh = "TERM=xterm-256color command ssh"; home-manager.users.moritz = { programs.kitty = { enable = true; @@ -38,11 +32,6 @@ in size = 10; }; }; - xdg.configFile."kitty/ssh.conf" = { - text = '' - env TERM=xterm-color - ''; - }; }; }; } diff --git a/modules/programs/ledger/default.nix b/modules/programs/ledger/default.nix index 3efcfab..348e0e1 100644 --- a/modules/programs/ledger/default.nix +++ b/modules/programs/ledger/default.nix @@ -9,48 +9,45 @@ let cfg = config.my.programs.ledger; in { - options.my.programs.ledger = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.ledger.enable = mkEnableOption "ledger"; config = mkIf cfg.enable { - my.shell.aliases = { - bal = "ledger bal"; - balcash = "ledger bal -R -X € --current --flat ^assets:bank ^liabilities"; - balnet = "ledger bal -R -X € --current --depth 2 ^assets ^liabilities"; - bud = ''ledger --budget --unbudgeted bal ^expenses -p "this month"''; - budr = ''ledger --budget reg -p "this month" ^expenses''; - reg = "ledger reg -R -V --tail 15"; - }; - home-manager.users.moritz = { - home.packages = with pkgs; let - reg-copy = writeShellApplication { - name = "reg-copy"; - - runtimeInputs = [ ledger xclip ]; - - text = '' - table="$(printf '%-10s %-30s %8s %8s\n' Datum Beschreibung Einzeln Gesamt && ledger reg -V --format '%10D %.30P %8t %8T\n' "$@")" - echo "$table" - echo "$table" | xclip -selection clipboard - ''; + my.shell = { + variables = { + LEDGER_FILE = "/home/moritz/Nextcloud/Notes/ledger/main.ledger"; + }; + aliases = + let + applyCommon = name: command: "${command} --payee note --strict --explicit"; + in + mapAttrs applyCommon { + bal = "ledger bal"; + balcash = "ledger bal -R -X € --current --flat ^assets:bank ^liabilities"; + balnet = "ledger bal -R -X € --current --depth 2 ^assets ^liabilities"; + bud = ''ledger bal --budget --unbudgeted -p "this month"''; + budr = ''ledger reg --budget --unbudgeted -p "this month"''; + reg = "ledger reg -R -V --tail 15"; }; - in - [ ledger reg-copy ]; + }; + environment.systemPackages = with pkgs; let + reg-copy = writeShellApplication { + name = "reg-copy"; + + runtimeInputs = [ ledger xclip ]; + + text = '' + table="$(printf '%-10s %-30s %8s %8s\n' Datum Beschreibung Einzeln Gesamt && ledger reg -V --format '%10D %.30P %8t %8T\n' "$@")" + echo "$table" + echo "$table" | xclip -selection clipboard + ''; + }; + in + [ ledger reg-copy hledger hledger-ui hledger-web ]; + home-manager.users.moritz = { xdg.configFile = { "fish/completions/ledger.fish" = { text = builtins.readFile ./ledger.fish; }; - "ledger/ledgerrc".text = '' - --strict - --explicit - --payee note - --file ~/Notes/ledger/main.ledger - ''; }; }; }; diff --git a/modules/programs/logseq.nix b/modules/programs/logseq.nix new file mode 100644 index 0000000..35349b3 --- /dev/null +++ b/modules/programs/logseq.nix @@ -0,0 +1,20 @@ +{ config +, lib +, pkgs +, ... +}: + +with lib; +let + cfg = config.my.programs.logseq; +in +{ + options.my.programs.logseq.enable = mkEnableOption "logseq"; + + config = mkIf cfg.enable { + users.users.moritz.packages = with pkgs; [ + logseq-wayland + ]; + xdg.mime.defaultApplications."x-scheme-handler/logseq" = "logseq.desktop"; + }; +} diff --git a/modules/programs/python.nix b/modules/programs/python.nix index 7480cb5..f0dadfb 100644 --- a/modules/programs/python.nix +++ b/modules/programs/python.nix @@ -30,7 +30,14 @@ in example = [ "python39" ]; }; packages = mkOption { - default = [ "isort" "pytest" "flake8" "python-lsp-server" ]; + default = [ + "flake8" + "isort" + "mypy" + "poetry" + "pytest" + "python-lsp-server" + ]; type = with types; listOf (enum commonPackages); }; }; diff --git a/modules/programs/rofi/default.nix b/modules/programs/rofi/default.nix index 28e7363..1bb06dd 100644 --- a/modules/programs/rofi/default.nix +++ b/modules/programs/rofi/default.nix @@ -7,63 +7,23 @@ with lib; let cfg = config.my.programs.rofi; - - rofi-bluetooth = with pkgs; stdenv.mkDerivation rec { - pname = "rofi-bluetooth"; - version = "unstable-2021-03-05"; - - src = fetchFromGitHub { - repo = pname; - owner = "nickclyde"; - # https://github.com/nickclyde/rofi-bluetooth/issues/19 - rev = "893db1f2b549e7bc0e9c62e7670314349a29cdf2"; - sha256 = "sha256-3oROJKEQCuSnLfbJ+JSSc9hcmJTPrLHRQJsrUcaOMss="; - }; - - nativeBuildInputs = [ makeWrapper ]; - - installPhase = '' - runHook preInstall - - install -D --target-directory=$out/bin/ ./rofi-bluetooth - - wrapProgram $out/bin/rofi-bluetooth \ - --prefix PATH ":" ${lib.makeBinPath [ rofi-unwrapped bluez ] } - - runHook postInstall - ''; - - meta = with lib; { - description = "Rofi-based interface to connect to bluetooth devices and display status info"; - homepage = "https://github.com/nickclyde/rofi-bluetooth"; - license = licenses.gpl3Only; - maintainers = with maintainers; [ MoritzBoehme ]; - platforms = platforms.linux; - }; - }; in { - options.my.programs.rofi = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.rofi.enable = mkEnableOption "rofi"; config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + (lib.mkIf config.networking.networkmanager.enable networkmanager_dmenu) + (lib.mkIf config.hardware.bluetooth.enable rofi-bluetooth) + rofi-power-menu + ]; home-manager.users.moritz = { programs.rofi = { enable = true; package = - pkgs.rofi.override { plugins = with pkgs; [ rofi-calc rofi-emoji ]; }; + pkgs.rofi-wayland.override { plugins = with pkgs; [ rofi-calc rofi-emoji ]; }; extraConfig = { combi-modi = "drun,window,emoji"; }; }; - home.packages = with pkgs; [ - (lib.mkIf config.networking.networkmanager.enable networkmanager_dmenu) - (lib.mkIf config.hardware.bluetooth.enable rofi-bluetooth) - rofi-power-menu - ]; xdg = { enable = true; configFile."networkmanager-dmenu/config.ini".text = '' diff --git a/modules/programs/spotify.nix b/modules/programs/spotify.nix index 283f9be..f6d39bd 100644 --- a/modules/programs/spotify.nix +++ b/modules/programs/spotify.nix @@ -9,21 +9,15 @@ let cfg = config.my.programs.spotify; in { - options.my.programs.spotify = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.spotify.enable = mkEnableOption "spotify"; config = mkIf cfg.enable { age.secrets.spotifyd = { file = ../../secrets/spotifyd.age; owner = "1000"; }; + environment.systemPackages = with pkgs; [ spotify-tui sptlrx ]; home-manager.users.moritz = { - home.packages = with pkgs; [ spotify-tui sptlrx ]; services.spotifyd = { enable = true; package = pkgs.spotifyd.override { withMpris = true; }; diff --git a/modules/programs/ssh.nix b/modules/programs/ssh.nix new file mode 100644 index 0000000..2c484ae --- /dev/null +++ b/modules/programs/ssh.nix @@ -0,0 +1,39 @@ +{ config +, lib +, pkgs +, ... +}: + +with lib; +let + cfg = config.my.programs.ssh; + + baseName = path: removeSuffix ".age" (baseNameOf path); +in +{ + options.my.programs.ssh = { + enable = mkEnableOption "ssh"; + includeSecrets = mkOption { + default = [ ]; + type = with types; listOf path; + }; + }; + + config = + mkIf cfg.enable + { + age.secrets = listToAttrs (map + (path: { + name = baseName path; + value = { + file = path; + owner = "1000"; + }; + }) + cfg.includeSecrets); + home-manager.users.moritz.programs.ssh = { + enable = true; + includes = map (path: "/run/agenix/" + baseName path) cfg.includeSecrets; + }; + }; +} diff --git a/modules/programs/sway.nix b/modules/programs/sway.nix index a3b6716..f7ae605 100644 --- a/modules/programs/sway.nix +++ b/modules/programs/sway.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.sway; in { - options.my.programs.sway = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.sway.enable = mkEnableOption "sway"; config = lib.mkIf cfg.enable { hardware.opengl = { diff --git a/modules/programs/thunar.nix b/modules/programs/thunar.nix index 20a3be7..3a6a6c7 100644 --- a/modules/programs/thunar.nix +++ b/modules/programs/thunar.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.thunar; in { - options.my.programs.thunar = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.thunar.enable = mkEnableOption "thunar"; config = mkIf cfg.enable { environment.systemPackages = with pkgs; [ @@ -26,7 +20,7 @@ in ]; services.gvfs = { enable = true; - package = lib.mkForce pkgs.gnome3.gvfs; + package = lib.mkForce pkgs.gnome.gvfs; }; }; } diff --git a/modules/programs/xmonad/default.nix b/modules/programs/xmonad/default.nix index dcaab68..80ceb83 100644 --- a/modules/programs/xmonad/default.nix +++ b/modules/programs/xmonad/default.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.xmonad; in { - options.my.programs.xmonad = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.xmonad.enable = mkEnableOption "xmonad"; config = lib.mkIf cfg.enable { services = { diff --git a/modules/programs/zathura.nix b/modules/programs/zathura.nix index 0389b1e..4eb23e3 100644 --- a/modules/programs/zathura.nix +++ b/modules/programs/zathura.nix @@ -9,13 +9,7 @@ let cfg = config.my.programs.zathura; in { - options.my.programs.zathura = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.zathura.enable = mkEnableOption "zathura"; config = mkIf cfg.enable { home-manager.users.moritz.programs.zathura = { diff --git a/modules/programs/zsh.nix b/modules/programs/zsh.nix index d5e775b..8088627 100644 --- a/modules/programs/zsh.nix +++ b/modules/programs/zsh.nix @@ -11,13 +11,7 @@ let shellConfig = config.my.shell; in { - options.my.programs.zsh = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.programs.zsh.enable = mkEnableOption "zsh"; config = lib.mkIf cfg.enable { environment.pathsToLink = [ "/share/zsh" ]; diff --git a/modules/security/default.nix b/modules/security/default.nix index c877f90..3506583 100644 --- a/modules/security/default.nix +++ b/modules/security/default.nix @@ -68,19 +68,6 @@ # So we don't have to do this later... security.acme.acceptTerms = true; - # Enable doas as an alternative to sudo - security.doas = { - enable = lib.mkDefault true; - extraRules = [ - # Do not ask for a password again for some time after the user successfully authenticates. - { - groups = [ "wheel" "doas" ]; - persist = true; - } - ]; - }; - security.sudo.enable = !config.security.doas.enable; - # SSH services.openssh = { # Disable ssh password login diff --git a/modules/services/default.nix b/modules/services/default.nix index 0dc2d3d..4d2b238 100644 --- a/modules/services/default.nix +++ b/modules/services/default.nix @@ -6,6 +6,7 @@ imports = [ ./dunst.nix ./kdeconnect.nix + ./mullvad.nix ./openconnect.nix ./openvpn.nix ./picom.nix diff --git a/modules/services/dunst.nix b/modules/services/dunst.nix index 80b330c..898faaa 100644 --- a/modules/services/dunst.nix +++ b/modules/services/dunst.nix @@ -9,13 +9,7 @@ let cfg = config.my.services.dunst; in { - options.my.services.dunst = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.dunst.enable = mkEnableOption "dunst"; config = lib.mkIf cfg.enable { home-manager.users.moritz = { diff --git a/modules/services/kdeconnect.nix b/modules/services/kdeconnect.nix index 6d66419..3ce2e31 100644 --- a/modules/services/kdeconnect.nix +++ b/modules/services/kdeconnect.nix @@ -13,13 +13,7 @@ let cfg = config.my.services.kdeconnect; in { - options.my.services.kdeconnect = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.kdeconnect.enable = mkEnableOption "kdeconnect"; config = mkIf cfg.enable { home-manager.users.moritz.services.kdeconnect.enable = mkIf (!config.my.programs.gnome.enable) true; diff --git a/modules/services/mullvad.nix b/modules/services/mullvad.nix new file mode 100644 index 0000000..3840016 --- /dev/null +++ b/modules/services/mullvad.nix @@ -0,0 +1,20 @@ +{ config +, lib +, pkgs +, ... +}: + +with lib; +let + cfg = config.my.services.mullvad; +in +{ + options.my.services.mullvad.enable = mkEnableOption "mullvad"; + + config = lib.mkIf cfg.enable { + services.mullvad-vpn.enable = true; + users.users.moritz.packages = with pkgs; [ + mullvad-vpn + ]; + }; +} diff --git a/modules/services/openconnect.nix b/modules/services/openconnect.nix index 8203acb..6a9433a 100644 --- a/modules/services/openconnect.nix +++ b/modules/services/openconnect.nix @@ -9,13 +9,7 @@ let cfg = config.my.services.openconnect; in { - options.my.services.openconnect = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.openconnect.enable = mkEnableOption "openconnect"; config = lib.mkIf cfg.enable { networking.openconnect.interfaces = { @@ -35,7 +29,6 @@ in }; age.secrets.uniVPN = { file = ../../secrets/uni-vpn.age; - owner = "1000"; }; }; } diff --git a/modules/services/openvpn.nix b/modules/services/openvpn.nix index 900721f..b0b49bc 100644 --- a/modules/services/openvpn.nix +++ b/modules/services/openvpn.nix @@ -9,13 +9,7 @@ let cfg = config.my.services.openvpn; in { - options.my.services.openvpn = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.openvpn.enable = mkEnableOption "openvpn"; config = lib.mkIf cfg.enable { age.secrets = { diff --git a/modules/services/picom.nix b/modules/services/picom.nix index 4c41830..13b0024 100644 --- a/modules/services/picom.nix +++ b/modules/services/picom.nix @@ -9,13 +9,7 @@ let cfg = config.my.services.picom; in { - options.my.services.picom = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.picom.enable = mkEnableOption "picom"; config = lib.mkIf cfg.enable { home-manager.users.moritz = { @@ -30,6 +24,9 @@ in glx-no-rebind-pixmap = true; glx-no-stencil = true; + # against flicker + unredir-if-possible = false; + # fastest swap method glx-swap-method = 1; @@ -45,7 +42,6 @@ in # needed for nvidia with glx backend xrender-sync-fence = true; }; - experimentalBackends = true; inactiveOpacity = 0.97; opacityRules = [ "100:fullscreen" "100:class_g = 'Polybar'" ]; vSync = true; diff --git a/modules/services/printing.nix b/modules/services/printing.nix index fd5e44c..ab7edd9 100644 --- a/modules/services/printing.nix +++ b/modules/services/printing.nix @@ -5,13 +5,7 @@ let cfg = config.my.services.printing; in { - options.my.services.printing = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.printing.enable = mkEnableOption "printing"; config = lib.mkIf cfg.enable { services = { diff --git a/modules/services/redshift.nix b/modules/services/redshift.nix index d4878ae..6e75b5e 100644 --- a/modules/services/redshift.nix +++ b/modules/services/redshift.nix @@ -5,13 +5,7 @@ let cfg = config.my.services.redshift; in { - options.my.services.redshift = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.services.redshift.enable = mkEnableOption "redshift"; config = lib.mkIf cfg.enable { services.redshift.enable = true; diff --git a/modules/virtualisation/podman.nix b/modules/virtualisation/podman.nix index 15c8547..f3fdf35 100644 --- a/modules/virtualisation/podman.nix +++ b/modules/virtualisation/podman.nix @@ -9,13 +9,7 @@ let cfg = config.my.virtualisation.podman; in { - options.my.virtualisation.podman = { - enable = mkOption { - default = false; - type = types.bool; - example = false; - }; - }; + options.my.virtualisation.podman.enable = mkEnableOption "podman"; config = mkIf cfg.enable { virtualisation.podman = { diff --git a/modules/virtualisation/virtualisation.nix b/modules/virtualisation/virtualisation.nix index 3326a40..f51862f 100644 --- a/modules/virtualisation/virtualisation.nix +++ b/modules/virtualisation/virtualisation.nix @@ -9,20 +9,17 @@ let cfg = config.my.virtualisation.libvirtd; in { - options.my.virtualisation.libvirtd = { - enable = mkOption { - default = false; - type = types.bool; - example = true; - }; - }; + options.my.virtualisation.libvirtd.enable = mkEnableOption "libvirtd"; config = mkIf cfg.enable { virtualisation.libvirtd = { enable = true; package = pkgs.libvirt; }; - home-manager.users.moritz.home.packages = with pkgs; [ virt-manager ]; - users.users.moritz.extraGroups = [ "libvirtd" ]; + + users.users.moritz = { + extraGroups = [ "libvirtd" ]; + packages = with pkgs; [ virt-manager ]; + }; }; } diff --git a/overlays/default.nix b/overlays/default.nix index 5f8d1a9..071a899 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -1,7 +1,22 @@ { inputs }: final: prev: { - inherit (inputs.comma.packages."${prev.system}") comma; - nixpkgs-review-checks = inputs.nixpkgs-review-checks.defaultPackage."${prev.system}"; - agenix = inputs.agenix.defaultPackage."${prev.system}"; + logseq-wayland = prev.symlinkJoin { + name = "logseq-wayland"; + paths = [ prev.logseq ]; + nativeBuildInputs = [ prev.makeWrapper ]; + postBuild = '' + wrapProgram $out/bin/logseq \ + --add-flags "--socket=wayland --enable-features=UseOzonePlatform --ozone-platform=wayland" + ''; + }; + + waybar-hyprland = prev.waybar.overrideAttrs (old: { + pname = "${old.pname}-hyprland"; + postPatch = old.postPatch or "" + '' + sed -i 's,zext_workspace_handle_v1_activate(workspace_handle_);,const std::string command = "${final.hyprland}/bin/hyprctl dispatch workspace " + name_;\n\tsystem(command.c_str());,g' src/modules/wlr/workspace_manager.cpp + ''; + mesonFlags = old.mesonFlags or [ ] ++ [ "-Dexperimental=true" ]; + }); + master = import inputs.master { inherit (prev) system; config.allowUnfree = true; diff --git a/secrets/email-desktop.age b/secrets/email-desktop.age deleted file mode 100644 index 3d5245b..0000000 Binary files a/secrets/email-desktop.age and /dev/null differ diff --git a/secrets/email-laptop.age b/secrets/email-laptop.age deleted file mode 100644 index 134853d..0000000 --- a/secrets/email-laptop.age +++ /dev/null @@ -1,15 +0,0 @@ -age-encryption.org/v1 --> ssh-ed25519 CjuqfA 42ZhJgcVV9rxkVmvEj4aCeeVx4Tldtx2L54hS1mZCxE -dqSOKoGxChgMHmiY4SgoJqxH9nSGlLVnmbke2+xZHYA --> ssh-ed25519 QRYDmg yHGmTle30O7BQ7SFG7m5gaZctmwT26LNfJPbocs1WTM -lQZa4yp8R8UZpG+/JGuZ4z4gxlGXColGCs8qlKFyCP4 --> ssh-ed25519 wG6LYg wokwDVXoQaZlpX4qM/2OmSo9lbDFIqqg/dKesIETJBI -0MBgUClVsQksxRCa4WhSvQlzZRl673CZeeP7PVfHtCI --> ssh-ed25519 ZYd7Zg cGYmLN+nSv5NGR+HMbofhtzbmZ/LjftCpcUIbZ5Z+hY -3u9UgW7TDWX+dfuJuIwRxSkwTOLrUw1znEkU9ao5Ltw --> ssh-ed25519 as9VYQ dK/VaOUKsr58sTfiF3qjUPHi3mxfioW5IXkyMmx+xCY -mTF8kUni1pxBrcE+j4mHZx/Zs8D8SgqWjfRkDH66m5k --> Pzw,"-grease R`h7fZ+ 'U[<2@ `Ay6[ -3a6T ---- I5udQOeevThPQ3VGfarWDe+n1y1DnC1vNqd+hU53ENw - ǻ@C wWLous fzb+4 \ No newline at end of file diff --git a/secrets/secrets.nix b/secrets/secrets.nix index 375fd0e..0862e22 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -11,12 +11,11 @@ let all = users ++ hosts; in { + "github.age".publicKeys = all; + "home-vpn-password.age".publicKeys = all; + "home-vpn.age".publicKeys = all; "nordvpn.age".publicKeys = all; "spotifyd.age".publicKeys = all; - "email-desktop.age".publicKeys = all; - "email-laptop.age".publicKeys = all; - "home-vpn.age".publicKeys = all; - "home-vpn-password.age".publicKeys = all; - "github.age".publicKeys = all; + "ssh-home.age".publicKeys = all; "uni-vpn.age".publicKeys = all; } diff --git a/secrets/ssh-home.age b/secrets/ssh-home.age new file mode 100644 index 0000000..0922fb5 --- /dev/null +++ b/secrets/ssh-home.age @@ -0,0 +1,18 @@ +age-encryption.org/v1 +-> ssh-ed25519 CjuqfA VN681gpv9+BTd6SAhmBuXZ4dnLocdkw3sdoK4sNeggY +lnTROi2cjMdOS34HrOBjydsV2o2i31SZTFOE0w1Z4wQ +-> ssh-ed25519 QRYDmg AEFJbJuGMYRpwFJ0ueCUc+jgU6hgpSqyvEjXnzcCPS4 +It+bPRBNuD6y03HyMkr+u+y1dLKXd/Iv6mpWGTa/ATg +-> ssh-ed25519 wG6LYg 9n101tlrOmWcIMQ+Ejw1MauMdXKVPwh0Wpc6Kvys5TY +Mk6Hp8uSpmClPxweTluUnQ7O+PNOyl4aZJJ++2UG/O0 +-> ssh-ed25519 ZYd7Zg bXnk/Ih6IWbodj6xFPJOw515+/L21xEaPgTy6wBBxlo +0cPd3Pq99x3qJAafPjYUv7+XwncmMqTYIouqjoAQG+k +-> ssh-ed25519 as9VYQ lbIvvkszmYr5ZVqtxR8mCS+bCqskk3+0yf8Mo/RtkX0 +IMY1Gqa7AXyAKCKUW8GTWSWaX3DN4Y5KN5b9JFvMrJI +-> M.`tiyM-grease 4bHP!dW +Bt8cOnxP0TP6pMYKg59Z +--- hIrUz6vpXLb1Jhwlc91amUWXEQVM17TQt7zy24nFNeM +Y\)fo`u+u5<;u IJqTS9S"M .[1 ssh-ed25519 CjuqfA RCNX2PCn0Nw3onGVpZKa2rwiX0OzHmwAyT5AYIPf3g4 -02E2bsAAS3FYna5dM+ReGTudrQVxC8T1hoFN7x10IMk --> ssh-ed25519 QRYDmg GSOSIihN5uQaRSTIHaHChqPnCePdtdQtMnD+YVOqSi8 -w8gMVpQh/GPuOeh8Kqlq5hUTwpGNGb+46TN5r7yPvG8 --> ssh-ed25519 wG6LYg g9yPEjf86J1JFigQ4wbcncQwB8vudbchp63648qchBY -jjAhYIacIbMWa+CX4ZIsnFXAS4DPIreCK8QeTgsVZsw --> ssh-ed25519 ZYd7Zg 8WQ39l77S3Hk5h9t0drUo8r1CFCDFNoAsBc8vIEIiT8 -nHvduRxFp+d7bu6n9mLTRTSnv+XfvD1c3xydkspcMZk --> ssh-ed25519 as9VYQ tDd4uU7mzJLeLbVupNeJQGTjY2lrtQA0Q7UREaCfCA8 -2zZslafI8HgoSXm1+tk/OP4jWMsVt7RxVBMS0pwNZf0 --> Uf`/-grease = r3?M -PM4EdUqyhLGuVj+AdzDNJrT70t6iyYGfXizxRCJdZ5gWG3BIPU3e1nVQhe599PYi -3VKQjDSbMvt/Hskxue8u5Q ---- spycnP0LXUKbLdOHOfmdtXoIKb8EL7yBY/zry/5LQ/I -"c'٤l$f!M}r*oaI6c!ModYw)u -M tͺ-_ \ No newline at end of file +-> ssh-ed25519 CjuqfA wsRuh5f7FBwEuH60mY/n5B2rfMXmN9loDRI5sgLAmQY +QRNPLd433Ax/F/NMCGdUUl1dXKvpaqErPYlDRPASkLA +-> ssh-ed25519 QRYDmg 1TN+ZhZMn3a5Ny/rrWZedHIwf69NCNj82RGfDt4VI1s +I+VsfBTJZ7gIIGROjU5hkvRZ/+OkxxPda9qYn28O5dg +-> ssh-ed25519 wG6LYg WhRpXAXmZPYLSmNcqvuLQIkwbOnyP/Fqmt5ZhvNqQx8 +lKyFPSmEgY/BuLKxTOQMrOVf7ScL50WwvghgDQT6gsY +-> ssh-ed25519 ZYd7Zg E4VAC6uIuBdXZ0jciRW/835qIaDWixDig6oGi8KqFlw +15J0vEUwCFiViXP7UlKmAmKfm+d6UgjcA3gHvDzSQwg +-> ssh-ed25519 as9VYQ +sGqCqiBOgMcF90Rt6xKRHm0fqZMXflg6OBRwAhVU2k +rgzztigEJ1WCdI9AuXcjP2VZrPQxiecYRPfg4RdOyFM +-> xA'C-grease s-9 ?tXT 38r l[ +lAYTp6Ot +--- RvWgnW1+4pux4UMOamln/5/xVLsyIgxAZwYOYZJGQo4 +H +I!4HQ uR7~Չ!3\B6 yGN7|v>n+2z'>D \ No newline at end of file