commit f3d47705d8bac143de9ddb51b998163abc0b6bf6 Author: Simon Gardling Date: Sun Sep 15 12:04:40 2024 -0400 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b61b12 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# My Dotfiles ✨ +These are my dotfiles for my laptop (which I use [NixOS](https://nixos.org/) on). I'm still working on porting more configs to [home-manager](https://github.com/nix-community/home-manager). + +## Structure +The `nix` folder contains two sub directories, `etcnixos` and `home-manager`. The former is the contents of `/etc/nixos` (hence the name), whereas the latter is the contents of `~/.config/home-manager`. +`justfile` is the [just](https://github.com/casey/just) script I use for updating my nixOS system and syncing the changes with this repo. + +## What do I use? +Browser: Firefox 🦊 (actually Librewolf :p) + +Text Editor: [helix](https://github.com/helix-editor/helix) + +Terminal: [alacritty](https://github.com/alacritty/alacritty) + +Shell: [fish](https://fishshell.com/) with the [pure](https://github.com/pure-fish/pure) prompt + +WM: [niri](https://github.com/YaLTeR/niri) (KDE on my desktop) + +There is more that I'm using, but those are the main ones! Read my configs to get more into the specifics. diff --git a/justfile b/justfile new file mode 100644 index 0000000..d15b366 --- /dev/null +++ b/justfile @@ -0,0 +1,21 @@ +update_all: system_update home_update sync_configs + +format_home: + nixfmt ~/.config/home-manager + +format_system: + doas nixfmt /etc/nixos + +system_update: + doas nix flake update /etc/nixos + doas nixos-rebuild boot --impure + +home_update: + nix flake update ~/.config/home-manager + rm -fr ~/.gtkrc-2.0 + home-manager switch --impure + +sync_configs: format_home format_system + rsync -a --delete /etc/nixos/ ~/dotfiles/nix/etcnixos/ + rsync -a --delete ~/.config/home-manager/ ~/dotfiles/nix/home-manager/ + cp ~/justfile ~/dotfiles/ diff --git a/nix/etcnixos/common.nix b/nix/etcnixos/common.nix new file mode 100644 index 0000000..6fbebc8 --- /dev/null +++ b/nix/etcnixos/common.nix @@ -0,0 +1,205 @@ +{ + config, + pkgs, + lib, + username, + system, + hostname, + inputs, + ... +}: +{ + imports = [ ./declarative-nm.nix ]; + + nix = { + #garbage collection and cleanup stuff + gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 7d"; + }; + + #optimize the store + optimise.automatic = true; + + #enable flakes! + settings.experimental-features = [ + "nix-command" + "flakes" + ]; + }; + + #kernel options + boot = { + kernelPackages = pkgs.linuxPackages_cachyos-lto; + + kernel.sysctl = { + #for profiling + "kernel.perf_event_paranoid" = 1; + "kernel.kptr_restrict" = 0; + + #dmesg shushhhhh + "kernel.printk" = "2 4 1 7"; + }; + + # Bootloader. + loader = { + systemd-boot.enable = true; + efi.canTouchEfiVariables = true; + }; + + initrd = { + compressor = "zstd"; + compressorArgs = [ "-1" ]; + }; + }; + + environment.etc = { + #override default nixos /etc/issue + "issue".text = ""; + }; + + services = { + #fwupd for updating firmware + fwupd = { + enable = true; + extraRemotes = [ "lvfs-testing" ]; + }; + + #auto detect network printers + avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + }; + + # Enable CUPS to print documents. + printing = { + enable = true; + drivers = with pkgs; [ hplip ]; + }; + + #disable fprintd (doesn't compile, idk) + fprintd.enable = false; + + #Making sure mullvad works on boot + mullvad-vpn.enable = true; + }; + + # Set your time zone. + time.timeZone = "America/New_York"; + + security = { + #lets use doas and not sudo! + doas.enable = true; + sudo.enable = false; + # Configure doas + doas.extraRules = [ + { + users = [ "${username}" ]; + keepEnv = true; + persist = true; + } + ]; + }; + + age.identityPaths = [ "/home/${username}/.ssh/id_ed25519" ]; + + age.secrets.wifi-passwords = { + file = ./secrets/wifi-passwords.age; + path = "/etc/secrets/wifi-passwords.nix"; + }; + + age.secrets.primary-password = { + file = ./secrets/primary-password.age; + path = "/etc/secrets/primary-password"; + }; + + #networking + networking = + let + wifi-passwords = import "${config.age.secrets.wifi-passwords.path}"; + in + import ./networking.nix { inherit hostname wifi-passwords; }; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + + # Enable Bluetooth + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + + #Enable experimental features for battery % of bluetooth devices + settings.General.Experimental = true; + }; + + #apply gtk themes by enabling dconf + programs.dconf.enable = true; + + # Enable sound with pipewire. + hardware.pulseaudio.enable = false; # pipewire >>>>>>> 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"; }) + ]; + + #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..7603a49 --- /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": 1726175462, + "narHash": "sha256-OWnvv900LI20DypGLMAsceRTFdkahMns6BHO2OKzmM0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d5c6dd163d933674a4e3871a89ddddb87036c751", + "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": 1726403681, + "narHash": "sha256-G922au3LygfpO+4CsAzQmtlg+KXjx8dSwehDwkCFMjQ=", + "owner": "chaotic-cx", + "repo": "nyx", + "rev": "68d822079a1b3e31db3cf1e30e32a69b46e6dfa3", + "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": 1726230467, + "narHash": "sha256-YyMNF7IFyysZ2KeqEO6AmV3nQeaDSxyNXLdHp1ghO60=", + "owner": "nix-community", + "repo": "fenix", + "rev": "43efa7a3a97f290441bd75b18defcd4f7b8df220", + "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": 1726222338, + "narHash": "sha256-KuA8ciNR8qCF3dQaCaeh0JWyQUgEwkwDHr/f49Q5/e8=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "503af483e1b328691ea3a434d331995595fb2e3d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "jovian": { + "inputs": { + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "chaotic", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726115155, + "narHash": "sha256-VDylz5VX4JD4/TZv6xUJDwuvNdgLRGoOpue1dlZGdIQ=", + "owner": "Jovian-Experiments", + "repo": "Jovian-NixOS", + "rev": "02cf60ce20b6034fc0459e5116cec7016aaff6e4", + "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": 1725885300, + "narHash": "sha256-5RLEnou1/GJQl+Wd+Bxaj7QY7FFQ9wjnFq1VNEaxTmc=", + "owner": "NixOS", + "repo": "nixos-hardware", + "rev": "166dee4f88a7e3ba1b7a243edb1aca822f00680e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixos-hardware", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1726243404, + "narHash": "sha256-sjiGsMh+1cWXb53Tecsm4skyFNag33GPbVgCdfj3n9I=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "345c263f2f53a3710abe117f28a5cb86d0ba4059", + "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": 1725985110, + "narHash": "sha256-0HKj+JI6rtxaE6Kzcd6HyFNbEFJRsLy5DoNgVF1pyRM=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "bcc708992104c2059f310fbc3ac00bfc377f9ea8", + "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..4906bd3 --- /dev/null +++ b/nix/etcnixos/flake.nix @@ -0,0 +1,62 @@ +{ + 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"; + in + { + nixosConfigurations.${hostname} = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs username hostname; + }; + 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..c7ee556 --- /dev/null +++ b/nix/etcnixos/hardware_desktop.nix @@ -0,0 +1,58 @@ +# 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"; + }; + + 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..fd1a983 --- /dev/null +++ b/nix/etcnixos/networking.nix @@ -0,0 +1,17 @@ +{ hostname, wifi-passwords, ... }: +{ + hostName = "${hostname}"; + + networkmanager = { + enable = true; + insertNameservers = [ + "1.1.1.1" + "8.8.8.8" + ]; + wifi = { + scanRandMacAddress = true; + }; + }; + + wireless.networks = wifi-passwords; +} diff --git a/nix/etcnixos/secrets/primary-password.age b/nix/etcnixos/secrets/primary-password.age new file mode 100644 index 0000000..ca3ac41 Binary files /dev/null and b/nix/etcnixos/secrets/primary-password.age differ diff --git a/nix/etcnixos/secrets/secrets.nix b/nix/etcnixos/secrets/secrets.nix new file mode 100644 index 0000000..4ae7da2 --- /dev/null +++ b/nix/etcnixos/secrets/secrets.nix @@ -0,0 +1,14 @@ +let + laptop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4jL6gYOunUlUtPvGdML0cpbKSsPNqQ1jit4E7U1RyH"; + desktop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJjT5QZ3zRDb+V6Em20EYpSEgPW5e/U+06uQGJdraxi"; +in +{ + "wifi-passwords.age".publicKeys = [ + laptop + desktop + ]; + "primary-password.age".publicKeys = [ + laptop + desktop + ]; +} diff --git a/nix/etcnixos/secrets/wifi-passwords.age b/nix/etcnixos/secrets/wifi-passwords.age new file mode 100644 index 0000000..62dc809 Binary files /dev/null and b/nix/etcnixos/secrets/wifi-passwords.age differ diff --git a/nix/etcnixos/system-mreow.nix b/nix/etcnixos/system-mreow.nix new file mode 100644 index 0000000..d5e574f --- /dev/null +++ b/nix/etcnixos/system-mreow.nix @@ -0,0 +1,118 @@ +{ + config, + pkgs, + lib, + username, + system, + cpu_arch, + ... +}: +{ + imports = [ + ./common.nix + ./hardware_laptop.nix + ]; + + services.tlp = { + enable = true; + settings = { + CPU_SCALING_GOVERNOR_ON_AC = "performance"; + CPU_SCALING_GOVERNOR_ON_BAT = "powersave"; + + CPU_ENERGY_PERF_POLICY_ON_BAT = "power"; + CPU_ENERGY_PERF_POLICY_ON_AC = "performance"; + + CPU_MIN_PERF_ON_AC = 0; + CPU_MAX_PERF_ON_AC = 100; + CPU_MIN_PERF_ON_BAT = 0; + CPU_MAX_PERF_ON_BAT = 60; + + CPU_BOOST_ON_BAT = 0; + START_CHARGE_THRESH_BAT0 = 90; + STOP_CHARGE_THRESH_BAT0 = 95; + RUNTIME_PM_ON_BAT = "auto"; + }; + }; + + services = { + + #using btrfs, so lets scrub! + btrfs.autoScrub = { + enable = true; + interval = "weekly"; + fileSystems = [ "/" ]; + }; + }; + + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd ${pkgs.niri}/bin/niri-session"; + user = "${username}"; + }; + }; + }; + + boot = { + enableContainers = true; + + lanzaboote = { + enable = true; + pkiBundle = "/etc/secureboot"; + }; + # Bootloader. + loader = { + /* + Lanzaboote currently replaces the systemd-boot module. + This setting is usually set to true in configuration.nix + generated at installation time. So we force it to false + for now. + */ + systemd-boot.enable = lib.mkForce false; + }; + + }; + + # this is a life saver. + # literally no documentation about this anywhere. + # might be good to write about this... + # https://www.reddit.com/r/NixOS/comments/u0cdpi/tuigreet_with_xmonad_how/ + systemd.services.greetd.serviceConfig = { + Type = "idle"; + StandardInput = "tty"; + StandardOutput = "tty"; + StandardError = "journal"; # Without this errors will spam on screen + # Without these bootlogs will spam on screen + TTYReset = true; + TTYVHangup = true; + TTYVTDisallocate = true; + }; + + # Enable common container config files in /etc/containers + virtualisation = { + containers.enable = true; + podman = { + enable = true; + + # Required for containers under podman-compose to be able to talk to each other. + # defaultNetwork.settings.dns_enabled = true; + }; + }; + + environment.systemPackages = with pkgs; [ + distrobox + niri + mangohud + ]; + + # programs.steam.gamescopeSession.enable = true; + # programs.gamescope = { + # enable = true; + # capSysNice = true; + # }; + + #weird hack to get swaylock working? idk, if you don't put this here, password entry doesnt work + #if I move to another lock screen program, i will have to replace `swaylock` + security.pam.services.swaylock = { }; +} diff --git a/nix/etcnixos/system-nixos.nix b/nix/etcnixos/system-nixos.nix new file mode 100644 index 0000000..7ca31d1 --- /dev/null +++ b/nix/etcnixos/system-nixos.nix @@ -0,0 +1,132 @@ +{ + config, + pkgs, + lib, + username, + system, + cpu_arch, + inputs, + ... +}: +{ + imports = [ + ./common.nix + ./hardware_desktop.nix + ]; + + boot = { + kernelPatches = [ + { + name = "amdgpu-ignore-ctx-privileges"; + patch = pkgs.fetchpatch { + name = "cap_sys_nice_begone.patch"; + url = "https://github.com/Frogging-Family/community-patches/raw/master/linux61-tkg/cap_sys_nice_begone.mypatch"; + sha256 = "Y3a0+x2xvHsfLax/uwycdJf3xLxvVfkfDVqjkxNaYEo="; + }; + } + ]; + kernelParams = [ "amdgpu.ppfeaturemask=0xFFF7FFFF" ]; + + kernelModules = [ + # kernel module for case fan control + "nct6775" + ]; + }; + + services.xserver.enable = false; + services.desktopManager.plasma6.enable = true; + services.displayManager.sddm = { + enable = true; + wayland.enable = true; + }; + + services.openssh = { + enable = true; + ports = [ 22 ]; + settings = { + PasswordAuthentication = true; + AllowUsers = null; # Allows all users by default. Can be [ "user1" "user2" ] + UseDns = true; + X11Forwarding = false; + PermitRootLogin = "prohibit-password"; # "yes", "without-password", "prohibit-password", "forced-commands-only", "no" + }; + }; + + systemd.services.no-rgb = + let + no-rgb = pkgs.writeScriptBin "no-rgb" '' + #!/bin/sh + NUM_DEVICES=$(${pkgs.openrgb}/bin/openrgb --noautoconnect --list-devices | grep -E '^[0-9]+: ' | wc -l) + + for i in $(seq 0 $(($NUM_DEVICES - 1))); do + ${pkgs.openrgb}/bin/openrgb --noautoconnect --device $i --mode direct --color 000000 + done + ''; + in + { + description = "disable rgb"; + serviceConfig = { + ExecStart = "${no-rgb}/bin/no-rgb"; + Type = "oneshot"; + }; + wantedBy = [ "multi-user.target" ]; + }; + + services.hardware.openrgb.enable = true; + services.udev.packages = [ pkgs.openrgb ]; + hardware.i2c.enable = true; + + #System packages + environment.systemPackages = with pkgs; [ + openrgb-with-all-plugins + lact + ]; + + programs.alvr = { + enable = true; + package = inputs.alvr.legacyPackages.${pkgs.system}.alvr; + openFirewall = true; + }; + + nixpkgs.config.allowUnfreePredicate = + pkg: + builtins.elem (lib.getName pkg) [ + "steam" + "steam-original" + "steam-run" + ]; + + programs.steam = { + enable = true; + remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play + # dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server + localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers + }; + + systemd.packages = with pkgs; [ lact ]; + systemd.services.lactd.wantedBy = [ "multi-user.target" ]; + + # control case fans with gpu temperature + # I have case fans attached to my gpu for better cooling + hardware.fancontrol = { + enable = true; + config = + let + select_hwmon = "hwmon/hwmon[[:print:]]*"; + gpu_path = "/sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0/0000:0a:00.0/0000:0b:00.0/${select_hwmon}"; + mobo_path = "/sys/devices/platform/nct6775.656/${select_hwmon}"; + fan_speed = "${mobo_path}/pwm4"; + + in + '' + INTERVAL=10 + FCTEMPS=${fan_speed}=${gpu_path}/temp1_input + FCFANS= ${fan_speed}=${mobo_path}/fan4_input + MINTEMP=${fan_speed}=40 + MAXTEMP=${fan_speed}=80 + MINSTART=${fan_speed}=150 + MINSTOP=${fan_speed}=0 + MAXPWM=${fan_speed}=255 + ''; + }; +} diff --git a/nix/home-manager/flake.lock b/nix/home-manager/flake.lock new file mode 100644 index 0000000..c27ad46 --- /dev/null +++ b/nix/home-manager/flake.lock @@ -0,0 +1,400 @@ +{ + "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" + } + }, + "binsider": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726404049, + "narHash": "sha256-RXxrLtYih9jXGYOXKoFWtQRrmtw/HD5cH8FZslFsQYY=", + "owner": "orhun", + "repo": "binsider", + "rev": "fa152e84907441f64f70e7c97f79d18f6f5c9408", + "type": "github" + }, + "original": { + "owner": "orhun", + "repo": "binsider", + "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" + } + }, + "firefox-mod-theme": { + "flake": false, + "locked": { + "lastModified": 1726262539, + "narHash": "sha256-cqV/tJ9bDionSX8KzMj1dv2LRGSXcQ/xV3CWTn/elhQ=", + "owner": "datguypiko", + "repo": "Firefox-Mod-Blur", + "rev": "cbbaa4dc54a060a01b69d096cf7039d8c7aef5f0", + "type": "github" + }, + "original": { + "owner": "datguypiko", + "repo": "Firefox-Mod-Blur", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1726153070, + "narHash": "sha256-HO4zgY0ekfwO5bX0QH/3kJ/h4KvUDFZg8YpkNwIbg1U=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bcef6817a8b2aa20a5a6dbb19b43e63c5bf8619a", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726357542, + "narHash": "sha256-p4OrJL2weh0TRtaeu1fmNYP6+TOp/W2qdaIJxxQay4c=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "e524c57b1fa55d6ca9d8354c6ce1e538d2a1f47f", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "niri": { + "inputs": { + "flake-parts": "flake-parts", + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1726404066, + "narHash": "sha256-Yt438MuAaZ3DEdRcY2qA3V/L2xCG4MoxR1ROv5PmTGU=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "ed6c5c478bf87eddc276b192100cc16e76172383", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1726304152, + "narHash": "sha256-4YDrKMwXGVOBkeaISbxqf24rLuHvO98TnqxWYfgiSeg=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "6a48728ffb1e638839b07f9ab2f06b2adb41dc61", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v0.1.9", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1726304152, + "narHash": "sha256-4YDrKMwXGVOBkeaISbxqf24rLuHvO98TnqxWYfgiSeg=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "6a48728ffb1e638839b07f9ab2f06b2adb41dc61", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1726243404, + "narHash": "sha256-sjiGsMh+1cWXb53Tecsm4skyFNag33GPbVgCdfj3n9I=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "345c263f2f53a3710abe117f28a5cb86d0ba4059", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1725233747, + "narHash": "sha256-Ss8QWLXdr2JCBPcYChJhz4xJm+h/xjl4G0c0XlP6a74=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/356624c12086a18f2ea2825fed34523d60ccc4e3.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/356624c12086a18f2ea2825fed34523d60ccc4e3.tar.gz" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1726320982, + "narHash": "sha256-RuVXUwcYwaUeks6h3OLrEmg14z9aFXdWppTWPMTwdQw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8f7492cce28977fbf8bd12c72af08b1f6c7c3e49", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "protontricks": { + "flake": false, + "locked": { + "lastModified": 1722530921, + "narHash": "sha256-t794WEMJx/JNX3gTMHfgquFWB7yXkleW07+QURm1NPM=", + "owner": "Matoking", + "repo": "protontricks", + "rev": "f7b1fa33b0438dbd72f7222703f8442e40edc510", + "type": "github" + }, + "original": { + "owner": "Matoking", + "ref": "appinfo_v29", + "repo": "protontricks", + "type": "github" + } + }, + "root": { + "inputs": { + "agenix": "agenix", + "binsider": "binsider", + "firefox-mod-theme": "firefox-mod-theme", + "home-manager": "home-manager", + "niri": "niri", + "nixpkgs": "nixpkgs", + "protontricks": "protontricks", + "rust-overlay": "rust-overlay", + "vdf-patch": "vdf-patch", + "zen-browser": "zen-browser" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726382494, + "narHash": "sha256-T7W+ohiXe1IY0yf/PpS4wQItZ0SyRO+/v8kqNpMXlI4=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "ff13821613ffe5dbfeb4fe353b1f4bf291d831db", + "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" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "vdf-patch": { + "flake": false, + "locked": { + "lastModified": 1719784100, + "narHash": "sha256-OPonFrYrEFYtx0T2hvSYXl/idsm0iDPwqlnm1KbTPIo=", + "owner": "Matoking", + "repo": "vdf", + "rev": "981cad270c2558aeb8eccaf42cfcf9fabbbed199", + "type": "github" + }, + "original": { + "owner": "Matoking", + "ref": "support_new_bvdf", + "repo": "vdf", + "type": "github" + } + }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1718165778, + "narHash": "sha256-dwF9nI54a6Fo9XU5s4qmvMXSgCid3YQVGxch00qEMvI=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "b6d281967cb0b7bf1dfdb8d0f597b517dc4aa5c5", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.4", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1726378112, + "narHash": "sha256-OANPb73V/RQDqtpIcbzeJ93KuOHKFQv+1xXC44Ut7tY=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "b962a0f33b503aa39c9cf6919f488b664e5b79b4", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "zen-browser": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726001766, + "narHash": "sha256-ADvEWfo0AuHR06ah1nnzOyhsG05/b5QpUc7vFNbiEfM=", + "owner": "MarceColl", + "repo": "zen-browser-flake", + "rev": "06505a088396e2c0b9ad100302502783a6bcdb40", + "type": "github" + }, + "original": { + "owner": "MarceColl", + "repo": "zen-browser-flake", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/home-manager/flake.nix b/nix/home-manager/flake.nix new file mode 100644 index 0000000..783ae42 --- /dev/null +++ b/nix/home-manager/flake.nix @@ -0,0 +1,100 @@ +{ + description = "My nixOS flake for home-manager"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + niri = { + url = "github:sodiboo/niri-flake"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + agenix = { + url = "github:ryantm/agenix"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.home-manager.follows = "home-manager"; + }; + + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + binsider = { + url = "github:orhun/binsider"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + zen-browser = { + url = "github:MarceColl/zen-browser-flake"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + # sources to patch protontricks as it doesn't work with latest steam beta + # https://github.com/Matoking/protontricks/issues/304#issuecomment-2280920826 + protontricks = { + url = "github:Matoking/protontricks/appinfo_v29"; + flake = false; + }; + + vdf-patch = { + url = "github:Matoking/vdf/support_new_bvdf"; + flake = false; + }; + + firefox-mod-theme = { + url = "github:datguypiko/Firefox-Mod-Blur"; + flake = false; + }; + + }; + + outputs = + { + self, + nixpkgs, + home-manager, + niri, + rust-overlay, + agenix, + ... + }@inputs: + let + system = "x86_64-linux"; + username = "primary"; + homeDirectory = "/home/${username}"; + hostname = nixpkgs.lib.strings.removeSuffix "\n" (builtins.readFile /etc/hostname); + in + { + + homeConfigurations.${username} = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.${system}; + extraSpecialArgs = { + inherit inputs username homeDirectory; + }; + modules = [ + ./system-${hostname}.nix + niri.homeModules.config + agenix.homeManagerModules.age + + # add declarative rust modules + ( + { pkgs, ... }: + { + nixpkgs.overlays = [ rust-overlay.overlays.default ]; + + # home-manager stuff + home = { + inherit username homeDirectory; + }; + } + ) + ]; + }; + }; +} diff --git a/nix/home-manager/gui.nix b/nix/home-manager/gui.nix new file mode 100644 index 0000000..3c9876a --- /dev/null +++ b/nix/home-manager/gui.nix @@ -0,0 +1,192 @@ +{ + pkgs, + lib, + inputs, + config, + homeDirectory, + ... +}: +{ + imports = [ + ./no-gui.nix + ./progs/librewolf.nix + ]; + + nixpkgs.config.allowUnfreePredicate = + pkg: + builtins.elem (lib.getName pkg) [ + "apple_cursor" + "factorio-alpha" + ]; + + age.secrets.factorio = { + file = ./secrets/factorio.age; + path = "${homeDirectory}/.secrets/factorio.nix"; + }; + + home.packages = with pkgs; [ + #calculator + gnome-calculator + + #productivity stuff + libreoffice + hunspell # spellcheck + hunspellDicts.en_US # spellcheck dictionary + + #video and audio downloading + parabolic + + #soulseek client + nicotine-plus + + #dark web browsing deep web browsing + tor-browser + + #audio editing + audacity + + #fonts + noto-fonts + noto-fonts-emoji + liberation_ttf + nerdfonts + jetbrains-mono + + #for ebook reading + foliate + + #audio mixer (pavucontrol but for pipewire) + pwvucontrol + + #minecraft launcher + prismlauncher + + mpv + mumble + system76-keyboard-configurator + mission-center + + #jellyfin + finamp # music player + delfin # jellyfin client + + signal-desktop + + #accounting + gnucash + + imagemagick + inkscape + nomacs + + nautilus + + darktable + + lrcget + + #openstreetmap contributing + josm + + easyeffects + gparted + + gpt4all + + #small nicities + wl-clipboard # wl-copy & wl-paste + libnotify # notifications library + xdg-utils # xdg utils + + gnome-disk-utility + + puddletag + + inputs.zen-browser.packages."${system}".specific + + (factorio.override ( + let + data = import "${config.age.secrets.factorio.path}"; + in + { + username = data.username; + token = data.token; + } + )) + ]; + + # make chromium-based stuff use wayland + home.file.".config/chromium-flags.conf".text = "--ozone-platform-hint=auto"; + + #dark mode + dconf.settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + + home.sessionVariables = { + TERMINAL = "alacritty"; + }; + + #rofi for application launcher + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + extraConfig = { + modi = "window,drun,ssh,combi"; + combi-modi = "window,drun,ssh"; + }; + }; + + #Terminal emulator + programs.alacritty = { + enable = true; + package = pkgs.alacritty; + settings = import ./progs/alacritty.nix { inherit pkgs; }; + }; + + #for trezor stuff + /* + trezor-udev-rules #trezor udev rules + trezord + trezor-suite + monero-gui + monero-cli + trezorctl + */ + + #allow extra fonts to be detected by fontconfig + fonts.fontconfig.enable = true; + + #gtk application theming + gtk = { + enable = true; + # make gtk3 applications look like libadwaita applications! + theme = { + package = pkgs.adw-gtk3; + name = "adw-gtk3-dark"; + }; + iconTheme = { + package = pkgs.adwaita-icon-theme; + name = "Adwaita"; + }; + }; + + #qt application theming + qt = { + enable = true; + style = { + name = "breeze-dark"; + package = pkgs.kdePackages.breeze; + }; + }; + + #macOS cursor! + home.pointerCursor = { + gtk.enable = true; + package = pkgs.apple-cursor; + name = "macOS"; + size = 24; + }; +} diff --git a/nix/home-manager/no-gui.nix b/nix/home-manager/no-gui.nix new file mode 100644 index 0000000..4279aa5 --- /dev/null +++ b/nix/home-manager/no-gui.nix @@ -0,0 +1,175 @@ +{ + pkgs, + inputs, + lib, + ... +}: +{ + home.stateVersion = "24.11"; + + home.packages = with pkgs; [ + #hex viewer + hexyl + + #rust stuff + (rust-bin.selectLatestNightlyWith ( + toolchain: + toolchain.default.override { + extensions = [ + "rust-src" + "rust-analyzer" + "clippy" + "rustfmt" + "rust-std" + "cargo" + ]; + #thumbv7m-none-eabi target for stm32 + targets = [ "thumbv7m-none-eabi" ]; + } + )) + + #find typos in code + typos + + #python formatter + ruff + + #for website generation + hugo + + #java development + google-java-format # formatter + jdk # java + jdt-language-server # lsp server + + #for benchmaking stuff + hyperfine + + #replacements for common posix tools + eza # ls replacement + bat # pretty `cat` clone + delta # viewer for `git` and `diff` output + dust # pretty `du` version + duf # better `df` clone + gping # `ping`... but with a graph!! + tldr # `man` but more straight-forward and simpler + ripgrep # grep, but written in rust, respects .gitignore, and very very fast, command is `rg` + + #adds `sensors` command + lm_sensors + + #rssfeed + newsboat + + #HTML/CSS/JSON/ESLint language servers + vscode-langservers-extracted + + just + + pfetch-rs + waypipe + htop + bottom + wget + unzip + mold + gcc + compsize + killall + gnumake + + sshfs + + #nix formatter + nixfmt-rfc-style + + #serial viewer + minicom + + #"~~matt's~~ my trace route" + mtr + + file + + b3sum + + ffmpeg-full + + #microcontroller tooling + probe-rs + + (python312.withPackages ( + ps: with ps; [ + python-lsp-server # lsp + python-lsp-ruff # ruff integration + ] + )) + + binwalk + + smartmontools + + nil # nix lsp + yaml-language-server # yaml lsp + marksman # markdown lsp + + #clang-format and clang-tidy + clang-tools + + inputs.binsider.packages.${pkgs.system}.binsider + + lldb + ]; + + home.file.".cargo/config.toml".text = '' + [target.${lib.strings.removeSuffix "-linux" pkgs.system}-unknown-linux-gnu] + linker = "${pkgs.clang}/bin/clang" + rustflags = ["-C", "link-arg=-fuse-ld=${pkgs.mold}/bin/mold"] + ''; + + #default applications + home.sessionVariables = { + EDITOR = "hx"; + }; + + #feed reader + programs.newsboat = { + enable = true; + #store rss feeds in a seperate file beacuse it's *a lot* + urls = import ./progs/rss.nix; + }; + + #git (self explanatory) + programs.git = { + enable = true; + package = pkgs.git; + userName = "Simon Gardling"; + userEmail = "titaniumtown@proton.me"; + + #better way to view diffs + delta.enable = true; + + #master -> main + extraConfig = { + init = { + defaultBranch = "main"; + }; + push.autoSetupRemote = true; + }; + + #gpg signing keys + signing = { + key = "9AB28AC10ECE533D"; + signByDefault = true; + }; + }; + + #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..759d02a --- /dev/null +++ b/nix/home-manager/progs/alacritty.nix @@ -0,0 +1,118 @@ +{ 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; + + #pading 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 = { + primary = { + background = "0x131621"; + foreground = "0xa6accd"; + }; + + cursor = { + text = "CellBackground"; + cursor = "CellForeground"; + }; + + search = { + matches = { + foreground = "0x1b1e28"; + background = "0xadd7ff"; + }; + + focused_match = { + foreground = "0x1b1e28"; + background = "0xadd7ff"; + }; + }; + + selection = { + text = "CellForeground"; + background = "0x303340"; + }; + + vi_mode_cursor = { + text = "CellBackground"; + cursor = "CellForeground"; + }; + + normal = { + black = "0x1b1e28"; + red = "0xd0679d"; + green = "0x5de4c7"; + yellow = "0xfffac2"; + blue = "#435c89"; + magenta = "0xfcc5e9"; + cyan = "0xadd7ff"; + white = "0xffffff"; + }; + + bright = { + black = "0xa6accd"; + red = "0xd0679d"; + green = "0x5de4c7"; + yellow = "0xfffac2"; + blue = "0xadd7ff"; + magenta = "0xfae4fc"; + cyan = "0x89ddff"; + white = "0xffffff"; + }; + }; + + 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..0493767 --- /dev/null +++ b/nix/home-manager/progs/borg.nix @@ -0,0 +1,39 @@ +{ homeDirectory }: +{ + home = { + location = { + sourceDirectories = [ + "/etc/nixos" + "${homeDirectory}/.librewolf" + "${homeDirectory}/dotfiles" + "${homeDirectory}/.config/home-manager" + "${homeDirectory}/.config/Signal" + "${homeDirectory}/Documents" + "${homeDirectory}/projects" + "${homeDirectory}/Pictures" + "${homeDirectory}/school" + "${homeDirectory}/.wallpaper.png" + "${homeDirectory}/.ssh" + "${homeDirectory}/justfile" + "${homeDirectory}/.local/share/fish" + "${homeDirectory}/.gnupg" + ]; + excludeHomeManagerSymlinks = true; + + repositories = [ "ssh://server-public/mnt/bak/laptop" ]; + }; + + retention = { + keepHourly = 48; + keepDaily = 30; + keepWeekly = 26; + keepMonthly = 24; + keepYearly = 10; + }; + + storage = { + #super secret password location (maybe I should find a way to store secrets properly) + encryptionPasscommand = "cat ${homeDirectory}/Documents/secrets/borg_bak_pass"; + }; + }; +} diff --git a/nix/home-manager/progs/fish.nix b/nix/home-manager/progs/fish.nix new file mode 100644 index 0000000..1e76482 --- /dev/null +++ b/nix/home-manager/progs/fish.nix @@ -0,0 +1,57 @@ +{ pkgs }: +{ + enable = true; + + interactiveShellInit = '' + #disable greeting + set fish_greeting + + #fixes gnupg password entry + export GPG_TTY=(${pkgs.coreutils}/bin/tty) + + #pfetch on shell start + PF_INFO="ascii title os host kernel uptime memory editor wm" ${pkgs.pfetch-rs}/bin/pfetch + ''; + + shellAliases = { + c = "${pkgs.cargo}/bin/cargo"; + cr = "${pkgs.cargo}/bin/cargo run"; + cb = "${pkgs.cargo}/bin/cargo build"; + + # from DistroTube's dot files: Changing "ls" to "eza" + ls = "${pkgs.eza}/bin/eza -al --color=always --group-directories-first"; + la = "${pkgs.eza}/bin/eza -a --color=always --group-directories-first"; + ll = "${pkgs.eza}/bin/eza -l --color=always --group-directories-first"; + lt = "${pkgs.eza}/bin/eza -aT --color=always --group-directories-first"; + + # 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' | + ${pkgs.coreutils}/bin/sort --numeric-sort --key=2 | + ${pkgs.coreutils}/bin/cut -c 1-12,41- | + ${pkgs.coreutils}/bin/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/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..f7b766b --- /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 [ + "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..89248ea --- /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: "JetBrainsMono Nerd Font"; + padding-left: 3px; + padding-right: 3px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + } + + #pulseaudio:hover { + background: @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/factorio.age b/nix/home-manager/secrets/factorio.age new file mode 100644 index 0000000..28800c0 Binary files /dev/null and b/nix/home-manager/secrets/factorio.age differ diff --git a/nix/home-manager/secrets/secrets.nix b/nix/home-manager/secrets/secrets.nix new file mode 100644 index 0000000..7a30db5 --- /dev/null +++ b/nix/home-manager/secrets/secrets.nix @@ -0,0 +1,10 @@ +let + laptop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4jL6gYOunUlUtPvGdML0cpbKSsPNqQ1jit4E7U1RyH"; + desktop = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJjT5QZ3zRDb+V6Em20EYpSEgPW5e/U+06uQGJdraxi"; +in +{ + "factorio.age".publicKeys = [ + laptop + desktop + ]; +} diff --git a/nix/home-manager/system-mreow.nix b/nix/home-manager/system-mreow.nix new file mode 100644 index 0000000..1c8323f --- /dev/null +++ b/nix/home-manager/system-mreow.nix @@ -0,0 +1,161 @@ +{ + config, + pkgs, + lib, + homeDirectory, + ... +}: +{ + imports = [ ./gui.nix ]; + + home.packages = with pkgs; [ + wdisplays + intel-gpu-tools + swaylock + + #manage bluetooth devices + blueman + ]; + + #bluetooth manager + services.blueman-applet.enable = true; + + #notification daemon + services.dunst = { + enable = true; + package = pkgs.dunst; + }; + + #window manager + programs.niri = { + 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; }; + + #backup utility + programs.borgmatic = { + enable = true; + package = pkgs.borgmatic; + backups = import ./progs/borg.nix { inherit homeDirectory; }; + }; + + # 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; + }; +}