diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..210573c --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1771574726, + "narHash": "sha256-D1PA3xQv/s4W3lnR9yJFSld8UOLr0a/cBWMQMXS+1Qg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c217913993d6c6f6805c3b1a3bda5e639adfde6d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..4ded4e7 --- /dev/null +++ b/flake.nix @@ -0,0 +1,12 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + }; + + outputs = {self, nixpkgs, ...}: { + nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ ./prospero/configuration.nix ]; + }; + }; +} diff --git a/prospero/configuration.nix b/prospero/configuration.nix new file mode 100644 index 0000000..445c465 --- /dev/null +++ b/prospero/configuration.nix @@ -0,0 +1,209 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, lib, pkgs, ... }: + +{ + nixpkgs.overlays = [ (final: prev: { + inherit (prev.lixPackageSets.stable) + nixpkgs-review + nix-eval-jobs + nix-fast-build + colmena; + }) ]; + nix.package = pkgs.lixPackageSets.stable.lix; + nix.settings.experimental-features = ["nix-command" "flakes"]; + imports = + [ # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; + hardware.bluetooth.enable = true; + # Bootloader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + # Use latest kernel. + boot.kernelPackages = pkgs.linuxPackages_latest; + + # Living on the edge! + # (no but seriously this is a personal machine I use for dev. There's no reason + # NOT to do this) + boot.kernel.sysctl."net.ipv4.ip_unprivileged_port_start" = 0; + + networking.hostName = "prospero"; # Define your hostname. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Enable networking + networking.networkmanager.enable = true; + + virtualisation = { + containers.enable = true; + docker = { + enable = true; + }; + }; + + systemd.services."user@".serviceConfig.Delegate="cpu cpuset io memory pids"; + + systemd.packages = [( + pkgs.writeTextFile { + name = "delegate.conf"; + text = '' + [Service] + Delegate=yes + ''; + destination = "/etc/systemd/system/user@.service.d/delegate.conf"; + } + )]; + + # Set your time zone. + time.timeZone = "America/New_York"; + + # 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 the X11 windowing system. + # You can disable this if you're only using the Wayland session. + services.xserver.enable = true; + + # Enable the KDE Plasma Desktop Environment. + services.displayManager.sddm.enable = true; + services.desktopManager.plasma6.enable = true; + + # Configure keymap in X11 + services.xserver.xkb = { + layout = "us"; + variant = ""; + }; + + # Enable CUPS to print documents. + services.printing.enable = true; + + # Enable sound with pipewire. + services.pulseaudio.enable = false; + 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; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + + # Enable touchpad support (enabled default in most desktopManager). + # services.xserver.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.joshua = { + subUidRanges = [ { startUid = 100000; count = 65536; } ]; + subGidRanges = [ { startGid = 100000; count = 65536; } ]; + isNormalUser = true; + description = "Joshua Barrett"; + shell = pkgs.zsh; + extraGroups = [ "networkmanager" "wheel" "docker" ]; + packages = with pkgs; [ + + ]; + }; + + # Install firefox. + programs.firefox.enable = true; + programs.zsh.enable = true; + programs.foot.enable = true; + # Install steam + programs.steam = { + enable = true; + remotePlay.openFirewall = true; + localNetworkGameTransfers.openFirewall = true; + }; + + # Allow unfree packages + nixpkgs.config.allowUnfree = true; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + gcc + gnumake + bison + flex + autoconf + automake + libtool + discord + calibre + libreoffice + enchant + rustup + pkg-config + passt + # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. + # wget + ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + programs.git.enable = true; + programs.ssh.startAgent = true; + + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + # syncthing gets run as a user service, but we need the ports open up here + services.syncthing.openDefaultPorts = true; + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + networking.nftables.enable = true; + networking.firewall = { + enable = true; + trustedInterfaces = [ "tailscale0" ]; + allowedUDPPorts = [ config.services.tailscale.port ]; + }; + + systemd.services.tailscaled.serviceConfig.Environment = [ + "TS_DEBUG_FIREWALL_MODE=nftables" + ]; + services.tailscale.enable = true; + services.resolved.enable = true; + systemd.network.wait-online.enable = false; + boot.initrd.systemd.network.wait-online.enable = false; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "25.05"; # Did you read the comment? + +} diff --git a/prospero/hardware-configuration.nix b/prospero/hardware-configuration.nix new file mode 100644 index 0000000..fa324af --- /dev/null +++ b/prospero/hardware-configuration.nix @@ -0,0 +1,41 @@ +# 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" "sd_mod" "rtsx_pci_sdmmc" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/c3671d1e-92a3-43de-a52f-e649cf309931"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/A250-67DA"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/af095409-4c04-4b58-a20f-3a47bce0eb82"; } + ]; + + # 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.enp2s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} -- 2.51.2 From c0ff741653309361ad26662f7f0cb5279bf7dc8f Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Mon, 9 Mar 2026 13:16:15 -0400 Subject: [PATCH 02/48] added prospero, home manager config to repo --- dt-common.nix | 145 ++++++++++++++++++++++++++++++++ flake.lock | 21 +++++ flake.nix | 24 ++++-- home-manager/#default.nix# | 1 + home-manager/.#default.nix | 1 + home-manager/default.nix | 0 home-manager/home.nix | 99 ++++++++++++++++++++++ prospero/configuration.nix | 124 --------------------------- uruk/configuration.nix | 116 +++++++++++++++++++++++++ uruk/hardware-configuration.nix | 51 +++++++++++ 10 files changed, 453 insertions(+), 129 deletions(-) create mode 100644 dt-common.nix create mode 100644 home-manager/#default.nix# create mode 120000 home-manager/.#default.nix create mode 100644 home-manager/default.nix create mode 100644 home-manager/home.nix create mode 100644 uruk/configuration.nix create mode 100644 uruk/hardware-configuration.nix diff --git a/dt-common.nix b/dt-common.nix new file mode 100644 index 0000000..08051f8 --- /dev/null +++ b/dt-common.nix @@ -0,0 +1,145 @@ +# dt-common.nix: configuration common to every computer where I have a desktop +# environment. +{ config, pkgs, lib, ... }: +{ + nix.settings.experimental-features = ["nix-command" "flakes"]; + networking.networkmanager.enable = true; + + virtualisation = { + containers.enable = true; + docker = { + enable = true; + }; + }; + + systemd.services."user@".serviceConfig.Delegate="cpu cpuset io memory pids"; + + systemd.packages = [( + pkgs.writeTextFile { + name = "delegate.conf"; + text = '' + [Service] + Delegate=yes + ''; + destination = "/etc/systemd/system/user@.service.d/delegate.conf"; + } + )]; + + # Set your time zone. + time.timeZone = "America/New_York"; + + # 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"; + }; + + # TODO move to niri + # Enable the X11 windowing system. + # You can disable this if you're only using the Wayland session. + services.xserver.enable = true; + + # Enable the KDE Plasma Desktop Environment. + services.displayManager.sddm.enable = true; + services.desktopManager.plasma6.enable = true; + + # Configure keymap in X11 + services.xserver.xkb = { + layout = "us"; + variant = ""; + }; + + # Enable CUPS to print documents. + services.printing.enable = true; + + # Enable sound with pipewire. + services.pulseaudio.enable = false; + 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; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + users.users.joshua = { + subUidRanges = [ { startUid = 100000; count = 65536; } ]; + subGidRanges = [ { startGid = 100000; count = 65536; } ]; + isNormalUser = true; + description = "Joshua Barrett"; + shell = pkgs.zsh; + extraGroups = [ "networkmanager" "wheel" "docker" ]; + packages = with pkgs; [ + + ]; + }; + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.joshua = ./home-manager/home.nix; + + # Install firefox. + programs.firefox.enable = true; + programs.zsh.enable = true; + programs.foot.enable = true; + programs.git.enable = true; + programs.ssh.startAgent = true; + + # Install steam + programs.steam = { + enable = true; + remotePlay.openFirewall = true; + localNetworkGameTransfers.openFirewall = true; + }; + + # Allow unfree packages + nixpkgs.config.allowUnfree = true; + + services.syncthing.openDefaultPorts = true; + + environment.systemPackages = with pkgs; [ + gcc + gnumake + bison + flex + autoconf + automake + libtool + discord + calibre + libreoffice + enchant + rustup + pkg-config + passt + # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. + # wget + ]; + networking.nftables.enable = true; + networking.firewall = { + enable = true; + trustedInterfaces = [ "tailscale0" ]; + allowedUDPPorts = [ config.services.tailscale.port ]; + }; + + systemd.services.tailscaled.serviceConfig.Environment = [ + "TS_DEBUG_FIREWALL_MODE=nftables" + ]; + services.tailscale.enable = true; + services.resolved.enable = true; + systemd.network.wait-online.enable = false; + boot.initrd.systemd.network.wait-online.enable = false; +} diff --git a/flake.lock b/flake.lock index 210573c..de4fdac 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,25 @@ { "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772985285, + "narHash": "sha256-wEEmvfqJcl9J0wyMgMrj1TixOgInBW/6tLPhWGoZE3s=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "5be5d8245cbc7bc0c09fbb5f38f23f223c543f85", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1771574726, @@ -18,6 +38,7 @@ }, "root": { "inputs": { + "home-manager": "home-manager", "nixpkgs": "nixpkgs" } } diff --git a/flake.nix b/flake.nix index 4ded4e7..f811320 100644 --- a/flake.nix +++ b/flake.nix @@ -1,12 +1,26 @@ { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = {self, nixpkgs, ...}: { - nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ ./prospero/configuration.nix ]; + outputs = {self, home-manager, nixpkgs, ...}: + { + #TODO put home-manager in dtcommon + nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ home-manager.nixosModules.home-manager + ./dt-common.nix + ./prospero/configuration.nix ]; + }; + nixosConfigurations.uruk = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ home-manager.nixosModules.home-manager + ./dt-common.nix + ./uruk/configuration.nix ]; + }; }; - }; } diff --git a/home-manager/#default.nix# b/home-manager/#default.nix# new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/home-manager/#default.nix# @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/home-manager/.#default.nix b/home-manager/.#default.nix new file mode 120000 index 0000000..31b65b2 --- /dev/null +++ b/home-manager/.#default.nix @@ -0,0 +1 @@ +joshua@prospero.1084246:1771686841 \ No newline at end of file diff --git a/home-manager/default.nix b/home-manager/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/home-manager/home.nix b/home-manager/home.nix new file mode 100644 index 0000000..b3193f5 --- /dev/null +++ b/home-manager/home.nix @@ -0,0 +1,99 @@ +{ config, pkgs, ... }: + +{ + # Home Manager needs a bit of information about you and the paths it should + # manage. + home.username = "joshua"; + home.homeDirectory = "/home/joshua"; + + # This value determines the Home Manager release that your configuration is + # compatible with. This helps avoid breakage when a new Home Manager release + # introduces backwards incompatible changes. + # + # You should not change this value, even if you update Home Manager. If you do + # want to update the value, then make sure to first check the Home Manager + # release notes. + home.stateVersion = "25.05"; # Please read the comment before changing. + + # The home.packages option allows you to install Nix packages into your + # environment. + home.packages = with pkgs; [ + # # Adds the 'hello' command to your environment. It prints a friendly + # # "Hello, world!" when run. + rsync + keepassxc + syncthing + terminus_font + jujutsu + ripgrep + goose-cli + kubectl + k3d + tilt + # # It is sometimes useful to fine-tune packages, for example, by applying + # # overrides. You can do that directly here, just don't forget the + # # parentheses. Maybe you want to install Nerd Fonts with a limited number of + # # fonts? + # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; }) + + # # You can also create simple shell scripts directly inside your + # # configuration. For example, this adds a command 'my-hello' to your + # # environment: + # (pkgs.writeShellScriptBin "my-hello" '' + # echo "Hello, ${config.home.username}!" + # '') + ]; + + # Home Manager is pretty good at managing dotfiles. The primary way to manage + # plain files is through 'home.file'. + home.file = { + # # Building this configuration will create a copy of 'dotfiles/screenrc' in + # # the Nix store. Activating the configuration will then make '~/.screenrc' a + # # symlink to the Nix store copy. + # ".screenrc".source = dotfiles/screenrc; + + # # You can also set the file content immediately. + # ".gradle/gradle.properties".text = '' + # org.gradle.console=verbose + # org.gradle.daemon.idletimeout=3600000 + # ''; + }; + + # Home Manager can also manage your environment variables through + # 'home.sessionVariables'. These will be explicitly sourced when using a + # shell provided by Home Manager. If you don't want to manage your shell + # through Home Manager then you have to manually source 'hm-session-vars.sh' + # located at either + # + # ~/.nix-profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # /etc/profiles/per-user/joshua/etc/profile.d/hm-session-vars.sh + # + home.sessionVariables = { + + }; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; + programs.zsh.enable = true; + programs.emacs.enable = true; + programs.atuin ={ + enable = true; + flags = [ "--disable-up-arrow" ]; + }; + programs.direnv = { + enable = true; + enableZshIntegration = true; + nix-direnv.enable = true; + }; + services.emacs.enable = true; + services.emacs.defaultEditor = true; + services.emacs.startWithUserSession = "graphical"; +} + diff --git a/prospero/configuration.nix b/prospero/configuration.nix index 445c465..a660a97 100644 --- a/prospero/configuration.nix +++ b/prospero/configuration.nix @@ -5,14 +5,6 @@ { config, lib, pkgs, ... }: { - nixpkgs.overlays = [ (final: prev: { - inherit (prev.lixPackageSets.stable) - nixpkgs-review - nix-eval-jobs - nix-fast-build - colmena; - }) ]; - nix.package = pkgs.lixPackageSets.stable.lix; nix.settings.experimental-features = ["nix-command" "flakes"]; imports = [ # Include the results of the hardware scan. @@ -40,107 +32,11 @@ # Enable networking networking.networkmanager.enable = true; - - virtualisation = { - containers.enable = true; - docker = { - enable = true; - }; - }; - - systemd.services."user@".serviceConfig.Delegate="cpu cpuset io memory pids"; - - systemd.packages = [( - pkgs.writeTextFile { - name = "delegate.conf"; - text = '' - [Service] - Delegate=yes - ''; - destination = "/etc/systemd/system/user@.service.d/delegate.conf"; - } - )]; - - # Set your time zone. - time.timeZone = "America/New_York"; - - # 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 the X11 windowing system. - # You can disable this if you're only using the Wayland session. - services.xserver.enable = true; - - # Enable the KDE Plasma Desktop Environment. - services.displayManager.sddm.enable = true; - services.desktopManager.plasma6.enable = true; - - # Configure keymap in X11 - services.xserver.xkb = { - layout = "us"; - variant = ""; - }; - - # Enable CUPS to print documents. - services.printing.enable = true; - - # Enable sound with pipewire. - services.pulseaudio.enable = false; - 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; - - # use the example session manager (no others are packaged yet so this is enabled by default, - # no need to redefine it in your config for now) - #media-session.enable = true; - }; # Enable touchpad support (enabled default in most desktopManager). # services.xserver.libinput.enable = true; # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.joshua = { - subUidRanges = [ { startUid = 100000; count = 65536; } ]; - subGidRanges = [ { startGid = 100000; count = 65536; } ]; - isNormalUser = true; - description = "Joshua Barrett"; - shell = pkgs.zsh; - extraGroups = [ "networkmanager" "wheel" "docker" ]; - packages = with pkgs; [ - - ]; - }; - - # Install firefox. - programs.firefox.enable = true; - programs.zsh.enable = true; - programs.foot.enable = true; - # Install steam - programs.steam = { - enable = true; - remotePlay.openFirewall = true; - localNetworkGameTransfers.openFirewall = true; - }; - - # Allow unfree packages - nixpkgs.config.allowUnfree = true; # List packages installed in system profile. To search, run: # $ nix search wget @@ -162,11 +58,6 @@ # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. # wget ]; - - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - programs.git.enable = true; - programs.ssh.startAgent = true; # programs.mtr.enable = true; # programs.gnupg.agent = { @@ -178,25 +69,10 @@ # Enable the OpenSSH daemon. # services.openssh.enable = true; # syncthing gets run as a user service, but we need the ports open up here - services.syncthing.openDefaultPorts = true; # Open ports in the firewall. # networking.firewall.allowedTCPPorts = [ ... ]; # networking.firewall.allowedUDPPorts = [ ... ]; # Or disable the firewall altogether. - networking.nftables.enable = true; - networking.firewall = { - enable = true; - trustedInterfaces = [ "tailscale0" ]; - allowedUDPPorts = [ config.services.tailscale.port ]; - }; - - systemd.services.tailscaled.serviceConfig.Environment = [ - "TS_DEBUG_FIREWALL_MODE=nftables" - ]; - services.tailscale.enable = true; - services.resolved.enable = true; - systemd.network.wait-online.enable = false; - boot.initrd.systemd.network.wait-online.enable = false; # This value determines the NixOS release from which the default # settings for stateful data, like file locations and database versions diff --git a/uruk/configuration.nix b/uruk/configuration.nix new file mode 100644 index 0000000..2e5ed85 --- /dev/null +++ b/uruk/configuration.nix @@ -0,0 +1,116 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page, on +# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). + +{ config, lib, pkgs, ... }: + +{ + imports = + [ # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; + + # Use the systemd-boot EFI boot loader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + networking.hostId = "5398fbbf"; + networking.hostName = "uruk"; # Define your hostname. + + # Configure network connections interactively with nmcli or nmtui. + + # Set your time zone. + # time.timeZone = "Europe/Amsterdam"; + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. + # i18n.defaultLocale = "en_US.UTF-8"; + #console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + # useXkbConfig = true; # use xkb.options in tty. + #}; + + # Configure keymap in X11 + # services.xserver.xkb.layout = "us"; + # services.xserver.xkb.options = "eurosign:e,caps:escape"; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound. + # services.pulseaudio.enable = true; + # OR + # services.pipewire = { + # enable = true; + # pulse.enable = true; + # }; + + # Enable touchpad support (enabled default in most desktopManager). + # services.libinput.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + # users.users.alice = { + # isNormalUser = true; + # extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. + # packages = with pkgs; [ + # tree + # ]; + # }; + + # programs.firefox.enable = true; + + # List packages installed in system profile. + # You can use https://search.nixos.org/ to find more packages (and options). + # environment.systemPackages = with pkgs; [ + # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. + # wget + # ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Copy the NixOS configuration file and link it from the resulting system + # (/run/current-system/configuration.nix). This is useful in case you + # accidentally delete configuration.nix. + # system.copySystemConfiguration = true; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how + # to actually do that. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "25.11"; # Did you read the comment? + +} + diff --git a/uruk/hardware-configuration.nix b/uruk/hardware-configuration.nix new file mode 100644 index 0000000..7dcfec7 --- /dev/null +++ b/uruk/hardware-configuration.nix @@ -0,0 +1,51 @@ +# 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 = [ ]; + boot.zfs.extraPools = [ "datastore" ]; + fileSystems."/" = + { device = "zpool/root"; + fsType = "zfs"; + }; + fileSystems."/boot" = + { + device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part1"; + fsType = "vfat"; + }; + fileSystems."/nix" = + { device = "zpool/nix"; + fsType = "zfs"; + }; + + fileSystems."/var" = + { device = "zpool/var"; + fsType = "zfs"; + }; + + fileSystems."/home" = + { device = "zpool/home"; + fsType = "zfs"; + }; + + swapDevices = [{ + device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part3"; + randomEncryption = true; + } + { + device = "/dev/disk/by-id/nvme-TEAM_TM8FP6001T_112301031502314-part3"; + randomEncryption = true; + }]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} -- 2.51.2 From 8cf4248798e7d1c198ffbbd2b858e1eb88f2d3b8 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 10 Mar 2026 15:13:53 -0400 Subject: [PATCH 03/48] migration to unstable, lots of improvements (it's still bad though) --- all.nix | 11 ++++ dt-common.nix | 12 ++-- flake.lock | 25 ++++++-- flake.nix | 23 +++++--- home-manager/.#default.nix | 1 - home-manager/home.nix | 4 +- modules/zfs.nix | 62 ++++++++++++++++++++ uruk/configuration.nix | 100 ++------------------------------ uruk/hardware-configuration.nix | 16 ++--- 9 files changed, 128 insertions(+), 126 deletions(-) create mode 100644 all.nix delete mode 120000 home-manager/.#default.nix create mode 100644 modules/zfs.nix diff --git a/all.nix b/all.nix new file mode 100644 index 0000000..eed28fc --- /dev/null +++ b/all.nix @@ -0,0 +1,11 @@ +# Configuration options I want set on every system. +{ config, pkgs, lib, ... }: +{ + nix = { + settings.experimental-features = ["nix-command" "flakes"]; + gc = { + automatic = true; + dates = "monthly"; + }; + }; +} diff --git a/dt-common.nix b/dt-common.nix index 08051f8..ece956a 100644 --- a/dt-common.nix +++ b/dt-common.nix @@ -2,7 +2,6 @@ # environment. { config, pkgs, lib, ... }: { - nix.settings.experimental-features = ["nix-command" "flakes"]; networking.networkmanager.enable = true; virtualisation = { @@ -12,6 +11,9 @@ }; }; + # this allows for rootless container runtimes to set resource limits. Still + # not using this yet because there are some kinks with rootless runtimes, but + # hopefully I will eventually. systemd.services."user@".serviceConfig.Delegate="cpu cpuset io memory pids"; systemd.packages = [( @@ -56,8 +58,10 @@ services.xserver.xkb = { layout = "us"; variant = ""; + options = "ctrl:swapcaps,compose:ralt"; }; - + console.useXkbConfig = true; + # Enable CUPS to print documents. services.printing.enable = true; @@ -125,8 +129,8 @@ rustup pkg-config passt - # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. - # wget + # vim # Do not forget to add an editor to edit configuration.nix! The Nano + # editor is also installed by default. wget ]; networking.nftables.enable = true; networking.firewall = { diff --git a/flake.lock b/flake.lock index de4fdac..5484f33 100644 --- a/flake.lock +++ b/flake.lock @@ -22,11 +22,27 @@ }, "nixpkgs": { "locked": { - "lastModified": 1771574726, - "narHash": "sha256-D1PA3xQv/s4W3lnR9yJFSld8UOLr0a/cBWMQMXS+1Qg=", + "lastModified": 1772963539, + "narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c217913993d6c6f6805c3b1a3bda5e639adfde6d", + "rev": "9dcb002ca1690658be4a04645215baea8b95f31d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1773068389, + "narHash": "sha256-vMrm7Pk2hjBRPnCSjhq1pH0bg350Z+pXhqZ9ICiqqCs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "44bae273f9f82d480273bab26f5c50de3724f52f", "type": "github" }, "original": { @@ -39,7 +55,8 @@ "root": { "inputs": { "home-manager": "home-manager", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "nixpkgs-stable": "nixpkgs-stable" } } }, diff --git a/flake.nix b/flake.nix index f811320..0f45434 100644 --- a/flake.nix +++ b/flake.nix @@ -1,26 +1,33 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11"; home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; }; - outputs = {self, home-manager, nixpkgs, ...}: + outputs = {self, home-manager, nixpkgs, nixpkgs-stable, ...}: { #TODO put home-manager in dtcommon nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; - modules = [ home-manager.nixosModules.home-manager - ./dt-common.nix - ./prospero/configuration.nix ]; + modules = [ + ./all.nix + home-manager.nixosModules.home-manager + ./dt-common.nix + ./prospero/configuration.nix + ]; }; nixosConfigurations.uruk = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; - modules = [ home-manager.nixosModules.home-manager - ./dt-common.nix - ./uruk/configuration.nix ]; + modules = [ + ./all.nix + home-manager.nixosModules.home-manager + ./dt-common.nix + ./uruk/configuration.nix + ]; }; }; } diff --git a/home-manager/.#default.nix b/home-manager/.#default.nix deleted file mode 120000 index 31b65b2..0000000 --- a/home-manager/.#default.nix +++ /dev/null @@ -1 +0,0 @@ -joshua@prospero.1084246:1771686841 \ No newline at end of file diff --git a/home-manager/home.nix b/home-manager/home.nix index b3193f5..0b582a7 100644 --- a/home-manager/home.nix +++ b/home-manager/home.nix @@ -32,8 +32,8 @@ tilt # # It is sometimes useful to fine-tune packages, for example, by applying # # overrides. You can do that directly here, just don't forget the - # # parentheses. Maybe you want to install Nerd Fonts with a limited number of - # # fonts? + # # parentheses. Maybe you want to install Nerd Fonts with a limited number + # # of fonts? # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; }) # # You can also create simple shell scripts directly inside your diff --git a/modules/zfs.nix b/modules/zfs.nix new file mode 100644 index 0000000..927f862 --- /dev/null +++ b/modules/zfs.nix @@ -0,0 +1,62 @@ +{ + lib, + pkgs, + config, + ... +}: let + cfg = config.profiles.zfs; +in + with lib; { + options.profiles.zfs = { + enable = mkEnableOption "ZFS profile"; + }; + + config = mkIf cfg.enable ( + let + isUnstable = config.boot.zfs.package == pkgs.zfs_unstable; + zfsCompatibleKernelPackages = + lib.filterAttrs + ( + name: kernelPackages: + (builtins.match "linux_[0-9]+_[0-9]+" name) + != null + && (builtins.tryEval kernelPackages).success + && ( + (!isUnstable && + !kernelPackages.${pkgs.zfs.kernelModuleAttribute}.meta.broken) + || (isUnstable && !kernelPackages.zfs_unstable.meta.broken) + ) + ) + pkgs.linuxKernel.packages; + latestZfsKernel = lib.last ( + lib.sort + (a: b: (lib.versionOlder a.kernel.version b.kernel.version)) ( + builtins.attrValues zfsCompatibleKernelPackages + ) + ); + in { + boot = { + # Note this might jump back and worth as kernel get added or removed. + kernelPackages = latestZfsKernel; + supportedFilesystems = ["zfs"]; + zfs.devNodes = "/dev/disk/by-id"; + }; + + # ZFS configuration + services.zfs = { + # Enable TRIM + trim.enable = mkDefault true; + # Enable automatic scrubbing and snapshotting. + autoScrub.enable = mkDefault true; + autoSnapshot = { + enable = mkDefault true; + frequent = mkDefault 4; + daily = mkDefault 3; + weekly = mkDefault 2; + monthly = mkDefault 2; + }; + zed.enableMail = false; + }; + } + ); + } diff --git a/uruk/configuration.nix b/uruk/configuration.nix index 2e5ed85..8b0aec7 100644 --- a/uruk/configuration.nix +++ b/uruk/configuration.nix @@ -8,108 +8,18 @@ imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix + ../modules/zfs.nix ]; # Use the systemd-boot EFI boot loader. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; + hardware.amdgpu.initrd.enable = true; + hardware.bluetooth.enable = true; + profiles.zfs.enable = true; networking.hostId = "5398fbbf"; networking.hostName = "uruk"; # Define your hostname. - - # Configure network connections interactively with nmcli or nmtui. - - # Set your time zone. - # time.timeZone = "Europe/Amsterdam"; - - # Configure network proxy if necessary - # networking.proxy.default = "http://user:password@proxy:port/"; - # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; - - # Select internationalisation properties. - # i18n.defaultLocale = "en_US.UTF-8"; - #console = { - # font = "Lat2-Terminus16"; - # keyMap = "us"; - # useXkbConfig = true; # use xkb.options in tty. - #}; - - # Configure keymap in X11 - # services.xserver.xkb.layout = "us"; - # services.xserver.xkb.options = "eurosign:e,caps:escape"; - - # Enable CUPS to print documents. - # services.printing.enable = true; - - # Enable sound. - # services.pulseaudio.enable = true; - # OR - # services.pipewire = { - # enable = true; - # pulse.enable = true; - # }; - - # Enable touchpad support (enabled default in most desktopManager). - # services.libinput.enable = true; - - # Define a user account. Don't forget to set a password with ‘passwd’. - # users.users.alice = { - # isNormalUser = true; - # extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - # packages = with pkgs; [ - # tree - # ]; - # }; - - # programs.firefox.enable = true; - - # List packages installed in system profile. - # You can use https://search.nixos.org/ to find more packages (and options). - # environment.systemPackages = with pkgs; [ - # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. - # wget - # ]; - - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - # programs.mtr.enable = true; - # programs.gnupg.agent = { - # enable = true; - # enableSSHSupport = true; - # }; - - # List services that you want to enable: - - # Enable the OpenSSH daemon. - # services.openssh.enable = true; - - # Open ports in the firewall. - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - # networking.firewall.enable = false; - - # Copy the NixOS configuration file and link it from the resulting system - # (/run/current-system/configuration.nix). This is useful in case you - # accidentally delete configuration.nix. - # system.copySystemConfiguration = true; - - # This option defines the first version of NixOS you have installed on this particular machine, - # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. - # - # Most users should NEVER change this value after the initial install, for any reason, - # even if you've upgraded your system to a new NixOS release. - # - # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, - # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how - # to actually do that. - # - # This value being lower than the current NixOS release does NOT mean your system is - # out of date, out of support, or vulnerable. - # - # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, - # and migrated your data accordingly. - # - # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + services.openssh.enable = true; system.stateVersion = "25.11"; # Did you read the comment? } diff --git a/uruk/hardware-configuration.nix b/uruk/hardware-configuration.nix index 7dcfec7..7e12562 100644 --- a/uruk/hardware-configuration.nix +++ b/uruk/hardware-configuration.nix @@ -8,7 +8,8 @@ [ (modulesPath + "/installer/scan/not-detected.nix") ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.availableKernelModules = + [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ "kvm-amd" ]; boot.extraModulePackages = [ ]; @@ -27,16 +28,6 @@ fsType = "zfs"; }; - fileSystems."/var" = - { device = "zpool/var"; - fsType = "zfs"; - }; - - fileSystems."/home" = - { device = "zpool/home"; - fsType = "zfs"; - }; - swapDevices = [{ device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part3"; randomEncryption = true; @@ -47,5 +38,6 @@ }]; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + hardware.cpu.amd.updateMicrocode = lib.mkDefault + config.hardware.enableRedistributableFirmware; } -- 2.51.2 From 0ec6d9a048ef68c83967df13fd7002d8fcc68cd3 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Wed, 11 Mar 2026 11:26:48 -0400 Subject: [PATCH 04/48] massive refactoring and new config options all around! Mostly stolen from orual... --- all.nix | 11 - dt-common.nix | 149 ---- flake.lock | 709 +++++++++++++++++- flake.nix | 114 ++- home-manager/#default.nix# | 1 - home-manager/default.nix | 0 home-manager/home.nix | 99 --- .../prospero}/configuration.nix | 0 hosts/prospero/default.nix | 7 + .../prospero}/hardware-configuration.nix | 0 hosts/prospero/home.nix | 2 + {uruk => hosts/uruk}/configuration.nix | 24 +- hosts/uruk/default.nix | 9 + .../uruk}/hardware-configuration.nix | 0 hosts/uruk/home.nix | 28 + lib/default.nix | 107 +++ modules/home/default.nix | 30 + modules/home/profiles/default.nix | 3 + modules/home/profiles/desktop/default.nix | 61 ++ modules/home/profiles/desktop/iskandar.png | Bin 0 -> 124980 bytes modules/home/profiles/desktop/niri.nix | 347 +++++++++ modules/nixos/default.nix | 98 +++ modules/nixos/nix.nix | 101 +++ modules/nixos/profiles/desktop/default.nix | 120 +++ modules/nixos/profiles/desktop/niri.nix | 59 ++ modules/nixos/profiles/docs.nix | 49 ++ modules/nixos/profiles/games.nix | 40 + modules/nixos/profiles/networking.nix | 113 +++ modules/nixos/profiles/perftools.nix | 27 + modules/{ => nixos/profiles}/zfs.nix | 0 30 files changed, 2015 insertions(+), 293 deletions(-) delete mode 100644 all.nix delete mode 100644 dt-common.nix delete mode 100644 home-manager/#default.nix# delete mode 100644 home-manager/default.nix delete mode 100644 home-manager/home.nix rename {prospero => hosts/prospero}/configuration.nix (100%) create mode 100644 hosts/prospero/default.nix rename {prospero => hosts/prospero}/hardware-configuration.nix (100%) create mode 100644 hosts/prospero/home.nix rename {uruk => hosts/uruk}/configuration.nix (50%) create mode 100644 hosts/uruk/default.nix rename {uruk => hosts/uruk}/hardware-configuration.nix (100%) create mode 100644 hosts/uruk/home.nix create mode 100644 lib/default.nix create mode 100644 modules/home/default.nix create mode 100644 modules/home/profiles/default.nix create mode 100644 modules/home/profiles/desktop/default.nix create mode 100644 modules/home/profiles/desktop/iskandar.png create mode 100644 modules/home/profiles/desktop/niri.nix create mode 100644 modules/nixos/default.nix create mode 100644 modules/nixos/nix.nix create mode 100644 modules/nixos/profiles/desktop/default.nix create mode 100644 modules/nixos/profiles/desktop/niri.nix create mode 100644 modules/nixos/profiles/docs.nix create mode 100644 modules/nixos/profiles/games.nix create mode 100644 modules/nixos/profiles/networking.nix create mode 100644 modules/nixos/profiles/perftools.nix rename modules/{ => nixos/profiles}/zfs.nix (100%) diff --git a/all.nix b/all.nix deleted file mode 100644 index eed28fc..0000000 --- a/all.nix +++ /dev/null @@ -1,11 +0,0 @@ -# Configuration options I want set on every system. -{ config, pkgs, lib, ... }: -{ - nix = { - settings.experimental-features = ["nix-command" "flakes"]; - gc = { - automatic = true; - dates = "monthly"; - }; - }; -} diff --git a/dt-common.nix b/dt-common.nix deleted file mode 100644 index ece956a..0000000 --- a/dt-common.nix +++ /dev/null @@ -1,149 +0,0 @@ -# dt-common.nix: configuration common to every computer where I have a desktop -# environment. -{ config, pkgs, lib, ... }: -{ - networking.networkmanager.enable = true; - - virtualisation = { - containers.enable = true; - docker = { - enable = true; - }; - }; - - # this allows for rootless container runtimes to set resource limits. Still - # not using this yet because there are some kinks with rootless runtimes, but - # hopefully I will eventually. - systemd.services."user@".serviceConfig.Delegate="cpu cpuset io memory pids"; - - systemd.packages = [( - pkgs.writeTextFile { - name = "delegate.conf"; - text = '' - [Service] - Delegate=yes - ''; - destination = "/etc/systemd/system/user@.service.d/delegate.conf"; - } - )]; - - # Set your time zone. - time.timeZone = "America/New_York"; - - # 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"; - }; - - # TODO move to niri - # Enable the X11 windowing system. - # You can disable this if you're only using the Wayland session. - services.xserver.enable = true; - - # Enable the KDE Plasma Desktop Environment. - services.displayManager.sddm.enable = true; - services.desktopManager.plasma6.enable = true; - - # Configure keymap in X11 - services.xserver.xkb = { - layout = "us"; - variant = ""; - options = "ctrl:swapcaps,compose:ralt"; - }; - console.useXkbConfig = true; - - # Enable CUPS to print documents. - services.printing.enable = true; - - # Enable sound with pipewire. - services.pulseaudio.enable = false; - 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; - - # use the example session manager (no others are packaged yet so this is enabled by default, - # no need to redefine it in your config for now) - #media-session.enable = true; - }; - users.users.joshua = { - subUidRanges = [ { startUid = 100000; count = 65536; } ]; - subGidRanges = [ { startGid = 100000; count = 65536; } ]; - isNormalUser = true; - description = "Joshua Barrett"; - shell = pkgs.zsh; - extraGroups = [ "networkmanager" "wheel" "docker" ]; - packages = with pkgs; [ - - ]; - }; - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.users.joshua = ./home-manager/home.nix; - - # Install firefox. - programs.firefox.enable = true; - programs.zsh.enable = true; - programs.foot.enable = true; - programs.git.enable = true; - programs.ssh.startAgent = true; - - # Install steam - programs.steam = { - enable = true; - remotePlay.openFirewall = true; - localNetworkGameTransfers.openFirewall = true; - }; - - # Allow unfree packages - nixpkgs.config.allowUnfree = true; - - services.syncthing.openDefaultPorts = true; - - environment.systemPackages = with pkgs; [ - gcc - gnumake - bison - flex - autoconf - automake - libtool - discord - calibre - libreoffice - enchant - rustup - pkg-config - passt - # vim # Do not forget to add an editor to edit configuration.nix! The Nano - # editor is also installed by default. wget - ]; - networking.nftables.enable = true; - networking.firewall = { - enable = true; - trustedInterfaces = [ "tailscale0" ]; - allowedUDPPorts = [ config.services.tailscale.port ]; - }; - - systemd.services.tailscaled.serviceConfig.Environment = [ - "TS_DEBUG_FIREWALL_MODE=nftables" - ]; - services.tailscale.enable = true; - services.resolved.enable = true; - systemd.network.wait-online.enable = false; - boot.initrd.systemd.network.wait-online.enable = false; -} diff --git a/flake.lock b/flake.lock index 5484f33..0e2109f 100644 --- a/flake.lock +++ b/flake.lock @@ -1,17 +1,190 @@ { "nodes": { - "home-manager": { + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1755819240, + "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "base16-fish": { + "flake": false, + "locked": { + "lastModified": 1765809053, + "narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=", + "owner": "tomyun", + "repo": "base16-fish", + "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782", + "type": "github" + }, + "original": { + "owner": "tomyun", + "repo": "base16-fish", + "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782", + "type": "github" + } + }, + "base16-helix": { + "flake": false, + "locked": { + "lastModified": 1760703920, + "narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "d646af9b7d14bff08824538164af99d0c521b185", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + } + }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1764873433, + "narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "locked": { + "lastModified": 1761640442, + "narHash": "sha256-AtrEP6Jmdvrqiv4x2xa5mrtaIp3OEe8uBYCDZDS+hu8=", + "owner": "nix-community", + "repo": "flake-compat", + "rev": "4a56054d8ffc173222d09dad23adf4ba946c8884", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767609335, + "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "250481aafeb741edfe23d29195671c19b36b6dca", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "gnome-shell": { + "flake": false, + "locked": { + "host": "gitlab.gnome.org", + "lastModified": 1767737596, + "narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=", + "owner": "GNOME", + "repo": "gnome-shell", + "rev": "ef02db02bf0ff342734d525b5767814770d85b49", + "type": "gitlab" + }, + "original": { + "host": "gitlab.gnome.org", + "owner": "GNOME", + "ref": "gnome-49", + "repo": "gnome-shell", + "type": "gitlab" + } + }, + "home": { "inputs": { "nixpkgs": [ "nixpkgs" ] }, "locked": { - "lastModified": 1772985285, - "narHash": "sha256-wEEmvfqJcl9J0wyMgMrj1TixOgInBW/6tLPhWGoZE3s=", + "lastModified": 1773422513, + "narHash": "sha256-MPjR48roW7CUMU6lu0+qQGqj92Kuh3paIulMWFZy+NQ=", "owner": "nix-community", "repo": "home-manager", - "rev": "5be5d8245cbc7bc0c09fbb5f38f23f223c543f85", + "rev": "ef12a9a2b0f77c8fa3dda1e7e494fca668909056", "type": "github" }, "original": { @@ -20,13 +193,106 @@ "type": "github" } }, + "lib-aggregate": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1772974622, + "narHash": "sha256-HIY4FEug/QVPF669+8A0ztFV1hC3d5Z+M6aL5J7AZNQ=", + "owner": "nix-community", + "repo": "lib-aggregate", + "rev": "55e6cfb4549362ed408875eee0f92cfde7ccda4e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "lib-aggregate", + "type": "github" + } + }, + "niri": { + "inputs": { + "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": 1773390002, + "narHash": "sha256-0RVjh9h0sgPHngxEs/Wd2/xdGsgKgZWjxFu5JsX3ASw=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "adc63b19724247f947385381481effd225a6e2fc", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1756556321, + "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.08", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1773130184, + "narHash": "sha256-3bwx4WqCB06yfQIGB+OgIckOkEDyKxiTD5pOo4Xz2rI=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "b07bde3ee82dd73115e6b949e4f3f63695da35ea", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, + "nix-monitored": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1745680380, + "narHash": "sha256-Z8PknjkmIr/8ZCH+dmc2Pc+UltiOr7/oKg37PXuVvuU=", + "owner": "ners", + "repo": "nix-monitored", + "rev": "60f3baa4701d58eab86c2d1d9c3d7e820074d461", + "type": "github" + }, + "original": { + "owner": "ners", + "repo": "nix-monitored", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1772963539, - "narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=", + "lastModified": 1773282481, + "narHash": "sha256-b/GV2ysM8mKHhinse2wz+uP37epUrSE+sAKXy/xvBY4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9dcb002ca1690658be4a04645215baea8b95f31d", + "rev": "fe416aaedd397cacb33a610b33d60ff2b431b127", "type": "github" }, "original": { @@ -36,7 +302,38 @@ "type": "github" } }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1772933218, + "narHash": "sha256-hohiyWALn8cXqk3FPnE3UADy03lRMaTV5iRzKCU86zM=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "7489b10b9d10953341b448ed8f30c96999baef2c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "nixpkgs-stable": { + "locked": { + "lastModified": 1773222311, + "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0590cd39f728e129122770c029970378a79d076a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_2": { "locked": { "lastModified": 1773068389, "narHash": "sha256-vMrm7Pk2hjBRPnCSjhq1pH0bg350Z+pXhqZ9ICiqqCs=", @@ -52,11 +349,403 @@ "type": "github" } }, + "nixpkgs-wayland": { + "inputs": { + "flake-compat": "flake-compat", + "lib-aggregate": "lib-aggregate", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1773409378, + "narHash": "sha256-9NARQANYlp2sSvxaZYG3WAWRmSk01lwx9sxUSjQ3VOw=", + "owner": "nix-community", + "repo": "nixpkgs-wayland", + "rev": "c3ff72acdf5e909dc92719f491ce98f135a4aabe", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs-wayland", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1745526057, + "narHash": "sha256-ITSpPDwvLBZBnPRS2bUcHY3gZSwis/uTe255QgMtTLA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f771eb401a46846c1aebd20552521b233dd7e18b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1772963539, + "narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9dcb002ca1690658be4a04645215baea8b95f31d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1773282481, + "narHash": "sha256-b/GV2ysM8mKHhinse2wz+uP37epUrSE+sAKXy/xvBY4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "fe416aaedd397cacb33a610b33d60ff2b431b127", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1770107345, + "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "noctalia": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "noctalia-qs": [ + "noctalia-qs" + ] + }, + "locked": { + "lastModified": 1773426896, + "narHash": "sha256-InonCkzlnCdsku697Eg+Jd36YVHUb/YL2BG1XZ7Eoi8=", + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "rev": "0bdf5afd2cf51fdcc5fe95b5205e6f6f3f0a9183", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "type": "github" + } + }, + "noctalia-qs": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems_2", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1773277895, + "narHash": "sha256-pK01O5J9ogI4rVtDI+PVxckaXqpYZ4uthY0vgVWdyl8=", + "owner": "noctalia-dev", + "repo": "noctalia-qs", + "rev": "d5209a6b5fe8c6dff8d530e820c96f09830011e3", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-qs", + "type": "github" + } + }, + "nur": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767810917, + "narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=", + "owner": "nix-community", + "repo": "NUR", + "rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "root": { "inputs": { - "home-manager": "home-manager", - "nixpkgs": "nixpkgs", - "nixpkgs-stable": "nixpkgs-stable" + "home": "home", + "niri": "niri", + "nix-monitored": "nix-monitored", + "nixpkgs": "nixpkgs_3", + "nixpkgs-stable": "nixpkgs-stable_2", + "nixpkgs-wayland": "nixpkgs-wayland", + "noctalia": "noctalia", + "noctalia-qs": "noctalia-qs", + "rust-overlay": "rust-overlay", + "stylix": "stylix" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773371126, + "narHash": "sha256-SGnZQO8hnynR90Lo/1MVrTScsOPx9i26XjqSqoFOZ4E=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "475826b105eb52f39bd3281f60c052299e64d085", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-parts": "flake-parts", + "gnome-shell": "gnome-shell", + "nixpkgs": [ + "nixpkgs" + ], + "nur": "nur", + "systems": "systems_3", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1772296853, + "narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=", + "owner": "danth", + "repo": "stylix", + "rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf", + "type": "github" + }, + "original": { + "owner": "danth", + "repo": "stylix", + "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": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tinted-foot": { + "flake": false, + "locked": { + "lastModified": 1726913040, + "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + } + }, + "tinted-kitty": { + "flake": false, + "locked": { + "lastModified": 1735730497, + "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1767710407, + "narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1767489635, + "narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1767488740, + "narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1772660329, + "narHash": "sha256-IjU1FxYqm+VDe5qIOxoW+pISBlGvVApRjiw/Y/ttJzY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "3710e0e1218041bbad640352a0440114b1e10428", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1755491097, + "narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "388d291e82ffbc73be18169d39470f340707edaa", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.7", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1772429643, + "narHash": "sha256-M+bAeCCcjBnVk6w/4dIVvXvpJwOKnXjwi/lDbaN6Yws=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "10f985b84cdbcc3bbf35b3e7e43d1b2a84fa9ce2", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index 0f45434..2e6f157 100644 --- a/flake.nix +++ b/flake.nix @@ -2,32 +2,108 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11"; - home-manager = { + nixpkgs-wayland.url = "github:nix-community/nixpkgs-wayland"; + niri.url = "github:sodiboo/niri-flake"; + nix-monitored.url = "github:ners/nix-monitored"; + home = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + stylix = { + url = "github:danth/stylix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs = { + nixpkgs.follows = "nixpkgs"; + }; + }; + noctalia = { + url = "github:noctalia-dev/noctalia-shell"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.noctalia-qs.follows = "noctalia-qs"; + }; + noctalia-qs = { + url = "github:noctalia-dev/noctalia-qs"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = {self, home-manager, nixpkgs, nixpkgs-stable, ...}: - { - #TODO put home-manager in dtcommon - nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - ./all.nix - home-manager.nixosModules.home-manager - ./dt-common.nix - ./prospero/configuration.nix + nixConfig = { + extra-substituters = [ + "https://cache.nixos.org" + "https://cache.lix.systems" + "https://nix-community.cachix.org" + "https://cache.garnix.io" + "https://niri.cachix.org" + ]; + extra-trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "cache.lix.systems:aBnZUw8zA7H35Cz2RyKFVs3H4PlGTLawyY5KRbvJR8o=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "niri.cachix.org-1:Wv0OmO7PsuocRKzfDoJ3mulSl7Z6oezYhGhR+3W2964=" + "nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA=" + ]; + }; + + + outputs = {self, home, nixpkgs, nixpkgs-stable, ...}@inputs: + let lib = import ./lib; + config = { + allowUnfree = true; + }; + overlays = [ + inputs.rust-overlay.overlays.default + inputs.niri.overlays.niri ]; - }; - nixosConfigurations.uruk = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - ./all.nix - home-manager.nixosModules.home-manager - ./dt-common.nix - ./uruk/configuration.nix + in { + nixosConfigurations = lib.genNixOSHosts { + inherit inputs config overlays self; + baseModules = [ + home.nixosModules.home-manager + self.nixosModules.default + inputs.niri.nixosModules.niri + inputs.stylix.nixosModules.stylix + inputs.nix-monitored.nixosModules.default ]; }; + + homeConfigurations = lib.genHomeHosts { + inherit inputs config overlays; + + user = "joshua"; + + baseModules = [ + self.homeModules.default + inputs.niri.homeModules.niri + inputs.niri.homeModules.stylix + inputs.noctalia.homeModules.default + inputs.stylix.homeModules.stylix + ]; + }; + + homeModules.default = import ./modules/home; + nixosModules.default = import ./modules/nixos; + #TODO put home-manager in dtcommon + # nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { + # system = "x86_64-linux"; + # modules = [ + # ./all.nix + # home-manager.nixosModules.home-manager + # ./dt-common.nix + # ./prospero/configuration.nix + # ]; + # }; + # nixosConfigurations.uruk = nixpkgs.lib.nixosSystem { + # system = "x86_64-linux"; + # modules = [ + # ./all.nix + # home-manager.nixosModules.home-manager + # ./dt-common.nix + # ./uruk/configuration.nix + # ]; + # }; }; } diff --git a/home-manager/#default.nix# b/home-manager/#default.nix# deleted file mode 100644 index 9e26dfe..0000000 --- a/home-manager/#default.nix# +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/home-manager/default.nix b/home-manager/default.nix deleted file mode 100644 index e69de29..0000000 diff --git a/home-manager/home.nix b/home-manager/home.nix deleted file mode 100644 index 0b582a7..0000000 --- a/home-manager/home.nix +++ /dev/null @@ -1,99 +0,0 @@ -{ config, pkgs, ... }: - -{ - # Home Manager needs a bit of information about you and the paths it should - # manage. - home.username = "joshua"; - home.homeDirectory = "/home/joshua"; - - # This value determines the Home Manager release that your configuration is - # compatible with. This helps avoid breakage when a new Home Manager release - # introduces backwards incompatible changes. - # - # You should not change this value, even if you update Home Manager. If you do - # want to update the value, then make sure to first check the Home Manager - # release notes. - home.stateVersion = "25.05"; # Please read the comment before changing. - - # The home.packages option allows you to install Nix packages into your - # environment. - home.packages = with pkgs; [ - # # Adds the 'hello' command to your environment. It prints a friendly - # # "Hello, world!" when run. - rsync - keepassxc - syncthing - terminus_font - jujutsu - ripgrep - goose-cli - kubectl - k3d - tilt - # # It is sometimes useful to fine-tune packages, for example, by applying - # # overrides. You can do that directly here, just don't forget the - # # parentheses. Maybe you want to install Nerd Fonts with a limited number - # # of fonts? - # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; }) - - # # You can also create simple shell scripts directly inside your - # # configuration. For example, this adds a command 'my-hello' to your - # # environment: - # (pkgs.writeShellScriptBin "my-hello" '' - # echo "Hello, ${config.home.username}!" - # '') - ]; - - # Home Manager is pretty good at managing dotfiles. The primary way to manage - # plain files is through 'home.file'. - home.file = { - # # Building this configuration will create a copy of 'dotfiles/screenrc' in - # # the Nix store. Activating the configuration will then make '~/.screenrc' a - # # symlink to the Nix store copy. - # ".screenrc".source = dotfiles/screenrc; - - # # You can also set the file content immediately. - # ".gradle/gradle.properties".text = '' - # org.gradle.console=verbose - # org.gradle.daemon.idletimeout=3600000 - # ''; - }; - - # Home Manager can also manage your environment variables through - # 'home.sessionVariables'. These will be explicitly sourced when using a - # shell provided by Home Manager. If you don't want to manage your shell - # through Home Manager then you have to manually source 'hm-session-vars.sh' - # located at either - # - # ~/.nix-profile/etc/profile.d/hm-session-vars.sh - # - # or - # - # ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh - # - # or - # - # /etc/profiles/per-user/joshua/etc/profile.d/hm-session-vars.sh - # - home.sessionVariables = { - - }; - - # Let Home Manager install and manage itself. - programs.home-manager.enable = true; - programs.zsh.enable = true; - programs.emacs.enable = true; - programs.atuin ={ - enable = true; - flags = [ "--disable-up-arrow" ]; - }; - programs.direnv = { - enable = true; - enableZshIntegration = true; - nix-direnv.enable = true; - }; - services.emacs.enable = true; - services.emacs.defaultEditor = true; - services.emacs.startWithUserSession = "graphical"; -} - diff --git a/prospero/configuration.nix b/hosts/prospero/configuration.nix similarity index 100% rename from prospero/configuration.nix rename to hosts/prospero/configuration.nix diff --git a/hosts/prospero/default.nix b/hosts/prospero/default.nix new file mode 100644 index 0000000..3f9a66a --- /dev/null +++ b/hosts/prospero/default.nix @@ -0,0 +1,7 @@ +{...}: { + system = "x86_64-linux"; + modules = [ + ./configuration.nix + ]; + home.modules = ./home.nix; +} diff --git a/prospero/hardware-configuration.nix b/hosts/prospero/hardware-configuration.nix similarity index 100% rename from prospero/hardware-configuration.nix rename to hosts/prospero/hardware-configuration.nix diff --git a/hosts/prospero/home.nix b/hosts/prospero/home.nix new file mode 100644 index 0000000..82cd87c --- /dev/null +++ b/hosts/prospero/home.nix @@ -0,0 +1,2 @@ +{...}: +{} diff --git a/uruk/configuration.nix b/hosts/uruk/configuration.nix similarity index 50% rename from uruk/configuration.nix rename to hosts/uruk/configuration.nix index 8b0aec7..2498c45 100644 --- a/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -8,7 +8,6 @@ imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix - ../modules/zfs.nix ]; # Use the systemd-boot EFI boot loader. @@ -16,11 +15,28 @@ boot.loader.efi.canTouchEfiVariables = true; hardware.amdgpu.initrd.enable = true; hardware.bluetooth.enable = true; - profiles.zfs.enable = true; networking.hostId = "5398fbbf"; - networking.hostName = "uruk"; # Define your hostname. - services.openssh.enable = true; system.stateVersion = "25.11"; # Did you read the comment? + # Disable auto-suspend if gdm is installed. + services.displayManager.gdm.autoSuspend = false; + # Disable the GNOME3/GDM auto-suspend feature that cannot be disabled in GUI! + # If no user is logged in, the machine will power down after 20 minutes. + systemd.targets.sleep.enable = false; + systemd.targets.suspend.enable = false; + systemd.targets.hibernate.enable = false; + systemd.targets.hybrid-sleep.enable = false; + + profiles = { + desktop = { + enable = true; + niri.enable = true; + }; + perftools.enable = true; + games.enable = true; + docs.enable = true; + zfs.enable = true; +# nix-ld.enable = true; + }; } diff --git a/hosts/uruk/default.nix b/hosts/uruk/default.nix new file mode 100644 index 0000000..2cdee0d --- /dev/null +++ b/hosts/uruk/default.nix @@ -0,0 +1,9 @@ +{...}: { + system = "x86_64-linux"; + modules = [ + ./configuration.nix + ]; + home.modules = [ + ./home.nix + ]; +} diff --git a/uruk/hardware-configuration.nix b/hosts/uruk/hardware-configuration.nix similarity index 100% rename from uruk/hardware-configuration.nix rename to hosts/uruk/hardware-configuration.nix diff --git a/hosts/uruk/home.nix b/hosts/uruk/home.nix new file mode 100644 index 0000000..f07e909 --- /dev/null +++ b/hosts/uruk/home.nix @@ -0,0 +1,28 @@ +{...}: +{ + profiles = { + desktop.enable = true; + desktop.niri.enable = true; + }; + programs.niri.settings.outputs = { + "DP-2" = { + scale = 1.0; + mode = { + width = 1920; + height = 1980; + refresh = 119.982; + }; + position.x = 0; + position.y = 0; + }; + "HDMI-A-1" = { + mode = { + width = 1920; + height = 1980; + refresh = 74.91; + }; + position.x = 1920; + position.y = 0; + }; + }; +} diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..027ba26 --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,107 @@ +# Shamelessly copied from github.com/orual/flake because they basically nailed +# it and I can't be assed to do this myself. +let + inherit (builtins) readDir hasAttr attrNames filter concatMap listToAttrs; + + loadHosts = dir: inputs: + let + loadConf = dir: n: (import "${dir}/${n}" inputs) // { hostname = n; }; + + hosts' = + let contents = readDir dir; + in filter (n: contents."${n}" == "directory") (attrNames contents); + in + concatMap + (n: + let + contents = readDir "${dir}/${n}"; + hasDefault = (hasAttr "default.nix" contents) + && (contents."default.nix" == "regular"); + in + if hasDefault then [ (loadConf dir n) ] else [ ]) + hosts'; +in +{ + # Discover NixOS configurations. + # It will find all sub-directories in `directory` and + # include it if it has a default.nix. + genNixOSHosts = + { inputs + , self + , directory ? "${inputs.self}/hosts" + , nixpkgs ? inputs.nixpkgs + , builder ? nixpkgs.lib.nixosSystem + , specialArgs ? { } + , baseModules ? [ ] + , overlays ? [ ] + , config ? { allowUnfree = true; } + }: + let + mkHost = { system, modules, hostname, }: + builder { + inherit system; + + specialArgs = { inherit inputs self; } // specialArgs; + + modules = [ + ({ ... }: { + networking.hostName = hostname; + + nixpkgs = { inherit overlays config; }; + }) + ] ++ baseModules ++ modules; + }; + in + listToAttrs (map + (conf: { + name = conf.hostname; + value = mkHost (removeAttrs conf [ "home" ]); + }) + (loadHosts directory inputs)); + + # Discover home-manager configurations. + # It will find all sub-directories in `directory` and + # include it if it has a default.nix. + genHomeHosts = + { inputs + , user + , directory ? "${inputs.self}/hosts" + , nixpkgs ? inputs.nixpkgs + , home ? inputs.home + , builder ? home.lib.homeManagerConfiguration + , specialArgs ? { } + , baseModules ? [ ] + , overlays ? [ ] + , config ? { allowUnfree = true; } + , + }: + let + homeHosts = concatMap + (h: + if (hasAttr "home" h) then + [ ((removeAttrs h [ "home" "modules" ]) // h.home) ] + else + [ ]) + (loadHosts directory inputs); + + mkHost = { system, modules, hostname, }: + let pkgs = import nixpkgs { inherit system config overlays; }; + in builder { + inherit pkgs; + extraSpecialArgs = { inherit inputs; } // specialArgs; + + modules = [ + ({ lib, ... }: { + home.username = lib.mkDefault user; + home.homeDirectory = lib.mkDefault "/home/${user}"; + }) + ] ++ baseModules ++ modules; + }; + in + listToAttrs (map + (conf: { + name = "${user}@${conf.hostname}"; + value = mkHost conf; + }) + homeHosts); +} diff --git a/modules/home/default.nix b/modules/home/default.nix new file mode 100644 index 0000000..2b846b0 --- /dev/null +++ b/modules/home/default.nix @@ -0,0 +1,30 @@ +{ pkgs, lib, ...}: +{ + home.stateVersion = "25.05"; # Please read the comment before changing. + imports = [ ./profiles ]; + manual.manpages.enable = true; + home = { + packages = with pkgs; [ + rsync + ripgrep + jujutsu + ]; + file = { + + }; + sessionVariables = { + + }; + }; + programs.home-manager.enable = true; + programs.zsh.enable = true; + programs.atuin ={ + enable = true; + flags = [ "--disable-up-arrow" ]; + }; + programs.direnv = { + enable = true; + enableZshIntegration = true; + nix-direnv.enable = true; + }; +} diff --git a/modules/home/profiles/default.nix b/modules/home/profiles/default.nix new file mode 100644 index 0000000..9bf7778 --- /dev/null +++ b/modules/home/profiles/default.nix @@ -0,0 +1,3 @@ +{...}: { + imports = [ ./desktop ]; +} diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix new file mode 100644 index 0000000..1f7517b --- /dev/null +++ b/modules/home/profiles/desktop/default.nix @@ -0,0 +1,61 @@ +{config, lib, pkgs, ...}: +let cfg = config.profiles.desktop; +in { + imports = [./niri.nix]; + options.profiles.desktop = with lib; { + enable = mkEnableOption "Profile for desktop machines"; + }; + config = lib.mkIf cfg.enable { + home.packages = with pkgs; [ + terminus_font + keepassxc + syncthing + goose-cli + discord + calibre + libreoffice-fresh + obs-studio + inkscape + krita + gimp + vlc + syncplay + # stuff emacs needs + # TODO bind this to a proper emacs nixenv + gcc + gnumake + bison + flex + autoconf + automake + libtool + enchant + pkg-config + # other junk + kubectl + k3d + tilt + rustup + ]; + programs.firefox.enable = true; + programs.emacs.enable = true; + programs.foot.enable = true; + services.emacs.enable = true; + services.emacs.defaultEditor = true; + services.emacs.startWithUserSession = "graphical"; + stylix.base16Scheme = + "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; + stylix.fonts = { + sizes.terminal = 12; + monospace = { + package = pkgs.terminus_font; + name = "Terminus"; + }; + }; + stylix.enable = true; + stylix.polarity = "dark"; + stylix.image = ./iskandar.png; + stylix.targets.foot.enable = true; + stylix.targets.emacs.enable = false; + }; +} diff --git a/modules/home/profiles/desktop/iskandar.png b/modules/home/profiles/desktop/iskandar.png new file mode 100644 index 0000000000000000000000000000000000000000..0da805e0e19fbc8b0d453c92c2efaf31b3e1eb3d GIT binary patch literal 124980 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix new file mode 100644 index 0000000..ded92b8 --- /dev/null +++ b/modules/home/profiles/desktop/niri.nix @@ -0,0 +1,347 @@ +{config, pkgs, lib, ... }: +with lib; +let + cfg = config.profiles.desktop.niri; + colors = config.lib.stylix.colors.withHashtag; + binds = + { + suffixes, + prefixes, + substitutions ? { }, + }: + let + replacer = replaceStrings (attrNames substitutions) (attrValues substitutions); + format = + prefix: suffix: + let + actual-suffix = + if isList suffix.action then + { + action = head suffix.action; + args = tail suffix.action; + } + else + { + inherit (suffix) action; + args = [ ]; + }; + + action = replacer "${prefix.action}-${actual-suffix.action}"; + in + { + name = "${prefix.key}+${suffix.key}"; + value.action.${action} = actual-suffix.args; + }; + pairs = + attrs: fn: + concatMap ( + key: + fn { + inherit key; + action = attrs.${key}; + } + ) (attrNames attrs); + in + listToAttrs + (pairs prefixes + (prefix: pairs suffixes (suffix: [ (format prefix suffix) ]))); +in +with lib; { + options.profiles.desktop.niri = { + enable = mkEnableOption "niri profile"; + }; + config = mkIf cfg.enable { + programs.niri.package = pkgs.niri-unstable; + stylix.targets.niri.enable = true; + gtk = { + enable = true; + iconTheme = { + name = "Adwaita"; # or whatever you want + package = pkgs.adwaita-icon-theme; + }; + }; + programs.fuzzel = { + enable = true; + settings.main = { + terminal = "${pkgs.foot}/bin/foot"; + layer = "overlay"; + #font = "Terminus:size=12"; + }; + }; + home.packages = with pkgs; [ + brightnessctl + ]; + services.cliphist = { + enable = true; + allowImages = true; + }; + programs.niri.settings = { + prefer-no-csd = true; + layout = { + gaps = 10; + preset-column-widths = [ + { proportion = 1.0 / 4.0; } + { proportion = 1.0 / 3.0; } + { proportion = 1.0 / 2.5; } + { proportion = 1.0 / 2.0; } + { proportion = 2.0 / 3.0; } + { proportion = 3.0 / 4.0; } + { proportion = 5.0 / 6.0; } + ]; + preset-window-heights = [ + { proportion = 1.0 / 3.0; } + { proportion = 0.4; } + { proportion = 0.5; } + { proportion = 2.0 / 3.0; } + ]; + default-column-width = { + proportion = 1.0 / 2.0; + }; + focus-ring = { + width = 2; + active.color = "${colors.base0B}ff"; + }; + }; + spawn-at-startup = [{command = ["keepassxc"];}]; + xwayland-satellite.enable = true; + xwayland-satellite.path = + "${pkgs.xwayland-satellite}/bin/xwayland-satellite"; + screenshot-path = + "~/Pictures/Screenshots/screenshot-%Y-%m-%d-%H:%M:%S.png"; + switch-events = + with config.lib.niri.actions; + let + sh = spawn "sh" "-c"; + in { + lid-close.action = sh "systemctl suspend"; + }; + binds = + with config.lib.niri.actions; + let + sh = spawn "sh" "-c"; + in lib.attrsets.mergeAttrsList [ + { + "Mod+Shift+Slash".action = show-hotkey-overlay; + "Mod+D".action = spawn "fuzzel"; + "Mod+Return".action = spawn "foot"; + "Mod+Shift+S".action.screenshot = [ ]; + "Print".action.screenshot-screen = [ ]; + "Mod+Print".action.screenshot-window = [ ]; + "XF86AudioRaiseVolume".action = + sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05+"; + "XF86AudioLowerVolume".action = + sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05-"; + "XF86AudioMute".action = + sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + "XF86AudioMicMute".action = + sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; + "Mod+Shift+Q".action = close-window; + "Mod+Space".action = toggle-column-tabbed-display; + "Mod+Tab".action = focus-window-down-or-column-right; + "Mod+Shift+Tab".action = focus-window-up-or-column-left; + "Mod+Shift+Ctrl+F".action = toggle-windowed-fullscreen; + "XF86MonBrightnessUp".action = sh "brightnessctl set 5%+"; + "XF86MonBrightnessDown".action = sh "brightnessctl set 5%-"; + "Mod+V".action = switch-focus-between-floating-and-tiling; + "Mod+Shift+V".action = toggle-window-floating; + "Mod+BracketLeft".action = consume-or-expel-window-left; + "Mod+BracketRight".action = consume-or-expel-window-right; + "Mod+Comma".action = consume-window-into-column; + "Mod+Period".action = expel-window-from-column; + "Mod+R".action = switch-preset-column-width; + "Mod+F".action = maximize-column; + "Mod+Shift+F".action = fullscreen-window; + "Mod+G".action = center-column; + + "Mod+Minus".action = set-column-width "-10%"; + "Mod+Equal".action = set-column-width "+10%"; + "Mod+Shift+Minus".action = set-window-height "-10%"; + "Mod+Shift+Equal".action = set-window-height "+10%"; + + "Mod+Shift+Escape".action = toggle-keyboard-shortcuts-inhibit; + "Mod+Shift+E".action = quit; + "Mod+Shift+P".action = power-off-monitors; + "Mod+Shift+Ctrl+T".action = toggle-debug-tint; + } + (binds { + suffixes."Left" = "column-left"; + suffixes."H" = "column-left"; + suffixes."Down" = "window-down"; + suffixes."J" = "window-down"; + suffixes."Up" = "window-up"; + suffixes."K" = "window-up"; + suffixes."Right" = "column-right"; + suffixes."L" = "column-right"; + prefixes."Mod" = "focus"; + prefixes."Mod+Ctrl" = "move"; + prefixes."Mod+Shift" = "focus-monitor"; + prefixes."Mod+Shift+Ctrl" = "move-window-to-monitor"; + substitutions."monitor-column" = "monitor"; + substitutions."monitor-window" = "monitor"; + }) + (binds { + suffixes."Home" = "first"; + suffixes."End" = "last"; + prefixes."Mod" = "focus-column"; + prefixes."Mod+Ctrl" = "move-column-to"; + }) + (binds { + suffixes."U" = "workspace-down"; + suffixes."I" = "workspace-up"; + prefixes."Mod" = "focus"; + prefixes."Mod+Ctrl" = "move-window-to"; + prefixes."Mod+Shift" = "move"; + }) + (binds { + suffixes = builtins.listToAttrs ( + map (n: { + name = toString n; + value = [ + "workspace" + (n + 1) + ]; # workspace 1 is empty; workspace 2 is the logical first. + }) (range 1 9) + ); + prefixes."Mod" = "focus"; + prefixes."Mod+Ctrl" = "move-window-to"; + }) + ]; + window-rules = [ + { + matches = [ + { + app-id = "^firefox$"; + title = "^Picture-in-Picture$"; + } + ]; + opacity = 1.0; + default-window-height = { + proportion = 0.42; + }; + open-floating = true; + default-column-width = { + proportion = 0.4; + }; + default-floating-position = { + relative-to = "top-left"; + x = 0; + y = 0; + }; + } + { + matches = [ + { + app-id = "^firefox$"; + title = "Private Browsing"; + } + ]; + border.active.color = colors.base0E; + } + { + matches = [ + { + app-id = "^org\\.keepassxc\\.KeePassXC$"; + } + ]; + block-out-from = "screen-capture"; + } + ]; + layer-rules = [ + { + matches = [ { namespace = "notifications"; } ]; + block-out-from = "screen-capture"; + opacity = 0.8; + } + { + matches = [ { namespace = "^noctalia-overview"; } ]; + + place-within-backdrop = true; + } + ]; + }; + # shell configuration w/ noctalia + stylix.targets.noctalia-shell.enable = true; + programs.noctalia-shell = { + enable = true; + systemd.enable = true; + settings = { + bar = { + density = "default"; + position = "top"; + # floating = true; + # showCapsule = true; + # useSeparateOpacity = true; + # capsuleOpacity = lib.mkForce 1; + # backgroundOpacity = lib.mkForce 0.01; + widgets = { + left = [ + { + id = "Launcher"; + } + { + id = "SystemMonitor"; + } + { + id = "MediaMini"; + useFixedWidth = false; + maxWidth = 400; + } + ]; + center = [ + { + formatHorizontal = "ddd yyyy-MM-dd HH:mm"; + formatVertical = "HH mm - MMM dd"; + id = "Clock"; + useMonospacedFont = true; + usePrimaryColor = true; + } + { + hideUnoccupied = false; + id = "Workspace"; + } + { + id = "ActiveWindow"; + useFixedWidth = false; + maxWidth = 400; + } + ]; + right = [ + { + id = "Tray"; + #drawerEnabled = false; + } + { + id = "NotificationHistory"; + } + { + alwaysShowPercentage = true; + id = "Battery"; + warningThreshold = 30; + } + { + id = "Volume"; + } + { + id = "Brightness"; + } + { + id = "ControlCenter"; + useDistroLogo = true; + } + ]; + }; + }; + general = { + }; + location = { + monthBeforeDay = true; + name = "New Haven, CT"; + }; + wallpaper = { + enabled = true; + overviewEnabled = true; + }; + }; + }; + }; +} diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix new file mode 100644 index 0000000..96ac0d9 --- /dev/null +++ b/modules/nixos/default.nix @@ -0,0 +1,98 @@ +{pkgs, lib, config, ...}:{ + imports = [ + ./nix.nix + ./profiles/zfs.nix + ./profiles/networking.nix + ./profiles/perftools.nix + ./profiles/docs.nix + ./profiles/games.nix + ./profiles/desktop + ]; + + console = { + font = "Lat2-Terminus16"; + }; + time.timeZone = "America/New_York"; + + i18n = let + locale = "en_US.UTF-8"; + in { + defaultLocale = locale; + extraLocaleSettings = { + LC_ADDRESS = locale; + LC_IDENTIFICATION = locale; + LC_MEASUREMENT = locale; + LC_MONETARY = locale; + LC_NAME = locale; + LC_NUMERIC = locale; + LC_PAPER = locale; + LC_TELEPHONE = locale; + LC_TIME = locale; + }; + }; + + environment = { + systemPackages = with pkgs; [ + git + nano + # for lspci etc + pciutils + # for lsusb etc + usbutils + lshw + home-manager + lm_sensors + smartmontools + ]; + pathsToLink = ["/share/zsh"]; + }; + programs = { + mtr.enable = true; + zsh.enable = true; + }; + + profiles = { + networking.enable = lib.mkDefault true; + }; + + users.users.joshua = { + subUidRanges = [ { startUid = 100000; count = 65536; } ]; + subGidRanges = [ { startGid = 100000; count = 65536; } ]; + isNormalUser = true; + description = "Joshua Barrett"; + shell = pkgs.zsh; + extraGroups = [ + "wheel" + "docker" + "podman" + "wireshark" + "dialout" + ]; + openssh.authorizedKeys.keys = [ + # prospero + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHM0G+Ri6crg86mYVWWDHUiO+FX0GB0di9QkdNvE8SWF" + # mercury + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG3JS6Mf2PwfjZOAh3Cztmeu1CFzxond254jHAeLQ85O" + # uruk + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN4yxSed86xXJ3wuBwxX7HrAHrHSkFliBg7s4Nx53NFS" + ]; + }; + + # Enable the Docker daemon. + virtualisation.docker = { + enable = true; + # Docker appears to select `devicemapper` by default, which is not cool. + storageDriver = if config.profiles.zfs.enable then "zfs" else "overlay2"; + # Prune the docker registry weekly. + autoPrune.enable = true; + extraOptions = '' + --experimental + ''; + }; + + virtualisation.oci-containers = { + backend = "docker"; + }; + + security.pam.sshAgentAuth.enable = lib.mkDefault true; +} diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix new file mode 100644 index 0000000..aa6af20 --- /dev/null +++ b/modules/nixos/nix.nix @@ -0,0 +1,101 @@ +{ config, pkgs, lib, ... }: +with lib; { + options.profiles.nix-ld = { + enable = mkEnableOption "nix-ld profile"; + }; + config = mkMerge [ + { + nixpkgs.config.allowUnfree = true; + nixpkgs.overlays = [ + (self: super: { + nixos-rebuild = super.nixos-rebuild.override { + nix = super.nix-monitored; + }; + nix-direnv = super.nix-direnv.override { + nix = super.nix-monitored; + }; + }) + ]; + + nix = { + package = pkgs.nix-monitored; + gc = { + automatic = true; + dates = "monthly"; + }; + settings = let + substituters = [ + "https://nix-community.cachix.org" + ]; + in { + experimental-features = ["nix-command" "flakes"]; + trusted-users = ["root" "joshua"]; + extra-substituters = substituters; + trusted-substituters = substituters; + extra-trusted-public-keys = [ + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + }; + } + (mkIf config.profiles.nix-ld.enable { + # Enable nix ld + programs.nix-ld = { + enable = true; + libraries = with pkgs; [ + alsa-lib + at-spi2-atk + at-spi2-core + atk + cairo + cups + curl + dbus + expat + fontconfig + freetype + fuse3 + gdk-pixbuf + glib + gtk3 + icu + libGL + libappindicator-gtk3 + libdrm + libglvnd + libnotify + libpulseaudio + libunwind + libusb1 + libuuid + libxkbcommon + libxml2 + mesa + nspr + nss + openssl + pango + pipewire + stdenv.cc.cc + systemd + vulkan-loader + libX11 + libXScrnSaver + libXcomposite + libXcursor + libXdamage + libXext + libXfixes + libXi + libXrandr + libXrender + libXtst + libxcb + libxkbfile + libxshmfence + zlib + ]; + }; + }) + ]; +} diff --git a/modules/nixos/profiles/desktop/default.nix b/modules/nixos/profiles/desktop/default.nix new file mode 100644 index 0000000..01e2ce5 --- /dev/null +++ b/modules/nixos/profiles/desktop/default.nix @@ -0,0 +1,120 @@ +# Profile for desktop machines (i.e. not servers). +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.profiles.desktop; +in { + imports = [ ./niri.nix ]; + + options.profiles.desktop = with lib; { + enable = mkEnableOption "Profile for desktop machines (i.e. not servers)"; + }; + + config = lib.mkIf cfg.enable { + # Use latest kernel by default. + boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest; + + ### pipewire ### + # Use PipeWire as the system audio/video bus + services.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa = { + enable = true; + support32Bit = true; + }; + jack.enable = true; + pulse.enable = true; + wireplumber.enable = true; + socketActivation = true; + extraConfig = { + pipewire = { + "10-clock-rate" = { + "context.properties" = { + "default.clock.rate" = 96000; + "default.clock.allowed-rates" = [44100 48000 88200 96000]; + }; + }; + }; + # jack = { + # "20-latency-control" = { + # "jack.properties" = { + # "node.force-quantum" = "64"; + # }; + # }; + # }; + }; + }; + + ### services ### + services = { + # Enable the X11 windowing system. + xserver = with lib; { + enable = mkDefault true; + + # Configure keymap in X11 + xkb = { + layout = mkDefault "us"; + variant = mkDefault ""; + options = mkDefault "ctrl:swapcaps,compose:ralt"; + }; + }; + + # Enable CUPS to print documents. + printing.enable = lib.mkDefault true; + }; + console.useXkbConfig = true; + + ### hardware ### + hardware = { + bluetooth.enable = lib.mkDefault true; + }; + + networking.wireless.iwd.enable = lib.mkDefault true; + networking.networkmanager.wifi.backend = lib.mkDefault "iwd"; + + ### programs ### + programs = { + firefox.enable = true; + kdeconnect.enable = true; + }; + + environment.systemPackages = []; + + stylix.base16Scheme = + "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; + stylix.enable = true; + stylix.polarity = "dark"; + + # stylix.fonts = { + # serif = { + # package = pkgs.ibm-plex; + # name = "IBM Plex"; + # }; + + # sansSerif = { + # package = pkgs.ibm-plex; + # name = "IBM Plex Sans"; + # }; + + # monospace = { + # package = pkgs.nerd-fonts.blex-mono; + # name = "BlexMono Nerd Font"; + # }; + + # emoji = { + # package = pkgs.noto-fonts-color-emoji; + # name = "Noto Color Emoji"; + # }; + # }; + # stylix.cursor = { + # package = pkgs.quintom-cursor-theme; + # name = "Quintom_Snow"; + # size = 24; + # }; + }; +} diff --git a/modules/nixos/profiles/desktop/niri.nix b/modules/nixos/profiles/desktop/niri.nix new file mode 100644 index 0000000..c47b3f2 --- /dev/null +++ b/modules/nixos/profiles/desktop/niri.nix @@ -0,0 +1,59 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.profiles.desktop; +in + with lib; { + options.profiles.desktop.niri = { + enable = mkEnableOption "niri profile"; + }; + + config = mkIf cfg.niri.enable { + profiles.desktop.enable = mkDefault true; + + services = { + displayManager = { + defaultSession = mkForce "niri"; + gdm.enable = mkDefault true; + }; + }; + xdg = { + portal = { + enable = true; + xdgOpenUsePortal = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gnome + xdg-desktop-portal-gtk + ]; + }; + }; + + environment.systemPackages = with pkgs; [ + libnotify + xwayland-satellite + wl-clipboard + wayland-utils + libsecret + gamescope + ]; + programs = { + firefox = { + #package = mkForce pkgs.firefox-wayland; + nativeMessagingHosts.packages = with pkgs; [ + firefoxpwa + ]; + }; + niri.enable = true; + + niri.package = pkgs.niri-unstable; + }; + environment.variables.NIXOS_OZONE_WL = "1"; + environment.variables.ELECTRON_OZONE_PLATFORM_HINT = "auto"; + + programs.nm-applet.enable = lib.mkForce false; + }; + + } diff --git a/modules/nixos/profiles/docs.nix b/modules/nixos/profiles/docs.nix new file mode 100644 index 0000000..4f793fc --- /dev/null +++ b/modules/nixos/profiles/docs.nix @@ -0,0 +1,49 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.profiles.docs; +in { + options.profiles.docs = with lib; { + enable = mkEnableOption "documentation profile"; + }; + + config = lib.mkIf cfg.enable { + ### documentation ### + documentation = { + # install documentation from all packages `environment.systemPackages`. + enable = true; + # enable documentation distributed in packages' `/share/doc`. + doc.enable = true; + + man = { + # enable manpages + enable = true; + # generate manpage index caches to enable searching using `man -k`. + cache.enable = true; + }; + + info.enable = true; + + # enable packages' developer documentation + dev.enable = true; + + # install nixos' own documentation + nixos.enable = true; + }; + + environment.systemPackages = with pkgs; [ + # i want all the man pages + man-pages + man-pages-posix + # manpage-style rustdoc viewer + # a fast documentation viewer for nix + manix + # Parse formatted man pages and man page source from most flavors of UNIX + # and converts them to HTML, ASCII, TkMan, DocBook, and other formats + rman + ]; + }; +} diff --git a/modules/nixos/profiles/games.nix b/modules/nixos/profiles/games.nix new file mode 100644 index 0000000..e36a2db --- /dev/null +++ b/modules/nixos/profiles/games.nix @@ -0,0 +1,40 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.profiles.games; +in { + options.profiles.games = with lib; { + enable = mkEnableOption "games profile"; + }; + + config = lib.mkIf cfg.enable { + # some steam games need 32-bit driver support + services.pulseaudio.support32Bit = true; + hardware = { + graphics = { + extraPackages32 = with pkgs.pkgsi686Linux; [libva]; + enable32Bit = true; + }; + }; + + # Steam controller + hardware.steam-hardware.enable = true; + # Steam + 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 + extraPackages = with pkgs; [ + mangohud + gamescope + xwayland-run + ]; + extraCompatPackages = with pkgs; [ + proton-ge-bin + ]; + }; + }; +} diff --git a/modules/nixos/profiles/networking.nix b/modules/nixos/profiles/networking.nix new file mode 100644 index 0000000..e116e95 --- /dev/null +++ b/modules/nixos/profiles/networking.nix @@ -0,0 +1,113 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.profiles.networking; +in + with lib; { + options.profiles.networking = { + enable = mkEnableOption "Network profile"; + }; + + config = mkIf cfg.enable { + #### Networking Configuration #### + + networking = { + # use networkmanager. + networkmanager.enable = lib.mkDefault true; + # disable wpa_supplicant, as NetworkManager is used instead. + wireless.enable = lib.mkForce false; + # `dhcpcd` conflicts with NetworkManager's `dhclient`, as they try to bind + # the same address; it needs to be explicitly disabled. + dhcpcd.enable = false; + + firewall = { + enable = true; + # allows use as a tailscale exit node + checkReversePath = "loose"; + trustedInterfaces = [ "docker0" "tailscale0" ]; + allowedUDPPorts = [ config.services.tailscale.port ]; + }; + # enable mdns resolution for resolved on all connections + # see https://man.archlinux.org/man/NetworkManager.conf.5 + networkmanager.connectionConfig."connection.mdns" = 2; + }; + + systemd.services.tailscaled.serviceConfig.Environment = [ + "TS_DEBUG_FIREWALL_MODE=nftables" + ]; + # tailscale gets kinda painful without this. + systemd.network.wait-online.enable = false; + boot.initrd.systemd.network.wait-online.enable = false; + + programs.mosh.enable = mkDefault true; + + services = { + # Enable the OpenSSH daemon. + openssh = { + enable = true; + settings = {X11Forwarding = true;}; + }; + # rkvm = { + # enable = true; + # # client = { + # # enable = true; + # # settings = { + # # password = "test"; + # # certificate = "/etc/secrets/rkvm-certificate.pem"; + # # server = "10.1.2.28:5258"; + # # }; + # # }; + # server = { + # enable = true; + # settings.password = "test"; + # settings.certificate = "/etc/secrets/rkvm-certificate.pem"; + # settings.key = "/etc/secrets/rkvm-key.pem"; + # }; + # }; + + # DNS configurations --- Avahi (mDNS) + avahi = { + enable = true; + # allow local applications to resolve `local.` domains using avahi. + # nssmdns4 = true; + ipv4 = true; + # ipv6 = true; + # publish this machine on mDNS. + publish = { + enable = true; + addresses = true; + # publish ._workstation._tcp + workstation = true; + domain = true; + # publish user services running on this machine + userServices = true; + # publish a HINFO record, which contains information about the local + # operating system and CPU. + hinfo = true; + }; + }; + + # enable tailscale + tailscale.enable = true; + + resolved.enable = true; + }; + + environment.systemPackages = with pkgs; [ + networkmanager + networkmanagerapplet + openssh + kdePackages.bluedevil + bluez + tailscale + ethtool + dig + ]; + + users.users.joshua.extraGroups = ["networkmanager"]; + }; + } diff --git a/modules/nixos/profiles/perftools.nix b/modules/nixos/profiles/perftools.nix new file mode 100644 index 0000000..8fe5a92 --- /dev/null +++ b/modules/nixos/profiles/perftools.nix @@ -0,0 +1,27 @@ +# Configuration for Linux performance profiling tools (perf, ebpf tracing, +# flamegraphs). +{ + config, + lib, + pkgs, + ... +}: +with lib; let + linuxpkgs = config.boot.kernelPackages; + cfg = config.profiles.perftools.enable; +in { + options.profiles.perftools.enable = mkEnableOption "perftools"; + + config = mkIf cfg { + environment.systemPackages = with pkgs; [ + # use the correct version of `perf` for the configured `linuxPackages` + perf + # also include userspace perf-tools and flamegraph scripts + perf-tools + flamegraph + ]; + # this does the same thing as above (using the correct `linuxPackages`) but + # for `bcc`...sad there's no version of this for perf out of the box. + programs.bcc.enable = true; + }; +} diff --git a/modules/zfs.nix b/modules/nixos/profiles/zfs.nix similarity index 100% rename from modules/zfs.nix rename to modules/nixos/profiles/zfs.nix -- 2.51.2 From e95996bb471024e712fcb28eb4c2b927773aa697 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sun, 15 Mar 2026 10:47:56 -0400 Subject: [PATCH 05/48] laptopification and other stuff --- hosts/prospero/configuration.nix | 43 +++++----------------- hosts/prospero/default.nix | 4 +- hosts/prospero/home.nix | 7 +++- hosts/uruk/configuration.nix | 1 - modules/home/profiles/desktop/niri.nix | 1 + modules/nixos/default.nix | 1 + modules/nixos/profiles/laptop.nix | 51 ++++++++++++++++++++++++++ 7 files changed, 72 insertions(+), 36 deletions(-) create mode 100644 modules/nixos/profiles/laptop.nix diff --git a/hosts/prospero/configuration.nix b/hosts/prospero/configuration.nix index a660a97..bb3aede 100644 --- a/hosts/prospero/configuration.nix +++ b/hosts/prospero/configuration.nix @@ -5,12 +5,10 @@ { config, lib, pkgs, ... }: { - nix.settings.experimental-features = ["nix-command" "flakes"]; imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; - hardware.bluetooth.enable = true; # Bootloader. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; @@ -33,30 +31,7 @@ # Enable networking networking.networkmanager.enable = true; - # Enable touchpad support (enabled default in most desktopManager). - # services.xserver.libinput.enable = true; - - # Define a user account. Don't forget to set a password with ‘passwd’. - - # List packages installed in system profile. To search, run: - # $ nix search wget environment.systemPackages = with pkgs; [ - gcc - gnumake - bison - flex - autoconf - automake - libtool - discord - calibre - libreoffice - enchant - rustup - pkg-config - passt - # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. - # wget ]; # programs.mtr.enable = true; @@ -73,13 +48,15 @@ # networking.firewall.allowedTCPPorts = [ ... ]; # networking.firewall.allowedUDPPorts = [ ... ]; # Or disable the firewall altogether. - - # This value determines the NixOS release from which the default - # settings for stateful data, like file locations and database versions - # on your system were taken. It‘s perfectly fine and recommended to leave - # this value at the release version of the first install of this system. - # Before changing this value read the documentation for this option - # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). system.stateVersion = "25.05"; # Did you read the comment? - + profiles = { + desktop = { + enable = true; + niri.enable = true; + }; + laptop.enable = true; + perftools.enable = true; + games.enable = true; + docs.enable = true; + }; } diff --git a/hosts/prospero/default.nix b/hosts/prospero/default.nix index 3f9a66a..2cdee0d 100644 --- a/hosts/prospero/default.nix +++ b/hosts/prospero/default.nix @@ -3,5 +3,7 @@ modules = [ ./configuration.nix ]; - home.modules = ./home.nix; + home.modules = [ + ./home.nix + ]; } diff --git a/hosts/prospero/home.nix b/hosts/prospero/home.nix index 82cd87c..8cb6eb9 100644 --- a/hosts/prospero/home.nix +++ b/hosts/prospero/home.nix @@ -1,2 +1,7 @@ {...}: -{} +{ + profiles = { + desktop.enable = true; + desktop.niri.enable = true; + }; +} diff --git a/hosts/uruk/configuration.nix b/hosts/uruk/configuration.nix index 2498c45..09c5193 100644 --- a/hosts/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -36,7 +36,6 @@ games.enable = true; docs.enable = true; zfs.enable = true; -# nix-ld.enable = true; }; } diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index ded92b8..aa50837 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -77,6 +77,7 @@ with lib; { }; programs.niri.settings = { prefer-no-csd = true; + cursor.size = 12; layout = { gaps = 10; preset-column-widths = [ diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 96ac0d9..404474a 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -7,6 +7,7 @@ ./profiles/docs.nix ./profiles/games.nix ./profiles/desktop + ./profiles/laptop.nix ]; console = { diff --git a/modules/nixos/profiles/laptop.nix b/modules/nixos/profiles/laptop.nix new file mode 100644 index 0000000..96747ad --- /dev/null +++ b/modules/nixos/profiles/laptop.nix @@ -0,0 +1,51 @@ +{ lib, config, pkgs, ... }: +let cfg = config.profiles.laptop; +in { + options.profiles.laptop = with lib; { + enable = mkEnableOption "laptop profile"; + suspendThenHibernate = { + enable = mkOption { + type = types.bool; + default = true; + description = + "Whether to setup suspend then hibernate when closing the lid."; + }; + delayHours = mkOption { + type = types.int; + default = 1; + description = + "Delay in hours before it should hibernate the laptop after suspending."; + }; + }; + }; + + config = with lib; mkIf cfg.enable + { + # Enabling the laptop profile automatically enables the + # desktop profile too. + profiles.desktop.enable = mkDefault true; + + services = { + # Enable UPower to watch battery stats. + upower.enable = mkDefault true; + # enable ppd + tuned.enable = mkDefault true; + }; + + # Enable light to control backlight. + powerManagement.powertop.enable = mkDefault true; + + environment.systemPackages = with pkgs; [ powertop brightnessctl ]; + + # Setup suspend then hibernate. + services.logind.lidSwitch = + if cfg.suspendThenHibernate.enable then + "suspend-then-hibernate" + else + "suspend"; + # as per the systemd manual this does nothing if suspend-then-hibernate is + # not enabled, so we might as well set it unconditionally. + systemd.sleep.settings.Sleep.HibernateDelaySec = + "${builtins.toString cfg.suspendThenHibernate.delayHours}h"; + }; +} -- 2.51.2 From ed65c77f89047ac5e66ce69b6da7c7396556213a Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 21 Mar 2026 19:21:38 -0400 Subject: [PATCH 06/48] re-enable smb on uruk --- hosts/uruk/configuration.nix | 73 ++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/hosts/uruk/configuration.nix b/hosts/uruk/configuration.nix index 09c5193..6ca6d4e 100644 --- a/hosts/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -27,6 +27,79 @@ systemd.targets.hibernate.enable = false; systemd.targets.hybrid-sleep.enable = false; + # samba + services.samba = { + enable = true; + securityType = "user"; + openFirewall = true; + settings = { + global = { + "workgroup" = "THOTH"; + "server string" = config.networking.hostName; + "netbios name" = config.networking.hostName; + "server smb encrypt" = "desired"; + "security" = "user"; + #"use sendfile" = "yes"; + #"max protocol" = "smb2"; + # note: localhost is the ipv6 localhost ::1 + "hosts allow" = "192.168.0. 127.0.0.1 100.64.0.0/10 localhost"; + "hosts deny" = "0.0.0.0/0"; + "guest account" = "nobody"; + "map to guest" = "bad user"; + }; + "video" = { + "path" = "/data/video"; + "browseable" = "yes"; + "read only" = "yes"; + "guest ok" = "yes"; + "create mask" = "0644"; + "directory mask" = "0755"; + "force user" = "nobody"; + "force group" = "users"; + }; + "music" = { + "path" = "/data/music"; + "browseable" = "yes"; + "read only" = "yes"; + "guest ok" = "yes"; + "create mask" = "0644"; + "directory mask" = "0755"; + "force user" = "nobody"; + "force group" = "users"; + }; + "books" = { + "path" = "/data/books"; + "browseable" = "yes"; + "read only" = "yes"; + "guest ok" = "yes"; + "create mask" = "0644"; + "directory mask" = "0755"; + "force user" = "nobody"; + "force group" = "users"; + }; + "emul" = { + "path" = "/data/emul"; + "browseable" = "yes"; + "read only" = "yes"; + "guest ok" = "yes"; + "create mask" = "0644"; + "directory mask" = "0755"; + "force user" = "nobody"; + "force group" = "users"; + }; + "wads" = { + "path" = "/data/wads"; + "browseable" = "yes"; + "read only" = "yes"; + "guest ok" = "yes"; + "create mask" = "0644"; + "directory mask" = "0755"; + "force user" = "nobody"; + "force group" = "users"; + }; + }; + }; + profiles = { desktop = { enable = true; -- 2.51.2 From 398c9929293392ce48916df4cd0b918136cffd17 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 3 Apr 2026 00:51:25 -0400 Subject: [PATCH 07/48] weakened smb encryption requirements --- hosts/uruk/configuration.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/uruk/configuration.nix b/hosts/uruk/configuration.nix index 6ca6d4e..ba5829f 100644 --- a/hosts/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -37,7 +37,7 @@ "workgroup" = "THOTH"; "server string" = config.networking.hostName; "netbios name" = config.networking.hostName; - "server smb encrypt" = "desired"; + "server smb encrypt" = "if_required"; "security" = "user"; #"use sendfile" = "yes"; #"max protocol" = "smb2"; -- 2.51.2 From 503858a6b1dba0f28e30c4c384cdb603496b9927 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 3 Apr 2026 01:00:31 -0400 Subject: [PATCH 08/48] ollama on uruk --- hosts/uruk/configuration.nix | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hosts/uruk/configuration.nix b/hosts/uruk/configuration.nix index ba5829f..780735f 100644 --- a/hosts/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -27,6 +27,16 @@ systemd.targets.hibernate.enable = false; systemd.targets.hybrid-sleep.enable = false; + services.ollama = { + enable = true; + package = pkgs.ollama-rocm; + host = "0.0.0.0"; + rocmOverrideGfx = "10.0.3.0"; + environmentVariables = { + OLLAMA_CONTEXT_LENGTH = "100000"; + }; + }; + # samba services.samba = { enable = true; -- 2.51.2 From ca55824441deb27f27332b1a1f900634a282248e Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 3 Apr 2026 01:00:31 -0400 Subject: [PATCH 09/48] update flake deps --- flake.lock | 185 +++++++++------------- hosts/uruk/configuration.nix | 10 +- modules/home/profiles/desktop/default.nix | 3 +- modules/home/profiles/desktop/niri.nix | 6 +- modules/nixos/nix.nix | 2 +- 5 files changed, 89 insertions(+), 117 deletions(-) diff --git a/flake.lock b/flake.lock index 0e2109f..42b8393 100644 --- a/flake.lock +++ b/flake.lock @@ -71,11 +71,11 @@ "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1764873433, - "narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=", + "lastModified": 1775176642, + "narHash": "sha256-2veEED0Fg7Fsh81tvVDNYR6SzjqQxa7hbi18Jv4LWpM=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92", + "rev": "179704030c5286c729b5b0522037d1d51341022c", "type": "github" }, "original": { @@ -107,11 +107,11 @@ ] }, "locked": { - "lastModified": 1767609335, - "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=", + "lastModified": 1775087534, + "narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "250481aafeb741edfe23d29195671c19b36b6dca", + "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b", "type": "github" }, "original": { @@ -157,20 +157,18 @@ "gnome-shell": { "flake": false, "locked": { - "host": "gitlab.gnome.org", "lastModified": 1767737596, "narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=", "owner": "GNOME", "repo": "gnome-shell", "rev": "ef02db02bf0ff342734d525b5767814770d85b49", - "type": "gitlab" + "type": "github" }, "original": { - "host": "gitlab.gnome.org", "owner": "GNOME", - "ref": "gnome-49", "repo": "gnome-shell", - "type": "gitlab" + "rev": "ef02db02bf0ff342734d525b5767814770d85b49", + "type": "github" } }, "home": { @@ -180,11 +178,11 @@ ] }, "locked": { - "lastModified": 1773422513, - "narHash": "sha256-MPjR48roW7CUMU6lu0+qQGqj92Kuh3paIulMWFZy+NQ=", + "lastModified": 1776777932, + "narHash": "sha256-0R3Yow/NzSeVGUke5tL7CCkqmss4Vmi6BbV6idHzq/8=", "owner": "nix-community", "repo": "home-manager", - "rev": "ef12a9a2b0f77c8fa3dda1e7e494fca668909056", + "rev": "5d5640599a0050b994330328b9fd45709c909720", "type": "github" }, "original": { @@ -199,11 +197,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1772974622, - "narHash": "sha256-HIY4FEug/QVPF669+8A0ztFV1hC3d5Z+M6aL5J7AZNQ=", + "lastModified": 1776604187, + "narHash": "sha256-rYAdN6wIB+li/dnF45di0ZplEzAbUr//r8T4TgTDMK4=", "owner": "nix-community", "repo": "lib-aggregate", - "rev": "55e6cfb4549362ed408875eee0f92cfde7ccda4e", + "rev": "ca6dd228fe3daf2f4bd08a46717d68aa44490b48", "type": "github" }, "original": { @@ -222,11 +220,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1773390002, - "narHash": "sha256-0RVjh9h0sgPHngxEs/Wd2/xdGsgKgZWjxFu5JsX3ASw=", + "lastModified": 1776714033, + "narHash": "sha256-O+34yexfSxigXyb5usuzqac7vRHy6gYv7BtNtzDhQNo=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "adc63b19724247f947385381481effd225a6e2fc", + "rev": "32bed686f4fd8274a5e4a58d071687a74e19821e", "type": "github" }, "original": { @@ -255,11 +253,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1773130184, - "narHash": "sha256-3bwx4WqCB06yfQIGB+OgIckOkEDyKxiTD5pOo4Xz2rI=", + "lastModified": 1776706941, + "narHash": "sha256-nnv27JD0FOOqs1Hh67kydXFzZoEu8e0QyMf0R9AXaIw=", "owner": "YaLTeR", "repo": "niri", - "rev": "b07bde3ee82dd73115e6b949e4f3f63695da35ea", + "rev": "e9c182a13c1d12762351ec01ce0ec711d41b0337", "type": "github" }, "original": { @@ -288,11 +286,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1773282481, - "narHash": "sha256-b/GV2ysM8mKHhinse2wz+uP37epUrSE+sAKXy/xvBY4=", + "lastModified": 1776548001, + "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "fe416aaedd397cacb33a610b33d60ff2b431b127", + "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", "type": "github" }, "original": { @@ -304,11 +302,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1772933218, - "narHash": "sha256-hohiyWALn8cXqk3FPnE3UADy03lRMaTV5iRzKCU86zM=", + "lastModified": 1776564050, + "narHash": "sha256-01CvP7g0lwWuB1ruUKUy/xZqorQYKaTd4iPdCAoToFk=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "7489b10b9d10953341b448ed8f30c96999baef2c", + "rev": "927c9af2765fead764f1a6b9557feef2a40201f5", "type": "github" }, "original": { @@ -319,11 +317,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1773222311, - "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=", + "lastModified": 1776434932, + "narHash": "sha256-gyqXNMgk3sh+ogY5svd2eNLJ6oEwzbAeaoBrrxD0lKk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0590cd39f728e129122770c029970378a79d076a", + "rev": "c7f47036d3df2add644c46d712d14262b7d86c0c", "type": "github" }, "original": { @@ -335,11 +333,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1773068389, - "narHash": "sha256-vMrm7Pk2hjBRPnCSjhq1pH0bg350Z+pXhqZ9ICiqqCs=", + "lastModified": 1776434932, + "narHash": "sha256-gyqXNMgk3sh+ogY5svd2eNLJ6oEwzbAeaoBrrxD0lKk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "44bae273f9f82d480273bab26f5c50de3724f52f", + "rev": "c7f47036d3df2add644c46d712d14262b7d86c0c", "type": "github" }, "original": { @@ -356,11 +354,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1773409378, - "narHash": "sha256-9NARQANYlp2sSvxaZYG3WAWRmSk01lwx9sxUSjQ3VOw=", + "lastModified": 1776781056, + "narHash": "sha256-JWT91+nSB9qBSVIDx6R5lEjs/qBwr8bFDGWKZXPURY0=", "owner": "nix-community", "repo": "nixpkgs-wayland", - "rev": "c3ff72acdf5e909dc92719f491ce98f135a4aabe", + "rev": "7575d23a35dec99eda9d3ef2e4a7487d1623dde3", "type": "github" }, "original": { @@ -387,11 +385,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1772963539, - "narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=", + "lastModified": 1776548001, + "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9dcb002ca1690658be4a04645215baea8b95f31d", + "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", "type": "github" }, "original": { @@ -403,11 +401,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1773282481, - "narHash": "sha256-b/GV2ysM8mKHhinse2wz+uP37epUrSE+sAKXy/xvBY4=", + "lastModified": 1776548001, + "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", "owner": "nixos", "repo": "nixpkgs", - "rev": "fe416aaedd397cacb33a610b33d60ff2b431b127", + "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", "type": "github" }, "original": { @@ -417,22 +415,6 @@ "type": "github" } }, - "nixpkgs_5": { - "locked": { - "lastModified": 1770107345, - "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "noctalia": { "inputs": { "nixpkgs": [ @@ -443,11 +425,11 @@ ] }, "locked": { - "lastModified": 1773426896, - "narHash": "sha256-InonCkzlnCdsku697Eg+Jd36YVHUb/YL2BG1XZ7Eoi8=", + "lastModified": 1776774185, + "narHash": "sha256-riCnQWAxvltNd6KrkzQLdG2EMxODNxjQOB2Z67DA4KU=", "owner": "noctalia-dev", "repo": "noctalia-shell", - "rev": "0bdf5afd2cf51fdcc5fe95b5205e6f6f3f0a9183", + "rev": "d7b68652e79bce5813dc4fea7e51636a5da3e1b7", "type": "github" }, "original": { @@ -465,11 +447,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1773277895, - "narHash": "sha256-pK01O5J9ogI4rVtDI+PVxckaXqpYZ4uthY0vgVWdyl8=", + "lastModified": 1776585574, + "narHash": "sha256-j35EWhKoGhKrfcXcAOpoRVgXEPQt41Eukji/h59cnjk=", "owner": "noctalia-dev", "repo": "noctalia-qs", - "rev": "d5209a6b5fe8c6dff8d530e820c96f09830011e3", + "rev": "75d180c28a9ab4470e980f3d6f706ad6c5213add", "type": "github" }, "original": { @@ -490,11 +472,11 @@ ] }, "locked": { - "lastModified": 1767810917, - "narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=", + "lastModified": 1775228139, + "narHash": "sha256-ebbeHmg+V7w8050bwQOuhmQHoLOEOfqKzM1KgCTexK4=", "owner": "nix-community", "repo": "NUR", - "rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4", + "rev": "601971b9c89e0304561977f2c28fa25e73aa7132", "type": "github" }, "original": { @@ -524,11 +506,11 @@ ] }, "locked": { - "lastModified": 1773371126, - "narHash": "sha256-SGnZQO8hnynR90Lo/1MVrTScsOPx9i26XjqSqoFOZ4E=", + "lastModified": 1776741231, + "narHash": "sha256-k9G98qzn+7npROUaks8VqCFm7cFtEG8ulQLBBo5lItg=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "475826b105eb52f39bd3281f60c052299e64d085", + "rev": "02061303f7c4c964f7b4584dabd9e985b4cd442b", "type": "github" }, "original": { @@ -551,18 +533,17 @@ ], "nur": "nur", "systems": "systems_3", - "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", "tinted-tmux": "tinted-tmux", "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1772296853, - "narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=", + "lastModified": 1776170745, + "narHash": "sha256-Tl1aZVP5EIlT+k0+iAKH018GLHJpLz3hhJ0LNQOWxCc=", "owner": "danth", "repo": "stylix", - "rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf", + "rev": "e3861617645a43c9bbefde1aa6ac54dd0a44bfa9", "type": "github" }, "original": { @@ -616,23 +597,6 @@ "type": "github" } }, - "tinted-foot": { - "flake": false, - "locked": { - "lastModified": 1726913040, - "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", - "owner": "tinted-theming", - "repo": "tinted-foot", - "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "tinted-foot", - "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", - "type": "github" - } - }, "tinted-kitty": { "flake": false, "locked": { @@ -652,11 +616,11 @@ "tinted-schemes": { "flake": false, "locked": { - "lastModified": 1767710407, - "narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=", + "lastModified": 1772661346, + "narHash": "sha256-4eu3LqB9tPqe0Vaqxd4wkZiBbthLbpb7llcoE/p5HT0=", "owner": "tinted-theming", "repo": "schemes", - "rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2", + "rev": "13b5b0c299982bb361039601e2d72587d6846294", "type": "github" }, "original": { @@ -668,11 +632,11 @@ "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1767489635, - "narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=", + "lastModified": 1772934010, + "narHash": "sha256-x+6+4UvaG+RBRQ6UaX+o6DjEg28u4eqhVRM9kpgJGjQ=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184", + "rev": "c3529673a5ab6e1b6830f618c45d9ce1bcdd829d", "type": "github" }, "original": { @@ -684,11 +648,11 @@ "tinted-zed": { "flake": false, "locked": { - "lastModified": 1767488740, - "narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=", + "lastModified": 1772909925, + "narHash": "sha256-jx/5+pgYR0noHa3hk2esin18VMbnPSvWPL5bBjfTIAU=", "owner": "tinted-theming", "repo": "base16-zed", - "rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40", + "rev": "b4d3a1b3bcbd090937ef609a0a3b37237af974df", "type": "github" }, "original": { @@ -699,14 +663,17 @@ }, "treefmt-nix": { "inputs": { - "nixpkgs": "nixpkgs_5" + "nixpkgs": [ + "noctalia-qs", + "nixpkgs" + ] }, "locked": { - "lastModified": 1772660329, - "narHash": "sha256-IjU1FxYqm+VDe5qIOxoW+pISBlGvVApRjiw/Y/ttJzY=", + "lastModified": 1775636079, + "narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "3710e0e1218041bbad640352a0440114b1e10428", + "rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba", "type": "github" }, "original": { @@ -735,11 +702,11 @@ "xwayland-satellite-unstable": { "flake": false, "locked": { - "lastModified": 1772429643, - "narHash": "sha256-M+bAeCCcjBnVk6w/4dIVvXvpJwOKnXjwi/lDbaN6Yws=", + "lastModified": 1773622265, + "narHash": "sha256-wToKwH7IgWdGLMSIWksEDs4eumR6UbbsuPQ42r0oTXQ=", "owner": "Supreeeme", "repo": "xwayland-satellite", - "rev": "10f985b84cdbcc3bbf35b3e7e43d1b2a84fa9ce2", + "rev": "a879e5e0896a326adc79c474bf457b8b99011027", "type": "github" }, "original": { diff --git a/hosts/uruk/configuration.nix b/hosts/uruk/configuration.nix index 780735f..bd5b2ec 100644 --- a/hosts/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -29,11 +29,15 @@ services.ollama = { enable = true; - package = pkgs.ollama-rocm; + package = pkgs.ollama-vulkan; host = "0.0.0.0"; - rocmOverrideGfx = "10.0.3.0"; + rocmOverrideGfx = "10.3.0"; environmentVariables = { - OLLAMA_CONTEXT_LENGTH = "100000"; + OLLAMA_CONTEXT_LENGTH = "128000"; + OLLAMA_FLASH_ATTENTION = "1"; + OLLAMA_KV_CACHE_OPTIMIZATION = "1"; + OLLAMA_KV_CACHE_TYPE = "q8_0"; + GGML_VK_VISIBLE_DEVICES = "0"; }; }; diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 1f7517b..2fca177 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -1,4 +1,4 @@ -{config, lib, pkgs, ...}: +{config, lib, pkgs, inputs, ...}: let cfg = config.profiles.desktop; in { imports = [./niri.nix]; @@ -10,7 +10,6 @@ in { terminus_font keepassxc syncthing - goose-cli discord calibre libreoffice-fresh diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index aa50837..07ae698 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -103,7 +103,10 @@ with lib; { active.color = "${colors.base0B}ff"; }; }; - spawn-at-startup = [{command = ["keepassxc"];}]; + spawn-at-startup = [ + { command = ["keepassxc"]; } + { command = ["noctalia-shell"]; } + ]; xwayland-satellite.enable = true; xwayland-satellite.path = "${pkgs.xwayland-satellite}/bin/xwayland-satellite"; @@ -264,7 +267,6 @@ with lib; { stylix.targets.noctalia-shell.enable = true; programs.noctalia-shell = { enable = true; - systemd.enable = true; settings = { bar = { density = "default"; diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index aa6af20..d71fa2e 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -26,7 +26,7 @@ with lib; { settings = let substituters = [ "https://nix-community.cachix.org" - ]; + ] ++ (if config.networking.hostName != "uruk" then [ "joshua@uruk" ] else [ ]); in { experimental-features = ["nix-command" "flakes"]; trusted-users = ["root" "joshua"]; -- 2.51.2 From 43ebcb9c1e45e29144e4399f08960d2f461c5ec6 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 21 Apr 2026 12:38:54 -0400 Subject: [PATCH 10/48] fix ssh uri for nixos substituter. d'oh! --- modules/nixos/nix.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index d71fa2e..ff90276 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -26,7 +26,7 @@ with lib; { settings = let substituters = [ "https://nix-community.cachix.org" - ] ++ (if config.networking.hostName != "uruk" then [ "joshua@uruk" ] else [ ]); + ] ++ (if config.networking.hostName != "uruk" then [ "ssh://joshua@uruk" ] else [ ]); in { experimental-features = ["nix-command" "flakes"]; trusted-users = ["root" "joshua"]; -- 2.51.2 From 2329a230e9372b9553154cc18bb5600933a46256 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Wed, 8 Apr 2026 23:56:53 -0400 Subject: [PATCH 11/48] set up ssh-agent on desktop machines --- modules/home/profiles/desktop/default.nix | 1 + modules/nixos/default.nix | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 2fca177..b973bcc 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -39,6 +39,7 @@ in { programs.firefox.enable = true; programs.emacs.enable = true; programs.foot.enable = true; + services.ssh-agent.enable = true; services.emacs.enable = true; services.emacs.defaultEditor = true; services.emacs.startWithUserSession = "graphical"; diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 404474a..1b987c2 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -69,6 +69,7 @@ "wireshark" "dialout" ]; + linger = true; openssh.authorizedKeys.keys = [ # prospero "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHM0G+Ri6crg86mYVWWDHUiO+FX0GB0di9QkdNvE8SWF" -- 2.51.2 From ec4e398f557e4fd5be8e01acbd7b8577d0e17e0c Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Wed, 8 Apr 2026 23:56:53 -0400 Subject: [PATCH 12/48] added kvm and adb permissions to self --- modules/nixos/default.nix | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 1b987c2..facace7 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -1,13 +1,13 @@ {pkgs, lib, config, ...}:{ imports = [ ./nix.nix - ./profiles/zfs.nix - ./profiles/networking.nix - ./profiles/perftools.nix + ./profiles/desktop ./profiles/docs.nix ./profiles/games.nix - ./profiles/desktop ./profiles/laptop.nix + ./profiles/networking.nix + ./profiles/perftools.nix + ./profiles/zfs.nix ]; console = { @@ -67,6 +67,8 @@ "docker" "podman" "wireshark" + "kvm" + "adbusers" "dialout" ]; linger = true; -- 2.51.2 From 2256b135e7cdbdd45c8ac8f05557937207a17232 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 1 May 2026 14:48:28 -0400 Subject: [PATCH 13/48] fixed cursor finally --- modules/home/profiles/desktop/default.nix | 5 +++++ modules/home/profiles/desktop/niri.nix | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index b973bcc..bf1ad9d 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -54,6 +54,11 @@ in { }; stylix.enable = true; stylix.polarity = "dark"; + stylix.cursor = { + size = 24; + package = pkgs.posy-cursors; + name = "Posy_Cursor_Black"; + }; stylix.image = ./iskandar.png; stylix.targets.foot.enable = true; stylix.targets.emacs.enable = false; diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index 07ae698..765832a 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -77,7 +77,6 @@ with lib; { }; programs.niri.settings = { prefer-no-csd = true; - cursor.size = 12; layout = { gaps = 10; preset-column-widths = [ -- 2.51.2 From 651a1fd971d0c2035291320ab6f3c5b9aaf4c9be Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 1 May 2026 14:59:43 -0400 Subject: [PATCH 14/48] noctalia now locks the fucking screen --- modules/home/profiles/desktop/niri.nix | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index 765832a..4b7b022 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -301,11 +301,6 @@ with lib; { hideUnoccupied = false; id = "Workspace"; } - { - id = "ActiveWindow"; - useFixedWidth = false; - maxWidth = 400; - } ]; right = [ { @@ -334,6 +329,10 @@ with lib; { }; }; general = { + lockOnSuspend = true; + }; + idle = { + enabled = true; }; location = { monthBeforeDay = true; -- 2.51.2 From 0594d1975eb503e39ea8b5eef42846314b9b1cd2 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 1 May 2026 19:24:54 -0400 Subject: [PATCH 15/48] Added Nautilus so we get file dialogs --- modules/nixos/profiles/desktop/niri.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nixos/profiles/desktop/niri.nix b/modules/nixos/profiles/desktop/niri.nix index c47b3f2..f4bad1c 100644 --- a/modules/nixos/profiles/desktop/niri.nix +++ b/modules/nixos/profiles/desktop/niri.nix @@ -38,6 +38,7 @@ in wayland-utils libsecret gamescope + nautilus ]; programs = { firefox = { -- 2.51.2 From 495400e335ecfb005525336660d740fc8724d23f Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 2 May 2026 14:10:55 -0400 Subject: [PATCH 16/48] reformatted, now with more nesting. --- modules/home/profiles/desktop/default.nix | 53 +++++++++++++---------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index bf1ad9d..a8d6468 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -36,31 +36,38 @@ in { tilt rustup ]; - programs.firefox.enable = true; - programs.emacs.enable = true; - programs.foot.enable = true; - services.ssh-agent.enable = true; - services.emacs.enable = true; - services.emacs.defaultEditor = true; - services.emacs.startWithUserSession = "graphical"; - stylix.base16Scheme = - "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; - stylix.fonts = { - sizes.terminal = 12; - monospace = { - package = pkgs.terminus_font; - name = "Terminus"; + programs = { + firefox.enable = true; + emacs.enable = true; + foot.enable = true; + }; + services = { + emacs = { + enable = true; + defaultEditor = true; + startWithUserSession = "graphical"; }; }; - stylix.enable = true; - stylix.polarity = "dark"; - stylix.cursor = { - size = 24; - package = pkgs.posy-cursors; - name = "Posy_Cursor_Black"; + stylix = { + enable = true; + base16Scheme = + "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; + fonts = { + sizes.terminal = 12; + monospace = { + package = pkgs.terminus_font; + name = "Terminus"; + }; + }; + polarity = "dark"; + cursor = { + size = 24; + package = pkgs.posy-cursors; + name = "Posy_Cursor_Black"; + }; + image = ./iskandar.png; + targets.foot.enable = true; + targets.emacs.enable = false; }; - stylix.image = ./iskandar.png; - stylix.targets.foot.enable = true; - stylix.targets.emacs.enable = false; }; } -- 2.51.2 From 08311541a312a1851b76b6f39d29e7a12e6828d7 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 2 May 2026 14:10:55 -0400 Subject: [PATCH 17/48] home-manager now manages ssh config --- modules/home/profiles/default.nix | 2 +- modules/home/profiles/ssh.nix | 40 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 modules/home/profiles/ssh.nix diff --git a/modules/home/profiles/default.nix b/modules/home/profiles/default.nix index 9bf7778..a28b9da 100644 --- a/modules/home/profiles/default.nix +++ b/modules/home/profiles/default.nix @@ -1,3 +1,3 @@ {...}: { - imports = [ ./desktop ]; + imports = [ ./desktop ./ssh.nix ]; } diff --git a/modules/home/profiles/ssh.nix b/modules/home/profiles/ssh.nix new file mode 100644 index 0000000..9ffc77d --- /dev/null +++ b/modules/home/profiles/ssh.nix @@ -0,0 +1,40 @@ +{config, lib, pkgs, inputs, ...}: +let cfg = config.profiles.ssh; +in { + options.profiles.ssh.enable = + lib.mkEnableOption "SSH configuration (keys not included)"; + config = lib.mkIf cfg.enable { + services.ssh-agent.enable = true; + programs.ssh = { + enable = true; + enableDefaultConfig = false; + matchBlocks = { + "*" = { + addKeysToAgent = "yes"; + identitiesOnly = true; + }; + anubis = { + hostname = "anubis.bahamut.monster"; + user = "root"; + identityFile = "~/.ssh/id_ed25519"; + forwardAgent = true; + }; + uruk = { + user = "joshua"; + identityFile = "~/.ssh/id_ed25519"; + forwardAgent = true; + }; + github = { + hostname = "github.com"; + user = "git"; + identityFile = "~/.ssh/id_ed25519"; + }; + tangled = { + hostname = "tangled.org"; + user = "git"; + identityFile = "~/.ssh/id_ed25519"; + }; + }; + }; + }; +} -- 2.51.2 From a2e1be55c897d576418e4e6508d300bb0b9315b1 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 2 May 2026 14:10:55 -0400 Subject: [PATCH 18/48] removed non-working ssh substituter --- modules/nixos/nix.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index ff90276..aa6af20 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -26,7 +26,7 @@ with lib; { settings = let substituters = [ "https://nix-community.cachix.org" - ] ++ (if config.networking.hostName != "uruk" then [ "ssh://joshua@uruk" ] else [ ]); + ]; in { experimental-features = ["nix-command" "flakes"]; trusted-users = ["root" "joshua"]; -- 2.51.2 From 2159e8ea461f27fe27f4f5f853db6d95d8754ea9 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 2 May 2026 14:10:55 -0400 Subject: [PATCH 19/48] added jujutsu config --- modules/home/profiles/default.nix | 2 +- modules/home/profiles/desktop/default.nix | 4 ++ modules/home/profiles/jj.nix | 47 +++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 modules/home/profiles/jj.nix diff --git a/modules/home/profiles/default.nix b/modules/home/profiles/default.nix index a28b9da..f5d0cc7 100644 --- a/modules/home/profiles/default.nix +++ b/modules/home/profiles/default.nix @@ -1,3 +1,3 @@ {...}: { - imports = [ ./desktop ./ssh.nix ]; + imports = [ ./desktop ./ssh.nix ./jj.nix ]; } diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index a8d6468..a39490b 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -6,6 +6,10 @@ in { enable = mkEnableOption "Profile for desktop machines"; }; config = lib.mkIf cfg.enable { + profiles = { + ssh.enable = lib.mkDefault true; + jj.enable = lib.mkDefault true; + }; home.packages = with pkgs; [ terminus_font keepassxc diff --git a/modules/home/profiles/jj.nix b/modules/home/profiles/jj.nix new file mode 100644 index 0000000..3946de9 --- /dev/null +++ b/modules/home/profiles/jj.nix @@ -0,0 +1,47 @@ +{config, lib, pkgs, inputs, ...}: +let cfg = config.profiles.jj; +in { + options.profiles.jj.enable = lib.mkEnableOption "jujutsu configuration"; + config = lib.mkIf cfg.enable { + programs.jujutsu = { + enable = true; + ediff = false; + settings = { + user = { + email = "jjbarr@ptnote.dev"; + name = "Joshua Barrett"; + }; + ui = { + default-command = "log"; + conflict-marker-style = "git"; + }; + templates = { + draft_commit_description = '' + concat( + builtin_draft_commit_description, + "\nJJ: ignore-rest\n---\n", + diff.git(), + ) + ''; + }; + revsets = { + bookmark-advance-to = "closest_pushable(@)"; + }; + revset-aliases = { + "closest_pushable(to)" = '' + heads(::to & mutable() & ~description(exact:"") & (~empty() | merges())) + ''; + }; + signing = { + backend = "ssh"; + behavior = "drop"; + key = "~/.ssh/id_ed25519.pub"; + }; + git = { + sign-on-push = true; + private-commits = "description('wip:*') | description('private:*')"; + }; + }; + }; + }; +} -- 2.51.2 From c28f631e6e668ccbdc63c1b1997b6d2d90abb1d8 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 19 May 2026 19:34:22 -0400 Subject: [PATCH 20/48] Updated dependencies --- flake.lock | 138 ++++++++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/flake.lock b/flake.lock index 42b8393..903dc94 100644 --- a/flake.lock +++ b/flake.lock @@ -38,11 +38,11 @@ "base16-helix": { "flake": false, "locked": { - "lastModified": 1760703920, - "narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=", + "lastModified": 1776754714, + "narHash": "sha256-E3OAK27smtATTmX45uoTSRsVD+Y+ZiVVfgM/tjpbtYg=", "owner": "tinted-theming", "repo": "base16-helix", - "rev": "d646af9b7d14bff08824538164af99d0c521b185", + "rev": "4d508123037e7851ad36ebf7d9c48b0e9e1eb581", "type": "github" }, "original": { @@ -71,11 +71,11 @@ "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1775176642, - "narHash": "sha256-2veEED0Fg7Fsh81tvVDNYR6SzjqQxa7hbi18Jv4LWpM=", + "lastModified": 1776136500, + "narHash": "sha256-r0gN2brVWA351zwMV0Flmlcd6SGMvYqFbvC3DfKFM8Y=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "179704030c5286c729b5b0522037d1d51341022c", + "rev": "0f8ba203d475587f477e7ae12661bd8459e225b7", "type": "github" }, "original": { @@ -178,11 +178,11 @@ ] }, "locked": { - "lastModified": 1776777932, - "narHash": "sha256-0R3Yow/NzSeVGUke5tL7CCkqmss4Vmi6BbV6idHzq/8=", + "lastModified": 1779157263, + "narHash": "sha256-VbiyZkRf8/qr7ObmlyfOHJsNAW5tyZ4MB1+cUwAwdrw=", "owner": "nix-community", "repo": "home-manager", - "rev": "5d5640599a0050b994330328b9fd45709c909720", + "rev": "866412a19866b4a8e32d2306a118040afa2b840c", "type": "github" }, "original": { @@ -197,11 +197,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1776604187, - "narHash": "sha256-rYAdN6wIB+li/dnF45di0ZplEzAbUr//r8T4TgTDMK4=", + "lastModified": 1779025127, + "narHash": "sha256-OGTSct+rUI1anMnxvG7KLP9I4LsvCHoVi9yKqcta/xA=", "owner": "nix-community", "repo": "lib-aggregate", - "rev": "ca6dd228fe3daf2f4bd08a46717d68aa44490b48", + "rev": "eeadc36611ebbecb9d2c8f5bef7049ba60344da9", "type": "github" }, "original": { @@ -220,11 +220,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1776714033, - "narHash": "sha256-O+34yexfSxigXyb5usuzqac7vRHy6gYv7BtNtzDhQNo=", + "lastModified": 1778942403, + "narHash": "sha256-SPCWvqeVySTNUgX/shARpRl5fi/NnkObUgDGR/Aco4c=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "32bed686f4fd8274a5e4a58d071687a74e19821e", + "rev": "daefca3370581223fedc24d0101c4915a3689f9e", "type": "github" }, "original": { @@ -253,11 +253,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1776706941, - "narHash": "sha256-nnv27JD0FOOqs1Hh67kydXFzZoEu8e0QyMf0R9AXaIw=", + "lastModified": 1778858756, + "narHash": "sha256-9VvAHNoi2wd0fxLfJOPChZMS7l6rhCtAJmpd59Hv5rw=", "owner": "YaLTeR", "repo": "niri", - "rev": "e9c182a13c1d12762351ec01ce0ec711d41b0337", + "rev": "cd5ac3e5e04bb5a11276d3c755fa25242818e05f", "type": "github" }, "original": { @@ -271,11 +271,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1745680380, - "narHash": "sha256-Z8PknjkmIr/8ZCH+dmc2Pc+UltiOr7/oKg37PXuVvuU=", + "lastModified": 1778497292, + "narHash": "sha256-vodUt55p0PXOaKK5xE1dldTxdtyuttbdGy0LvP8cCxQ=", "owner": "ners", "repo": "nix-monitored", - "rev": "60f3baa4701d58eab86c2d1d9c3d7e820074d461", + "rev": "4a7e1e7dcd0c1f7c2d063928511ebd72afea7e58", "type": "github" }, "original": { @@ -286,11 +286,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1776548001, - "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", + "lastModified": 1778869304, + "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", + "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", "type": "github" }, "original": { @@ -302,11 +302,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1776564050, - "narHash": "sha256-01CvP7g0lwWuB1ruUKUy/xZqorQYKaTd4iPdCAoToFk=", + "lastModified": 1778984393, + "narHash": "sha256-r755Kh5Q0XBTPNuv9rL2rsUJTq8BDhb+lIwRWhl6yYA=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "927c9af2765fead764f1a6b9557feef2a40201f5", + "rev": "0d14a58ab7aa3f513c58ccc9e47e77ffd92be204", "type": "github" }, "original": { @@ -317,11 +317,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1776434932, - "narHash": "sha256-gyqXNMgk3sh+ogY5svd2eNLJ6oEwzbAeaoBrrxD0lKk=", + "lastModified": 1778737229, + "narHash": "sha256-6xWoytx8jFW4PF1GjRm/i/53trbpKGfz6zjzQGBr4cI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c7f47036d3df2add644c46d712d14262b7d86c0c", + "rev": "d7a713c0b7e47c908258e71cba7a2d77cc8d71d5", "type": "github" }, "original": { @@ -333,11 +333,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1776434932, - "narHash": "sha256-gyqXNMgk3sh+ogY5svd2eNLJ6oEwzbAeaoBrrxD0lKk=", + "lastModified": 1778737229, + "narHash": "sha256-6xWoytx8jFW4PF1GjRm/i/53trbpKGfz6zjzQGBr4cI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c7f47036d3df2add644c46d712d14262b7d86c0c", + "rev": "d7a713c0b7e47c908258e71cba7a2d77cc8d71d5", "type": "github" }, "original": { @@ -354,11 +354,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1776781056, - "narHash": "sha256-JWT91+nSB9qBSVIDx6R5lEjs/qBwr8bFDGWKZXPURY0=", + "lastModified": 1779046559, + "narHash": "sha256-prtoFMToJ4S2O33/zARx0rAugKhCSuYN8Usc7mrvls8=", "owner": "nix-community", "repo": "nixpkgs-wayland", - "rev": "7575d23a35dec99eda9d3ef2e4a7487d1623dde3", + "rev": "8c21681fac7c3811654adc0fff6d0a0abd5402d8", "type": "github" }, "original": { @@ -369,11 +369,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1745526057, - "narHash": "sha256-ITSpPDwvLBZBnPRS2bUcHY3gZSwis/uTe255QgMtTLA=", + "lastModified": 1777954456, + "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f771eb401a46846c1aebd20552521b233dd7e18b", + "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "type": "github" }, "original": { @@ -385,11 +385,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1776548001, - "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", + "lastModified": 1778869304, + "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", + "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", "type": "github" }, "original": { @@ -401,11 +401,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1776548001, - "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", + "lastModified": 1778869304, + "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", + "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", "type": "github" }, "original": { @@ -425,11 +425,11 @@ ] }, "locked": { - "lastModified": 1776774185, - "narHash": "sha256-riCnQWAxvltNd6KrkzQLdG2EMxODNxjQOB2Z67DA4KU=", + "lastModified": 1779125269, + "narHash": "sha256-vMF9Hd5/UoLggIJcLKK/oC1SnxoQdgIaUMdVB48zQ7A=", "owner": "noctalia-dev", "repo": "noctalia-shell", - "rev": "d7b68652e79bce5813dc4fea7e51636a5da3e1b7", + "rev": "da95089dfe5148ee7fb33b3faa314e86de1e6f25", "type": "github" }, "original": { @@ -447,11 +447,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1776585574, - "narHash": "sha256-j35EWhKoGhKrfcXcAOpoRVgXEPQt41Eukji/h59cnjk=", + "lastModified": 1778983195, + "narHash": "sha256-hE3EFK5GoSdbO5WHZ8bZDUVYkofbDLQN/KK25z7IOOI=", "owner": "noctalia-dev", "repo": "noctalia-qs", - "rev": "75d180c28a9ab4470e980f3d6f706ad6c5213add", + "rev": "4116b41cdc89e186be7cb8b24a9b6022af95d742", "type": "github" }, "original": { @@ -472,11 +472,11 @@ ] }, "locked": { - "lastModified": 1775228139, - "narHash": "sha256-ebbeHmg+V7w8050bwQOuhmQHoLOEOfqKzM1KgCTexK4=", + "lastModified": 1777598946, + "narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=", "owner": "nix-community", "repo": "NUR", - "rev": "601971b9c89e0304561977f2c28fa25e73aa7132", + "rev": "5d55af01c0f86be583931fe99207fc56c14134b3", "type": "github" }, "original": { @@ -506,11 +506,11 @@ ] }, "locked": { - "lastModified": 1776741231, - "narHash": "sha256-k9G98qzn+7npROUaks8VqCFm7cFtEG8ulQLBBo5lItg=", + "lastModified": 1779160702, + "narHash": "sha256-frUihZLlBLdcFN95mq5QiQmxF2M16nxtmw1GH4rhZmg=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "02061303f7c4c964f7b4584dabd9e985b4cd442b", + "rev": "8cd592658d4448c57326aaa819e1c2f91086eb40", "type": "github" }, "original": { @@ -539,11 +539,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1776170745, - "narHash": "sha256-Tl1aZVP5EIlT+k0+iAKH018GLHJpLz3hhJ0LNQOWxCc=", + "lastModified": 1778776709, + "narHash": "sha256-YhnEcpiY6+l3RFA+cPmdTaeODGvNRuqE8B7VBjPVIxo=", "owner": "danth", "repo": "stylix", - "rev": "e3861617645a43c9bbefde1aa6ac54dd0a44bfa9", + "rev": "e8ea85b4f7dddda9603e0f1ac86cd92cee3b2819", "type": "github" }, "original": { @@ -616,11 +616,11 @@ "tinted-schemes": { "flake": false, "locked": { - "lastModified": 1772661346, - "narHash": "sha256-4eu3LqB9tPqe0Vaqxd4wkZiBbthLbpb7llcoE/p5HT0=", + "lastModified": 1777041405, + "narHash": "sha256-BAGZ7ObFV/9Z61OJZun7ifPyhkuHqNuW1QIhQ8LuzCo=", "owner": "tinted-theming", "repo": "schemes", - "rev": "13b5b0c299982bb361039601e2d72587d6846294", + "rev": "5f868b3a338b6904c47f3833b9c411be641983a8", "type": "github" }, "original": { @@ -632,11 +632,11 @@ "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1772934010, - "narHash": "sha256-x+6+4UvaG+RBRQ6UaX+o6DjEg28u4eqhVRM9kpgJGjQ=", + "lastModified": 1777169200, + "narHash": "sha256-h7dDbIzP5hDr9v97w9PL6jdAgXawmj6krcH+959rqpU=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "c3529673a5ab6e1b6830f618c45d9ce1bcdd829d", + "rev": "f798c2dce44ef815bb6b8f05a82135c7942d35ac", "type": "github" }, "original": { @@ -648,11 +648,11 @@ "tinted-zed": { "flake": false, "locked": { - "lastModified": 1772909925, - "narHash": "sha256-jx/5+pgYR0noHa3hk2esin18VMbnPSvWPL5bBjfTIAU=", + "lastModified": 1777463218, + "narHash": "sha256-Bhkozqtq3BKLqWTlmKm8uAptfX4aRGI8QX3eEL54Vpc=", "owner": "tinted-theming", "repo": "base16-zed", - "rev": "b4d3a1b3bcbd090937ef609a0a3b37237af974df", + "rev": "5768d08ed2e7944a26a958868cdb073cb8856dae", "type": "github" }, "original": { -- 2.51.2 From 411d1c55265a0cb294e8213d0fc7679e1c2f71d4 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 19 May 2026 20:56:18 -0400 Subject: [PATCH 21/48] added proper development environment --- .envrc | 1 + flake.lock | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++- flake.nix | 88 +++++++++++++++++++++++++--------------- justfile | 7 ++++ 4 files changed, 178 insertions(+), 35 deletions(-) create mode 100644 .envrc create mode 100644 justfile diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/flake.lock b/flake.lock index 903dc94..8ac7fdf 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,28 @@ { "nodes": { + "alejandra": { + "inputs": { + "fenix": "fenix", + "flakeCompat": "flakeCompat", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1744324181, + "narHash": "sha256-Oi1n2ncF4/AWeY6X55o2FddIRICokbciqFYK64XorYk=", + "owner": "kamadorueda", + "repo": "alejandra", + "rev": "3e2a85506627062313e131bf8a85315f3387c8e0", + "type": "github" + }, + "original": { + "owner": "kamadorueda", + "ref": "4.0.0", + "repo": "alejandra", + "type": "github" + } + }, "base16": { "inputs": { "fromYaml": "fromYaml" @@ -68,6 +91,28 @@ "type": "github" } }, + "fenix": { + "inputs": { + "nixpkgs": [ + "alejandra", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1730615655, + "narHash": "sha256-2HBR3zLn57LXKNRtxBb+O+uDqHM4n0pz51rPayMl4cg=", + "owner": "nix-community", + "repo": "fenix", + "rev": "efeb50e2535b17ffd4a135e6e3e5fd60a525180c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, "firefox-gnome-theme": { "flake": false, "locked": { @@ -100,6 +145,24 @@ } }, "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -138,6 +201,22 @@ "type": "github" } }, + "flakeCompat": { + "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" + } + }, "fromYaml": { "flake": false, "locked": { @@ -194,7 +273,7 @@ "lib-aggregate": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs-lib": "nixpkgs-lib" + "nixpkgs-lib": "nixpkgs-lib_2" }, "locked": { "lastModified": 1779025127, @@ -301,6 +380,21 @@ } }, "nixpkgs-lib": { + "locked": { + "lastModified": 1777168982, + "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-lib_2": { "locked": { "lastModified": 1778984393, "narHash": "sha256-r755Kh5Q0XBTPNuv9rL2rsUJTq8BDhb+lIwRWhl6yYA=", @@ -487,6 +581,8 @@ }, "root": { "inputs": { + "alejandra": "alejandra", + "flake-parts": "flake-parts", "home": "home", "niri": "niri", "nix-monitored": "nix-monitored", @@ -499,6 +595,23 @@ "stylix": "stylix" } }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1730555913, + "narHash": "sha256-KNHZUlqsEibg3YtfUyOFQSofP8hp1HKoY+laoesBxRM=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "f17a5bbfd0969ba2e63a74505a80e55ecb174ed9", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, "rust-overlay": { "inputs": { "nixpkgs": [ @@ -526,7 +639,7 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts", + "flake-parts": "flake-parts_2", "gnome-shell": "gnome-shell", "nixpkgs": [ "nixpkgs" diff --git a/flake.nix b/flake.nix index 2e6f157..d62b757 100644 --- a/flake.nix +++ b/flake.nix @@ -28,6 +28,13 @@ url = "github:noctalia-dev/noctalia-qs"; inputs.nixpkgs.follows = "nixpkgs"; }; + alejandra = { + url = "github:kamadorueda/alejandra/4.0.0"; + inputs = { + nixpkgs.follows = "nixpkgs"; + }; + }; + flake-parts.url = "github:hercules-ci/flake-parts"; }; nixConfig = { @@ -57,20 +64,33 @@ overlays = [ inputs.rust-overlay.overlays.default inputs.niri.overlays.niri + (_: prev: + {alejandra = + inputs.alejandra.defaultPackage.${prev.stdenv.hostPlatform.system};}) ]; - in { - nixosConfigurations = lib.genNixOSHosts { - inherit inputs config overlays self; - baseModules = [ - home.nixosModules.home-manager - self.nixosModules.default - inputs.niri.nixosModules.niri - inputs.stylix.nixosModules.stylix - inputs.nix-monitored.nixosModules.default - ]; + in inputs.flake-parts.lib.mkFlake {inherit inputs;} { + perSystem = {pkgs, system, ...}: { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + alejandra + just + nil + ]; + }; }; + flake = { + nixosConfigurations = lib.genNixOSHosts { + inherit inputs config overlays self; + baseModules = [ + home.nixosModules.home-manager + self.nixosModules.default + inputs.niri.nixosModules.niri + inputs.stylix.nixosModules.stylix + inputs.nix-monitored.nixosModules.default + ]; + }; - homeConfigurations = lib.genHomeHosts { + homeConfigurations = lib.genHomeHosts { inherit inputs config overlays; user = "joshua"; @@ -82,28 +102,30 @@ inputs.noctalia.homeModules.default inputs.stylix.homeModules.stylix ]; + }; + + homeModules.default = import ./modules/home; + nixosModules.default = import ./modules/nixos; + #TODO put home-manager in dtcommon + # nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { + # system = "x86_64-linux"; + # modules = [ + # ./all.nix + # home-manager.nixosModules.home-manager + # ./dt-common.nix + # ./prospero/configuration.nix + # ]; + # }; + # nixosConfigurations.uruk = nixpkgs.lib.nixosSystem { + # system = "x86_64-linux"; + # modules = [ + # ./all.nix + # home-manager.nixosModules.home-manager + # ./dt-common.nix + # ./uruk/configuration.nix + # ]; + # }; }; - - homeModules.default = import ./modules/home; - nixosModules.default = import ./modules/nixos; - #TODO put home-manager in dtcommon - # nixosConfigurations.prospero = nixpkgs.lib.nixosSystem { - # system = "x86_64-linux"; - # modules = [ - # ./all.nix - # home-manager.nixosModules.home-manager - # ./dt-common.nix - # ./prospero/configuration.nix - # ]; - # }; - # nixosConfigurations.uruk = nixpkgs.lib.nixosSystem { - # system = "x86_64-linux"; - # modules = [ - # ./all.nix - # home-manager.nixosModules.home-manager - # ./dt-common.nix - # ./uruk/configuration.nix - # ]; - # }; + systems = [ "x86_64-linux" "aarch64-linux" ]; }; } diff --git a/justfile b/justfile new file mode 100644 index 0000000..8ee29b7 --- /dev/null +++ b/justfile @@ -0,0 +1,7 @@ +apply: + nixos-rebuild switch --flake . --sudo + home-manager switch --flake . +apply-boot: + nixos-rebuild boot --flake . --sudo +hm: + home-manager switch --flake . -- 2.51.2 From 918dbcbfc40196cda683491e5c6e74ef3e175a88 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 19 May 2026 20:56:18 -0400 Subject: [PATCH 22/48] nixos appeasement, reformatting --- modules/home/profiles/desktop/default.nix | 7 ++++++- modules/home/profiles/desktop/niri.nix | 20 ++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index a39490b..6d41edf 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -41,7 +41,10 @@ in { rustup ]; programs = { - firefox.enable = true; + firefox = { + enable = true; + configPath = "${config.xdg.configHome}/mozilla/firefox"; + }; emacs.enable = true; foot.enable = true; }; @@ -52,6 +55,7 @@ in { startWithUserSession = "graphical"; }; }; + gtk.gtk4.theme = null; stylix = { enable = true; base16Scheme = @@ -72,6 +76,7 @@ in { image = ./iskandar.png; targets.foot.enable = true; targets.emacs.enable = false; + targets.firefox.enable = false; }; }; } diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index 4b7b022..a8ab3ff 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -211,12 +211,10 @@ with lib; { ]; window-rules = [ { - matches = [ - { + matches = [{ app-id = "^firefox$"; title = "^Picture-in-Picture$"; - } - ]; + }]; opacity = 1.0; default-window-height = { proportion = 0.42; @@ -232,20 +230,14 @@ with lib; { }; } { - matches = [ - { + matches = [{ app-id = "^firefox$"; title = "Private Browsing"; - } - ]; + }]; border.active.color = colors.base0E; } { - matches = [ - { - app-id = "^org\\.keepassxc\\.KeePassXC$"; - } - ]; + matches = [{ app-id = "^org\\.keepassxc\\.KeePassXC$"; }]; block-out-from = "screen-capture"; } ]; @@ -329,7 +321,7 @@ with lib; { }; }; general = { - lockOnSuspend = true; + lockOnSuspend = true; }; idle = { enabled = true; -- 2.51.2 From 60ded048189f0d54457e2a5d9490d13b1af3f6f9 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 19 May 2026 20:56:18 -0400 Subject: [PATCH 23/48] niri configuration adjustements - steam notifications now locked to corner - focus follows mouse, but not if it would move windows. --- modules/home/profiles/desktop/niri.nix | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index a8ab3ff..4afed19 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -77,6 +77,12 @@ with lib; { }; programs.niri.settings = { prefer-no-csd = true; + input = { + focus-follows-mouse = { + enable = true; + max-scroll-amount = "0%"; + }; + }; layout = { gaps = 10; preset-column-widths = [ @@ -240,6 +246,18 @@ with lib; { matches = [{ app-id = "^org\\.keepassxc\\.KeePassXC$"; }]; block-out-from = "screen-capture"; } + { + matches = [{ + app-id = "steam"; + title =''^notificationtoasts_\d+_desktop$''; + }]; + default-floating-position = { + x = 0; + y = 0; + relative-to = "bottom-right"; + }; + open-focused = false; + } ]; layer-rules = [ { -- 2.51.2 From 3381a7348582e878dbe3aed8bbe36825875090d5 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 19 May 2026 20:56:18 -0400 Subject: [PATCH 24/48] enabled printer autodiscovery --- modules/nixos/profiles/desktop/default.nix | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/nixos/profiles/desktop/default.nix b/modules/nixos/profiles/desktop/default.nix index 01e2ce5..588c75d 100644 --- a/modules/nixos/profiles/desktop/default.nix +++ b/modules/nixos/profiles/desktop/default.nix @@ -65,7 +65,12 @@ in { }; # Enable CUPS to print documents. - printing.enable = lib.mkDefault true; + printing = { + enable = lib.mkDefault true; + cups-pdf.enable = true; + browsed.enable = true; + browsing.enable = true; + }; }; console.useXkbConfig = true; -- 2.51.2 From 12ab0250316ce0fd992e737cfbd46e0bfac669ea Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 23 May 2026 20:04:15 -0400 Subject: [PATCH 25/48] Fixed bug with printing on uruk grr --- modules/nixos/profiles/desktop/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nixos/profiles/desktop/default.nix b/modules/nixos/profiles/desktop/default.nix index 588c75d..013b775 100644 --- a/modules/nixos/profiles/desktop/default.nix +++ b/modules/nixos/profiles/desktop/default.nix @@ -69,7 +69,7 @@ in { enable = lib.mkDefault true; cups-pdf.enable = true; browsed.enable = true; - browsing.enable = true; + browsing = true; }; }; console.useXkbConfig = true; -- 2.51.2 From 41cd04c32086c6fdc66c9b6ef3ae3d1adbb01203 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 23 May 2026 20:04:15 -0400 Subject: [PATCH 26/48] added .direnv to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b42106 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.direnv/ -- 2.51.2 From fcca201850c30bec654145f42800200c26be2941 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Wed, 20 May 2026 13:24:04 -0400 Subject: [PATCH 27/48] ensure emacs backup files aren't checked in --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9b42106..5bf65d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .direnv/ +\#* -- 2.51.2 From b42c886cbf3f92b35faa113ae1b1a53dbfbcad16 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Wed, 20 May 2026 13:24:04 -0400 Subject: [PATCH 28/48] moved from kpxc to bitwarden --- modules/home/profiles/desktop/default.nix | 3 ++- modules/home/profiles/desktop/niri.nix | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 6d41edf..155a8cf 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -12,7 +12,6 @@ in { }; home.packages = with pkgs; [ terminus_font - keepassxc syncthing discord calibre @@ -23,6 +22,8 @@ in { gimp vlc syncplay + bitwarden-desktop + bitwarden-cli # stuff emacs needs # TODO bind this to a proper emacs nixenv gcc diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index 4afed19..5f881e0 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -109,7 +109,6 @@ with lib; { }; }; spawn-at-startup = [ - { command = ["keepassxc"]; } { command = ["noctalia-shell"]; } ]; xwayland-satellite.enable = true; -- 2.51.2 From 1994c5b629e562999a82b4693dc97a92bc09c48f Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 23 May 2026 20:42:26 -0400 Subject: [PATCH 29/48] fix emacs terminal colors --- modules/home/profiles/desktop/default.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 155a8cf..3d7f895 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -49,6 +49,8 @@ in { emacs.enable = true; foot.enable = true; }; + # hack hack hack! + systemd.user.services.emacs.Service.Environment = "COLORTERM=truecolor"; services = { emacs = { enable = true; -- 2.51.2 From c240ae97decea7451ca2d8f34530816b70fd3ae6 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 23 May 2026 20:46:36 -0400 Subject: [PATCH 30/48] rip out nix-monitored having the monitor output is very cool, but the way nom works is extremely flaky. It's just not worth it. --- flake.lock | 41 +++-------------------------------------- flake.nix | 2 -- modules/nixos/nix.nix | 12 ------------ 3 files changed, 3 insertions(+), 52 deletions(-) diff --git a/flake.lock b/flake.lock index 8ac7fdf..487d5f2 100644 --- a/flake.lock +++ b/flake.lock @@ -345,24 +345,6 @@ "type": "github" } }, - "nix-monitored": { - "inputs": { - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1778497292, - "narHash": "sha256-vodUt55p0PXOaKK5xE1dldTxdtyuttbdGy0LvP8cCxQ=", - "owner": "ners", - "repo": "nix-monitored", - "rev": "4a7e1e7dcd0c1f7c2d063928511ebd72afea7e58", - "type": "github" - }, - "original": { - "owner": "ners", - "repo": "nix-monitored", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1778869304, @@ -445,7 +427,7 @@ "inputs": { "flake-compat": "flake-compat", "lib-aggregate": "lib-aggregate", - "nixpkgs": "nixpkgs_4" + "nixpkgs": "nixpkgs_3" }, "locked": { "lastModified": 1779046559, @@ -462,22 +444,6 @@ } }, "nixpkgs_2": { - "locked": { - "lastModified": 1777954456, - "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { "locked": { "lastModified": 1778869304, "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", @@ -493,7 +459,7 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_3": { "locked": { "lastModified": 1778869304, "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", @@ -585,8 +551,7 @@ "flake-parts": "flake-parts", "home": "home", "niri": "niri", - "nix-monitored": "nix-monitored", - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs_2", "nixpkgs-stable": "nixpkgs-stable_2", "nixpkgs-wayland": "nixpkgs-wayland", "noctalia": "noctalia", diff --git a/flake.nix b/flake.nix index d62b757..7768e98 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,6 @@ nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11"; nixpkgs-wayland.url = "github:nix-community/nixpkgs-wayland"; niri.url = "github:sodiboo/niri-flake"; - nix-monitored.url = "github:ners/nix-monitored"; home = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; @@ -86,7 +85,6 @@ self.nixosModules.default inputs.niri.nixosModules.niri inputs.stylix.nixosModules.stylix - inputs.nix-monitored.nixosModules.default ]; }; diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index aa6af20..3ad57bf 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -6,19 +6,7 @@ with lib; { config = mkMerge [ { nixpkgs.config.allowUnfree = true; - nixpkgs.overlays = [ - (self: super: { - nixos-rebuild = super.nixos-rebuild.override { - nix = super.nix-monitored; - }; - nix-direnv = super.nix-direnv.override { - nix = super.nix-monitored; - }; - }) - ]; - nix = { - package = pkgs.nix-monitored; gc = { automatic = true; dates = "monthly"; -- 2.51.2 From 697e79283e6983cac17bc306b47bc2053703b069 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 23 May 2026 20:49:18 -0400 Subject: [PATCH 31/48] disable zfs forceImportRoot For some godforsaken reason nixos made forceImportRoot default for ages. They've fixed it, but the default has been set so as not to break me. So I need to change it because fuck that shit. --- modules/nixos/profiles/zfs.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/nixos/profiles/zfs.nix b/modules/nixos/profiles/zfs.nix index 927f862..fdba04e 100644 --- a/modules/nixos/profiles/zfs.nix +++ b/modules/nixos/profiles/zfs.nix @@ -39,7 +39,10 @@ in # Note this might jump back and worth as kernel get added or removed. kernelPackages = latestZfsKernel; supportedFilesystems = ["zfs"]; - zfs.devNodes = "/dev/disk/by-id"; + zfs = { + devNodes = "/dev/disk/by-id"; + forceImportRoot = false; + }; }; # ZFS configuration -- 2.51.2 From 249182301f57779643b84d32af5b02a6e5f53098 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 23 May 2026 21:37:55 -0400 Subject: [PATCH 32/48] updated ssh to use hm's new and much better config system. --- modules/home/profiles/ssh.nix | 54 ++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/modules/home/profiles/ssh.nix b/modules/home/profiles/ssh.nix index 9ffc77d..663c180 100644 --- a/modules/home/profiles/ssh.nix +++ b/modules/home/profiles/ssh.nix @@ -8,33 +8,35 @@ in { programs.ssh = { enable = true; enableDefaultConfig = false; - matchBlocks = { - "*" = { - addKeysToAgent = "yes"; - identitiesOnly = true; + settings = + (builtins.mapAttrs (k: v: lib.hm.dag.entryBefore [ "Host *" ] v ) ({ + "Host anubis anubis.bahamut.monster" = { + HostName = "anubis.bahamut.monster"; + User = "root"; + IdentityFile = "~/.ssh/id_ed25519"; + ForwardAgent = true; + }; + "Host uruk uruk.beago-lydian.ts.net" = { + User = "joshua"; + IdentityFile = "~/.ssh/id_ed25519"; + ForwardAgent = true; + }; + "Host github github.com" = { + HostName = "github.com"; + User = "git"; + IdentityFile = "~/.ssh/id_ed25519"; + }; + "Host tangled tangled.org" = { + HostName = "tangled.org"; + User = "git"; + IdentityFile = "~/.ssh/id_ed25519"; + }; + })) // { + "Host *" = { + AddKeysToAgent = "yes"; + IdentitiesOnly = true; + }; }; - anubis = { - hostname = "anubis.bahamut.monster"; - user = "root"; - identityFile = "~/.ssh/id_ed25519"; - forwardAgent = true; - }; - uruk = { - user = "joshua"; - identityFile = "~/.ssh/id_ed25519"; - forwardAgent = true; - }; - github = { - hostname = "github.com"; - user = "git"; - identityFile = "~/.ssh/id_ed25519"; - }; - tangled = { - hostname = "tangled.org"; - user = "git"; - identityFile = "~/.ssh/id_ed25519"; - }; - }; }; }; } -- 2.51.2 From 93ecdcac026378d3035cbee4a74c1d129ead1653 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Fri, 29 May 2026 19:28:35 -0400 Subject: [PATCH 33/48] now with emacs integation --- flake.lock | 297 +++++++++++++++++++++- flake.nix | 55 ++-- modules/home/default.nix | 1 - modules/home/profiles/default.nix | 6 +- modules/home/profiles/desktop/default.nix | 31 +-- 5 files changed, 336 insertions(+), 54 deletions(-) diff --git a/flake.lock b/flake.lock index 487d5f2..c14553a 100644 --- a/flake.lock +++ b/flake.lock @@ -91,6 +91,93 @@ "type": "github" } }, + "elisp-helpers": { + "inputs": { + "fromElisp": "fromElisp" + }, + "locked": { + "lastModified": 1763784882, + "narHash": "sha256-ZaGDaT7hKNFh/RwT0YZqWL9AzFjRgpUPGGYbVVHJ4PM=", + "owner": "emacs-twist", + "repo": "elisp-helpers", + "rev": "6126c7bb179b13442c86e6f5ee9ff7b0c4837e53", + "type": "github" + }, + "original": { + "owner": "emacs-twist", + "repo": "elisp-helpers", + "type": "github" + } + }, + "emacs-builtins": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1779147734, + "narHash": "sha256-8Tupa1CVVPix9b5JjsvyflMLFFmQSZBj+y4H/JAiyvg=", + "owner": "emacs-twist", + "repo": "emacs-builtins", + "rev": "b9d3aa84b0e4cc027feea2c05c52adce1f7c85dc", + "type": "github" + }, + "original": { + "owner": "emacs-twist", + "repo": "emacs-builtins", + "type": "github" + } + }, + "emacs-config": { + "inputs": { + "alejandra": [ + "alejandra" + ], + "emacs-builtins": "emacs-builtins", + "epkgs": "epkgs", + "flake-parts": "flake-parts_2", + "gnu-elpa": "gnu-elpa", + "home-manager": [ + "home" + ], + "melpa": "melpa", + "nixpkgs": [ + "nixpkgs" + ], + "nongnu": "nongnu", + "systems": "systems", + "twist": "twist" + }, + "locked": { + "lastModified": 1780176772, + "narHash": "sha256-8F/Sc3zR7gUfcF4+SFk20zoH+ssWxJ5zRHH+J2NZugg=", + "ref": "refs/heads/main", + "rev": "186b543ca2ffe986dfbdb2571d3f3f1d5042a1c7", + "revCount": 301, + "type": "git", + "url": "ssh://git@github.com/jjbarr/emacs.d" + }, + "original": { + "type": "git", + "url": "ssh://git@github.com/jjbarr/emacs.d" + } + }, + "epkgs": { + "flake": false, + "locked": { + "lastModified": 1779623115, + "narHash": "sha256-NnPPyNO3fJgjfx0bxFG0BLhoRdU18e8L8yyKBL2mnSQ=", + "owner": "emacsmirror", + "repo": "epkgs", + "rev": "137a67afcbda7cb00fe1ba474aa7e20864b6fa9f", + "type": "github" + }, + "original": { + "owner": "emacsmirror", + "repo": "epkgs", + "type": "github" + } + }, "fenix": { "inputs": { "nixpkgs": [ @@ -163,6 +250,42 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -185,7 +308,7 @@ }, "flake-utils": { "inputs": { - "systems": "systems" + "systems": "systems_2" }, "locked": { "lastModified": 1731533236, @@ -217,6 +340,22 @@ "type": "github" } }, + "fromElisp": { + "flake": false, + "locked": { + "lastModified": 1723987997, + "narHash": "sha256-OhaVgTG6zjLByzl+uPTvtCld3p2uqgbCXmOl/s3LVRo=", + "owner": "talyz", + "repo": "fromElisp", + "rev": "f071a0e262c02c0895b575c4e322b7fd90713543", + "type": "github" + }, + "original": { + "owner": "talyz", + "repo": "fromElisp", + "type": "github" + } + }, "fromYaml": { "flake": false, "locked": { @@ -250,6 +389,23 @@ "type": "github" } }, + "gnu-elpa": { + "flake": false, + "locked": { + "lastModified": 1779379016, + "narHash": "sha256-i+EcraUXuN3XmdWLtYCYrmxb3epIwW25BsUvOT9jSno=", + "ref": "main", + "rev": "9103f918995753bd98bbad09a3a38267cb1cdfaa", + "revCount": 755, + "type": "git", + "url": "https://git.savannah.gnu.org/git/emacs/elpa.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://git.savannah.gnu.org/git/emacs/elpa.git" + } + }, "home": { "inputs": { "nixpkgs": [ @@ -273,7 +429,7 @@ "lib-aggregate": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs-lib": "nixpkgs-lib_2" + "nixpkgs-lib": "nixpkgs-lib_4" }, "locked": { "lastModified": 1779025127, @@ -289,11 +445,27 @@ "type": "github" } }, + "melpa": { + "flake": false, + "locked": { + "lastModified": 1779650126, + "narHash": "sha256-4nH349kfSm58RIZIKuQRUJg37H5oxK/JWC90S2WzZeo=", + "owner": "melpa", + "repo": "melpa", + "rev": "141f731232697e997efe49295531f92589d36c3b", + "type": "github" + }, + "original": { + "owner": "melpa", + "repo": "melpa", + "type": "github" + } + }, "niri": { "inputs": { "niri-stable": "niri-stable", "niri-unstable": "niri-unstable", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "nixpkgs-stable": "nixpkgs-stable", "xwayland-satellite-stable": "xwayland-satellite-stable", "xwayland-satellite-unstable": "xwayland-satellite-unstable" @@ -347,16 +519,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", + "lastModified": 1779536132, + "narHash": "sha256-q+fF42iv/geEbHfgSzy3tS0FF/EyD6XTZ98E6yxiBO8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", + "rev": "3d8f0f3f72a6cd4d93d0ad13203f2ea1cb7e1456", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -377,6 +549,36 @@ } }, "nixpkgs-lib_2": { + "locked": { + "lastModified": 1777168982, + "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "lastModified": 1777168982, + "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-lib_4": { "locked": { "lastModified": 1778984393, "narHash": "sha256-r755Kh5Q0XBTPNuv9rL2rsUJTq8BDhb+lIwRWhl6yYA=", @@ -427,7 +629,7 @@ "inputs": { "flake-compat": "flake-compat", "lib-aggregate": "lib-aggregate", - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_4" }, "locked": { "lastModified": 1779046559, @@ -460,6 +662,22 @@ } }, "nixpkgs_3": { + "locked": { + "lastModified": 1778869304, + "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { "locked": { "lastModified": 1778869304, "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", @@ -503,7 +721,7 @@ "nixpkgs": [ "nixpkgs" ], - "systems": "systems_2", + "systems": "systems_3", "treefmt-nix": "treefmt-nix" }, "locked": { @@ -520,6 +738,23 @@ "type": "github" } }, + "nongnu": { + "flake": false, + "locked": { + "lastModified": 1778814297, + "narHash": "sha256-U8FoYexh4glbG5yP7VF056fZwsW++wzEVNGph4MZ4fc=", + "ref": "main", + "rev": "9a138bb309154f4595bd11b6e12cd2d56d99dc49", + "revCount": 401, + "type": "git", + "url": "https://git.savannah.gnu.org/git/emacs/nongnu.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://git.savannah.gnu.org/git/emacs/nongnu.git" + } + }, "nur": { "inputs": { "flake-parts": [ @@ -548,10 +783,11 @@ "root": { "inputs": { "alejandra": "alejandra", - "flake-parts": "flake-parts", + "emacs-config": "emacs-config", + "flake-parts": "flake-parts_3", "home": "home", "niri": "niri", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_3", "nixpkgs-stable": "nixpkgs-stable_2", "nixpkgs-wayland": "nixpkgs-wayland", "noctalia": "noctalia", @@ -604,13 +840,13 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_4", "gnome-shell": "gnome-shell", "nixpkgs": [ "nixpkgs" ], "nur": "nur", - "systems": "systems_3", + "systems": "systems_4", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", "tinted-tmux": "tinted-tmux", @@ -646,6 +882,21 @@ } }, "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" + } + }, + "systems_3": { "locked": { "lastModified": 1689347949, "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", @@ -660,7 +911,7 @@ "type": "github" } }, - "systems_3": { + "systems_4": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -760,6 +1011,24 @@ "type": "github" } }, + "twist": { + "inputs": { + "elisp-helpers": "elisp-helpers" + }, + "locked": { + "lastModified": 1779192794, + "narHash": "sha256-ogJgK4tuDV8yqrf+HxmOE51SWuz7L9VfYdq4vor2BlI=", + "owner": "emacs-twist", + "repo": "twist.nix", + "rev": "7f12f6f0988c6f979e1fe0dd97c98209647d48f0", + "type": "github" + }, + "original": { + "owner": "emacs-twist", + "repo": "twist.nix", + "type": "github" + } + }, "xwayland-satellite-stable": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 7768e98..9ee59bf 100644 --- a/flake.nix +++ b/flake.nix @@ -4,6 +4,12 @@ nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11"; nixpkgs-wayland.url = "github:nix-community/nixpkgs-wayland"; niri.url = "github:sodiboo/niri-flake"; + emacs-config = { + url = "git+ssh://git@github.com/jjbarr/emacs.d"; + inputs.home-manager.follows = "home"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.alejandra.follows = "alejandra"; + }; home = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; @@ -35,7 +41,7 @@ }; flake-parts.url = "github:hercules-ci/flake-parts"; }; - + nixConfig = { extra-substituters = [ "https://cache.nixos.org" @@ -54,21 +60,31 @@ ]; }; - - outputs = {self, home, nixpkgs, nixpkgs-stable, ...}@inputs: - let lib = import ./lib; - config = { - allowUnfree = true; - }; - overlays = [ - inputs.rust-overlay.overlays.default - inputs.niri.overlays.niri - (_: prev: - {alejandra = - inputs.alejandra.defaultPackage.${prev.stdenv.hostPlatform.system};}) - ]; - in inputs.flake-parts.lib.mkFlake {inherit inputs;} { - perSystem = {pkgs, system, ...}: { + outputs = { + self, + home, + nixpkgs, + ... + } @ inputs: let + lib = import ./lib; + config = { + allowUnfree = true; + }; + overlays = [ + inputs.rust-overlay.overlays.default + inputs.niri.overlays.niri + (_: prev: { + alejandra = + inputs.alejandra.defaultPackage.${prev.stdenv.hostPlatform.system}; + }) + ]; + in + inputs.flake-parts.lib.mkFlake {inherit inputs;} { + perSystem = { + pkgs, + system, + ... + }: { devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ alejandra @@ -92,16 +108,17 @@ inherit inputs config overlays; user = "joshua"; - + baseModules = [ self.homeModules.default inputs.niri.homeModules.niri inputs.niri.homeModules.stylix inputs.noctalia.homeModules.default inputs.stylix.homeModules.stylix + inputs.emacs-config.homeModules.emacs ]; }; - + homeModules.default = import ./modules/home; nixosModules.default = import ./modules/nixos; #TODO put home-manager in dtcommon @@ -124,6 +141,6 @@ # ]; # }; }; - systems = [ "x86_64-linux" "aarch64-linux" ]; + systems = ["x86_64-linux" "aarch64-linux"]; }; } diff --git a/modules/home/default.nix b/modules/home/default.nix index 2b846b0..c6939ff 100644 --- a/modules/home/default.nix +++ b/modules/home/default.nix @@ -7,7 +7,6 @@ packages = with pkgs; [ rsync ripgrep - jujutsu ]; file = { diff --git a/modules/home/profiles/default.nix b/modules/home/profiles/default.nix index f5d0cc7..fee8708 100644 --- a/modules/home/profiles/default.nix +++ b/modules/home/profiles/default.nix @@ -1,3 +1,7 @@ {...}: { - imports = [ ./desktop ./ssh.nix ./jj.nix ]; + imports = [ + ./desktop + ./ssh.nix + ./jj.nix + ]; } diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 3d7f895..abb8ae5 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -9,6 +9,7 @@ in { profiles = { ssh.enable = lib.mkDefault true; jj.enable = lib.mkDefault true; + emacs.enable = lib.mkDefault true; }; home.packages = with pkgs; [ terminus_font @@ -26,16 +27,18 @@ in { bitwarden-cli # stuff emacs needs # TODO bind this to a proper emacs nixenv - gcc - gnumake - bison - flex - autoconf - automake - libtool - enchant - pkg-config + # gcc + # gnumake + # bison + # flex + # autoconf + # automake + # libtool + # enchant + # pkg-config # other junk + hunspell + hunspellDicts.en-us kubectl k3d tilt @@ -46,18 +49,8 @@ in { enable = true; configPath = "${config.xdg.configHome}/mozilla/firefox"; }; - emacs.enable = true; foot.enable = true; }; - # hack hack hack! - systemd.user.services.emacs.Service.Environment = "COLORTERM=truecolor"; - services = { - emacs = { - enable = true; - defaultEditor = true; - startWithUserSession = "graphical"; - }; - }; gtk.gtk4.theme = null; stylix = { enable = true; -- 2.51.2 From 9dcced7c76c2969bc1e96e0f26a40e971ba36d90 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 6 Jun 2026 19:23:59 -0400 Subject: [PATCH 34/48] version update --- flake.lock | 132 ++++++++++----------- modules/home/profiles/desktop/default.nix | 4 + modules/nixos/profiles/desktop/default.nix | 2 +- modules/nixos/profiles/desktop/niri.nix | 6 - 4 files changed, 71 insertions(+), 73 deletions(-) diff --git a/flake.lock b/flake.lock index c14553a..76a9365 100644 --- a/flake.lock +++ b/flake.lock @@ -203,11 +203,11 @@ "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1776136500, - "narHash": "sha256-r0gN2brVWA351zwMV0Flmlcd6SGMvYqFbvC3DfKFM8Y=", + "lastModified": 1779670703, + "narHash": "sha256-UdfMivNMwCCqQsYDg5pSz8X2IOaOrIZLIIy+Bg3CO2o=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "0f8ba203d475587f477e7ae12661bd8459e225b7", + "rev": "942159e73e40bf785816f7f1f5feed9ef3d7c8f9", "type": "github" }, "original": { @@ -293,11 +293,11 @@ ] }, "locked": { - "lastModified": 1775087534, - "narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=", + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", "type": "github" }, "original": { @@ -413,11 +413,11 @@ ] }, "locked": { - "lastModified": 1779157263, - "narHash": "sha256-VbiyZkRf8/qr7ObmlyfOHJsNAW5tyZ4MB1+cUwAwdrw=", + "lastModified": 1780408569, + "narHash": "sha256-s7Tv6FUQThRAvW8En8XVC6HMb0uiikzVccCcCo9u/Bg=", "owner": "nix-community", "repo": "home-manager", - "rev": "866412a19866b4a8e32d2306a118040afa2b840c", + "rev": "f384af1bec6423a0d4ba1855917ab948f64e5808", "type": "github" }, "original": { @@ -432,11 +432,11 @@ "nixpkgs-lib": "nixpkgs-lib_4" }, "locked": { - "lastModified": 1779025127, - "narHash": "sha256-OGTSct+rUI1anMnxvG7KLP9I4LsvCHoVi9yKqcta/xA=", + "lastModified": 1780235539, + "narHash": "sha256-neW/f0B00Tv19lRtK98zu74qSLIZWIz9C4z686s6LFo=", "owner": "nix-community", "repo": "lib-aggregate", - "rev": "eeadc36611ebbecb9d2c8f5bef7049ba60344da9", + "rev": "577c8f9b06c4d3990ceb4554445cfb37a9c3b8e1", "type": "github" }, "original": { @@ -471,11 +471,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1778942403, - "narHash": "sha256-SPCWvqeVySTNUgX/shARpRl5fi/NnkObUgDGR/Aco4c=", + "lastModified": 1780348240, + "narHash": "sha256-V4QJAR5+AHUV31KOwrUVE8efOC9bkhLHbvkXT05I0mY=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "daefca3370581223fedc24d0101c4915a3689f9e", + "rev": "134a4f01eff9291806eab0e8d9fe31bbda7587f3", "type": "github" }, "original": { @@ -504,11 +504,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1778858756, - "narHash": "sha256-9VvAHNoi2wd0fxLfJOPChZMS7l6rhCtAJmpd59Hv5rw=", + "lastModified": 1780056110, + "narHash": "sha256-t7lKVshV/srD0G06j4r5P5qj9zaDeZ9JYFCxHDGROZU=", "owner": "YaLTeR", "repo": "niri", - "rev": "cd5ac3e5e04bb5a11276d3c755fa25242818e05f", + "rev": "f9f43d826ab4014a7c302be28d7da33e12f5be37", "type": "github" }, "original": { @@ -580,11 +580,11 @@ }, "nixpkgs-lib_4": { "locked": { - "lastModified": 1778984393, - "narHash": "sha256-r755Kh5Q0XBTPNuv9rL2rsUJTq8BDhb+lIwRWhl6yYA=", + "lastModified": 1780195591, + "narHash": "sha256-/LAL+E75c0ioCHxyVFGwzXorfuHzToKgqPUCRq4RTIY=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "0d14a58ab7aa3f513c58ccc9e47e77ffd92be204", + "rev": "49d924421d7c3175edc499fdc738bd70d69d97d5", "type": "github" }, "original": { @@ -595,11 +595,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1778737229, - "narHash": "sha256-6xWoytx8jFW4PF1GjRm/i/53trbpKGfz6zjzQGBr4cI=", + "lastModified": 1779796641, + "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d7a713c0b7e47c908258e71cba7a2d77cc8d71d5", + "rev": "25f538306313eae3927264466c70d7001dcea1df", "type": "github" }, "original": { @@ -611,11 +611,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1778737229, - "narHash": "sha256-6xWoytx8jFW4PF1GjRm/i/53trbpKGfz6zjzQGBr4cI=", + "lastModified": 1779796641, + "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d7a713c0b7e47c908258e71cba7a2d77cc8d71d5", + "rev": "25f538306313eae3927264466c70d7001dcea1df", "type": "github" }, "original": { @@ -632,11 +632,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1779046559, - "narHash": "sha256-prtoFMToJ4S2O33/zARx0rAugKhCSuYN8Usc7mrvls8=", + "lastModified": 1780338303, + "narHash": "sha256-IhbaMM8Q4e29VSZ+ALrSxm+/rdf/KymxlGbRJpR/hZg=", "owner": "nix-community", "repo": "nixpkgs-wayland", - "rev": "8c21681fac7c3811654adc0fff6d0a0abd5402d8", + "rev": "dc2f99e859576e5bf5d865ccc3db298128b03cb5", "type": "github" }, "original": { @@ -647,11 +647,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", + "lastModified": 1780243769, + "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", + "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", "type": "github" }, "original": { @@ -663,11 +663,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", + "lastModified": 1780243769, + "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", + "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", "type": "github" }, "original": { @@ -679,11 +679,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1778869304, - "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", + "lastModified": 1779560665, + "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", + "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", "type": "github" }, "original": { @@ -703,11 +703,11 @@ ] }, "locked": { - "lastModified": 1779125269, - "narHash": "sha256-vMF9Hd5/UoLggIJcLKK/oC1SnxoQdgIaUMdVB48zQ7A=", + "lastModified": 1780371321, + "narHash": "sha256-WCaU6npdMdjZSZHe3XATNDFijmzRnsV8V+iR80e5deg=", "owner": "noctalia-dev", "repo": "noctalia-shell", - "rev": "da95089dfe5148ee7fb33b3faa314e86de1e6f25", + "rev": "3aab45a2f34fd47666b05892b95054952e788de1", "type": "github" }, "original": { @@ -725,11 +725,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1778983195, - "narHash": "sha256-hE3EFK5GoSdbO5WHZ8bZDUVYkofbDLQN/KK25z7IOOI=", + "lastModified": 1780194487, + "narHash": "sha256-M+YtjKCTkHrkplNaKVyaxfa8hAWjRF6wFOUBAZvxQ4U=", "owner": "noctalia-dev", "repo": "noctalia-qs", - "rev": "4116b41cdc89e186be7cb8b24a9b6022af95d742", + "rev": "07398e12b54f194e3a2d47c87e3fd10b8eeaa27d", "type": "github" }, "original": { @@ -767,11 +767,11 @@ ] }, "locked": { - "lastModified": 1777598946, - "narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=", + "lastModified": 1780281641, + "narHash": "sha256-M/+hUKoKbHXpV0xGVfELbN1Ds1aoe3pL5p5/t46YhVo=", "owner": "nix-community", "repo": "NUR", - "rev": "5d55af01c0f86be583931fe99207fc56c14134b3", + "rev": "30f9ae2f04174de63ba8bcf3580ca90843b28a01", "type": "github" }, "original": { @@ -820,11 +820,11 @@ ] }, "locked": { - "lastModified": 1779160702, - "narHash": "sha256-frUihZLlBLdcFN95mq5QiQmxF2M16nxtmw1GH4rhZmg=", + "lastModified": 1780370483, + "narHash": "sha256-7mDa7OBAaf7MU6ZovT9ENfD62kH911SsSazBb4KTDF0=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "8cd592658d4448c57326aaa819e1c2f91086eb40", + "rev": "4a408e1fc99ad517b4cb402fd0de7464f40c05e1", "type": "github" }, "original": { @@ -853,11 +853,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1778776709, - "narHash": "sha256-YhnEcpiY6+l3RFA+cPmdTaeODGvNRuqE8B7VBjPVIxo=", + "lastModified": 1780418031, + "narHash": "sha256-/lkloe/Vlpq8GmKiHzxA3woYUubWX1mV/RDtv8TE4d0=", "owner": "danth", "repo": "stylix", - "rev": "e8ea85b4f7dddda9603e0f1ac86cd92cee3b2819", + "rev": "b670c2bdf09861b3215f30fc8a70f2fe26dc5f16", "type": "github" }, "original": { @@ -945,11 +945,11 @@ "tinted-schemes": { "flake": false, "locked": { - "lastModified": 1777041405, - "narHash": "sha256-BAGZ7ObFV/9Z61OJZun7ifPyhkuHqNuW1QIhQ8LuzCo=", + "lastModified": 1777806186, + "narHash": "sha256-PDF0/wObw4nIsSBeXVYLsloXOiphXCgIdsrNcVXguKs=", "owner": "tinted-theming", "repo": "schemes", - "rev": "5f868b3a338b6904c47f3833b9c411be641983a8", + "rev": "0c94645546f4f3ddac77a1a5fce54eb95bf50795", "type": "github" }, "original": { @@ -961,11 +961,11 @@ "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1777169200, - "narHash": "sha256-h7dDbIzP5hDr9v97w9PL6jdAgXawmj6krcH+959rqpU=", + "lastModified": 1778379944, + "narHash": "sha256-wPDFzMGSlARlw0Sfsn48Q2+jPSfk6N0Ng6BC/d+7Q24=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "f798c2dce44ef815bb6b8f05a82135c7942d35ac", + "rev": "fe0203a198690e71a5ff11e08812a4673de3678d", "type": "github" }, "original": { @@ -977,11 +977,11 @@ "tinted-zed": { "flake": false, "locked": { - "lastModified": 1777463218, - "narHash": "sha256-Bhkozqtq3BKLqWTlmKm8uAptfX4aRGI8QX3eEL54Vpc=", + "lastModified": 1778378178, + "narHash": "sha256-OXPXRIQgGwV77HjYRryOHguh4ALX96jkg+tseLkGgHA=", "owner": "tinted-theming", "repo": "base16-zed", - "rev": "5768d08ed2e7944a26a958868cdb073cb8856dae", + "rev": "9cd816033ff969415b190722cddf134e78a5665f", "type": "github" }, "original": { @@ -1049,11 +1049,11 @@ "xwayland-satellite-unstable": { "flake": false, "locked": { - "lastModified": 1773622265, - "narHash": "sha256-wToKwH7IgWdGLMSIWksEDs4eumR6UbbsuPQ42r0oTXQ=", + "lastModified": 1779745227, + "narHash": "sha256-yqY7RtEJGJiENzR0GwL6q69tSAy6xAAmAcLuIhLjPf8=", "owner": "Supreeeme", "repo": "xwayland-satellite", - "rev": "a879e5e0896a326adc79c474bf457b8b99011027", + "rev": "5d1efbc9dc3ab1c10160b656e0247f3325daf0f2", "type": "github" }, "original": { diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index abb8ae5..70f5597 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -6,6 +6,10 @@ in { enable = mkEnableOption "Profile for desktop machines"; }; config = lib.mkIf cfg.enable { + nixpkgs.config.allowUnfree = true; + nixpkgs.config.permittedInsecurePackages = [ + "electron-39.8.10" + ]; profiles = { ssh.enable = lib.mkDefault true; jj.enable = lib.mkDefault true; diff --git a/modules/nixos/profiles/desktop/default.nix b/modules/nixos/profiles/desktop/default.nix index 013b775..ea0fd95 100644 --- a/modules/nixos/profiles/desktop/default.nix +++ b/modules/nixos/profiles/desktop/default.nix @@ -94,7 +94,7 @@ in { "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; stylix.enable = true; stylix.polarity = "dark"; - + stylix.targets.kmscon.enable = false; # stylix.fonts = { # serif = { # package = pkgs.ibm-plex; diff --git a/modules/nixos/profiles/desktop/niri.nix b/modules/nixos/profiles/desktop/niri.nix index f4bad1c..cf6fc5b 100644 --- a/modules/nixos/profiles/desktop/niri.nix +++ b/modules/nixos/profiles/desktop/niri.nix @@ -41,12 +41,6 @@ in nautilus ]; programs = { - firefox = { - #package = mkForce pkgs.firefox-wayland; - nativeMessagingHosts.packages = with pkgs; [ - firefoxpwa - ]; - }; niri.enable = true; niri.package = pkgs.niri-unstable; -- 2.51.2 From 205dc8b5bdc081813c121857e176e7d6bf594a37 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sat, 6 Jun 2026 19:35:35 -0400 Subject: [PATCH 35/48] version update again --- flake.lock | 60 +++++++++++------------ modules/home/profiles/desktop/default.nix | 15 ++++-- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/flake.lock b/flake.lock index 76a9365..09741a5 100644 --- a/flake.lock +++ b/flake.lock @@ -413,11 +413,11 @@ ] }, "locked": { - "lastModified": 1780408569, - "narHash": "sha256-s7Tv6FUQThRAvW8En8XVC6HMb0uiikzVccCcCo9u/Bg=", + "lastModified": 1780679734, + "narHash": "sha256-KmRNvpNOb7QEORa06bVgjW9kITcx0VhsI7w0vhmZyD8=", "owner": "nix-community", "repo": "home-manager", - "rev": "f384af1bec6423a0d4ba1855917ab948f64e5808", + "rev": "b2b7db486e06e098711dc291bb25db82850e1d16", "type": "github" }, "original": { @@ -471,11 +471,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1780348240, - "narHash": "sha256-V4QJAR5+AHUV31KOwrUVE8efOC9bkhLHbvkXT05I0mY=", + "lastModified": 1780694373, + "narHash": "sha256-wuj6QmOlLsGjBOut+Ki/hiOT/H5ONzBePqOkOolsNfo=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "134a4f01eff9291806eab0e8d9fe31bbda7587f3", + "rev": "8f7043c852210cd0875a1bbe9ca872c90ab5ac74", "type": "github" }, "original": { @@ -504,11 +504,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1780056110, - "narHash": "sha256-t7lKVshV/srD0G06j4r5P5qj9zaDeZ9JYFCxHDGROZU=", + "lastModified": 1780637332, + "narHash": "sha256-FeKyLRxLZu2EUnhifijZPDZRl0sVnPVHMtizAINNiN4=", "owner": "YaLTeR", "repo": "niri", - "rev": "f9f43d826ab4014a7c302be28d7da33e12f5be37", + "rev": "f717ae030fe56fc52522ebef69f17f3f09064ac4", "type": "github" }, "original": { @@ -595,11 +595,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1779796641, - "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=", + "lastModified": 1780511130, + "narHash": "sha256-2v9lT4ya59Lh1FqPeLnz1MoX9y/wz2huqfe9RtQZITk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "25f538306313eae3927264466c70d7001dcea1df", + "rev": "535f3e6942cb1cead3929c604320d3db54b542b9", "type": "github" }, "original": { @@ -611,11 +611,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1779796641, - "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=", + "lastModified": 1780511130, + "narHash": "sha256-2v9lT4ya59Lh1FqPeLnz1MoX9y/wz2huqfe9RtQZITk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "25f538306313eae3927264466c70d7001dcea1df", + "rev": "535f3e6942cb1cead3929c604320d3db54b542b9", "type": "github" }, "original": { @@ -632,11 +632,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1780338303, - "narHash": "sha256-IhbaMM8Q4e29VSZ+ALrSxm+/rdf/KymxlGbRJpR/hZg=", + "lastModified": 1780675415, + "narHash": "sha256-uDSfu5+9lThYtl5x3tYDnTf36jO9Aw+Bxm6G5OQkZmE=", "owner": "nix-community", "repo": "nixpkgs-wayland", - "rev": "dc2f99e859576e5bf5d865ccc3db298128b03cb5", + "rev": "381faffd24a947bcaf01016bd4a791b15684f0ed", "type": "github" }, "original": { @@ -679,11 +679,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", + "lastModified": 1780243769, + "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", + "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", "type": "github" }, "original": { @@ -703,11 +703,11 @@ ] }, "locked": { - "lastModified": 1780371321, - "narHash": "sha256-WCaU6npdMdjZSZHe3XATNDFijmzRnsV8V+iR80e5deg=", + "lastModified": 1780673010, + "narHash": "sha256-h7Q8F019PwjIqm5lH0kJRQ/58UiELG+XwZ2B62K3PKA=", "owner": "noctalia-dev", "repo": "noctalia-shell", - "rev": "3aab45a2f34fd47666b05892b95054952e788de1", + "rev": "2461f871a602f9a5688b5b01dc19c6309dd0d519", "type": "github" }, "original": { @@ -820,11 +820,11 @@ ] }, "locked": { - "lastModified": 1780370483, - "narHash": "sha256-7mDa7OBAaf7MU6ZovT9ENfD62kH911SsSazBb4KTDF0=", + "lastModified": 1780715792, + "narHash": "sha256-4+8gPeiPeud89mjo865RwpqmKwa1MThRsq2SvRxo7mg=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "4a408e1fc99ad517b4cb402fd0de7464f40c05e1", + "rev": "27b7e78c6935293ee868469cc4172e9b8b17823b", "type": "github" }, "original": { @@ -853,11 +853,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1780418031, - "narHash": "sha256-/lkloe/Vlpq8GmKiHzxA3woYUubWX1mV/RDtv8TE4d0=", + "lastModified": 1780701809, + "narHash": "sha256-u7AUNs6U6eD1os4+ghbr1gH4QjPWzOdKvpeM+E+XRKM=", "owner": "danth", "repo": "stylix", - "rev": "b670c2bdf09861b3215f30fc8a70f2fe26dc5f16", + "rev": "3a02d9f73608641b28e08b26acb0b0b47c05f14b", "type": "github" }, "original": { diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 70f5597..0aa358c 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -1,5 +1,11 @@ -{config, lib, pkgs, inputs, ...}: -let cfg = config.profiles.desktop; +{ + config, + lib, + pkgs, + inputs, + ... +}: let + cfg = config.profiles.desktop; in { imports = [./niri.nix]; options.profiles.desktop = with lib; { @@ -55,11 +61,10 @@ in { }; foot.enable = true; }; - gtk.gtk4.theme = null; + gtk.gtk4.theme = lib.mkForce null; stylix = { enable = true; - base16Scheme = - "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; + base16Scheme = "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; fonts = { sizes.terminal = 12; monospace = { -- 2.51.2 From 636ca1b9bbae245744d2ec0fd00fffee734d5d8d Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sun, 7 Jun 2026 01:10:47 -0400 Subject: [PATCH 36/48] reformat w/ alejandra --- hosts/prospero/configuration.nix | 22 +- hosts/prospero/hardware-configuration.nix | 46 +- hosts/prospero/home.nix | 3 +- hosts/uruk/configuration.nix | 17 +- hosts/uruk/hardware-configuration.nix | 71 +-- hosts/uruk/home.nix | 3 +- lib/default.nix | 149 ++--- modules/home/default.nix | 15 +- modules/home/profiles/desktop/default.nix | 2 +- modules/home/profiles/desktop/niri.nix | 646 ++++++++++----------- modules/home/profiles/jj.nix | 22 +- modules/home/profiles/ssh.nix | 15 +- modules/nixos/default.nix | 40 +- modules/nixos/nix.nix | 7 +- modules/nixos/profiles/desktop/default.nix | 9 +- modules/nixos/profiles/desktop/niri.nix | 1 - modules/nixos/profiles/laptop.nix | 30 +- modules/nixos/profiles/networking.nix | 12 +- modules/nixos/profiles/zfs.nix | 10 +- 19 files changed, 588 insertions(+), 532 deletions(-) diff --git a/hosts/prospero/configuration.nix b/hosts/prospero/configuration.nix index bb3aede..1f250d8 100644 --- a/hosts/prospero/configuration.nix +++ b/hosts/prospero/configuration.nix @@ -1,21 +1,23 @@ # Edit this configuration file to define what should be installed on # your system. Help is available in the configuration.nix(5) man page # and in the NixOS manual (accessible by running ‘nixos-help’). - -{ config, lib, pkgs, ... }: - { - imports = - [ # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; + config, + lib, + pkgs, + ... +}: { + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; # Bootloader. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; # Use latest kernel. boot.kernelPackages = pkgs.linuxPackages_latest; - + # Living on the edge! # (no but seriously this is a personal machine I use for dev. There's no reason # NOT to do this) @@ -30,10 +32,10 @@ # Enable networking networking.networkmanager.enable = true; - + environment.systemPackages = with pkgs; [ ]; - + # programs.mtr.enable = true; # programs.gnupg.agent = { # enable = true; diff --git a/hosts/prospero/hardware-configuration.nix b/hosts/prospero/hardware-configuration.nix index fa324af..25e1763 100644 --- a/hosts/prospero/hardware-configuration.nix +++ b/hosts/prospero/hardware-configuration.nix @@ -1,32 +1,36 @@ # 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") - ]; + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; - fileSystems."/" = - { device = "/dev/disk/by-uuid/c3671d1e-92a3-43de-a52f-e649cf309931"; - fsType = "ext4"; - }; + fileSystems."/" = { + device = "/dev/disk/by-uuid/c3671d1e-92a3-43de-a52f-e649cf309931"; + fsType = "ext4"; + }; - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/A250-67DA"; - fsType = "vfat"; - options = [ "fmask=0077" "dmask=0077" ]; - }; + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/A250-67DA"; + fsType = "vfat"; + options = ["fmask=0077" "dmask=0077"]; + }; - swapDevices = - [ { device = "/dev/disk/by-uuid/af095409-4c04-4b58-a20f-3a47bce0eb82"; } - ]; + swapDevices = [ + {device = "/dev/disk/by-uuid/af095409-4c04-4b58-a20f-3a47bce0eb82";} + ]; # 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 diff --git a/hosts/prospero/home.nix b/hosts/prospero/home.nix index 8cb6eb9..260c702 100644 --- a/hosts/prospero/home.nix +++ b/hosts/prospero/home.nix @@ -1,5 +1,4 @@ -{...}: -{ +{...}: { profiles = { desktop.enable = true; desktop.niri.enable = true; diff --git a/hosts/uruk/configuration.nix b/hosts/uruk/configuration.nix index bd5b2ec..e3f0b46 100644 --- a/hosts/uruk/configuration.nix +++ b/hosts/uruk/configuration.nix @@ -1,14 +1,16 @@ # Edit this configuration file to define what should be installed on # your system. Help is available in the configuration.nix(5) man page, on # https://search.nixos.org/options and in the NixOS manual (`nixos-help`). - -{ config, lib, pkgs, ... }: - { - imports = - [ # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; + config, + lib, + pkgs, + ... +}: { + imports = [ + # Include the results of the hardware scan. + ./hardware-configuration.nix + ]; # Use the systemd-boot EFI boot loader. boot.loader.systemd-boot.enable = true; @@ -125,4 +127,3 @@ zfs.enable = true; }; } - diff --git a/hosts/uruk/hardware-configuration.nix b/hosts/uruk/hardware-configuration.nix index 7e12562..cca132d 100644 --- a/hosts/uruk/hardware-configuration.nix +++ b/hosts/uruk/hardware-configuration.nix @@ -1,43 +1,48 @@ # 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") - ]; + 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 = [ ]; - boot.zfs.extraPools = [ "datastore" ]; - fileSystems."/" = - { device = "zpool/root"; - fsType = "zfs"; - }; - fileSystems."/boot" = - { - device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part1"; - fsType = "vfat"; - }; - fileSystems."/nix" = - { device = "zpool/nix"; - fsType = "zfs"; - }; + boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; + boot.zfs.extraPools = ["datastore"]; + fileSystems."/" = { + device = "zpool/root"; + fsType = "zfs"; + }; + fileSystems."/boot" = { + device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part1"; + fsType = "vfat"; + }; + fileSystems."/nix" = { + device = "zpool/nix"; + fsType = "zfs"; + }; - swapDevices = [{ - device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part3"; - randomEncryption = true; - } - { - device = "/dev/disk/by-id/nvme-TEAM_TM8FP6001T_112301031502314-part3"; - randomEncryption = true; - }]; + swapDevices = [ + { + device = "/dev/disk/by-id/nvme-INTEL_SSDPEKNW010T9_BTNR014314861P0B-part3"; + randomEncryption = true; + } + { + device = "/dev/disk/by-id/nvme-TEAM_TM8FP6001T_112301031502314-part3"; + randomEncryption = true; + } + ]; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - hardware.cpu.amd.updateMicrocode = lib.mkDefault + hardware.cpu.amd.updateMicrocode = + lib.mkDefault config.hardware.enableRedistributableFirmware; } diff --git a/hosts/uruk/home.nix b/hosts/uruk/home.nix index f07e909..76d18ba 100644 --- a/hosts/uruk/home.nix +++ b/hosts/uruk/home.nix @@ -1,5 +1,4 @@ -{...}: -{ +{...}: { profiles = { desktop.enable = true; desktop.niri.enable = true; diff --git a/lib/default.nix b/lib/default.nix index 027ba26..c1bda3a 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -3,101 +3,112 @@ let inherit (builtins) readDir hasAttr attrNames filter concatMap listToAttrs; - loadHosts = dir: inputs: - let - loadConf = dir: n: (import "${dir}/${n}" inputs) // { hostname = n; }; + loadHosts = dir: inputs: let + loadConf = dir: n: (import "${dir}/${n}" inputs) // {hostname = n;}; - hosts' = - let contents = readDir dir; - in filter (n: contents."${n}" == "directory") (attrNames contents); + hosts' = let + contents = readDir dir; in + filter (n: contents."${n}" == "directory") (attrNames contents); + in concatMap - (n: - let - contents = readDir "${dir}/${n}"; - hasDefault = (hasAttr "default.nix" contents) - && (contents."default.nix" == "regular"); - in - if hasDefault then [ (loadConf dir n) ] else [ ]) - hosts'; -in -{ + (n: let + contents = readDir "${dir}/${n}"; + hasDefault = + (hasAttr "default.nix" contents) + && (contents."default.nix" == "regular"); + in + if hasDefault + then [(loadConf dir n)] + else []) + hosts'; +in { # Discover NixOS configurations. # It will find all sub-directories in `directory` and # include it if it has a default.nix. - genNixOSHosts = - { inputs - , self - , directory ? "${inputs.self}/hosts" - , nixpkgs ? inputs.nixpkgs - , builder ? nixpkgs.lib.nixosSystem - , specialArgs ? { } - , baseModules ? [ ] - , overlays ? [ ] - , config ? { allowUnfree = true; } + genNixOSHosts = { + inputs, + self, + directory ? "${inputs.self}/hosts", + nixpkgs ? inputs.nixpkgs, + builder ? nixpkgs.lib.nixosSystem, + specialArgs ? {}, + baseModules ? [], + overlays ? [], + config ? {allowUnfree = true;}, + }: let + mkHost = { + system, + modules, + hostname, }: - let - mkHost = { system, modules, hostname, }: - builder { - inherit system; + builder { + inherit system; - specialArgs = { inherit inputs self; } // specialArgs; + specialArgs = {inherit inputs self;} // specialArgs; - modules = [ - ({ ... }: { + modules = + [ + ({...}: { networking.hostName = hostname; - nixpkgs = { inherit overlays config; }; + nixpkgs = {inherit overlays config;}; }) - ] ++ baseModules ++ modules; - }; - in + ] + ++ baseModules ++ modules; + }; + in listToAttrs (map (conf: { name = conf.hostname; - value = mkHost (removeAttrs conf [ "home" ]); + value = mkHost (removeAttrs conf ["home"]); }) (loadHosts directory inputs)); # Discover home-manager configurations. # It will find all sub-directories in `directory` and # include it if it has a default.nix. - genHomeHosts = - { inputs - , user - , directory ? "${inputs.self}/hosts" - , nixpkgs ? inputs.nixpkgs - , home ? inputs.home - , builder ? home.lib.homeManagerConfiguration - , specialArgs ? { } - , baseModules ? [ ] - , overlays ? [ ] - , config ? { allowUnfree = true; } - , - }: - let - homeHosts = concatMap - (h: - if (hasAttr "home" h) then - [ ((removeAttrs h [ "home" "modules" ]) // h.home) ] - else - [ ]) - (loadHosts directory inputs); + genHomeHosts = { + inputs, + user, + directory ? "${inputs.self}/hosts", + nixpkgs ? inputs.nixpkgs, + home ? inputs.home, + builder ? home.lib.homeManagerConfiguration, + specialArgs ? {}, + baseModules ? [], + overlays ? [], + config ? {allowUnfree = true;}, + }: let + homeHosts = + concatMap + (h: + if (hasAttr "home" h) + then [((removeAttrs h ["home" "modules"]) // h.home)] + else []) + (loadHosts directory inputs); - mkHost = { system, modules, hostname, }: - let pkgs = import nixpkgs { inherit system config overlays; }; - in builder { - inherit pkgs; - extraSpecialArgs = { inherit inputs; } // specialArgs; + mkHost = { + system, + modules, + hostname, + }: let + pkgs = import nixpkgs {inherit system config overlays;}; + in + builder { + inherit pkgs; + extraSpecialArgs = {inherit inputs;} // specialArgs; - modules = [ - ({ lib, ... }: { + modules = + [ + ({lib, ...}: { home.username = lib.mkDefault user; home.homeDirectory = lib.mkDefault "/home/${user}"; }) - ] ++ baseModules ++ modules; - }; - in + ] + ++ baseModules ++ modules; + }; + in listToAttrs (map (conf: { name = "${user}@${conf.hostname}"; diff --git a/modules/home/default.nix b/modules/home/default.nix index c6939ff..f2a3eb1 100644 --- a/modules/home/default.nix +++ b/modules/home/default.nix @@ -1,7 +1,10 @@ -{ pkgs, lib, ...}: { + pkgs, + lib, + ... +}: { home.stateVersion = "25.05"; # Please read the comment before changing. - imports = [ ./profiles ]; + imports = [./profiles]; manual.manpages.enable = true; home = { packages = with pkgs; [ @@ -9,18 +12,16 @@ ripgrep ]; file = { - }; sessionVariables = { - }; }; programs.home-manager.enable = true; programs.zsh.enable = true; - programs.atuin ={ + programs.atuin = { enable = true; - flags = [ "--disable-up-arrow" ]; - }; + flags = ["--disable-up-arrow"]; + }; programs.direnv = { enable = true; enableZshIntegration = true; diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 0aa358c..e1ee4dc 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -61,7 +61,7 @@ in { }; foot.enable = true; }; - gtk.gtk4.theme = lib.mkForce null; + # gtk.gtk4.theme = lib.mkForce null; stylix = { enable = true; base16Scheme = "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; diff --git a/modules/home/profiles/desktop/niri.nix b/modules/home/profiles/desktop/niri.nix index 5f881e0..25aa9c5 100644 --- a/modules/home/profiles/desktop/niri.nix +++ b/modules/home/profiles/desktop/niri.nix @@ -1,357 +1,355 @@ -{config, pkgs, lib, ... }: -with lib; -let +{ + config, + pkgs, + lib, + ... +}: +with lib; let cfg = config.profiles.desktop.niri; colors = config.lib.stylix.colors.withHashtag; - binds = - { - suffixes, - prefixes, - substitutions ? { }, - }: - let - replacer = replaceStrings (attrNames substitutions) (attrValues substitutions); - format = - prefix: suffix: - let - actual-suffix = - if isList suffix.action then - { - action = head suffix.action; - args = tail suffix.action; - } - else - { - inherit (suffix) action; - args = [ ]; - }; - - action = replacer "${prefix.action}-${actual-suffix.action}"; - in - { - name = "${prefix.key}+${suffix.key}"; - value.action.${action} = actual-suffix.args; + binds = { + suffixes, + prefixes, + substitutions ? {}, + }: let + replacer = replaceStrings (attrNames substitutions) (attrValues substitutions); + format = prefix: suffix: let + actual-suffix = + if isList suffix.action + then { + action = head suffix.action; + args = tail suffix.action; + } + else { + inherit (suffix) action; + args = []; }; - pairs = - attrs: fn: - concatMap ( - key: + + action = replacer "${prefix.action}-${actual-suffix.action}"; + in { + name = "${prefix.key}+${suffix.key}"; + value.action.${action} = actual-suffix.args; + }; + pairs = attrs: fn: + concatMap ( + key: fn { inherit key; action = attrs.${key}; } - ) (attrNames attrs); - in - listToAttrs - (pairs prefixes - (prefix: pairs suffixes (suffix: [ (format prefix suffix) ]))); + ) (attrNames attrs); + in + listToAttrs + (pairs prefixes + (prefix: pairs suffixes (suffix: [(format prefix suffix)]))); in -with lib; { - options.profiles.desktop.niri = { - enable = mkEnableOption "niri profile"; - }; - config = mkIf cfg.enable { - programs.niri.package = pkgs.niri-unstable; - stylix.targets.niri.enable = true; - gtk = { - enable = true; - iconTheme = { - name = "Adwaita"; # or whatever you want - package = pkgs.adwaita-icon-theme; - }; - }; - programs.fuzzel = { - enable = true; - settings.main = { - terminal = "${pkgs.foot}/bin/foot"; - layer = "overlay"; - #font = "Terminus:size=12"; - }; + with lib; { + options.profiles.desktop.niri = { + enable = mkEnableOption "niri profile"; }; - home.packages = with pkgs; [ - brightnessctl - ]; - services.cliphist = { - enable = true; - allowImages = true; - }; - programs.niri.settings = { - prefer-no-csd = true; - input = { - focus-follows-mouse = { - enable = true; - max-scroll-amount = "0%"; + config = mkIf cfg.enable { + programs.niri.package = pkgs.niri-unstable; + stylix.targets.niri.enable = true; + gtk = { + enable = true; + iconTheme = { + name = "Adwaita"; # or whatever you want + package = pkgs.adwaita-icon-theme; }; }; - layout = { - gaps = 10; - preset-column-widths = [ - { proportion = 1.0 / 4.0; } - { proportion = 1.0 / 3.0; } - { proportion = 1.0 / 2.5; } - { proportion = 1.0 / 2.0; } - { proportion = 2.0 / 3.0; } - { proportion = 3.0 / 4.0; } - { proportion = 5.0 / 6.0; } - ]; - preset-window-heights = [ - { proportion = 1.0 / 3.0; } - { proportion = 0.4; } - { proportion = 0.5; } - { proportion = 2.0 / 3.0; } - ]; - default-column-width = { - proportion = 1.0 / 2.0; - }; - focus-ring = { - width = 2; - active.color = "${colors.base0B}ff"; + programs.fuzzel = { + enable = true; + settings.main = { + terminal = "${pkgs.foot}/bin/foot"; + layer = "overlay"; + #font = "Terminus:size=12"; }; }; - spawn-at-startup = [ - { command = ["noctalia-shell"]; } + home.packages = with pkgs; [ + brightnessctl ]; - xwayland-satellite.enable = true; - xwayland-satellite.path = - "${pkgs.xwayland-satellite}/bin/xwayland-satellite"; - screenshot-path = - "~/Pictures/Screenshots/screenshot-%Y-%m-%d-%H:%M:%S.png"; - switch-events = - with config.lib.niri.actions; - let + services.cliphist = { + enable = true; + allowImages = true; + }; + programs.niri.settings = { + prefer-no-csd = true; + input = { + focus-follows-mouse = { + enable = true; + max-scroll-amount = "0%"; + }; + }; + layout = { + gaps = 10; + preset-column-widths = [ + {proportion = 1.0 / 4.0;} + {proportion = 1.0 / 3.0;} + {proportion = 1.0 / 2.5;} + {proportion = 1.0 / 2.0;} + {proportion = 2.0 / 3.0;} + {proportion = 3.0 / 4.0;} + {proportion = 5.0 / 6.0;} + ]; + preset-window-heights = [ + {proportion = 1.0 / 3.0;} + {proportion = 0.4;} + {proportion = 0.5;} + {proportion = 2.0 / 3.0;} + ]; + default-column-width = { + proportion = 1.0 / 2.0; + }; + focus-ring = { + width = 2; + active.color = "${colors.base0B}ff"; + }; + }; + spawn-at-startup = [ + {command = ["noctalia-shell"];} + ]; + xwayland-satellite.enable = true; + xwayland-satellite.path = "${pkgs.xwayland-satellite}/bin/xwayland-satellite"; + screenshot-path = "~/Pictures/Screenshots/screenshot-%Y-%m-%d-%H:%M:%S.png"; + switch-events = with config.lib.niri.actions; let sh = spawn "sh" "-c"; in { lid-close.action = sh "systemctl suspend"; }; - binds = - with config.lib.niri.actions; - let + binds = with config.lib.niri.actions; let sh = spawn "sh" "-c"; - in lib.attrsets.mergeAttrsList [ + in + lib.attrsets.mergeAttrsList [ + { + "Mod+Shift+Slash".action = show-hotkey-overlay; + "Mod+D".action = spawn "fuzzel"; + "Mod+Return".action = spawn "foot"; + "Mod+Shift+S".action.screenshot = []; + "Print".action.screenshot-screen = []; + "Mod+Print".action.screenshot-window = []; + "XF86AudioRaiseVolume".action = + sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05+"; + "XF86AudioLowerVolume".action = + sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05-"; + "XF86AudioMute".action = + sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + "XF86AudioMicMute".action = + sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; + "Mod+Shift+Q".action = close-window; + "Mod+Space".action = toggle-column-tabbed-display; + "Mod+Tab".action = focus-window-down-or-column-right; + "Mod+Shift+Tab".action = focus-window-up-or-column-left; + "Mod+Shift+Ctrl+F".action = toggle-windowed-fullscreen; + "XF86MonBrightnessUp".action = sh "brightnessctl set 5%+"; + "XF86MonBrightnessDown".action = sh "brightnessctl set 5%-"; + "Mod+V".action = switch-focus-between-floating-and-tiling; + "Mod+Shift+V".action = toggle-window-floating; + "Mod+BracketLeft".action = consume-or-expel-window-left; + "Mod+BracketRight".action = consume-or-expel-window-right; + "Mod+Comma".action = consume-window-into-column; + "Mod+Period".action = expel-window-from-column; + "Mod+R".action = switch-preset-column-width; + "Mod+F".action = maximize-column; + "Mod+Shift+F".action = fullscreen-window; + "Mod+G".action = center-column; + + "Mod+Minus".action = set-column-width "-10%"; + "Mod+Equal".action = set-column-width "+10%"; + "Mod+Shift+Minus".action = set-window-height "-10%"; + "Mod+Shift+Equal".action = set-window-height "+10%"; + + "Mod+Shift+Escape".action = toggle-keyboard-shortcuts-inhibit; + "Mod+Shift+E".action = quit; + "Mod+Shift+P".action = power-off-monitors; + "Mod+Shift+Ctrl+T".action = toggle-debug-tint; + } + (binds { + suffixes."Left" = "column-left"; + suffixes."H" = "column-left"; + suffixes."Down" = "window-down"; + suffixes."J" = "window-down"; + suffixes."Up" = "window-up"; + suffixes."K" = "window-up"; + suffixes."Right" = "column-right"; + suffixes."L" = "column-right"; + prefixes."Mod" = "focus"; + prefixes."Mod+Ctrl" = "move"; + prefixes."Mod+Shift" = "focus-monitor"; + prefixes."Mod+Shift+Ctrl" = "move-window-to-monitor"; + substitutions."monitor-column" = "monitor"; + substitutions."monitor-window" = "monitor"; + }) + (binds { + suffixes."Home" = "first"; + suffixes."End" = "last"; + prefixes."Mod" = "focus-column"; + prefixes."Mod+Ctrl" = "move-column-to"; + }) + (binds { + suffixes."U" = "workspace-down"; + suffixes."I" = "workspace-up"; + prefixes."Mod" = "focus"; + prefixes."Mod+Ctrl" = "move-window-to"; + prefixes."Mod+Shift" = "move"; + }) + (binds { + suffixes = builtins.listToAttrs ( + map (n: { + name = toString n; + value = [ + "workspace" + (n + 1) + ]; # workspace 1 is empty; workspace 2 is the logical first. + }) (range 1 9) + ); + prefixes."Mod" = "focus"; + prefixes."Mod+Ctrl" = "move-window-to"; + }) + ]; + window-rules = [ { - "Mod+Shift+Slash".action = show-hotkey-overlay; - "Mod+D".action = spawn "fuzzel"; - "Mod+Return".action = spawn "foot"; - "Mod+Shift+S".action.screenshot = [ ]; - "Print".action.screenshot-screen = [ ]; - "Mod+Print".action.screenshot-window = [ ]; - "XF86AudioRaiseVolume".action = - sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05+"; - "XF86AudioLowerVolume".action = - sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.05-"; - "XF86AudioMute".action = - sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; - "XF86AudioMicMute".action = - sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; - "Mod+Shift+Q".action = close-window; - "Mod+Space".action = toggle-column-tabbed-display; - "Mod+Tab".action = focus-window-down-or-column-right; - "Mod+Shift+Tab".action = focus-window-up-or-column-left; - "Mod+Shift+Ctrl+F".action = toggle-windowed-fullscreen; - "XF86MonBrightnessUp".action = sh "brightnessctl set 5%+"; - "XF86MonBrightnessDown".action = sh "brightnessctl set 5%-"; - "Mod+V".action = switch-focus-between-floating-and-tiling; - "Mod+Shift+V".action = toggle-window-floating; - "Mod+BracketLeft".action = consume-or-expel-window-left; - "Mod+BracketRight".action = consume-or-expel-window-right; - "Mod+Comma".action = consume-window-into-column; - "Mod+Period".action = expel-window-from-column; - "Mod+R".action = switch-preset-column-width; - "Mod+F".action = maximize-column; - "Mod+Shift+F".action = fullscreen-window; - "Mod+G".action = center-column; - - "Mod+Minus".action = set-column-width "-10%"; - "Mod+Equal".action = set-column-width "+10%"; - "Mod+Shift+Minus".action = set-window-height "-10%"; - "Mod+Shift+Equal".action = set-window-height "+10%"; - - "Mod+Shift+Escape".action = toggle-keyboard-shortcuts-inhibit; - "Mod+Shift+E".action = quit; - "Mod+Shift+P".action = power-off-monitors; - "Mod+Shift+Ctrl+T".action = toggle-debug-tint; - } - (binds { - suffixes."Left" = "column-left"; - suffixes."H" = "column-left"; - suffixes."Down" = "window-down"; - suffixes."J" = "window-down"; - suffixes."Up" = "window-up"; - suffixes."K" = "window-up"; - suffixes."Right" = "column-right"; - suffixes."L" = "column-right"; - prefixes."Mod" = "focus"; - prefixes."Mod+Ctrl" = "move"; - prefixes."Mod+Shift" = "focus-monitor"; - prefixes."Mod+Shift+Ctrl" = "move-window-to-monitor"; - substitutions."monitor-column" = "monitor"; - substitutions."monitor-window" = "monitor"; - }) - (binds { - suffixes."Home" = "first"; - suffixes."End" = "last"; - prefixes."Mod" = "focus-column"; - prefixes."Mod+Ctrl" = "move-column-to"; - }) - (binds { - suffixes."U" = "workspace-down"; - suffixes."I" = "workspace-up"; - prefixes."Mod" = "focus"; - prefixes."Mod+Ctrl" = "move-window-to"; - prefixes."Mod+Shift" = "move"; - }) - (binds { - suffixes = builtins.listToAttrs ( - map (n: { - name = toString n; - value = [ - "workspace" - (n + 1) - ]; # workspace 1 is empty; workspace 2 is the logical first. - }) (range 1 9) - ); - prefixes."Mod" = "focus"; - prefixes."Mod+Ctrl" = "move-window-to"; - }) - ]; - window-rules = [ - { - matches = [{ - app-id = "^firefox$"; - title = "^Picture-in-Picture$"; - }]; - opacity = 1.0; - default-window-height = { - proportion = 0.42; - }; - open-floating = true; - default-column-width = { - proportion = 0.4; - }; - default-floating-position = { - relative-to = "top-left"; - x = 0; - y = 0; - }; - } - { - matches = [{ - app-id = "^firefox$"; - title = "Private Browsing"; - }]; - border.active.color = colors.base0E; - } - { - matches = [{ app-id = "^org\\.keepassxc\\.KeePassXC$"; }]; - block-out-from = "screen-capture"; - } - { - matches = [{ - app-id = "steam"; - title =''^notificationtoasts_\d+_desktop$''; - }]; - default-floating-position = { - x = 0; - y = 0; - relative-to = "bottom-right"; - }; - open-focused = false; - } - ]; - layer-rules = [ - { - matches = [ { namespace = "notifications"; } ]; - block-out-from = "screen-capture"; - opacity = 0.8; - } - { - matches = [ { namespace = "^noctalia-overview"; } ]; - - place-within-backdrop = true; - } - ]; - }; - # shell configuration w/ noctalia - stylix.targets.noctalia-shell.enable = true; - programs.noctalia-shell = { - enable = true; - settings = { - bar = { - density = "default"; - position = "top"; - # floating = true; - # showCapsule = true; - # useSeparateOpacity = true; - # capsuleOpacity = lib.mkForce 1; - # backgroundOpacity = lib.mkForce 0.01; - widgets = { - left = [ - { - id = "Launcher"; - } - { - id = "SystemMonitor"; - } + matches = [ { - id = "MediaMini"; - useFixedWidth = false; - maxWidth = 400; + app-id = "^firefox$"; + title = "^Picture-in-Picture$"; } ]; - center = [ - { - formatHorizontal = "ddd yyyy-MM-dd HH:mm"; - formatVertical = "HH mm - MMM dd"; - id = "Clock"; - useMonospacedFont = true; - usePrimaryColor = true; - } + opacity = 1.0; + default-window-height = { + proportion = 0.42; + }; + open-floating = true; + default-column-width = { + proportion = 0.4; + }; + default-floating-position = { + relative-to = "top-left"; + x = 0; + y = 0; + }; + } + { + matches = [ { - hideUnoccupied = false; - id = "Workspace"; + app-id = "^firefox$"; + title = "Private Browsing"; } ]; - right = [ - { - id = "Tray"; - #drawerEnabled = false; - } - { - id = "NotificationHistory"; - } - { - alwaysShowPercentage = true; - id = "Battery"; - warningThreshold = 30; - } - { - id = "Volume"; - } - { - id = "Brightness"; - } + border.active.color = colors.base0E; + } + { + matches = [{app-id = "^org\\.keepassxc\\.KeePassXC$";}]; + block-out-from = "screen-capture"; + } + { + matches = [ { - id = "ControlCenter"; - useDistroLogo = true; + app-id = "steam"; + title = ''^notificationtoasts_\d+_desktop$''; } ]; + default-floating-position = { + x = 0; + y = 0; + relative-to = "bottom-right"; + }; + open-focused = false; + } + ]; + layer-rules = [ + { + matches = [{namespace = "notifications";}]; + block-out-from = "screen-capture"; + opacity = 0.8; + } + { + matches = [{namespace = "^noctalia-overview";}]; + + place-within-backdrop = true; + } + ]; + }; + # shell configuration w/ noctalia + stylix.targets.noctalia-shell.enable = true; + programs.noctalia-shell = { + enable = true; + settings = { + bar = { + density = "default"; + position = "top"; + # floating = true; + # showCapsule = true; + # useSeparateOpacity = true; + # capsuleOpacity = lib.mkForce 1; + # backgroundOpacity = lib.mkForce 0.01; + widgets = { + left = [ + { + id = "Launcher"; + } + { + id = "SystemMonitor"; + } + { + id = "MediaMini"; + useFixedWidth = false; + maxWidth = 400; + } + ]; + center = [ + { + formatHorizontal = "ddd yyyy-MM-dd HH:mm"; + formatVertical = "HH mm - MMM dd"; + id = "Clock"; + useMonospacedFont = true; + usePrimaryColor = true; + } + { + hideUnoccupied = false; + id = "Workspace"; + } + ]; + right = [ + { + id = "Tray"; + #drawerEnabled = false; + } + { + id = "NotificationHistory"; + } + { + alwaysShowPercentage = true; + id = "Battery"; + warningThreshold = 30; + } + { + id = "Volume"; + } + { + id = "Brightness"; + } + { + id = "ControlCenter"; + useDistroLogo = true; + } + ]; + }; + }; + general = { + lockOnSuspend = true; + }; + idle = { + enabled = true; + }; + location = { + monthBeforeDay = true; + name = "New Haven, CT"; + }; + wallpaper = { + enabled = true; + overviewEnabled = true; }; - }; - general = { - lockOnSuspend = true; - }; - idle = { - enabled = true; - }; - location = { - monthBeforeDay = true; - name = "New Haven, CT"; - }; - wallpaper = { - enabled = true; - overviewEnabled = true; }; }; }; - }; -} + } diff --git a/modules/home/profiles/jj.nix b/modules/home/profiles/jj.nix index 3946de9..0b0f4f0 100644 --- a/modules/home/profiles/jj.nix +++ b/modules/home/profiles/jj.nix @@ -1,5 +1,11 @@ -{config, lib, pkgs, inputs, ...}: -let cfg = config.profiles.jj; +{ + config, + lib, + pkgs, + inputs, + ... +}: let + cfg = config.profiles.jj; in { options.profiles.jj.enable = lib.mkEnableOption "jujutsu configuration"; config = lib.mkIf cfg.enable { @@ -17,11 +23,11 @@ in { }; templates = { draft_commit_description = '' - concat( - builtin_draft_commit_description, - "\nJJ: ignore-rest\n---\n", - diff.git(), - ) + concat( + builtin_draft_commit_description, + "\nJJ: ignore-rest\n---\n", + diff.git(), + ) ''; }; revsets = { @@ -29,7 +35,7 @@ in { }; revset-aliases = { "closest_pushable(to)" = '' - heads(::to & mutable() & ~description(exact:"") & (~empty() | merges())) + heads(::to & mutable() & ~description(exact:"") & (~empty() | merges())) ''; }; signing = { diff --git a/modules/home/profiles/ssh.nix b/modules/home/profiles/ssh.nix index 663c180..553b29a 100644 --- a/modules/home/profiles/ssh.nix +++ b/modules/home/profiles/ssh.nix @@ -1,5 +1,11 @@ -{config, lib, pkgs, inputs, ...}: -let cfg = config.profiles.ssh; +{ + config, + lib, + pkgs, + inputs, + ... +}: let + cfg = config.profiles.ssh; in { options.profiles.ssh.enable = lib.mkEnableOption "SSH configuration (keys not included)"; @@ -9,7 +15,7 @@ in { enable = true; enableDefaultConfig = false; settings = - (builtins.mapAttrs (k: v: lib.hm.dag.entryBefore [ "Host *" ] v ) ({ + (builtins.mapAttrs (k: v: lib.hm.dag.entryBefore ["Host *"] v) { "Host anubis anubis.bahamut.monster" = { HostName = "anubis.bahamut.monster"; User = "root"; @@ -31,7 +37,8 @@ in { User = "git"; IdentityFile = "~/.ssh/id_ed25519"; }; - })) // { + }) + // { "Host *" = { AddKeysToAgent = "yes"; IdentitiesOnly = true; diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index facace7..17bf3e2 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -1,4 +1,9 @@ -{pkgs, lib, config, ...}:{ +{ + pkgs, + lib, + config, + ... +}: { imports = [ ./nix.nix ./profiles/desktop @@ -9,12 +14,12 @@ ./profiles/perftools.nix ./profiles/zfs.nix ]; - + console = { font = "Lat2-Terminus16"; - }; + }; time.timeZone = "America/New_York"; - + i18n = let locale = "en_US.UTF-8"; in { @@ -31,7 +36,7 @@ LC_TIME = locale; }; }; - + environment = { systemPackages = with pkgs; [ git @@ -51,14 +56,24 @@ mtr.enable = true; zsh.enable = true; }; - + profiles = { networking.enable = lib.mkDefault true; }; - + users.users.joshua = { - subUidRanges = [ { startUid = 100000; count = 65536; } ]; - subGidRanges = [ { startGid = 100000; count = 65536; } ]; + subUidRanges = [ + { + startUid = 100000; + count = 65536; + } + ]; + subGidRanges = [ + { + startGid = 100000; + count = 65536; + } + ]; isNormalUser = true; description = "Joshua Barrett"; shell = pkgs.zsh; @@ -86,7 +101,10 @@ virtualisation.docker = { enable = true; # Docker appears to select `devicemapper` by default, which is not cool. - storageDriver = if config.profiles.zfs.enable then "zfs" else "overlay2"; + storageDriver = + if config.profiles.zfs.enable + then "zfs" + else "overlay2"; # Prune the docker registry weekly. autoPrune.enable = true; extraOptions = '' @@ -97,6 +115,6 @@ virtualisation.oci-containers = { backend = "docker"; }; - + security.pam.sshAgentAuth.enable = lib.mkDefault true; } diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index 3ad57bf..a7cbc26 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -1,4 +1,9 @@ -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: with lib; { options.profiles.nix-ld = { enable = mkEnableOption "nix-ld profile"; diff --git a/modules/nixos/profiles/desktop/default.nix b/modules/nixos/profiles/desktop/default.nix index ea0fd95..884ec62 100644 --- a/modules/nixos/profiles/desktop/default.nix +++ b/modules/nixos/profiles/desktop/default.nix @@ -7,7 +7,7 @@ }: let cfg = config.profiles.desktop; in { - imports = [ ./niri.nix ]; + imports = [./niri.nix]; options.profiles.desktop = with lib; { enable = mkEnableOption "Profile for desktop machines (i.e. not servers)"; @@ -73,7 +73,7 @@ in { }; }; console.useXkbConfig = true; - + ### hardware ### hardware = { bluetooth.enable = lib.mkDefault true; @@ -89,9 +89,8 @@ in { }; environment.systemPackages = []; - - stylix.base16Scheme = - "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; + + stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/selenized-black.yaml"; stylix.enable = true; stylix.polarity = "dark"; stylix.targets.kmscon.enable = false; diff --git a/modules/nixos/profiles/desktop/niri.nix b/modules/nixos/profiles/desktop/niri.nix index cf6fc5b..1339dd5 100644 --- a/modules/nixos/profiles/desktop/niri.nix +++ b/modules/nixos/profiles/desktop/niri.nix @@ -50,5 +50,4 @@ in programs.nm-applet.enable = lib.mkForce false; }; - } diff --git a/modules/nixos/profiles/laptop.nix b/modules/nixos/profiles/laptop.nix index 96747ad..2db314d 100644 --- a/modules/nixos/profiles/laptop.nix +++ b/modules/nixos/profiles/laptop.nix @@ -1,5 +1,10 @@ -{ lib, config, pkgs, ... }: -let cfg = config.profiles.laptop; +{ + lib, + config, + pkgs, + ... +}: let + cfg = config.profiles.laptop; in { options.profiles.laptop = with lib; { enable = mkEnableOption "laptop profile"; @@ -7,19 +12,18 @@ in { enable = mkOption { type = types.bool; default = true; - description = - "Whether to setup suspend then hibernate when closing the lid."; + description = "Whether to setup suspend then hibernate when closing the lid."; }; delayHours = mkOption { type = types.int; default = 1; - description = - "Delay in hours before it should hibernate the laptop after suspending."; + description = "Delay in hours before it should hibernate the laptop after suspending."; }; }; }; - config = with lib; mkIf cfg.enable + config = with lib; + mkIf cfg.enable { # Enabling the laptop profile automatically enables the # desktop profile too. @@ -35,17 +39,15 @@ in { # Enable light to control backlight. powerManagement.powertop.enable = mkDefault true; - environment.systemPackages = with pkgs; [ powertop brightnessctl ]; + environment.systemPackages = with pkgs; [powertop brightnessctl]; # Setup suspend then hibernate. services.logind.lidSwitch = - if cfg.suspendThenHibernate.enable then - "suspend-then-hibernate" - else - "suspend"; + if cfg.suspendThenHibernate.enable + then "suspend-then-hibernate" + else "suspend"; # as per the systemd manual this does nothing if suspend-then-hibernate is # not enabled, so we might as well set it unconditionally. - systemd.sleep.settings.Sleep.HibernateDelaySec = - "${builtins.toString cfg.suspendThenHibernate.delayHours}h"; + systemd.sleep.settings.Sleep.HibernateDelaySec = "${builtins.toString cfg.suspendThenHibernate.delayHours}h"; }; } diff --git a/modules/nixos/profiles/networking.nix b/modules/nixos/profiles/networking.nix index e116e95..85fe8b8 100644 --- a/modules/nixos/profiles/networking.nix +++ b/modules/nixos/profiles/networking.nix @@ -23,13 +23,13 @@ in # `dhcpcd` conflicts with NetworkManager's `dhclient`, as they try to bind # the same address; it needs to be explicitly disabled. dhcpcd.enable = false; - + firewall = { enable = true; # allows use as a tailscale exit node checkReversePath = "loose"; - trustedInterfaces = [ "docker0" "tailscale0" ]; - allowedUDPPorts = [ config.services.tailscale.port ]; + trustedInterfaces = ["docker0" "tailscale0"]; + allowedUDPPorts = [config.services.tailscale.port]; }; # enable mdns resolution for resolved on all connections # see https://man.archlinux.org/man/NetworkManager.conf.5 @@ -37,12 +37,12 @@ in }; systemd.services.tailscaled.serviceConfig.Environment = [ - "TS_DEBUG_FIREWALL_MODE=nftables" + "TS_DEBUG_FIREWALL_MODE=nftables" ]; # tailscale gets kinda painful without this. - systemd.network.wait-online.enable = false; + systemd.network.wait-online.enable = false; boot.initrd.systemd.network.wait-online.enable = false; - + programs.mosh.enable = mkDefault true; services = { diff --git a/modules/nixos/profiles/zfs.nix b/modules/nixos/profiles/zfs.nix index fdba04e..d1f2231 100644 --- a/modules/nixos/profiles/zfs.nix +++ b/modules/nixos/profiles/zfs.nix @@ -22,17 +22,17 @@ in != null && (builtins.tryEval kernelPackages).success && ( - (!isUnstable && - !kernelPackages.${pkgs.zfs.kernelModuleAttribute}.meta.broken) + (!isUnstable + && !kernelPackages.${pkgs.zfs.kernelModuleAttribute}.meta.broken) || (isUnstable && !kernelPackages.zfs_unstable.meta.broken) ) ) pkgs.linuxKernel.packages; latestZfsKernel = lib.last ( lib.sort - (a: b: (lib.versionOlder a.kernel.version b.kernel.version)) ( - builtins.attrValues zfsCompatibleKernelPackages - ) + (a: b: (lib.versionOlder a.kernel.version b.kernel.version)) ( + builtins.attrValues zfsCompatibleKernelPackages + ) ); in { boot = { -- 2.51.2 From 32cd88d034e5c32e783b4cc5d5f30b0933be326e Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sun, 7 Jun 2026 01:21:09 -0400 Subject: [PATCH 37/48] Replaced GDM with Plasma Login Manager so my system would stop hanging at boot. --- modules/nixos/profiles/desktop/niri.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nixos/profiles/desktop/niri.nix b/modules/nixos/profiles/desktop/niri.nix index 1339dd5..d3107d5 100644 --- a/modules/nixos/profiles/desktop/niri.nix +++ b/modules/nixos/profiles/desktop/niri.nix @@ -17,7 +17,7 @@ in services = { displayManager = { defaultSession = mkForce "niri"; - gdm.enable = mkDefault true; + plasma-login-manager.enable = mkDefault true; }; }; xdg = { -- 2.51.2 From 7146ac93520d0ee4c67bf1335c827a7e7e133561 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sun, 7 Jun 2026 12:57:18 -0400 Subject: [PATCH 38/48] removed the lix resolver since we are not currently using lix --- flake.nix | 2 -- 1 file changed, 2 deletions(-) diff --git a/flake.nix b/flake.nix index 9ee59bf..03a346f 100644 --- a/flake.nix +++ b/flake.nix @@ -45,14 +45,12 @@ nixConfig = { extra-substituters = [ "https://cache.nixos.org" - "https://cache.lix.systems" "https://nix-community.cachix.org" "https://cache.garnix.io" "https://niri.cachix.org" ]; extra-trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" - "cache.lix.systems:aBnZUw8zA7H35Cz2RyKFVs3H4PlGTLawyY5KRbvJR8o=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" "niri.cachix.org-1:Wv0OmO7PsuocRKzfDoJ3mulSl7Z6oezYhGhR+3W2964=" -- 2.51.2 From d84ffd2ad51fd7778965b421189a6d88a2d5796c Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Sun, 7 Jun 2026 12:57:18 -0400 Subject: [PATCH 39/48] Added alejandra and nil to the global environment in the desktop profile --- modules/home/profiles/desktop/default.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index e1ee4dc..6fe2c31 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -53,6 +53,8 @@ in { k3d tilt rustup + alejandra + nil ]; programs = { firefox = { -- 2.51.2 From aa97115ab8e801e901412733a6ef54e7f64bd4de Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Mon, 8 Jun 2026 12:55:16 -0400 Subject: [PATCH 40/48] emacs update --- flake.lock | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/flake.lock b/flake.lock index 09741a5..a22072a 100644 --- a/flake.lock +++ b/flake.lock @@ -115,11 +115,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1779147734, - "narHash": "sha256-8Tupa1CVVPix9b5JjsvyflMLFFmQSZBj+y4H/JAiyvg=", + "lastModified": 1780483622, + "narHash": "sha256-nG8qhM659r1eWCe5QqrxQzIuaCk+v/dnVUaZNj6yQe4=", "owner": "emacs-twist", "repo": "emacs-builtins", - "rev": "b9d3aa84b0e4cc027feea2c05c52adce1f7c85dc", + "rev": "21ccbc158a21f5dd6a8cb9dfc6e66ec3ad77a351", "type": "github" }, "original": { @@ -149,11 +149,11 @@ "twist": "twist" }, "locked": { - "lastModified": 1780176772, - "narHash": "sha256-8F/Sc3zR7gUfcF4+SFk20zoH+ssWxJ5zRHH+J2NZugg=", + "lastModified": 1780941008, + "narHash": "sha256-5pZhs7YD2Dm6acmQ53E4pAtpYS1tIQyhKa9rXm6ZWQk=", "ref": "refs/heads/main", - "rev": "186b543ca2ffe986dfbdb2571d3f3f1d5042a1c7", - "revCount": 301, + "rev": "93a2867e516f784015910ca60f64a290e97df722", + "revCount": 310, "type": "git", "url": "ssh://git@github.com/jjbarr/emacs.d" }, @@ -165,11 +165,11 @@ "epkgs": { "flake": false, "locked": { - "lastModified": 1779623115, - "narHash": "sha256-NnPPyNO3fJgjfx0bxFG0BLhoRdU18e8L8yyKBL2mnSQ=", + "lastModified": 1780917035, + "narHash": "sha256-o4254CxEMPByzrntG+O91vyVLl4oVwQn+cLJ23aBwtQ=", "owner": "emacsmirror", "repo": "epkgs", - "rev": "137a67afcbda7cb00fe1ba474aa7e20864b6fa9f", + "rev": "14787042821c03a922ae43b0988635558e01dfd1", "type": "github" }, "original": { @@ -392,11 +392,11 @@ "gnu-elpa": { "flake": false, "locked": { - "lastModified": 1779379016, - "narHash": "sha256-i+EcraUXuN3XmdWLtYCYrmxb3epIwW25BsUvOT9jSno=", + "lastModified": 1780236505, + "narHash": "sha256-CM9cHPuKsdB1YfDjYSk/clgwj3+iR3MApC2izDgDI4c=", "ref": "main", - "rev": "9103f918995753bd98bbad09a3a38267cb1cdfaa", - "revCount": 755, + "rev": "5f986b454cb7c8b9c886d6cfc1c837aa4b85a920", + "revCount": 756, "type": "git", "url": "https://git.savannah.gnu.org/git/emacs/elpa.git" }, @@ -448,11 +448,11 @@ "melpa": { "flake": false, "locked": { - "lastModified": 1779650126, - "narHash": "sha256-4nH349kfSm58RIZIKuQRUJg37H5oxK/JWC90S2WzZeo=", + "lastModified": 1780848109, + "narHash": "sha256-df5t0bZDO+PVicFyRv86jhlLc9wB9MjXb2oACKShCXQ=", "owner": "melpa", "repo": "melpa", - "rev": "141f731232697e997efe49295531f92589d36c3b", + "rev": "fa2e546d32f6d70d57daf387fe49fc3c9e1d6034", "type": "github" }, "original": { @@ -519,11 +519,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1779536132, - "narHash": "sha256-q+fF42iv/geEbHfgSzy3tS0FF/EyD6XTZ98E6yxiBO8=", + "lastModified": 1780747962, + "narHash": "sha256-IX7G1dlKrOqPOImfbo7ADDfV5yU1+j+MRChI3TL4tAA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3d8f0f3f72a6cd4d93d0ad13203f2ea1cb7e1456", + "rev": "cbb5cf358f50aa6acc9efd6113b7bcfbc352cd73", "type": "github" }, "original": { @@ -741,11 +741,11 @@ "nongnu": { "flake": false, "locked": { - "lastModified": 1778814297, - "narHash": "sha256-U8FoYexh4glbG5yP7VF056fZwsW++wzEVNGph4MZ4fc=", + "lastModified": 1780515522, + "narHash": "sha256-Uti87vKEtHZJl6xjA8Ek73OV+1WEiwqQtHSZWMBrsRQ=", "ref": "main", - "rev": "9a138bb309154f4595bd11b6e12cd2d56d99dc49", - "revCount": 401, + "rev": "75687fd1d60d7ad7f9dacb4379389a024d893138", + "revCount": 402, "type": "git", "url": "https://git.savannah.gnu.org/git/emacs/nongnu.git" }, @@ -1016,11 +1016,11 @@ "elisp-helpers": "elisp-helpers" }, "locked": { - "lastModified": 1779192794, - "narHash": "sha256-ogJgK4tuDV8yqrf+HxmOE51SWuz7L9VfYdq4vor2BlI=", + "lastModified": 1780483602, + "narHash": "sha256-ElHIzapNdyGGajrhMzuZQrd87H6qqmZ9XD8Hx9Aa718=", "owner": "emacs-twist", "repo": "twist.nix", - "rev": "7f12f6f0988c6f979e1fe0dd97c98209647d48f0", + "rev": "2979b8376d6845b8cfd2ec98de4f13f06469f3fa", "type": "github" }, "original": { -- 2.51.2 From 82728dbe52350ff71727d6e67b7799e66e0a09e5 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Mon, 8 Jun 2026 12:55:16 -0400 Subject: [PATCH 41/48] sorting/cleanup --- modules/home/profiles/desktop/default.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 6fe2c31..7e52d3d 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -2,7 +2,6 @@ config, lib, pkgs, - inputs, ... }: let cfg = config.profiles.desktop; @@ -24,8 +23,8 @@ in { home.packages = with pkgs; [ terminus_font syncthing - discord calibre + discord libreoffice-fresh obs-studio inkscape -- 2.51.2 From 6c59de422d1d72dab6eba7f279c8b6872f58244f Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Mon, 8 Jun 2026 12:55:16 -0400 Subject: [PATCH 42/48] add equibop to work around broken discord screenshare --- modules/home/profiles/desktop/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 7e52d3d..e34db36 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -60,6 +60,7 @@ in { enable = true; configPath = "${config.xdg.configHome}/mozilla/firefox"; }; + equibop.enable = true; foot.enable = true; }; # gtk.gtk4.theme = lib.mkForce null; -- 2.51.2 From d2ae456400c2c260295c3c9d2d4864bc1eb13ee9 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 23 Jun 2026 10:27:18 -0400 Subject: [PATCH 43/48] dependency update --- flake.lock | 144 ++++++++++++++++++++++++++--------------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/flake.lock b/flake.lock index a22072a..28077bf 100644 --- a/flake.lock +++ b/flake.lock @@ -96,11 +96,11 @@ "fromElisp": "fromElisp" }, "locked": { - "lastModified": 1763784882, - "narHash": "sha256-ZaGDaT7hKNFh/RwT0YZqWL9AzFjRgpUPGGYbVVHJ4PM=", + "lastModified": 1782098990, + "narHash": "sha256-cdzwG8NRXtwlG25Tjfvscx9nKllZbNbEHvK/q7Sdmak=", "owner": "emacs-twist", "repo": "elisp-helpers", - "rev": "6126c7bb179b13442c86e6f5ee9ff7b0c4837e53", + "rev": "6ed8c5617af3d62a456ad1407c2e22feefd48b1b", "type": "github" }, "original": { @@ -115,11 +115,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1780483622, - "narHash": "sha256-nG8qhM659r1eWCe5QqrxQzIuaCk+v/dnVUaZNj6yQe4=", + "lastModified": 1782098993, + "narHash": "sha256-VlXIY8Dsr6TWdYFzXxq+HR+xyyv7Ij95QtVwwz+HGdQ=", "owner": "emacs-twist", "repo": "emacs-builtins", - "rev": "21ccbc158a21f5dd6a8cb9dfc6e66ec3ad77a351", + "rev": "f4a96d96134d883f977baa3a1060e2a4f1a47966", "type": "github" }, "original": { @@ -149,11 +149,11 @@ "twist": "twist" }, "locked": { - "lastModified": 1780941008, - "narHash": "sha256-5pZhs7YD2Dm6acmQ53E4pAtpYS1tIQyhKa9rXm6ZWQk=", + "lastModified": 1782224823, + "narHash": "sha256-PoVbib1XDLSwdhNuI2dx/quW8+mwVh5EkW9b4Fuw/a8=", "ref": "refs/heads/main", - "rev": "93a2867e516f784015910ca60f64a290e97df722", - "revCount": 310, + "rev": "13f0e7a51e0d8817fecc7895e9add54f5814f93f", + "revCount": 318, "type": "git", "url": "ssh://git@github.com/jjbarr/emacs.d" }, @@ -165,11 +165,11 @@ "epkgs": { "flake": false, "locked": { - "lastModified": 1780917035, - "narHash": "sha256-o4254CxEMPByzrntG+O91vyVLl4oVwQn+cLJ23aBwtQ=", + "lastModified": 1782078914, + "narHash": "sha256-fwBls1tq6gIakgXqQM5EixMtuJS+3+QZJBOALEnyXO8=", "owner": "emacsmirror", "repo": "epkgs", - "rev": "14787042821c03a922ae43b0988635558e01dfd1", + "rev": "d27b36f81d3cf0c8e42f2d63761a37fb2df19176", "type": "github" }, "original": { @@ -392,11 +392,11 @@ "gnu-elpa": { "flake": false, "locked": { - "lastModified": 1780236505, - "narHash": "sha256-CM9cHPuKsdB1YfDjYSk/clgwj3+iR3MApC2izDgDI4c=", + "lastModified": 1781293922, + "narHash": "sha256-nhrJP0zu1yuNgATAvjFqqIGRNqX4UHDtoG5qcwg+YyQ=", "ref": "main", - "rev": "5f986b454cb7c8b9c886d6cfc1c837aa4b85a920", - "revCount": 756, + "rev": "f88cdce39b6e4162059bf39af4319c2956e48ca2", + "revCount": 758, "type": "git", "url": "https://git.savannah.gnu.org/git/emacs/elpa.git" }, @@ -413,11 +413,11 @@ ] }, "locked": { - "lastModified": 1780679734, - "narHash": "sha256-KmRNvpNOb7QEORa06bVgjW9kITcx0VhsI7w0vhmZyD8=", + "lastModified": 1782220169, + "narHash": "sha256-NxykfEdGQjop9m49Bk61pXpAduH8ICHgXC1N3Ph3Jp0=", "owner": "nix-community", "repo": "home-manager", - "rev": "b2b7db486e06e098711dc291bb25db82850e1d16", + "rev": "4b0b9474749820afac53ea30d4ccfef60aba5ce6", "type": "github" }, "original": { @@ -432,11 +432,11 @@ "nixpkgs-lib": "nixpkgs-lib_4" }, "locked": { - "lastModified": 1780235539, - "narHash": "sha256-neW/f0B00Tv19lRtK98zu74qSLIZWIz9C4z686s6LFo=", + "lastModified": 1782051522, + "narHash": "sha256-45VZixBM3606DSmvus47JZYr8Aq3LkSDYan4sqi7KBc=", "owner": "nix-community", "repo": "lib-aggregate", - "rev": "577c8f9b06c4d3990ceb4554445cfb37a9c3b8e1", + "rev": "89fd755403086a06198fc77a3fd993b7f4ab3ea8", "type": "github" }, "original": { @@ -448,11 +448,11 @@ "melpa": { "flake": false, "locked": { - "lastModified": 1780848109, - "narHash": "sha256-df5t0bZDO+PVicFyRv86jhlLc9wB9MjXb2oACKShCXQ=", + "lastModified": 1782081335, + "narHash": "sha256-V+kx0DI9l0CnrhdwU9IDFFkrjbh/tNAWFmHeLnXcS6I=", "owner": "melpa", "repo": "melpa", - "rev": "fa2e546d32f6d70d57daf387fe49fc3c9e1d6034", + "rev": "94c60de3a59fb002f2c1e8bbf7996079feba2d38", "type": "github" }, "original": { @@ -471,11 +471,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1780694373, - "narHash": "sha256-wuj6QmOlLsGjBOut+Ki/hiOT/H5ONzBePqOkOolsNfo=", + "lastModified": 1781795508, + "narHash": "sha256-VKrApQ3WCkEe9D8DbaeFjGqLAh7zqYGYjbQYtY5ikxc=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "8f7043c852210cd0875a1bbe9ca872c90ab5ac74", + "rev": "493ce1e33e72f86312584f331c8cf52b3432ec99", "type": "github" }, "original": { @@ -504,11 +504,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1780637332, - "narHash": "sha256-FeKyLRxLZu2EUnhifijZPDZRl0sVnPVHMtizAINNiN4=", + "lastModified": 1781781064, + "narHash": "sha256-Ii/koEm/sRyg65qbAQWqEgboSEIhdH0EL4KglAc14p0=", "owner": "YaLTeR", "repo": "niri", - "rev": "f717ae030fe56fc52522ebef69f17f3f09064ac4", + "rev": "49fc6117fd6c043adaa2ead316b82db5ed735d36", "type": "github" }, "original": { @@ -519,11 +519,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1780747962, - "narHash": "sha256-IX7G1dlKrOqPOImfbo7ADDfV5yU1+j+MRChI3TL4tAA=", + "lastModified": 1781607440, + "narHash": "sha256-rxO+uc/KFbSJp+pgyXRuAX6QlG9hJdnt0BXpEQRXY+U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cbb5cf358f50aa6acc9efd6113b7bcfbc352cd73", + "rev": "3e41b24abd260e8f71dbe2f5737d24122f972158", "type": "github" }, "original": { @@ -580,11 +580,11 @@ }, "nixpkgs-lib_4": { "locked": { - "lastModified": 1780195591, - "narHash": "sha256-/LAL+E75c0ioCHxyVFGwzXorfuHzToKgqPUCRq4RTIY=", + "lastModified": 1782010777, + "narHash": "sha256-s4FQtsk7FyKMG9GshEPqEu+y5xjMWtVSIYe5+ReKw+o=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "49d924421d7c3175edc499fdc738bd70d69d97d5", + "rev": "2b737a461ddaf811dd6f684701d53da3f7c4ff5c", "type": "github" }, "original": { @@ -595,11 +595,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1780511130, - "narHash": "sha256-2v9lT4ya59Lh1FqPeLnz1MoX9y/wz2huqfe9RtQZITk=", + "lastModified": 1781509190, + "narHash": "sha256-uJZs9Di8I6ciTp6jiojj0HzlNpBkud8ax5aT/O5aJkw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "535f3e6942cb1cead3929c604320d3db54b542b9", + "rev": "d6df3513510aa548c83868fd22bfddd0a8c0a0d4", "type": "github" }, "original": { @@ -611,11 +611,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1780511130, - "narHash": "sha256-2v9lT4ya59Lh1FqPeLnz1MoX9y/wz2huqfe9RtQZITk=", + "lastModified": 1781509190, + "narHash": "sha256-uJZs9Di8I6ciTp6jiojj0HzlNpBkud8ax5aT/O5aJkw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "535f3e6942cb1cead3929c604320d3db54b542b9", + "rev": "d6df3513510aa548c83868fd22bfddd0a8c0a0d4", "type": "github" }, "original": { @@ -632,11 +632,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1780675415, - "narHash": "sha256-uDSfu5+9lThYtl5x3tYDnTf36jO9Aw+Bxm6G5OQkZmE=", + "lastModified": 1782148611, + "narHash": "sha256-9K37YxSnN2wT/HJbUwON9vKPyv9UkBBboNYNbiYm/Xw=", "owner": "nix-community", "repo": "nixpkgs-wayland", - "rev": "381faffd24a947bcaf01016bd4a791b15684f0ed", + "rev": "733f8c91858b78db4d4a3bed1816b5440fb097cc", "type": "github" }, "original": { @@ -647,11 +647,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "lastModified": 1781577229, + "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", "type": "github" }, "original": { @@ -663,11 +663,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "lastModified": 1781577229, + "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", "type": "github" }, "original": { @@ -679,11 +679,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "lastModified": 1781577229, + "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", "owner": "nixos", "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", "type": "github" }, "original": { @@ -741,11 +741,11 @@ "nongnu": { "flake": false, "locked": { - "lastModified": 1780515522, - "narHash": "sha256-Uti87vKEtHZJl6xjA8Ek73OV+1WEiwqQtHSZWMBrsRQ=", + "lastModified": 1780978367, + "narHash": "sha256-LIUL6R+/HY+TV3g3kak5XCktLm4ejkie3vC/Z/AG+Ts=", "ref": "main", - "rev": "75687fd1d60d7ad7f9dacb4379389a024d893138", - "revCount": 402, + "rev": "3253fbf43762ee4310b414aa45473898b814762f", + "revCount": 403, "type": "git", "url": "https://git.savannah.gnu.org/git/emacs/nongnu.git" }, @@ -820,11 +820,11 @@ ] }, "locked": { - "lastModified": 1780715792, - "narHash": "sha256-4+8gPeiPeud89mjo865RwpqmKwa1MThRsq2SvRxo7mg=", + "lastModified": 1782184651, + "narHash": "sha256-4XHdXp3MRa++XiGkltJChCtdbCmSlNTwQRfWQOhqbRw=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "27b7e78c6935293ee868469cc4172e9b8b17823b", + "rev": "f59bc28dd0b89e9c0240d1b80195559fc79c2471", "type": "github" }, "original": { @@ -853,11 +853,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1780701809, - "narHash": "sha256-u7AUNs6U6eD1os4+ghbr1gH4QjPWzOdKvpeM+E+XRKM=", + "lastModified": 1781997134, + "narHash": "sha256-muBZG4O/agq/ljgHr6c3AsobIWgODAS6vf50xIS7o+Q=", "owner": "danth", "repo": "stylix", - "rev": "3a02d9f73608641b28e08b26acb0b0b47c05f14b", + "rev": "a6a493119e492e15874caf6f7f8c7e572e64c655", "type": "github" }, "original": { @@ -1016,11 +1016,11 @@ "elisp-helpers": "elisp-helpers" }, "locked": { - "lastModified": 1780483602, - "narHash": "sha256-ElHIzapNdyGGajrhMzuZQrd87H6qqmZ9XD8Hx9Aa718=", + "lastModified": 1782099003, + "narHash": "sha256-1mAGjPpNRB6ML920sBID1faXvJaRWwyEZ+MWBYBQBVI=", "owner": "emacs-twist", "repo": "twist.nix", - "rev": "2979b8376d6845b8cfd2ec98de4f13f06469f3fa", + "rev": "37c343a92e4fc4c7890733f76f1720fce0eb9e48", "type": "github" }, "original": { @@ -1049,11 +1049,11 @@ "xwayland-satellite-unstable": { "flake": false, "locked": { - "lastModified": 1779745227, - "narHash": "sha256-yqY7RtEJGJiENzR0GwL6q69tSAy6xAAmAcLuIhLjPf8=", + "lastModified": 1781226823, + "narHash": "sha256-28696iIw8uE0ZUyFTtzhEM8xMh85clCYypMxkvUi+sc=", "owner": "Supreeeme", "repo": "xwayland-satellite", - "rev": "5d1efbc9dc3ab1c10160b656e0247f3325daf0f2", + "rev": "8575d0ef55d70f9b4c46b6bffb3accf912217e1e", "type": "github" }, "original": { -- 2.51.2 From 8b2bbc8b58ce9dbab0946b1129e1ebd510a8aa8c Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 23 Jun 2026 10:27:18 -0400 Subject: [PATCH 44/48] removed broken and disabled nix-ld configuration (we'll add it back later in a not-broken form) --- modules/nixos/nix.nix | 102 ++++++++---------------------------------- 1 file changed, 19 insertions(+), 83 deletions(-) diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index a7cbc26..e673917 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -5,90 +5,26 @@ ... }: with lib; { - options.profiles.nix-ld = { - enable = mkEnableOption "nix-ld profile"; - }; - config = mkMerge [ - { - nixpkgs.config.allowUnfree = true; - nix = { - gc = { - automatic = true; - dates = "monthly"; - }; - settings = let - substituters = [ - "https://nix-community.cachix.org" - ]; - in { - experimental-features = ["nix-command" "flakes"]; - trusted-users = ["root" "joshua"]; - extra-substituters = substituters; - trusted-substituters = substituters; - extra-trusted-public-keys = [ - "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" - ]; - }; + config = { + nixpkgs.config.allowUnfree = true; + nix = { + gc = { + automatic = true; + dates = "monthly"; }; - } - (mkIf config.profiles.nix-ld.enable { - # Enable nix ld - programs.nix-ld = { - enable = true; - libraries = with pkgs; [ - alsa-lib - at-spi2-atk - at-spi2-core - atk - cairo - cups - curl - dbus - expat - fontconfig - freetype - fuse3 - gdk-pixbuf - glib - gtk3 - icu - libGL - libappindicator-gtk3 - libdrm - libglvnd - libnotify - libpulseaudio - libunwind - libusb1 - libuuid - libxkbcommon - libxml2 - mesa - nspr - nss - openssl - pango - pipewire - stdenv.cc.cc - systemd - vulkan-loader - libX11 - libXScrnSaver - libXcomposite - libXcursor - libXdamage - libXext - libXfixes - libXi - libXrandr - libXrender - libXtst - libxcb - libxkbfile - libxshmfence - zlib + settings = let + substituters = [ + "https://nix-community.cachix.org" + ]; + in { + experimental-features = ["nix-command" "flakes"]; + trusted-users = ["root" "joshua"]; + extra-substituters = substituters; + trusted-substituters = substituters; + extra-trusted-public-keys = [ + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" ]; }; - }) - ]; + }; + }; } -- 2.51.2 From dda91c58a576df0b1dd4b058b644117c37f4f591 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 23 Jun 2026 10:27:18 -0400 Subject: [PATCH 45/48] added angrr to help clean things up --- modules/nixos/nix.nix | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/modules/nixos/nix.nix b/modules/nixos/nix.nix index e673917..44265d4 100644 --- a/modules/nixos/nix.nix +++ b/modules/nixos/nix.nix @@ -7,6 +7,45 @@ with lib; { config = { nixpkgs.config.allowUnfree = true; + # Yet more theft from orual. This seems about right. + services.angrr = { + enable = true; + settings = { + temporary-root-policies = { + direnv = { + path-regex = "/\\.direnv/"; + period = "14d"; + }; + result = { + path-regex = "/result[^/]*$"; + period = "3d"; + }; + }; + profile-policies = { + system = { + keep-booted-system = true; + keep-current-system = true; + keep-latest-n = 10; + keep-since = "14d"; + profile-paths = [ + "/nix/var/nix/profiles/system" + ]; + }; + user = { + enable = true; + keep-booted-system = true; + keep-current-system = true; + keep-latest-n = 2; + keep-since = "1d"; + profile-paths = [ + "~/.local/state/nix/profiles/profile" + "/nix/var/nix/profiles/per-user/root/profile" + ]; + }; + }; + }; + }; + nix = { gc = { automatic = true; -- 2.51.2 From 12d8820277471d5796eae471eaa3d24ebb5f0949 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 23 Jun 2026 10:27:18 -0400 Subject: [PATCH 46/48] the long-anticipated font-configuration-palooza --- modules/home/profiles/default.nix | 1 + modules/home/profiles/desktop/default.nix | 14 +++++++- modules/home/profiles/fonts.nix | 39 +++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 modules/home/profiles/fonts.nix diff --git a/modules/home/profiles/default.nix b/modules/home/profiles/default.nix index fee8708..139a0c5 100644 --- a/modules/home/profiles/default.nix +++ b/modules/home/profiles/default.nix @@ -3,5 +3,6 @@ ./desktop ./ssh.nix ./jj.nix + ./fonts.nix ]; } diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index e34db36..85e2f2f 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -19,9 +19,9 @@ in { ssh.enable = lib.mkDefault true; jj.enable = lib.mkDefault true; emacs.enable = lib.mkDefault true; + fonts.enable = lib.mkDefault true; }; home.packages = with pkgs; [ - terminus_font syncthing calibre discord @@ -73,6 +73,18 @@ in { package = pkgs.terminus_font; name = "Terminus"; }; + serif = { + package = pkgs.ibm-plex; + name = "IBM Plex"; + }; + sansSerif = { + package = pkgs.ibm-plex; + name = "IBM Plex Sans"; + }; + emoji = { + package = pkgs.noto-fonts-color-emoji; + name = "Noto Color Emoji"; + }; }; polarity = "dark"; cursor = { diff --git a/modules/home/profiles/fonts.nix b/modules/home/profiles/fonts.nix new file mode 100644 index 0000000..4eb445b --- /dev/null +++ b/modules/home/profiles/fonts.nix @@ -0,0 +1,39 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.profiles.fonts; +in { + options = { + profiles.fonts = { + enable = + lib.mkEnableOption "install all the fonts (for graphical environments)"; + }; + }; + config = lib.mkIf cfg.enable { + home.packages = with pkgs; [ + b612 + bqn386 + corefonts + cozette + departure-mono + emacs-all-the-icons-fonts + et-book + fairfax-hd + fontconfig + ibm-plex + inter + nerd-fonts.symbols-only + noto-fonts + noto-fonts-cjk-sans + noto-fonts-color-emoji + noto-fonts-monochrome-emoji + roboto + terminus_font + uiua386 + vista-fonts + ]; + }; +} -- 2.51.2 From 475c319540c65fe89323f70496d6b331aba03c51 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 23 Jun 2026 10:27:18 -0400 Subject: [PATCH 47/48] added a handful of useful cli tools to default home environment --- modules/home/default.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/home/default.nix b/modules/home/default.nix index f2a3eb1..038b51d 100644 --- a/modules/home/default.nix +++ b/modules/home/default.nix @@ -10,11 +10,17 @@ packages = with pkgs; [ rsync ripgrep + fd + bottom + procs + moor ]; file = { }; sessionVariables = { + PAGER = "moor"; }; + sessionPath = ["$HOME/.local/bin"]; }; programs.home-manager.enable = true; programs.zsh.enable = true; -- 2.51.2 From da25b658ea32b4eb5cb3acb7aa8ac3e1757c94a0 Mon Sep 17 00:00:00 2001 From: Joshua Barrett Date: Tue, 23 Jun 2026 10:27:18 -0400 Subject: [PATCH 48/48] removed a bunch of commented-out junk emacs used to need --- modules/home/profiles/desktop/default.nix | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/home/profiles/desktop/default.nix b/modules/home/profiles/desktop/default.nix index 85e2f2f..246a0ea 100644 --- a/modules/home/profiles/desktop/default.nix +++ b/modules/home/profiles/desktop/default.nix @@ -34,18 +34,6 @@ in { syncplay bitwarden-desktop bitwarden-cli - # stuff emacs needs - # TODO bind this to a proper emacs nixenv - # gcc - # gnumake - # bison - # flex - # autoconf - # automake - # libtool - # enchant - # pkg-config - # other junk hunspell hunspellDicts.en-us kubectl