From 9f8684b84877491aaf278d166c52e91bde35867e Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Thu, 26 Sep 2024 22:23:45 -0400 Subject: [PATCH] aaa? --- .git-crypt/.gitattributes | 4 + ...5E4754FE1AEDA15A6D47029AB28AC10ECE533D.gpg | Bin 0 -> 736 bytes .gitattributes | 3 + README.md | 19 + justfile | 21 + nix/etcnixos/common.nix | 203 ++++++++ nix/etcnixos/declarative-nm.nix | 52 ++ nix/etcnixos/flake.lock | 458 ++++++++++++++++++ nix/etcnixos/flake.nix | 78 +++ nix/etcnixos/hardware_desktop.nix | 59 +++ nix/etcnixos/hardware_laptop.nix | 53 ++ nix/etcnixos/networking.nix | 19 + nix/etcnixos/secrets/primary-password.age | Bin 0 -> 544 bytes nix/etcnixos/secrets/secrets.nix | 16 + nix/etcnixos/secrets/secureboot.tar | Bin 0 -> 30742 bytes nix/etcnixos/secrets/wifi-passwords.nix | Bin 0 -> 339 bytes nix/etcnixos/system-mreow.nix | 125 +++++ nix/etcnixos/system-nixos.nix | 148 ++++++ nix/home-manager/flake.lock | 400 +++++++++++++++ nix/home-manager/flake.nix | 103 ++++ nix/home-manager/gui.nix | 163 +++++++ nix/home-manager/no-gui.nix | 197 ++++++++ nix/home-manager/progs/alacritty.nix | 124 +++++ nix/home-manager/progs/borg.nix | 46 ++ nix/home-manager/progs/fish.nix | 65 +++ .../gpt4all-HEAD-disable-settings-err.patch | 19 + .../gpt4all-HEAD-disable-settings-err.patch | 19 + .../gpt4all-HEAD-embeddings-model.patch | 53 ++ nix/home-manager/progs/gpt4all/gpt4all.nix | 124 +++++ nix/home-manager/progs/helix.nix | 288 +++++++++++ nix/home-manager/progs/librewolf.nix | 77 +++ nix/home-manager/progs/niri.nix | 167 +++++++ nix/home-manager/progs/rss.nix | 91 ++++ nix/home-manager/progs/swaylock.nix | 31 ++ nix/home-manager/progs/waybar.nix | 253 ++++++++++ .../secrets/borg-laptop-password.age | 10 + nix/home-manager/secrets/factorio.nix | Bin 0 -> 99 bytes nix/home-manager/secrets/my-gpg.age | Bin 0 -> 2969 bytes nix/home-manager/secrets/secrets.nix | 18 + nix/home-manager/secrets/server-password.age | 9 + nix/home-manager/system-mreow.nix | 183 +++++++ nix/home-manager/system-nixos.nix | 45 ++ 42 files changed, 3743 insertions(+) create mode 100644 .git-crypt/.gitattributes create mode 100644 .git-crypt/keys/default/0/D15E4754FE1AEDA15A6D47029AB28AC10ECE533D.gpg create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 justfile create mode 100644 nix/etcnixos/common.nix create mode 100644 nix/etcnixos/declarative-nm.nix create mode 100644 nix/etcnixos/flake.lock create mode 100644 nix/etcnixos/flake.nix create mode 100644 nix/etcnixos/hardware_desktop.nix create mode 100644 nix/etcnixos/hardware_laptop.nix create mode 100644 nix/etcnixos/networking.nix create mode 100644 nix/etcnixos/secrets/primary-password.age create mode 100644 nix/etcnixos/secrets/secrets.nix create mode 100644 nix/etcnixos/secrets/secureboot.tar create mode 100644 nix/etcnixos/secrets/wifi-passwords.nix create mode 100644 nix/etcnixos/system-mreow.nix create mode 100644 nix/etcnixos/system-nixos.nix create mode 100644 nix/home-manager/flake.lock create mode 100644 nix/home-manager/flake.nix create mode 100644 nix/home-manager/gui.nix create mode 100644 nix/home-manager/no-gui.nix create mode 100644 nix/home-manager/progs/alacritty.nix create mode 100644 nix/home-manager/progs/borg.nix create mode 100644 nix/home-manager/progs/fish.nix create mode 100644 nix/home-manager/progs/gpt4all-HEAD-disable-settings-err.patch create mode 100644 nix/home-manager/progs/gpt4all/gpt4all-HEAD-disable-settings-err.patch create mode 100644 nix/home-manager/progs/gpt4all/gpt4all-HEAD-embeddings-model.patch create mode 100644 nix/home-manager/progs/gpt4all/gpt4all.nix create mode 100644 nix/home-manager/progs/helix.nix create mode 100644 nix/home-manager/progs/librewolf.nix create mode 100644 nix/home-manager/progs/niri.nix create mode 100644 nix/home-manager/progs/rss.nix create mode 100644 nix/home-manager/progs/swaylock.nix create mode 100644 nix/home-manager/progs/waybar.nix create mode 100644 nix/home-manager/secrets/borg-laptop-password.age create mode 100644 nix/home-manager/secrets/factorio.nix create mode 100644 nix/home-manager/secrets/my-gpg.age create mode 100644 nix/home-manager/secrets/secrets.nix create mode 100644 nix/home-manager/secrets/server-password.age create mode 100644 nix/home-manager/system-mreow.nix create mode 100644 nix/home-manager/system-nixos.nix diff --git a/.git-crypt/.gitattributes b/.git-crypt/.gitattributes new file mode 100644 index 0000000..665b10e --- /dev/null +++ b/.git-crypt/.gitattributes @@ -0,0 +1,4 @@ +# Do not edit this file. To specify the files to encrypt, create your own +# .gitattributes file in the directory where your files are. +* !filter !diff +*.gpg binary diff --git a/.git-crypt/keys/default/0/D15E4754FE1AEDA15A6D47029AB28AC10ECE533D.gpg b/.git-crypt/keys/default/0/D15E4754FE1AEDA15A6D47029AB28AC10ECE533D.gpg new file mode 100644 index 0000000000000000000000000000000000000000..5b8cf6f4548731c0b709f46ec196113e6065c58b GIT binary patch literal 736 zcmZo=;$fb(sp}x$xnNsH{{NoO`${KXUpHN9V`t>PCvi*nWgw`m#o%upX!-6^h4*}`T05b^ywhRXxWFyj2+t#J^ZFTAyr_qR&QHzcgY>* zAd!$28ZyScarZ+auRrK$5BpyHIryaY#U)DYdkhk!&T(4tW-xGk=H3^tCLF=MLS;U|I1j%e&KDL*4LQW#EE-KWe8^8qxbGA%5az$k6 z0_~!-_1mB1o<6gov$5>`?ZZctqCd{sQhYe3K=HAxYh!rZUpKu+BJFHjUN5^|q*_ur zU(>6+{O$DpEBR+<@8{aRc)`+)eLG8dMJhE~|3AF$`+h}SRHLOfpZV{IzVqu1XZUlU zSaMDE?cd2UXOcxk;`C;|{_*L6veU=#>xB<`pDsUlulV1bfM*U#R}Szoaxw{IUewYG zQrW7^@FrP^@eb$m`w>r7{&opYJ!W0>=;rxU9!Aya@{>P`Ij{GUG}7=WH^;`C9e3^E`@g|@0ESHUF~{w(j=2DpJteO>>>>>> pulseaudio + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + # jack.enable = true; + }; + + # Define my user account (the rest of the configuration if found in `~/.config/home-manager/...`) + users.users.${username} = { + isNormalUser = true; + extraGroups = [ + "networkmanager" + "wheel" + "video" + "camera" + ]; + hashedPasswordFile = config.age.secrets.primary-password.path; + }; + + services.gvfs.enable = true; + programs.gphoto2.enable = true; + + # Enable thermal data + services.thermald.enable = true; + + services.pcscd.enable = true; + programs.gnupg.agent = { + enable = true; + pinentryPackage = pkgs.pinentry-curses; + enableSSHSupport = false; + }; + + #System packages + environment.systemPackages = with pkgs; [ + mullvad-vpn + + #secureboot ctl + sbctl + + dmidecode + + (inputs.agenix.packages.${pkgs.system}.default.override { ageBin = "${pkgs.rage}/bin/rage"; }) + + qemu_full + + git-agecrypt + ]; + + #wayland with electron/chromium applications + environment.sessionVariables.NIXOS_OZONE_WL = "1"; + + system.stateVersion = "24.11"; +} diff --git a/nix/etcnixos/declarative-nm.nix b/nix/etcnixos/declarative-nm.nix new file mode 100644 index 0000000..7fea1a0 --- /dev/null +++ b/nix/etcnixos/declarative-nm.nix @@ -0,0 +1,52 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; +# from: https://discourse.nixos.org/t/imperative-declarative-wifi-networks-with-wpa-supplicant/12394/6 +let + cfg = config.networking.networkmanager; + + getFileName = stringAsChars (x: if x == " " then "-" else x); + + createWifi = ssid: opt: { + name = "NetworkManager/system-connections/${getFileName ssid}.nmconnection"; + value = { + mode = "0400"; + source = pkgs.writeText "${ssid}.nmconnection" '' + [connection] + id=${ssid} + type=wifi + + [wifi] + ssid=${ssid} + + [wifi-security] + ${optionalString (opt.psk != null) '' + key-mgmt=wpa-psk + psk=${opt.psk}''} + ''; + }; + }; + + keyFiles = mapAttrs' createWifi config.networking.wireless.networks; +in +{ + config = mkIf cfg.enable { + environment.etc = keyFiles; + + systemd.services.NetworkManager-predefined-connections = { + restartTriggers = mapAttrsToList (name: value: value.source) keyFiles; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.coreutils}/bin/true"; + ExecReload = "${pkgs.networkmanager}/bin/nmcli connection reload"; + }; + reloadIfChanged = true; + wantedBy = [ "multi-user.target" ]; + }; + }; +} diff --git a/nix/etcnixos/flake.lock b/nix/etcnixos/flake.lock new file mode 100644 index 0000000..c371580 --- /dev/null +++ b/nix/etcnixos/flake.lock @@ -0,0 +1,458 @@ +{ + "nodes": { + "agenix": { + "inputs": { + "darwin": "darwin", + "home-manager": "home-manager", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1723293904, + "narHash": "sha256-b+uqzj+Wa6xgMS9aNbX4I+sXeb5biPDi39VgvSFqFvU=", + "owner": "ryantm", + "repo": "agenix", + "rev": "f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41", + "type": "github" + }, + "original": { + "owner": "ryantm", + "repo": "agenix", + "type": "github" + } + }, + "alvr": { + "locked": { + "lastModified": 1727023213, + "narHash": "sha256-KPghRPcTbqCMktw9ahrtiq7a/seajAyLkEI2GS1x+sg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "7c2572e5cf4329ad9fa50d33015aa7be394b4026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "pull/308097/head", + "repo": "nixpkgs", + "type": "github" + } + }, + "chaotic": { + "inputs": { + "fenix": "fenix", + "flake-schemas": "flake-schemas", + "home-manager": "home-manager_2", + "jovian": "jovian", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1727292492, + "narHash": "sha256-vKkVoZJB35xOb1kmAH6i74ziuP0ZGKnzM6+NVi/OhD8=", + "owner": "chaotic-cx", + "repo": "nyx", + "rev": "9b30ea4a39c8c5a2b6a6519f85da38f72b7f29f0", + "type": "github" + }, + "original": { + "owner": "chaotic-cx", + "ref": "nyxpkgs-unstable", + "repo": "nyx", + "type": "github" + } + }, + "crane": { + "inputs": { + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1721842668, + "narHash": "sha256-k3oiD2z2AAwBFLa4+xfU+7G5fisRXfkvrMTCJrjZzXo=", + "owner": "ipetkov", + "repo": "crane", + "rev": "529c1a0b1f29f0d78fa3086b8f6a134c71ef3aaf", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "darwin": { + "inputs": { + "nixpkgs": [ + "agenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1700795494, + "narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d", + "type": "github" + }, + "original": { + "owner": "lnl7", + "ref": "master", + "repo": "nix-darwin", + "type": "github" + } + }, + "fenix": { + "inputs": { + "nixpkgs": [ + "chaotic", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1726900127, + "narHash": "sha256-v3r7yJY8YE4HAzD5DXOxLkzj8YZKQ0xuccp9yppGW1U=", + "owner": "nix-community", + "repo": "fenix", + "rev": "18eefba7fd0bf03e115785948758a44125a9fd68", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1719994518, + "narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-schemas": { + "locked": { + "lastModified": 1721999734, + "narHash": "sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw=", + "rev": "0a5c42297d870156d9c57d8f99e476b738dcd982", + "revCount": 75, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%3D0.1.5.tar.gz" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "lanzaboote", + "pre-commit-hooks-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "agenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1703113217, + "narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "chaotic", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726902823, + "narHash": "sha256-Gkc7pwTVLKj4HSvRt8tXNvosl8RS9hrBAEhOjAE0Tt4=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "14929f7089268481d86b83ed31ffd88713dcd415", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "jovian": { + "inputs": { + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "chaotic", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726902390, + "narHash": "sha256-ESAD6AkxsQdV/j5ZBcO4Vg94J7Xd0nfpiEZpJtwSEhg=", + "owner": "Jovian-Experiments", + "repo": "Jovian-NixOS", + "rev": "faf4c746c068dd8e41b1fa5f18beeabd34d4064c", + "type": "github" + }, + "original": { + "owner": "Jovian-Experiments", + "repo": "Jovian-NixOS", + "type": "github" + } + }, + "lanzaboote": { + "inputs": { + "crane": "crane", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "nixpkgs": [ + "nixpkgs" + ], + "pre-commit-hooks-nix": "pre-commit-hooks-nix", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1725379389, + "narHash": "sha256-qS1H/5/20ewJIXmf8FN2A5KTOKKU9elWvCPwdBi1P/U=", + "owner": "nix-community", + "repo": "lanzaboote", + "rev": "e7bd94e0b5ff3c1e686f2101004ebf4fcea9d871", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "lanzaboote", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "chaotic", + "jovian", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1690328911, + "narHash": "sha256-fxtExYk+aGf2YbjeWQ8JY9/n9dwuEt+ma1eUFzF8Jeo=", + "owner": "zhaofengli", + "repo": "nix-github-actions", + "rev": "96df4a39c52f53cb7098b923224d8ce941b64747", + "type": "github" + }, + "original": { + "owner": "zhaofengli", + "ref": "matrix-name", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nixos-hardware": { + "locked": { + "lastModified": 1727040444, + "narHash": "sha256-19FNN5QT9Z11ZUMfftRplyNN+2PgcHKb3oq8KMW/hDA=", + "owner": "NixOS", + "repo": "nixos-hardware", + "rev": "d0cb432a9d28218df11cbd77d984a2a46caeb5ac", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixos-hardware", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1727122398, + "narHash": "sha256-o8VBeCWHBxGd4kVMceIayf5GApqTavJbTa44Xcg5Rrk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "30439d93eb8b19861ccbe3e581abf97bdc91b093", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks-nix": { + "inputs": { + "flake-compat": [ + "lanzaboote", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1721042469, + "narHash": "sha256-6FPUl7HVtvRHCCBQne7Ylp4p+dpP3P/OYuzjztZ4s70=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "f451c19376071a90d8c58ab1a953c6e9840527fd", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "agenix": "agenix", + "alvr": "alvr", + "chaotic": "chaotic", + "lanzaboote": "lanzaboote", + "nixos-hardware": "nixos-hardware", + "nixpkgs": "nixpkgs" + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1726443025, + "narHash": "sha256-nCmG4NJpwI0IoIlYlwtDwVA49yuspA2E6OhfCOmiArQ=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "94b526fc86eaa0e90fb4d54a5ba6313aa1e9b269", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1722219664, + "narHash": "sha256-xMOJ+HW4yj6e69PvieohUJ3dBSdgCfvI0nnCEe6/yVc=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "a6fbda5d9a14fb5f7c69b8489d24afeb349c7bb4", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/etcnixos/flake.nix b/nix/etcnixos/flake.nix new file mode 100644 index 0000000..5a96564 --- /dev/null +++ b/nix/etcnixos/flake.nix @@ -0,0 +1,78 @@ +{ + description = "A simple NixOS flake"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + lanzaboote = { + url = "github:nix-community/lanzaboote"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + nixos-hardware.url = "github:NixOS/nixos-hardware/master"; + + alvr.url = "github:NixOS/nixpkgs/pull/308097/head"; + + chaotic = { + url = "github:chaotic-cx/nyx/nyxpkgs-unstable"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + agenix = { + url = "github:ryantm/agenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + { + self, + nixpkgs, + lanzaboote, + nixos-hardware, + chaotic, + agenix, + ... + }@inputs: + let + username = "primary"; + hostname = nixpkgs.lib.strings.removeSuffix "\n" (builtins.readFile /etc/hostname); + system = "x86_64-linux"; + + # pkgs = import nixpkgs { + # config.replaceStdenv = { pkgs }: pkgs.clangStdenv; + # }; + pkgs = import nixpkgs { + config.allowUnfreePredicate = + pkg: + builtins.elem (nixpkgs.lib.getName pkg) [ + "steam" + "steam-original" + "steam-run" + ]; + }; + in + { + nixosConfigurations.${hostname} = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs username hostname; + }; + inherit pkgs; + modules = + [ + ./system-${hostname}.nix + chaotic.nixosModules.default + agenix.nixosModules.default + + ] + ++ ( + if ("${hostname}" == "mreow") then # laptop + [ + nixos-hardware.nixosModules.framework-12th-gen-intel + lanzaboote.nixosModules.lanzaboote + ] + else + [ ] + ); + }; + }; +} diff --git a/nix/etcnixos/hardware_desktop.nix b/nix/etcnixos/hardware_desktop.nix new file mode 100644 index 0000000..3f45ceb --- /dev/null +++ b/nix/etcnixos/hardware_desktop.nix @@ -0,0 +1,59 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + pkgs, + modulesPath, + ... +}: + +{ + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + + boot.initrd.availableKernelModules = [ + "nvme" + "xhci_pci" + "ahci" + "usb_storage" + "usbhid" + "sd_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/ff51be5a-b87b-4e6a-9c1d-796ceeaca153"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/3D37-E610"; + fsType = "vfat"; + options = [ + "fmask=0022" + "dmask=0022" + ]; + }; + + fileSystems."/media/steam" = { + device = "/dev/disk/by-uuid/df865fc2-6b26-4689-809b-1615f860507e"; + fsType = "btrfs"; + options = [ "nofail" ]; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp5s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/nix/etcnixos/hardware_laptop.nix b/nix/etcnixos/hardware_laptop.nix new file mode 100644 index 0000000..17a48a2 --- /dev/null +++ b/nix/etcnixos/hardware_laptop.nix @@ -0,0 +1,53 @@ +{ + config, + lib, + pkgs, + modulesPath, + ... +}: +{ + imports = [ + #if this is removed, then niri doesn't start, TODO! look into wtf this does + (modulesPath + "/installer/scan/not-detected.nix") + ]; + boot.initrd.availableKernelModules = [ + "xhci_pci" + "thunderbolt" + "nvme" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/acbd96e3-e7c7-442d-82cc-ce2913a9e90c"; + fsType = "btrfs"; + options = [ + "subvol=@" + "compress=zstd" + "autodefrag" + "noatime" + "space_cache=v2" + "discard" + ]; + }; + + boot.initrd.luks.devices."luks-0f481d5f-528c-4838-bd8a-d2780b4ba234".device = "/dev/disk/by-uuid/0f481d5f-528c-4838-bd8a-d2780b4ba234"; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/4D19-520E"; + fsType = "vfat"; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp166s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/nix/etcnixos/networking.nix b/nix/etcnixos/networking.nix new file mode 100644 index 0000000..f660e51 --- /dev/null +++ b/nix/etcnixos/networking.nix @@ -0,0 +1,19 @@ +{ hostname, ... }: +{ + hostName = "${hostname}"; + + hostId = "cfe0ff46"; + + networkmanager = { + enable = true; + insertNameservers = [ + "1.1.1.1" + "8.8.8.8" + ]; + wifi = { + scanRandMacAddress = true; + }; + }; + + wireless.networks = import ./secrets/wifi-passwords.nix; +} diff --git a/nix/etcnixos/secrets/primary-password.age b/nix/etcnixos/secrets/primary-password.age new file mode 100644 index 0000000000000000000000000000000000000000..ca3ac41dc9112abfb2e0b195d029f728beaeedd8 GIT binary patch literal 544 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCUl$_b533{>!NEwJ>} z56MWcD9F#$chB>52?`6(i7fX@OG!#J3Dd7|HBJgn$t;X2_v9)KtI8~o$O;e5@Cgeu zaPc)yu`KrR^Got7^^bHmitupvEzT^-t|&{d$Vay=#lyubJy5~J)6?9&(#**)(yzoc zJGUUhI5EV?wJgc9B*`VqA}z`?)6c*#-7_<*%7UxXr82w3HLyIxH$2HdEvvM`v^Y6Z z+qAGSGt$M|B`hM(&od-4HQyk+I2&Y}uWou#YGQG!LWYGxL|{acLa0@;Teho$fsds& zSFTT#X|khhs<&x!q@PoGW=3XUka1N&P?)K?epOypNRV?{a9*iPWUhySS7kwBa7vJK zSY>&IfsvcJi;0oDA6L0)K#EyNNnmn#R+xX5XOebERYqB)fv2&FkA-%HtD|{wet~m& zg;`cnzN1;HVWM9km#(g^LWy&TWqv?zWpPQ4VNOVKdWLDPnO9&*VMRu|sX>l*M7l{( zXr)(>fw@OEmr(FopUIX?$LlK+94`5FdF{N&*P4~u&!7^?I@SBB7k}pgvGb9iF1^$GetS7e`pz*#M8z;={OLTpR5m)q#VT|9Q@1a3;{8`YTpP1=2gmA(dMg;Z Ua!SKnxmb&~bymkM=vuD>086*N@Bjb+ literal 0 HcmV?d00001 diff --git a/nix/etcnixos/secrets/secrets.nix b/nix/etcnixos/secrets/secrets.nix new file mode 100644 index 0000000..2aa18e7 --- /dev/null +++ b/nix/etcnixos/secrets/secrets.nix @@ -0,0 +1,16 @@ +let + laptop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4jL6gYOunUlUtPvGdML0cpbKSsPNqQ1jit4E7U1RyH"; + desktop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJjT5QZ3zRDb+V6Em20EYpSEgPW5e/U+06uQGJdraxi"; +in +(builtins.listToAttrs ( + map + (f: { + f.publicKeys = [ + laptop + desktop + ]; + }) + [ + "primary-password.age" + ] +)) diff --git a/nix/etcnixos/secrets/secureboot.tar b/nix/etcnixos/secrets/secureboot.tar new file mode 100644 index 0000000000000000000000000000000000000000..023a0a5ef1a3c05f62473d2f320ac835b9d29ee9 GIT binary patch literal 30742 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 |i=Hz~5bf~#c&X}( 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 main + extraConfig = { + init = { + defaultBranch = "main"; + }; + push.autoSetupRemote = true; + }; + + #gpg signing keys + signing = { + key = "9AB28AC10ECE533D"; + signByDefault = true; + }; + }; + + age.secrets.serverpass = { + file = ./secrets/server-password.age; + path = "${homeDirectory}/.secrets/serverpass"; + }; + + age.secrets.gnupg = { + file = ./secrets/my-gpg.age; + path = "${homeDirectory}/.secrets/my-gpg.asc"; + }; + + home.activation.extractGnuPG = '' + ${pkgs.gnupg}/bin/gpg --import ${config.age.secrets.gnupg.path} + ''; + + #fish shell! + programs.fish = import ./progs/fish.nix { inherit pkgs; }; + + #text editor + programs.helix = import ./progs/helix.nix { inherit pkgs; }; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; +} diff --git a/nix/home-manager/progs/alacritty.nix b/nix/home-manager/progs/alacritty.nix new file mode 100644 index 0000000..50cadaf --- /dev/null +++ b/nix/home-manager/progs/alacritty.nix @@ -0,0 +1,124 @@ +{ pkgs }: +{ + #use the fish shell + shell.program = "${pkgs.fish}/bin/fish"; + + #some programs can't handle alacritty + env.TERM = "xterm-256color"; + + window = { + #using a window manager, no decorations needed + decorations = "none"; + + #semi-transparent + opacity = 0.95; + + #padding between the content of the terminal and the edge + padding = { + x = 10; + y = 10; + }; + + dimensions = { + columns = 80; + lines = 40; + }; + }; + + scrolling = { + history = 1000; + multiplier = 3; + }; + + font = + let + baseFont = { + family = "JetBrains Mono Nerd Font"; + style = "Regular"; + }; + in + { + size = 12; + + normal = baseFont; + + bold = baseFont // { + style = "Bold"; + }; + + italic = baseFont // { + style = "Italic"; + }; + + offset.y = 0; + glyph_offset.y = 0; + }; + + #color scheme + colors = + let + normal = { + black = "0x1b1e28"; + red = "0xd0679d"; + green = "0x5de4c7"; + yellow = "0xfffac2"; + blue = "#435c89"; + magenta = "0xfcc5e9"; + cyan = "0xadd7ff"; + white = "0xffffff"; + }; + + bright = { + black = "0xa6accd"; + red = normal.red; + green = normal.green; + yellow = normal.yellow; + blue = normal.cyan; + magenta = "0xfae4fc"; + cyan = "0x89ddff"; + white = normal.white; + }; + in + { + inherit normal bright; + primary = { + background = "0x131621"; + foreground = bright.black; + }; + + cursor = { + text = "CellBackground"; + cursor = "CellForeground"; + }; + + search = + let + foreground = normal.black; + background = normal.cyan; + in + { + matches = { + inherit foreground background; + }; + + focused_match = { + inherit foreground background; + }; + }; + + selection = { + text = "CellForeground"; + background = "0x303340"; + }; + + vi_mode_cursor = { + text = "CellBackground"; + cursor = "CellForeground"; + }; + }; + + cursor = { + style = "Underline"; + vi_mode_style = "Underline"; + }; +} diff --git a/nix/home-manager/progs/borg.nix b/nix/home-manager/progs/borg.nix new file mode 100644 index 0000000..b928cd3 --- /dev/null +++ b/nix/home-manager/progs/borg.nix @@ -0,0 +1,46 @@ +{ homeDirectory, borgPasswordFile }: +{ + + home = { + location = { + sourceDirectories = + # stuff in my home directory: + ( + map (f: "${homeDirectory}/${f}") [ + ".zen" + ".local/share/fish" + ".gnupg" + ".config/Signal" + ".wallpaper.png" + ".ssh" + + "dotfiles" + "Documents" + "projects" + "Pictures" + "school" + "justfile" + ] + ); + + excludeHomeManagerSymlinks = true; + repositories = [ "ssh://server-public/tank/bak/laptop" ]; + + extraConfig = { + compression = "zstd"; + }; + }; + + retention = { + keepHourly = 48; + keepDaily = 30; + keepWeekly = 26; + keepMonthly = 24; + keepYearly = 10; + }; + + storage = { + encryptionPasscommand = "cat ${borgPasswordFile}"; + }; + }; +} diff --git a/nix/home-manager/progs/fish.nix b/nix/home-manager/progs/fish.nix new file mode 100644 index 0000000..25e6ac0 --- /dev/null +++ b/nix/home-manager/progs/fish.nix @@ -0,0 +1,65 @@ +{ pkgs }: +let + eza = "${pkgs.eza}/bin/eza --color=always --group-directories-first"; + cargo = "${pkgs.cargo}/bin/cargo"; + coreutil = "${pkgs.coreutils}/bin"; +in +{ + enable = true; + + interactiveShellInit = '' + #disable greeting + set fish_greeting + + #fixes gnupg password entry + export GPG_TTY=(${coreutil}/tty) + + #pfetch on shell start (disable pkgs because of execution time) + PF_INFO="ascii title os host kernel uptime memory editor wm" ${pkgs.pfetch-rs}/bin/pfetch + ''; + + shellAliases = { + c = cargo; + cr = "${cargo} run"; + cb = "${cargo} build"; + + # I hate the red background + run0 = "run0 --background=\"\""; + + # from DistroTube's dot files: Changing "ls" to "eza" + ls = "${eza} -al"; + la = "${eza} -a"; + ll = "${eza} -l"; + lt = "${eza} -aT"; + + # gets the largest files in a git repo's history + "git-size" = '' + ${pkgs.git}/bin/git rev-list --objects --all | + ${pkgs.git}/bin/git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | + ${pkgs.gnused}/bin/sed -n 's/^blob //p' | + ${coreutil}/sort --numeric-sort --key=2 | + ${coreutil}/cut -c 1-12,41- | + ${coreutil}/numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest''; + + #aliases for (I think) macos commands + pbcopy = "${pkgs.wl-clipboard}/bin/wl-copy"; + pbpaste = "${pkgs.wl-clipboard}/bin/wl-paste"; + }; + + shellInit = '' + fish_add_path ~/.local/bin + fish_add_path ~/.cargo/bin + set hydro_color_pwd 62A + set hydro_color_error red + set hydro_color_duration yellow + set hydro_color_prompt green + set hydro_color_git blue + ''; + + plugins = [ + { + name = "hydro"; + src = pkgs.fishPlugins.hydro.src; + } + ]; +} diff --git a/nix/home-manager/progs/gpt4all-HEAD-disable-settings-err.patch b/nix/home-manager/progs/gpt4all-HEAD-disable-settings-err.patch new file mode 100644 index 0000000..a6911ab --- /dev/null +++ b/nix/home-manager/progs/gpt4all-HEAD-disable-settings-err.patch @@ -0,0 +1,19 @@ +diff --git a/main.qml b/main.qml +index 1e685385..7c747eba 100644 +--- a/main.qml ++++ b/main.qml +@@ -72,12 +72,14 @@ Window { + return; + } + ++ /* + // check if we have access to settings and if not show an error + if (!hasShownSettingsAccess && !LLM.hasSettingsAccess()) { + errorSettingsAccess.open(); + hasShownSettingsAccess = true; + return; + } ++ */ + + // check for first time start of this version + if (!hasCheckedFirstStart) { diff --git a/nix/home-manager/progs/gpt4all/gpt4all-HEAD-disable-settings-err.patch b/nix/home-manager/progs/gpt4all/gpt4all-HEAD-disable-settings-err.patch new file mode 100644 index 0000000..a6911ab --- /dev/null +++ b/nix/home-manager/progs/gpt4all/gpt4all-HEAD-disable-settings-err.patch @@ -0,0 +1,19 @@ +diff --git a/main.qml b/main.qml +index 1e685385..7c747eba 100644 +--- a/main.qml ++++ b/main.qml +@@ -72,12 +72,14 @@ Window { + return; + } + ++ /* + // check if we have access to settings and if not show an error + if (!hasShownSettingsAccess && !LLM.hasSettingsAccess()) { + errorSettingsAccess.open(); + hasShownSettingsAccess = true; + return; + } ++ */ + + // check for first time start of this version + if (!hasCheckedFirstStart) { diff --git a/nix/home-manager/progs/gpt4all/gpt4all-HEAD-embeddings-model.patch b/nix/home-manager/progs/gpt4all/gpt4all-HEAD-embeddings-model.patch new file mode 100644 index 0000000..fb15635 --- /dev/null +++ b/nix/home-manager/progs/gpt4all/gpt4all-HEAD-embeddings-model.patch @@ -0,0 +1,53 @@ +commit 425b33877c819dd88f3692aae37452c767371f6b +Author: Simon Gardling +Date: Thu Sep 19 10:00:39 2024 -0400 + + use locally downloaded embeddings + +diff --git a/gpt4all-chat/CMakeLists.txt b/gpt4all-chat/CMakeLists.txt +index 900307ae..802fc31a 100644 +--- a//CMakeLists.txt ++++ b/CMakeLists.txt +@@ -120,6 +120,7 @@ elseif (APPLE) + endif() + + # Embedding model ++#[[ + set(LOCAL_EMBEDDING_MODEL "nomic-embed-text-v1.5.f16.gguf") + set(LOCAL_EMBEDDING_MODEL_MD5 "a5401e7f7e46ed9fcaed5b60a281d547") + set(LOCAL_EMBEDDING_MODEL_PATH "${CMAKE_BINARY_DIR}/resources/${LOCAL_EMBEDDING_MODEL}") +@@ -134,6 +135,7 @@ message(STATUS "Embedding model downloaded to ${LOCAL_EMBEDDING_MODEL_PATH}") + if (APPLE) + list(APPEND CHAT_EXE_RESOURCES "${LOCAL_EMBEDDING_MODEL_PATH}") + endif() ++]] + + set(QAPPLICATION_CLASS QGuiApplication) + add_subdirectory(deps/SingleApplication) +@@ -348,11 +350,13 @@ if (LLMODEL_CUDA) + endif() + endif() + ++#[[ + if (NOT APPLE) + install(FILES "${LOCAL_EMBEDDING_MODEL_PATH}" + DESTINATION resources + COMPONENT ${COMPONENT_NAME_MAIN}) + endif() ++]] + + set(CPACK_GENERATOR "IFW") + set(CPACK_VERBATIM_VARIABLES YES) +diff --git a/gpt4all-chat/src/embllm.cpp b/gpt4all-chat/src/embllm.cpp +index 81b1e9e1..e3266cc7 100644 +--- a/src/embllm.cpp ++++ b/src/embllm.cpp +@@ -84,7 +84,7 @@ bool EmbeddingLLMWorker::loadModel() + + QString filePath = embPathFmt.arg(QCoreApplication::applicationDirPath(), LOCAL_EMBEDDING_MODEL); + if (!QFileInfo::exists(filePath)) { +- qWarning() << "embllm WARNING: Local embedding model not found"; ++ qWarning() << "embllm WARNING: Local embedding model not found: " << filePath; + return false; + } + diff --git a/nix/home-manager/progs/gpt4all/gpt4all.nix b/nix/home-manager/progs/gpt4all/gpt4all.nix new file mode 100644 index 0000000..ef222f8 --- /dev/null +++ b/nix/home-manager/progs/gpt4all/gpt4all.nix @@ -0,0 +1,124 @@ +{ pkgs, lib, ... }: +let + models = [ + { + name = "Qwen2.5-14B-Instruct-Q4_K_S.gguf"; + context_length = "32768"; + gen_length = "8192"; + source = pkgs.fetchurl { + url = "https://huggingface.co/bartowski/Qwen2.5-14B-Instruct-GGUF/resolve/main/Qwen2.5-14B-Instruct-Q4_K_S.gguf?download=true"; + sha256 = "E1CmWUhMMbTXEjIRczzA3rSrVuR8qOL8BLagw7LiyZk="; + }; + } + { + name = "Qwen2.5-7B-Instruct-Q6_K_L.gguf"; + context_length = "32768"; + gen_length = "8192"; + source = pkgs.fetchurl { + url = "https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF/resolve/main/Qwen2.5-7B-Instruct-Q6_K_L.gguf?download=true"; + sha256 = "thEXN06T/UVGfzdB83jlgpG7kuTzZtz1ZUAdupAnErM="; + }; + } + ]; + + # stolen from: https://stackoverflow.com/a/42398526 + optimizeWithFlags = + pkg: flags: + pkgs.lib.overrideDerivation pkg ( + old: + let + newflags = pkgs.lib.foldl' (acc: x: "${acc} ${x}") "" flags; + oldflags = if (pkgs.lib.hasAttr "NIX_CFLAGS_COMPILE" old) then "${old.NIX_CFLAGS_COMPILE}" else ""; + in + { + NIX_CFLAGS_COMPILE = "${oldflags} ${newflags}"; + stdenv = pkgs.clangStdenv; + } + ); + + model_files = builtins.listToAttrs ( + map (f: { + name = ".local/share/nomic.ai/GPT4All/${f.name}"; + value = { + source = f.source; + }; + }) models + ); + + gpt4all_package = ( + optimizeWithFlags + (pkgs.gpt4all.overrideAttrs (old: { + # https://github.com/NixOS/nixpkgs/pull/344001 3.2.1 -> 3.3.0 + version = "3.3.0"; + src = pkgs.fetchFromGitHub { + fetchSubmodules = true; + owner = "nomic-ai"; + repo = "gpt4all"; + rev = "HEAD"; + sha256 = "RDYf+VaI5pl46Cd04ADvvi4ygNfYa4fY9rTv9Ui3qUk="; + }; + + patches = [ + ./gpt4all-HEAD-embeddings-model.patch + ./gpt4all-HEAD-disable-settings-err.patch + ]; + })) + # compile flags + [ + "-Ofast" + "-march=native" + "-mtune=native" + "-fno-protect-parens" + "-fno-finite-math-only" # https://github.com/ggerganov/llama.cpp/pull/7154#issuecomment-2143844461 + ] + ); + +in +{ + home.packages = [ + gpt4all_package + ]; + + home.file = lib.recursiveUpdate { + ".config/nomic.ai/GPT4All.ini".text = + let + system_prompt = "You are an expert AI assistant who is thoughtful and works step-by-step from first principles derive an answer to the user's prompt. For each step, provide a title that describes what you're doing in that step, along with the content. Decide if you need another step or if you're ready to provide your answer to the user, make sure to exhaust ALL POSSIBILITIES before providing a response to the user. While your reasoning is not shown to the user, it is under high levels of scrutiny to ensure high-quality reasoning. WHEN YOU DETERMINE THAT YOU ARE READY TO GIVE A FINAL ANSWER TO THE USER GIVEN YOUR REASONING AND STEP-BY-STEP WORK. ONLY TEXT WRITTEN AFTER A SECTION NAMED \"Final Answer\" WILL BE SHOWN TO THE USER. ASSUME THAT NO REASONING STEPS ARE SHOWN TO THE USER. DO NOT THINK THAT THE USER CAN SEE YOUR INTERNAL REASONING STEPS. + USE AS MANY REASONING STEPS AS POSSIBLE. AT LEAST 3. BE AWARE OF YOUR LIMITATIONS AS AN LLM AND WHAT YOU CAN AND CANNOT DO. EXPLORE ALTERNATE ANSWERS AND CONSIDER THAT YOUR ANSWER MAY BE WRONG. IDENTIFY POSSIBLE ERRORS IN YOUR REASONING AND WHERE SUCH ERRORS MAY BE. FULLY TEST ALL OTHER POSSIBILITIES. YOU CAN BE WRONG. WHEN YOU SAY YOU ARE RE-EXAMINING, ACTUALLY RE-EXAMINE, AND USE ANOTHER APPROACH TO DO SO. DO NOT JUST SAY YOU ARE RE-EXAMINING. SHOW ALL YOUR WORK. USE AT LEAST 3 METHODS TO DERIVE THE ANSWER. USE BEST PRACTICES. WORK FROM FIRST PRINCIPLES TO CREATE YOUR ANSWER."; + in + '' + [General] + chatTheme=Dark + height=940 + suggestionMode=Off + threadCount=8 + uniqueId=7096f2d2-448d-4272-a132-d37e77f8a781 + userDefaultModel=${(builtins.elemAt models 0).name} + width=1472 + x=0 + y=0 + + [download] + lastVersionStarted=${gpt4all_package.version} + '' + + (lib.concatStrings ( + map (model: '' + [model-${model.name}] + contextLength=${model.context_length} + filename=${model.name} + maxLength=${model.gen_length} + promptBatchSize=256 + promptTemplate=<|im_start|>user\n%1<|im_end|>\n<|im_start|>assistant\n + systemPrompt="<|im_start|>system\n${ + # replace newlines with the string "\n" for gpt4all to properly parse + builtins.replaceStrings [ "\n" ] [ "\\n" ] system_prompt + }<|im_end|> + \n" + '') models + )) + + '' + [network] + isActive=true + usageStatsActive=true + ''; + } model_files; +} diff --git a/nix/home-manager/progs/helix.nix b/nix/home-manager/progs/helix.nix new file mode 100644 index 0000000..76f4a5e --- /dev/null +++ b/nix/home-manager/progs/helix.nix @@ -0,0 +1,288 @@ +{ pkgs }: +{ + enable = true; + package = pkgs.helix; + settings = { + theme = "my_theme"; + editor = { + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "underline"; + }; + + file-picker = { + hidden = false; + }; + + #wrapping!! + soft-wrap.enable = true; + }; + }; + + languages = { + language = [ + { + name = "rust"; + auto-format = true; + } + ]; + }; + + themes = { + #modified fleet_dark theme + my_theme = + let + white = "#ffffff"; + gray-120 = "#d1d1d1"; + gray-110 = "#c2c2c2"; + gray-100 = "#a0a0a0"; + gray-90 = "#898989"; + gray-80 = "#767676"; + gray-70 = "#5d5d5d"; + gray-60 = "#484848"; + gray-50 = "#383838"; + gray-40 = "#333333"; + gray-30 = "#2d2d2d"; + gray-20 = "#292929"; + gray-15 = "#1F1F1F"; + gray-10 = "#181818"; + black = "#000000"; + blue-110 = "#6daaf7"; + blue-100 = "#4d9bf8"; + blue-90 = "#3691f9"; + blue-80 = "#1a85f6"; + blue-70 = "#0273eb"; + blue-60 = "#0c6ddd"; + blue-50 = "#195eb5"; + blue-40 = "#194176"; + blue-30 = "#163764"; + blue-20 = "#132c4f"; + blue-10 = "#0b1b32"; + red-80 = "#ec7388"; + red-70 = "#ea4b67"; + red-60 = "#d93953"; + red-50 = "#ce364d"; + red-40 = "#c03248"; + red-30 = "#a72a3f"; + red-20 = "#761b2d"; + red-10 = "#390813"; + green-50 = "#4ca988"; + green-40 = "#3ea17f"; + green-30 = "#028764"; + green-20 = "#134939"; + green-10 = "#081f19"; + yellow-60 = "#f8ab17"; + yellow-50 = "#e1971b"; + yellow-40 = "#b5791f"; + yellow-30 = "#7c511a"; + yellow-20 = "#5a3a14"; + yellow-10 = "#281806"; + purple-20 = "#c07bf3"; + purple-10 = "#b35def"; + + blue = "#87C3FF"; + blue-light = "#ADD1DE"; + coral = "#CC7C8A"; + cyan = "#82D2CE"; + cyan-dark = "#779E9E"; + lime = "#A8CC7C"; + orange = "#E09B70"; + pink = "#E394DC"; + violet = "#AF9CFF"; + yellow = "#EBC88D"; + in + { + "attribute" = lime; + "type" = blue; + "type.return" = blue-light; + "type.parameter" = blue-light; + "constructor" = yellow; + "constant" = violet; + "constant.builtin.boolean" = cyan; + "constant.character" = yellow; + "constant.character.escape" = cyan; + "constant.numeric" = yellow; + "string" = pink; + "string.regexp" = cyan; + "string.special" = { + fg = yellow; + modifiers = [ "underlined" ]; + }; # .path / .url / .symbol + + "comment" = gray-90; # .line + # "comment.block" = {} # .documentation + "variable" = gray-120; # .builtin + "variable.builtin" = { + fg = coral; + }; + # "variable.other" = {} # .member + "variable.other.member" = violet; + "label" = yellow; + "keyword" = cyan; # .operator / .directive / .function + "function" = yellow; + "function.declaration" = "#EFEFEF"; + "function.macro" = lime; + "function.builtin" = lime; + "function.special" = lime; + #"function.declaration.method" = { fg = "lightest", modifiers = ["bold"] } #depends on #4892 + "tag" = blue; + "special" = lime; + "namespace" = blue; + + # used in theming + # "markup" = {} # .normal / .quote / .raw + # "markup.normal" = {} # .completion / .hover + "markup.bold" = { + modifiers = [ "bold" ]; + }; + "markup.italic" = { + modifiers = [ "italic" ]; + }; + "markup.strikethrough" = { + modifiers = [ "crossed_out" ]; + }; + "markup.heading" = { + fg = cyan; + modifiers = [ "bold" ]; + }; # .marker / .1 / .2 / .3 / .4 / .5 / .6 + "markup.list" = pink; # .unnumbered / .numbered + "markup.list.numbered" = cyan; + "markup.list.unnumbered" = cyan; + # "markup.link" = "green" + "markup.link.url" = { + fg = pink; + modifiers = [ + "italic" + "underlined" + ]; + }; + "markup.link.text" = cyan; + "markup.link.label" = purple-20; + "markup.quote" = pink; + "markup.raw" = pink; + "markup.raw.inline" = cyan; # .completion / .hover + "markup.raw.block" = "#EB83E2"; + + "diff.plus" = green-50; + "diff.minus" = red-50; + "diff.delta" = blue-80; + + # ui specific + # "ui.background" = { bg = gray-10; }; # .separator + "ui.background" = { }; + "ui.statusline" = { + fg = gray-120; + bg = gray-20; + }; # .inactive / .normal / .insert / .select + "ui.statusline.normal" = { + fg = gray-120; + bg = gray-20; + }; + "ui.statusline.inactive" = { + fg = gray-90; + }; + "ui.statusline.insert" = { + fg = gray-20; + bg = blue-90; + }; + "ui.statusline.select" = { + fg = gray-20; + bg = yellow-60; + }; + + "ui.cursor" = { + modifiers = [ "reversed" ]; + }; # .insert / .select / .match / .primary + "ui.cursor.match" = { + bg = blue-30; + }; # .insert / .select / .match / .primary + "ui.selection" = { + bg = gray-50; + }; # .primary + "ui.selection.primary" = { + bg = blue-40; + }; + + "ui.cursorline" = { + bg = gray-15; + }; + "ui.linenr" = gray-70; + "ui.linenr.selected" = gray-110; + + "ui.popup" = { + fg = gray-120; + bg = gray-20; + }; # .info + "ui.window" = { + fg = gray-50; + }; + "ui.help" = { + fg = gray-120; + bg = gray-20; + }; + "ui.menu" = { + fg = gray-120; + bg = gray-20; + }; # .selected + "ui.menu.selected" = { + fg = white; + bg = blue-40; + }; # .selected + # Calculated as #ffffff with 30% opacity + "ui.menu.scroll" = { + fg = "#dfdfdf"; + }; + + "ui.text" = gray-120; # .focus / .info + "ui.text.focus" = { + fg = white; + bg = blue-40; + }; + + "ui.virtual" = gray-90; # .whitespace + "ui.virtual.inlay-hint" = { + fg = gray-70; + }; + "ui.virtual.ruler" = { + bg = gray-20; + }; + + "hint" = gray-80; + "info" = "#A366C4"; + "warning" = "#FACb66"; + "error" = "#FF5269"; + + "diagnostic.hint" = { + underline = { + color = gray-80; + style = "line"; + }; + }; + "diagnostic.info" = { + underline = { + color = "#A366C4"; + style = "line"; + }; + }; + "diagnostic.warning" = { + underline = { + color = "#FACB66"; + style = "line"; + }; + }; + "diagnostic.error" = { + underline = { + color = "#FF5269"; + style = "line"; + }; + }; + "diagnostic.unnecessary" = { + modifiers = [ "dim" ]; + }; + "diagnostic.deprecated" = { + modifiers = [ "crossed_out" ]; + }; + }; + }; +} diff --git a/nix/home-manager/progs/librewolf.nix b/nix/home-manager/progs/librewolf.nix new file mode 100644 index 0000000..c26fd13 --- /dev/null +++ b/nix/home-manager/progs/librewolf.nix @@ -0,0 +1,77 @@ +{ pkgs, inputs, ... }: +{ + home.packages = with pkgs; [ librewolf ]; + + programs.librewolf = { + enable = true; + settings = { + "webgl.disabled" = false; + "privacy.resistFingerprinting" = false; + "privacy.clearOnShutdown.history" = false; + "privacy.clearOnShutdown.cookies" = false; + "network.cookie.lifetimePolicy" = 0; + "general.useragent.compatMode.firefox" = true; + "identity.fxaccounts.enabled" = true; + "services.sync.prefs.sync.privacy.clearOnShutdown.cookies" = false; + "services.sync.prefs.sync.privacy.clearOnShutdown_v2.cookiesAndStorage" = false; + + "general.useragent.override" = "Mozilla/5.0 (X11; Linux x86_64; rv:${pkgs.firefox.version}) Gecko/20100101 Firefox/${pkgs.firefox.version}"; + + "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; + + # For themeing + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + "browser.tabs.drawInTitlebar" = true; + "svg.context-properties.content.enabled" = true; + + #fake location, FIT (just about) + "geo.provider.network.url" = + "data:application/json," + + builtins.toJSON { + location = { + lat = 28.0749; + lng = -80.6302; + }; + accuracy = 1.0; + }; + }; + }; + + home.file = + let + chromeTheme = ".librewolf/tckj7njq.default-release/chrome"; + + firefoxThemeFile = file: src: { + target = "${chromeTheme}/${file}"; + source = "${inputs.firefox-mod-theme}/${src}/${file}"; + recursive = true; + }; + + baseThemeFile = { + file = ""; + src = ""; + }; + + modThemeFiles = [ + { + file = "userChrome.css"; + } + { + file = "userContent.css"; + } + { + file = "ASSETS"; + } + ]; + in + builtins.listToAttrs ( + map (f: { + name = "firefox-theme-${f.file}"; + value = firefoxThemeFile f.file f.src; + }) (map (f: baseThemeFile // f) modThemeFiles) + ); + + home.sessionVariables = { + BROWSER = "librewolf"; + }; +} diff --git a/nix/home-manager/progs/niri.nix b/nix/home-manager/progs/niri.nix new file mode 100644 index 0000000..a6aa705 --- /dev/null +++ b/nix/home-manager/progs/niri.nix @@ -0,0 +1,167 @@ +{ + config, + pkgs, + homeDirectory, +}: +{ + prefer-no-csd = true; + + spawn-at-startup = [ + #waybar + { command = [ "${pkgs.waybar}/bin/waybar" ]; } + + #swaybg works on more than just sway (sets a wallpaper) + { + command = [ + "${pkgs.swaybg}/bin/swaybg" + "-m" + "center" + "-i" + "${homeDirectory}/.wallpaper.png" + ]; + } + ]; + + window-rules = [ + { draw-border-with-background = false; } + { + geometry-corner-radius = { + top-left = 10.0; + top-right = 10.0; + bottom-right = 10.0; + bottom-left = 10.0; + }; + } + { clip-to-geometry = true; } + ]; + + binds = with config.lib.niri.actions; { + #application launcher + "Mod+Space".action = spawn [ + "${pkgs.rofi-wayland}/bin/rofi" + "-show" + "combi" + ]; + + #open a terminal + "Mod+T".action = spawn "${pkgs.alacritty}/bin/alacritty"; + + #lock the screen + "Mod+X".action = spawn "${pkgs.swaylock}/bin/swaylock"; + + #screenshotting + "Print".action = screenshot; + "Ctrl+Print".action = screenshot-screen; + "Alt+Print".action = screenshot-window; + + #Volume control + "XF86AudioRaiseVolume".action = spawn [ + "${pkgs.avizo}/bin/volumectl" + "-u" + "up" + ]; + "XF86AudioLowerVolume".action = spawn [ + "${pkgs.avizo}/bin/volumectl" + "-u" + "down" + ]; + "XF86AudioMute".action = spawn [ + "${pkgs.avizo}/bin/volumectl" + "toggle-mute" + ]; + "XF86AudioMicMute".action = spawn [ + "${pkgs.avizo}/bin/volumectl" + "-m" + "toggle-mute" + ]; + + #Display Brightness control + "XF86MonBrightnessUp".action = spawn [ + "${pkgs.avizo}/bin/lightctl" + "up" + ]; + "XF86MonBrightnessDown".action = spawn [ + "${pkgs.avizo}/bin/lightctl" + "down" + ]; + + #Force close a window + "Mod+Q".action = close-window; + + "Mod+Shift+Q".action = quit; + + #bindings for like window management ig + + "Mod+Left".action = focus-column-left; + "Mod+Down".action = focus-window-down; + "Mod+Up".action = focus-window-up; + "Mod+Right".action = focus-column-right; + + "Mod+H".action = focus-column-left; + "Mod+J".action = focus-window-down; + "Mod+K".action = focus-window-up; + "Mod+L".action = focus-column-right; + + "Mod+Ctrl+Left".action = move-column-left; + "Mod+Ctrl+Down".action = move-window-down; + "Mod+Ctrl+Up".action = move-window-up; + "Mod+Ctrl+Right".action = move-column-right; + + "Mod+Ctrl+H".action = move-column-left; + "Mod+Ctrl+J".action = move-window-down; + "Mod+Ctrl+K".action = move-window-up; + "Mod+Ctrl+L".action = move-column-right; + + #fine adjustments to height and width of window + "Mod+Minus".action = set-column-width "-10%"; + "Mod+Equal".action = set-column-width "+10%"; + "Mod+Shift+Minus".action = set-window-height "-10%"; + "Mod+Shift+Equal".action = set-window-height "+10%"; + + "Mod+Home".action = focus-column-first; + "Mod+End".action = focus-column-last; + "Mod+Ctrl+Home".action = move-column-to-first; + "Mod+Ctrl+End".action = move-column-to-last; + + "Mod+Shift+Left".action = focus-monitor-left; + "Mod+Shift+Down".action = focus-monitor-down; + "Mod+Shift+Up".action = focus-monitor-up; + "Mod+Shift+Right".action = focus-monitor-right; + + "Mod+Shift+H".action = focus-monitor-left; + "Mod+Shift+J".action = focus-monitor-down; + "Mod+Shift+K".action = focus-monitor-up; + "Mod+Shift+L".action = focus-monitor-right; + + "Mod+Shift+Ctrl+Left".action = move-column-to-monitor-left; + "Mod+Shift+Ctrl+Down".action = move-column-to-monitor-down; + "Mod+Shift+Ctrl+Up".action = move-column-to-monitor-up; + "Mod+Shift+Ctrl+Right".action = move-column-to-monitor-right; + + "Mod+Shift+Ctrl+H".action = move-column-to-monitor-left; + "Mod+Shift+Ctrl+J".action = move-column-to-monitor-down; + "Mod+Shift+Ctrl+K".action = move-column-to-monitor-up; + "Mod+Shift+Ctrl+L".action = move-column-to-monitor-right; + + "Mod+Page_Down".action = focus-workspace-down; + "Mod+Page_Up".action = focus-workspace-up; + "Mod+U".action = focus-workspace-down; + "Mod+I".action = focus-workspace-up; + + #move a window up and down workspaces + "Mod+Ctrl+Page_Down".action = move-column-to-workspace-down; + "Mod+Ctrl+Page_Up".action = move-column-to-workspace-up; + + "Mod+Ctrl+U".action = move-column-to-workspace-down; + "Mod+Ctrl+I".action = move-column-to-workspace-up; + + #does little squeeze thing into the left or right position with another window + "Mod+BracketLeft".action = consume-or-expel-window-left; + "Mod+BracketRight".action = consume-or-expel-window-right; + + "Mod+R".action = switch-preset-column-width; + "Mod+F".action = maximize-column; + "Mod+Shift+F".action = fullscreen-window; + "Mod+C".action = center-column; + }; +} diff --git a/nix/home-manager/progs/rss.nix b/nix/home-manager/progs/rss.nix new file mode 100644 index 0000000..97515ca --- /dev/null +++ b/nix/home-manager/progs/rss.nix @@ -0,0 +1,91 @@ +[ + { + title = "Stratechery"; + url = "https://stratechery.passport.online/feed/rss/2gi1tPZ8Ta36Tsx7rDLM5P"; + } + + { + title = "Factorio Blog"; + url = "https://www.factorio.com/blog/rss"; + } + + { + title = "Firefox Nightly News"; + url = "https://blog.nightly.mozilla.org/feed/"; + } + + { + title = "Servo Blog"; + url = "https://servo.org/blog/feed.xml"; + } + + { + title = "Alyssa Rosenzweig"; + url = "https://rosenzweig.io/feed.xml"; + } + + { + title = "Marc's Blog"; + url = "https://brooker.co.za/blog/rss.xml"; + } + + { + title = "Fabien Sanglard"; + url = "https://fabiensanglard.net/rss.xml"; + } + + { + title = "Xuanwo's Blog"; + url = "https://xuanwo.io/index.xml"; + } + + { + title = "Carlos Galdino"; + url = "https://blog.carlosgaldino.com/atom.xml"; + } + + { + title = "soatok"; + url = "https://soatok.blog/feed/"; + } + + { + title = "Jack Garbus"; + url = "https://jarbus.net/index.xml"; + } + + { + title = "Terence Eden"; + url = "https://shkspr.mobi/blog/feed/atom/"; + } + + { + title = "GioCities"; + url = "https://blog.giovanh.com/feeds/atom.xml"; + } + + { + title = "mcyoung"; + url = "https://mcyoung.xyz/atom.xml"; + } + + { + title = "Embrace the Red"; + url = "https://embracethered.com/blog/index.xml"; + } + + { + title = "Chips and Cheese"; + url = "https://chipsandcheese.com/feed/"; + } + + { + title = "System5"; + url = "https://blogsystem5.substack.com/feed"; + } + + { + title = "lwn"; + url = "https://lwn.net/headlines/Features"; + } +] diff --git a/nix/home-manager/progs/swaylock.nix b/nix/home-manager/progs/swaylock.nix new file mode 100644 index 0000000..bb528c3 --- /dev/null +++ b/nix/home-manager/progs/swaylock.nix @@ -0,0 +1,31 @@ +{ + color = "24273a"; + bs-hl-color = "f4dbd6"; + caps-lock-bs-hl-color = "f4dbd6"; + caps-lock-key-hl-color = "a6da95"; + inside-color = 0; + inside-clear-color = 0; + inside-caps-lock-color = 0; + inside-ver-color = 0; + inside-wrong-color = 0; + key-hl-color = "a6da95"; + layout-bg-color = 0; + layout-border-color = 0; + layout-text-color = "cad3f5"; + line-color = 0; + line-clear-color = 0; + line-caps-lock-color = 0; + line-ver-color = 0; + line-wrong-color = 0; + ring-color = "b7bdf8"; + ring-clear-color = "f4dbd6"; + ring-caps-lock-color = "f5a97f"; + ring-ver-color = "8aadf4"; + ring-wrong-color = "ee99a0"; + separator-color = 0; + text-color = "cad3f5"; + text-clear-color = "f4dbd6"; + text-caps-lock-color = "f5a97f"; + text-ver-color = "8aadf4"; + text-wrong-color = "ee99a0"; +} diff --git a/nix/home-manager/progs/waybar.nix b/nix/home-manager/progs/waybar.nix new file mode 100644 index 0000000..5448024 --- /dev/null +++ b/nix/home-manager/progs/waybar.nix @@ -0,0 +1,253 @@ +{ pkgs }: +{ + enable = true; + settings.mainBar = { + layer = "top"; + position = "top"; + # mod = "dock"; + # exclusive = true; + # gtk-layer-shell = true; + margin-bottom = -1; + # passthrough = false; + height = 32; + modules-left = + [ + ]; + modules-center = [ "clock" ]; + modules-right = [ + "cpu" + "memory" + "tray" + "pulseaudio" + "network" + "battery" + ]; + cpu = { + interval = 5; + format = " {usage}%"; + max-length = 10; + }; + memory = { + interval = 10; + format = " {percentage}%"; + max-length = 10; + tooltip = true; + tooltip-format = "RAM - {used:0.1f}GiB used"; + }; + tray = { + icon-size = 18; + spacing = 3; + }; + clock = { + format = " {:%R\n %d.%m.%Y}"; + tooltip-format = "{calendar}"; + calendar = { + mode = "year"; + mode-mon-col = 3; + weeks-pos = "right"; + on-scroll = 1; + on-click-right = "mode"; + format = { + months = "{}"; + days = "{}"; + weeks = "W{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + on-click-right = "mode"; + on-click-forward = "tz_up"; + on-click-backward = "tz_down"; + on-scroll-up = "shift_up"; + on-scroll-down = "shift_down"; + }; + }; + network = { + format-wifi = " {icon}"; + format-ethernet = "  "; + format-disconnected = "󰌙 "; + format-icons = [ + "󰤯 " + "󰤟 " + "󰤢 " + "󰤢 " + "󰤨 " + ]; + }; + battery = { + states = { + good = 95; + warning = 30; + critical = 20; + }; + format = " {icon} {capacity}%"; + format-charging = "  {capacity}%"; + format-plugged = "  {capacity}%"; + format-alt = "{time} {icon}"; + format-icons = [ + "󰂎" + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + }; + # not actually pulseaudio-specific + pulseaudio = { + max-volume = 100; + scroll-step = 10; + format = "{icon}"; + tooltip-format = "{volume}%"; + format-muted = "🔇"; + format-icons = { + default = [ + " " + " " + " " + ]; + }; + on-click = "${pkgs.pwvucontrol}/bin/pwvucontrol"; + }; + }; + + style = '' + /*base background color*/ + @define-color bg_main rgba(25, 25, 25, 1.0); + @define-color bg_main_tooltip rgba(0, 0, 0, 0.7); + + + /*base background color of selections */ + @define-color bg_hover rgba(200, 200, 200, 0.3); + /*base background color of active elements */ + @define-color bg_active rgba(100, 100, 100, 0.5); + + /*base border color*/ + @define-color border_main rgba(255, 255, 255, 0.2); + + /*text color for entries, views and content in general */ + @define-color content_main white; + /*text color for entries that are unselected */ + @define-color content_inactive rgba(255, 255, 255, 0.25); + + * { + text-shadow: none; + box-shadow: none; + border: none; + border-radius: 0; + font-family: "Segoe UI", "Ubuntu"; + font-weight: 600; + font-size: 12.7px; + } + + window#waybar { + background: @bg_main; + border-top: 0; + color: @content_main; + } + + tooltip { + background: @bg_main_tooltip; + border-radius: 5px; + border-width: 1px; + border-style: solid; + border-color: @border_main; + } + + tooltip label { + color: @content_main; + } + + #taskbar { + } + + #taskbar button { + min-width: 130px; + border-bottom: 3px solid rgba(255, 255, 255, 0.3); + margin-left: 2px; + margin-right: 2px; + padding-left: 8px; + padding-right: 8px; + color: white; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + #taskbar button.active { + border-bottom: 3px solid white; + background: @bg_active; + } + + #taskbar button:hover { + border-bottom: 3px solid white; + background: @bg_hover; + color: @content_main; + } + + #cpu, #memory { + padding:3px; + } + + #window { + border-radius: 10px; + margin-left: 20px; + margin-right: 20px; + } + + #tray { + margin-left: 5px; + margin-right: 5px; + } + + #tray > .passive { + border-bottom: none; + } + + #tray > .active { + border-bottom: 3px solid white; + } + + #tray > .needs-attention { + border-bottom: 3px solid @warning_color; + } + + #tray > widget { + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + #tray > widget:hover { + background: @bg_hover; + } + + #pulseaudio { + font-family: "JetBrains Mono Nerd Font"; + padding-left: 3px; + padding-right: 3px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + #pulseaudio:hover { + background: @bg_hover; + } + + #network { + padding-left: 3px; + padding-right: 3px; + } + + #clock { + padding-right: 5px; + padding-left: 5px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + #clock:hover { + background: @bg_hover; + } + ''; +} diff --git a/nix/home-manager/secrets/borg-laptop-password.age b/nix/home-manager/secrets/borg-laptop-password.age new file mode 100644 index 0000000..abca559 --- /dev/null +++ b/nix/home-manager/secrets/borg-laptop-password.age @@ -0,0 +1,10 @@ +age-encryption.org/v1 +-> ssh-ed25519 JlUYaQ 0zR1i7aaaTiNatQ64adSfLAes3mxyErq3kZUziRInVc +A8sfonsw2iodHRFsmYbmMNAviEUFSy9mkXuq6jefki8 +-> ssh-ed25519 dHDJgQ CmnVM06YvF+mzPNF1LsHdyL1hk+d/yH3HTBcdRlX/2c +79u1EAd+g/Cmb9TzAifO4VHqJZk5T88nP4DWfsJEuIw +-> >=ei241-grease co`|!7_c lx{qy +A6d8YS1s8NZojKmRVWhmJDzOOFT/AEO/IRZN0LI30QP3jImoTJ4EFDQUm4p+0IWk +dam3RKxF7XzF6dNigGDKKeIVXcSX1SiEgHyIo0+hPm2nZbM/p1IJ6fsACbTB6Q +--- /Za+90oVP7/fGDLBRr6s56UopJjz8f851js/htBcYWA +6e0YT0|`H>`b. XGXs1n.$o \ No newline at end of file diff --git a/nix/home-manager/secrets/factorio.nix b/nix/home-manager/secrets/factorio.nix new file mode 100644 index 0000000000000000000000000000000000000000..549fa66986604a8664d199dcd7df193cb4e409a1 GIT binary patch literal 99 zcmZQ@_Y83kiVO&0u$|oeHY#57^Y&xY=CvYZmYF G^(+A7_%3Mx literal 0 HcmV?d00001 diff --git a/nix/home-manager/secrets/my-gpg.age b/nix/home-manager/secrets/my-gpg.age new file mode 100644 index 0000000000000000000000000000000000000000..2344279827bb9c4513889db7e4e07d4b66ddf8dd GIT binary patch literal 2969 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCUl$_b533{=Q=kMcK2 z$@6wMc8N*}cD4)%D^2tEjPfZAi12aD3k%80%W_OH$Vp6ej^xUS@(T^{5A*Uj4fFIV zFEw%s3Ns4LHxG98@-OoC4NcC#lyubJy5|dDay?>Si3Ac-{0N6 z*do~5#LYA>!qF?Oq$;_pB+aqX-Obse*eu)EEt0D++{DW{IVji2B0t!u%Am5KGR)N3 z+rZN@JulS2QoGc+GTkCGETYgY5Nw;DouaLqt8RKxYGQG!La<|=k*R`jqJMZl(~XP`@xMQCKOPlaz#QfW?=o1ur3XMS*6Zgyp$No0|^ zV_=18v3F)viKDl#b7n=h8<(q_OJ!0{p?8W=K!mqrO*Ss;gs&V_JY?fLpe3olHV5}(;HSD)wntl9Mi%~o}j)@)SVBXOZ5L0{D{M|E?` z+xZ{*jv&aJcdo>IAV zGAn=O-_7xNOh36yjS%!-qj_ll*_V00-euda>*Kx^YU13yL+Z=VO@*(_xssNP{Mc4} zIVV-$B+2~ksplUT3i~nsn^4uO_Un7ttCz7?%qH&s!MEMHsu%5TP`w!SeT`fCZSAE|x{lf&+yIkk> zj=y~*6?pE-RqiFZU#2xLw6#m&{*~)Fq4HO0>DSBCvQ~ZGtLDXhflF6ti`@hx{S|kF zf|GtG98BB$yY9)FFFZ02yC+=ec`ewqb;I{_J^UY+uB|rT6?W@K0=tq&v%$%idvz!O zzUH^ALgkbC<(Z2@8UvP|*SZ_>!b{gD^~wJn<~=Q&W%j)DloN>9rM*&2&-S&l$wQu3 zas~2C%w@`D`cB1LOJ{EXQt|YsOwEQX&R>6g%VCd>%dWI}-(&H6i=WxXjNKn2SI5>0 z&HC4tJ@aN!24Bj8wRhSpCCztKxXrxZd2vb3YODP3G1X7@Tn=zB{dM+%L56eO?%UH? z-+$k@y^x{e6uV1^!u2IapFZDs8|U-!yp5})zyGVd4zqnF3%HUy8J*UK_bDgzUtiw) zqWo=9xoY2vGt1t*c&of;`r&tfIXC!UcaGg6lPOpDRPe9m3+?H9Y#5%%c>T4pd6d=q zVD_YSW&6%vx$q##`Z9O=6b%JSivHp6-_x z-!SLFyybg-?8AKfCpD znqkUUpC$S&t8c#lm!H|UQ~v9Db0HJmvv*EU(tcLf|jIzxH@0)Mh1DNsI5CV=q?~Diq)I z)pTRvDZ$u=*V6^h-tI}+-TdjBgy^I2#)-NGXU^vB^G=9%?bVxkYvPH;cjx?aIz8>x z?_X;sJl!ns$gQ8Te$!GPUbDXY%Xa5}xA}Rdx7w1~ga7!nG~TSkTGQ`0PyH()+9l6r z5#@2!K4^aQG>*Svyas1p9k{;x)3uDs0!j9=i)>S$329B)|ITBr=Ts>_b+65#%Winw zxoNgv(!8}#XtL z*(ZHyol<`^;o5cnk~51BPRr}LHTA`vyDiI^jpXgW3Qa#+XE@D{=f~sg9p@8na%QJzKurPBC$C-n>HKFI_qsS$NMz9O_Fk0qoa>_T0_C zP96!eabaxfXY#HnQ19gZk+eC>Gl1jz%JiLgzb;912`-)Z;>W{4liB$T7VYzyKglgk z@6{I`5{HjP&ok?jEBCl*{_fP2c(&q6tVIhl)5_P@W^6gX!}o}$ z#&L_q_e&Zon;+%!EpYx@GM(quX0N%Q=cYWg5{Oxzz;B(2_iJO1z z8`GD6ItM@hFO}dtdR4$bwyDKXAd+eFN2L=D(k0RtRWF?~-5nP-t;X+I(TjRF&%ehf zJ*l7gOGf8I^4^M7z8eJ0SFp6NX#Q2QV6)-tX{VgJb~#j8E$~<_aerr2_Rgf`F9SUq z7@INz4kUbEbZ~wWM$H|u4o4368duT7?ZOrqG>APg^dLwYxSfWd4sGIyI3>2{{L=YzBcoO813vyuuN0hXV*TAI z%lV6|g-hJGgZ&m$cU@oUvFvdt*M-NMlZ_9|v9y2xlxfeZ!_H1MYBKA6On82+=Lxpa zUHa~4nb-EUtPefzr@1yY=M^jG3WTsFJYIIGT6GJnX0TNB9BG>;4`xqT5w*uy^wb8s zD=jN0wKq;W@bcbN^J!nsUa4?k_$;x&K55-%4+vacTUXUbaZFK$b=5M`A zPrk9)p)$8f{1Zb`S;dk3GMdSp8l&HOgn#I*~`($4^*f?hh{6dDZv)RNehG9J1Uht844y68@!5 g4amFDzH9plp+|h8ZY`g89+Zgwd4iAG&RRqa0JM&KLjV8( literal 0 HcmV?d00001 diff --git a/nix/home-manager/secrets/secrets.nix b/nix/home-manager/secrets/secrets.nix new file mode 100644 index 0000000..43b3368 --- /dev/null +++ b/nix/home-manager/secrets/secrets.nix @@ -0,0 +1,18 @@ +let + laptop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4jL6gYOunUlUtPvGdML0cpbKSsPNqQ1jit4E7U1RyH"; + desktop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJjT5QZ3zRDb+V6Em20EYpSEgPW5e/U+06uQGJdraxi"; +in +(builtins.listToAttrs ( + map + (f: { + f.publicKeys = [ + laptop + desktop + ]; + }) + [ + "server-password.age" + "borg-laptop-password.age" + "my-gpg.age" + ] +)) diff --git a/nix/home-manager/secrets/server-password.age b/nix/home-manager/secrets/server-password.age new file mode 100644 index 0000000..1df1be5 --- /dev/null +++ b/nix/home-manager/secrets/server-password.age @@ -0,0 +1,9 @@ +age-encryption.org/v1 +-> ssh-ed25519 JlUYaQ u9duGBEW7wp7aG5cqd1gfB8w+MDAirki9ZVSsotqtRM +9gyL9k29ytNJZ6Kp90309bDim1fZNqcLhPTVqs1py5s +-> ssh-ed25519 dHDJgQ ytHA01CSY/0dD6F8XC9ilzNaivZS84PsCmr5GFWAE1o +4jLi+spahOIExkrUyfpX8cYJFEKvWfErWskYJ2btBkw +-> Q-grease +n1QvV95VRYZ7CiOl6KOedEKr2L7tjTdj8aahF/DHOifCyWnc +--- iV/7+IbpWvsgrZIs2yPwOL0Xa6AlvkIfwbDotCh7iiQ +'Fh2mYiuL/D* :@;f 9v{2aǫ& \ No newline at end of file diff --git a/nix/home-manager/system-mreow.nix b/nix/home-manager/system-mreow.nix new file mode 100644 index 0000000..c042439 --- /dev/null +++ b/nix/home-manager/system-mreow.nix @@ -0,0 +1,183 @@ +{ + config, + pkgs, + lib, + homeDirectory, + ... +}: +{ + imports = [ ./gui.nix ]; + + home.packages = with pkgs; [ + wdisplays + intel-gpu-tools + swaylock + + #manage bluetooth devices + blueman + + niri-unstable + ]; + + #bluetooth manager + services.blueman-applet.enable = true; + + #notification daemon + services.dunst = { + enable = true; + package = pkgs.dunst; + }; + + #window manager + programs.niri = { + package = pkgs.niri-unstable; + settings = import ./progs/niri.nix { inherit config pkgs homeDirectory; }; + }; + + programs.swaylock = { + enable = true; + settings = import ./progs/swaylock.nix; + }; + + #waybar for status bar + programs.waybar = import ./progs/waybar.nix { inherit pkgs; }; + + #rofi for application launcher + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + extraConfig = { + modi = "window,drun,ssh,combi"; + combi-modi = "window,drun,ssh"; + }; + }; + + age.secrets.borg-laptop-password = { + file = ./secrets/borg-laptop-password.age; + path = "${homeDirectory}/.secrets/borg_bak_pass"; + }; + + #backup utility + programs.borgmatic = { + enable = true; + package = pkgs.borgmatic; + backups = + let + borgPasswordFile = config.age.secrets.borg-laptop-password.path; + in + import ./progs/borg.nix { inherit homeDirectory borgPasswordFile; }; + }; + + # https://community.frame.work/t/speakers-sound-quality/1078/83 + # Filter: ON HPQ Fc 100.0 Hz Gain 0.0 dB Q 1.0 + # Filter: ON PK Fc 150.0 Hz Gain 4.02 dB Q 3.0 + # Filter: ON PK Fc 600.0 Hz Gain -5.07 dB Q 4.000000000000008 + # Filter: ON PK Fc 1200.0 Hz Gain -3.49 dB Q 4.17 + # Filter: ON PK Fc 2000.0 Hz Gain 1.43 dB Q 4.0 + # Filter: ON PK Fc 5300.0 Hz Gain 3.84 dB Q 2.64 + # Filter: ON HSC Fc 6000.0 Hz Gain 4.02 dB Q 4.36 + # Filter: ON PK Fc 7500.0 Hz Gain -2.09 dB Q 3.0 + # Filter: ON PK Fc 8000.0 Hz Gain 2.01 dB Q 4.36 + # Filter: ON PK Fc 900.0 Hz Gain -4.12 dB Q 5.909999999999967 + home.file.".config/easyeffects/output/framework.json".text = + let + baseBand = { + mode = "RLC (BT)"; + mute = false; + solo = false; + slope = "1x"; + type = "Bell"; + }; + + bandList = [ + { + frequency = 100.0; + gain = 0.0; + q = 1.0; + slope = "x4"; + type = "Hi-pass"; + } + { + frequency = 150.0; + gain = 4.02; + q = 3.0; + } + { + frequency = 600.0; + gain = -5.07; + q = 4.000000000000008; + } + { + frequency = 1200.0; + gain = -3.49; + q = 4.17; + } + { + frequency = 2000.0; + gain = 1.43; + q = 4.0; + } + { + frequency = 5300.0; + gain = 3.84; + q = 2.64; + } + { + frequency = 6000.0; + gain = 4.02; + q = 4.36; + type = "Hi-shelf"; + } + { + frequency = 7500.0; + gain = -2.09; + q = 3.0; + } + { + frequency = 8000.0; + gain = 2.01; + q = 4.36; + } + { + frequency = 900.0; + gain = -4.12; + q = 5.909999999999967; + } + ]; + + bands = builtins.listToAttrs ( + map (f: { + name = "band${toString f.snd}"; + value = baseBand // f.fst; + }) (lib.lists.zipLists bandList (lib.range 0 (lib.length (bandList)))) + ); + + in + builtins.toJSON { + output = { + blocklist = [ ]; + equalizer = { + balance = 0.0; + bypass = false; + input-gain = 0.0; + left = bands; + right = bands; + mode = "IIR"; + num-bands = 10; + output-gain = -1.5; + pitch-left = 0.0; + pitch-right = 0.0; + split-channels = false; + }; + plugins_order = [ + "equalizer" + ]; + }; + }; + + services.easyeffects = { + enable = true; + package = pkgs.easyeffects; + preset = "framework"; + }; +} diff --git a/nix/home-manager/system-nixos.nix b/nix/home-manager/system-nixos.nix new file mode 100644 index 0000000..1435381 --- /dev/null +++ b/nix/home-manager/system-nixos.nix @@ -0,0 +1,45 @@ +{ + pkgs, + inputs, + lib, + ... +}: +{ + imports = [ ./gui.nix ]; + nixpkgs.config.allowUnfree = true; + + nixpkgs.overlays = [ + # Add a protontricks-beta package so we can use protontricks with latest steam beta + # https://github.com/Matoking/protontricks/issues/304#issuecomment-2280920826 + ( + final: prev: + let + ps = prev.python312Packages; + in + { + vdf-patch = ps.vdf.overrideAttrs (oldAttrs: { + src = inputs.vdf-patch; + }); + protontricks-beta = prev.protontricks.overrideAttrs (oldAttrs: { + src = inputs.protontricks; + propagatedBuildInputs = [ + ps.setuptools # implicit dependency, used to find data/icon_placeholder.png + final.vdf-patch + ps.pillow + ]; + }); + } + ) + ]; + + home.packages = with pkgs; [ + protontricks-beta + beatsabermodmanager + protonup-qt + ]; + + programs.alacritty.settings = { + window.decorations = lib.mkForce "full"; + window.opacity = lib.mkForce 1.0; + }; +}