commit c85bfd53f469125f0197f5f99d86422cdde52765 Author: Ray Andrew Date: Sat Oct 26 00:10:48 2024 -0500 init diff --git a/configuration.nix b/configuration.nix new file mode 100644 index 0000000..17f9f70 --- /dev/null +++ b/configuration.nix @@ -0,0 +1,196 @@ +{ config, lib, pkgs, inputs, ... }: + +{ + imports = [ + ./hardware-configuration.nix + inputs.nixos-hardware.nixosModules.framework-13-7040-amd + ]; + + nixpkgs.config.allowUnfree = true; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + networking.hostName = "pickwick"; + networking.networkmanager.enable = true; + + time.timeZone = "America/Chicago"; + + i18n.defaultLocale = "en_US.UTF-8"; + + services.xserver.enable = true; + # services.displayManager.sddm.enable = true; + # services.desktopManager.plasma6.enable = true; + + services.xserver.displayManager.gdm.enable = true; + services.xserver.desktopManager.gnome.enable = true; + services.xserver.xkb.layout = "us"; + # services.xserver.xkb.options = "caps:ctrl_modifier"; + + security.pam.services.login.fprintAuth = false; + security.pam.services.sudo.fprintAuth = false; + + # framework setting + services.fwupd.enable = true; + # services.fwupd.package = (import (builtins.fetchTarball { + # url = "https://github.com/NixOS/nixpkgs/archive/bb2009ca185d97813e75736c2b8d1d8bb81bde05.tar.gz"; + # sha256 = "sha256:003qcrsq5g5lggfrpq31gcvj82lb065xvr7bpfa8ddsw8x4dnysk"; + # }) { + # inherit (pkgs) system; + # }).fwupd; + hardware.framework.amd-7040.preventWakeOnAC = true; + + services.pipewire = { + enable = true; + pulse.enable = true; + jack.enable = true; + }; + + services.libinput.enable = true; + + users.users.root.hashedPasswordFile = "/persist/passwords/root"; + users.users.rayandrew = { + isNormalUser = true; + # initialPassword = "12345"; + hashedPasswordFile = "/persist/passwords/rayandrew"; + extraGroups = [ "wheel" "audio" "keyd" ]; + packages = with pkgs; [ + firefox + tree + ]; + }; + users.groups.keyd = {}; + + environment.systemPackages = with pkgs; [ + vim + wget + htop-vim + + # gnome + keyd + # gnomeExtensions.pop-launcher-super-key + ]; + + environment.plasma6.excludePackages = with pkgs.kdePackages; [ + # plasma-browser-integration + # konsole + oxygen + ]; + + environment.gnome.excludePackages = with pkgs; [ + baobab + cheese + epiphany + simple-scan + yelp + evince + file-roller + geary + gnome-tour + gnome-initial-setup + gnome-music + gnome-maps + gnome-disk-utility + ]; + + programs._1password.enable = true; + programs._1password-gui = { + enable = true; + polkitPolicyOwners = [ "rayandrew" ]; + }; + environment.etc = { + "1password/custom_allowed_browsers" = { + text = '' + firefox + ''; + mode = "0755"; + }; + }; + + programs.dconf.enable = true; + + fileSystems."/persist".neededForBoot = true; + environment.persistence."/persist/system" = { + hideMounts = true; + directories = [ + "/etc/nixos" + # "/etc/gdm" + "/var/log" + "/var/lib/fprint" + "/var/lib/nixos" + "/var/lib/bluetooth" + "/var/lib/systemd/coredump" + "/etc/NetworkManager/system-connections" + { directory = "/var/lib/colord"; user = "colord"; group = "colord"; mode = "u=rwx,g=rx,o="; } + ]; + files = [ + "/etc/machine-id" + ]; + }; + + programs.fuse.userAllowOther = true; + home-manager = { + extraSpecialArgs = {inherit inputs pkgs;}; + users = { + "rayandrew" = import ./home.nix; + }; + useGlobalPkgs = true; + useUserPackages = true; + }; + + + # xdg.portal = { + # enable = true; + # xdgOpenUsePortal = true; + # extraPortals = [ + # pkgs.xdg-desktop-portal-gnome + # pkgs.xdg-desktop-portal-gtk + # ]; + # }; + + services.keyd = { + enable = true; + keyboards = { + default = { + ids = [ "*" ]; + settings = { + main = { + capslock = "layer(capslock)"; + insert = "S-insert"; + # capslock = "layer(control)"; + }; + meta = { + w = "macro(C-w)"; + a = "macro(C-a)"; + }; + "capslock:C" = { }; + }; + }; + framework = { + ids = [ "0001:0001:a38e6885" ]; + settings = { + main = { + leftalt = "layer(meta)"; + leftmeta = "layer(alt)"; + }; + }; + }; + normal = { + ids = [ "413c:2107:eb8bfad1" ]; + settings = { + main = { + leftalt = "layer(meta)"; + leftmeta = "layer(alt)"; + }; + }; + }; + }; + }; + + systemd.services.keyd.serviceConfig.CapabilityBoundingSet = [ + "CAP_SETGID" + ]; + + system.stateVersion = "24.11"; +} + diff --git a/disko.nix b/disko.nix new file mode 100644 index 0000000..4c2301c --- /dev/null +++ b/disko.nix @@ -0,0 +1,96 @@ +{ + device ? throw "Set this to your disk device, e.g. /dev/sda", + ... +}: +{ + disko.devices = { + nodev = { + "/" = { + fsType = "tmpfs"; + mountOptions = [ + "defaults" + "size=8G" + "mode=755" + ]; + }; + }; + + disk.main = { + type = "disk"; + inherit device; + + content = { + type = "gpt"; + partitions = { + boot = { + name = "boot"; + size = "1M"; + type = "EF02"; + }; + esp = { + priority = 1; + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ + "defaults" + "umask=0077" + ]; + }; + }; + + luks = { + size = "100%"; + content = { + type = "luks"; + name = "crypted"; + settings = { + allowDiscards = true; + }; + content = { + type = "lvm_pv"; + vg = "pool"; + }; + }; + }; + }; + }; + }; + + lvm_vg = { + pool = { + type = "lvm_vg"; + lvs = { + root = { + size = "100%FREE"; + content = { + type = "btrfs"; + extraArgs = ["-f"]; + + subvolumes = { + "/persist" = { + mountOptions = ["subvol=persist" "compress=zstd" "noatime"]; + mountpoint = "/persist"; + }; + + "/nix" = { + mountOptions = ["subvol=nix" "compress=zstd" "noatime"]; + mountpoint = "/nix"; + }; + + "/swap" = { + mountpoint = "/swap"; + mountOptions = ["noatime"]; + swap.swapfile.size = "108G"; + }; + }; + }; + }; + }; + }; + }; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..ef81198 --- /dev/null +++ b/flake.lock @@ -0,0 +1,102 @@ +{ + "nodes": { + "disko": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729712798, + "narHash": "sha256-a+Aakkb+amHw4biOZ0iMo8xYl37uUL48YEXIC5PYJ/8=", + "owner": "nix-community", + "repo": "disko", + "rev": "09a776702b004fdf9c41a024e1299d575ee18a7d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1729864948, + "narHash": "sha256-CeGSqbN6S8JmzYJX/HqZjr7dMGlvHLLnJJarwB45lPs=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "0c0268a3c80d30b989d0aadbd65f38d4fa27a9a0", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1729068498, + "narHash": "sha256-C2sGRJl1EmBq0nO98TNd4cbUy20ABSgnHWXLIJQWRFA=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "e337457502571b23e449bf42153d7faa10c0a562", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "impermanence", + "type": "github" + } + }, + "nixos-hardware": { + "locked": { + "lastModified": 1729742320, + "narHash": "sha256-u3Of8xRkN//me8PU+RucKA59/6RNy4B2jcGAF36P4jI=", + "owner": "NixOS", + "repo": "nixos-hardware", + "rev": "e8a2f6d5513fe7b7d15701b2d05404ffdc3b6dda", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixos-hardware", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1729665710, + "narHash": "sha256-AlcmCXJZPIlO5dmFzV3V2XF6x/OpNWUV8Y/FMPGd8Z4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2768c7d042a37de65bb1b5b3268fc987e534c49d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "disko": "disko", + "home-manager": "home-manager", + "impermanence": "impermanence", + "nixos-hardware": "nixos-hardware", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..82d1f01 --- /dev/null +++ b/flake.nix @@ -0,0 +1,29 @@ +{ + description = "Nixos config flake"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + disko.url = "github:nix-community/disko"; + disko.inputs.nixpkgs.follows = "nixpkgs"; + impermanence.url = "github:nix-community/impermanence"; + home-manager.url = "github:nix-community/home-manager"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + nixos-hardware.url = "github:NixOS/nixos-hardware/master"; + }; + + outputs = {nixpkgs, ...} @ inputs: + { + nixosConfigurations.pickwick = nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs; }; + modules = [ + inputs.disko.nixosModules.default + (import ./disko.nix { device = "/dev/nvme0n1"; }) + + ./configuration.nix + + inputs.home-manager.nixosModules.default + inputs.impermanence.nixosModules.impermanence + ]; + }; + }; +} diff --git a/hardware-configuration.nix b/hardware-configuration.nix new file mode 100644 index 0000000..9ded9b2 --- /dev/null +++ b/hardware-configuration.nix @@ -0,0 +1,26 @@ +# 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" "thunderbolt" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eth0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp1s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/home.nix b/home.nix new file mode 100644 index 0000000..414f55c --- /dev/null +++ b/home.nix @@ -0,0 +1,329 @@ +{ config, pkgs, inputs, lib, ... }: + +{ + imports = [ + inputs.impermanence.nixosModules.home-manager.impermanence + ]; + + home.persistence."/persist/home/rayandrew/common" = { + directories = [ + "Downloads" + "Music" + "Pictures" + "Documents" + "Videos" + "Code" + ".gnupg" + ".ssh" + ".local/share/keyrings" + ".local/share/direnv" + ".config/1Password" + ".zoom" + ".config/Slack" + ".config/skypeforlinux" + ]; + files = [ + ".bash_history" + ".config/zoomus.conf" + ]; + allowOther = false; + }; + + home.persistence."/persist/home/rayandrew/desktop" = { + removePrefixDirectory = false; + allowOther = false; + directories = [ + ".config/gtk-3.0" + ".config/gtk-4.0" + ".config/KDE" + ".config/kde.org" + ".config/plasma-workspace" + ".config/xsettingsd" + ".kde" + + ".local/share/baloo" + ".local/share/dolphin" + ".local/share/kactivitymanagerd" + ".local/share/kate" + ".local/share/klipper" + ".local/share/konsole" + ".local/share/kscreen" + ".local/share/kwalletd" + ".local/share/kxmlgui5" + ".local/share/RecentDocuments" + ".local/share/sddm" + ]; + files = [ + ".config/monitors.xml" + ".config/akregatorrc" + ".config/baloofileinformationrc" + ".config/baloofilerc" + ".config/bluedevilglobalrc" + ".config/device_automounter_kcmrc" + ".config/dolphinrc" + ".config/filetypesrc" + # ".config/gtkrc" + # ".config/gtkrc-2.0" + # ".config/gtkrc-3.0" + ".config/gwenviewrc" + ".config/kactivitymanagerd-pluginsrc" + ".config/kactivitymanagerd-statsrc" + ".config/kactivitymanagerd-switcher" + ".config/kactivitymanagerdrc" + ".config/katemetainfos" + ".config/katerc" + ".config/kateschemarc" + ".config/katevirc" + ".config/kcmfonts" + ".config/kcminputrc" + ".config/kconf_updaterc" + ".config/kded5rc" + ".config/kdeglobals" + ".config/kgammarc" + ".config/kglobalshortcutsrc" + ".config/khotkeysrc" + ".config/kmixrc" + ".config/konsolerc" + ".config/kscreenlockerrc" + ".config/ksmserverrc" + ".config/ksplashrc" + ".config/ktimezonedrc" + ".config/kwinrc" + ".config/kwinrulesrc" + ".config/kxkbrc" + # ".config/mimeapps.list" + ".config/partitionmanagerrc" + ".config/plasma-localerc" + ".config/plasma-nm" + ".config/plasma-org.kde.plasma.desktop-appletsrc" + ".config/plasmanotifyrc" + ".config/plasmarc" + ".config/plasmashellrc" + ".config/PlasmaUserFeedback" + ".config/plasmawindowed-appletsrc" + ".config/plasmawindowedrc" + ".config/powermanagementprofilesrc" + ".config/spectaclerc" + ".config/startkderc" + ".config/systemsettingsrc" + ".config/Trolltech.conf" + # ".config/user-dirs.dirs" + ".config/user-dirs.locale" + + ".local/share/krunnerstaterc" + ".local/share/user-places.xbel" + # ".local/share/user-places.xbel.bak" + ".local/share/user-places.xbel.tbcache" + ]; + }; + + home.persistence."/persist/home/rayandrew/firefox" = { + directories = [ + ".mozilla" + ]; + allowOther = true; + }; + + home.stateVersion = "24.11"; + + programs.home-manager = { + enable = true; + }; + + dconf.settings = { + "org/gnome/shell" = { + disable-user-extensions = false; + enabled-extensions = [ + "pop-shell@system76.com" + "keyd" + ]; + favorite-apps = [ + "org.gnome.Console.desktop" + "firefox.desktop" + ]; + }; + "org/gnome/desktop/wm/keybindings" = { + minimize = []; + lock = []; + switch-to-workspace-left = []; + switch-to-workspace-right = []; + maximize = [ "f" ]; + unmaximize = [ "f" ]; + move-to-monitor-up = [ ]; + move-to-monitor-down = []; + move-to-monitor-left = []; + move-to-monitor-right = []; + move-to-workspace-down = []; + move-to-workspace-up = []; + close = [ "q" "F4" ]; + }; + "org/gnome/settings-daemon/plugins/media-keys" = { + custom-keybindings = [ + "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/terminal/" + ]; + }; + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/terminal" = { + binding = "Return"; + command = "kgx"; + name = "GNOME Console"; + }; + "org/gnome/mutter/keybindings" = { + toggle-tiled-left = []; + toggle-tiled-right = []; + }; + "org/gnome/shell/extensions/pop-shell" = { + activate-launcher = ["Space"]; + tile-enter = ["r"]; + }; + "org/gnome/desktop/background" = { + picture-uri-dark = "file://${pkgs.nixos-artwork.wallpapers.nineish-dark-gray.src}"; + }; + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + gtk2 = { + configLocation = "${config.home.homeDirectory}/.config/gtkrc-2.0"; + }; + }; + + qt = { + enable = true; + platformTheme.name = "adwaita"; + style.name = "adwaita-dark"; + }; + + xdg = { + mimeApps = { + enable = true; + defaultApplications = { + "application/pdf" = "firefox.desktop"; + "application/x-extension-htm" = "firefox.desktop"; + "application/x-extension-html" = "firefox.desktop"; + "application/x-extension-shtml" = "firefox.desktop"; + "application/x-extension-xht" = "firefox.desktop"; + "application/x-extension-xhtml" = "firefox.desktop"; + "application/xhtml+xml" = "firefox.desktop"; + "image/jpeg" = "firefox.desktop"; + "image/png" = "firefox.desktop"; + "text/html" = "firefox.desktop"; + "text/uri-list" = "firefox.desktop"; + "x-scheme-handler/chrome" = "firefox.desktop"; + "x-scheme-handler/http" = "firefox.desktop"; + "x-scheme-handler/https" = "firefox.desktop"; + }; + }; + configFile."mimeapps.list".force = true; + }; + + xdg.portal = { + enable = true; + xdgOpenUsePortal = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-kde + xdg-desktop-portal-gnome + xdg-desktop-portal-gtk + ]; + config = { + common = { default = [ "gtk" ]; }; + gnome = { default = [ "gnome" "gtk" ]; }; + }; + }; + + home.packages = with pkgs; [ + zoom-us + slack + skypeforlinux + desktop-file-utils + gnomeExtensions.pop-shell + gnomeExtensions.tray-icons-reloaded + gnomeExtensions.hibernate-status-button + pop-launcher + ]; + + programs.git = { + enable = true; + }; + + programs.bash.profileExtra = lib.mkAfter '' + rm -rf ${config.home.homeDirectory}/.local/share/applications/home-manager + rm -rf ${config.home.homeDirectory}/.icons/nix-icons + ls ${config.home.homeDirectory}/.nix-profile/share/applications/*.desktop > ${config.home.homeDirectory}/.cache/current_desktop_files.txt + ''; + + home.activation = { + linkDesktopApplications = { + after = ["writeBoundary" "createXdgUserDirectories"]; + before = []; + data = '' + rm -rf ${config.home.homeDirectory}/.local/share/applications/home-manager + rm -rf ${config.home.homeDirectory}/.icons/nix-icons + mkdir -p ${config.home.homeDirectory}/.local/share/applications/home-manager + mkdir -p ${config.home.homeDirectory}/.icons + ln -sf ${config.home.homeDirectory}/.nix-profile/share/icons ${config.home.homeDirectory}/.icons/nix-icons + + # Check if the cached desktop files list exists + if [ -f ${config.home.homeDirectory}/.cache/current_desktop_files.txt ]; then + current_files=$(cat ${config.home.homeDirectory}/.cache/current_desktop_files.txt) + else + current_files="" + fi + + # Symlink new desktop entries + for desktop_file in ${config.home.homeDirectory}/.nix-profile/share/applications/*.desktop; do + if ! echo "$current_files" | grep -q "$(basename $desktop_file)"; then + ln -sf "$desktop_file" ${config.home.homeDirectory}/.local/share/applications/home-manager/$(basename $desktop_file) + fi + done + + # Update desktop database + ${pkgs.desktop-file-utils}/bin/update-desktop-database ${config.home.homeDirectory}/.local/share/applications + ''; + }; + }; + + programs.emacs = { + enable = true; + package = pkgs.emacs; + }; + + programs.vscode = { + enable = true; + }; + + xdg.configFile."keyd/app.conf" = { + text = '' +[firefox] + +control.p = up +control.n = down +control.e = end +control.a = home +control.shift.p = macro(C-S-p) +''; + }; + + home.file.".local/share/gnome-shell/extensions/keyd" = { + source = "${pkgs.keyd}/share/keyd/gnome-extension-45"; + recursive = true; + }; + + # systemd.user.services.keyd-application-mapper = { + # Install.WantedBy = [ "default.target" ]; + # Unit = { Description = "keyd-application-mapper"; }; + # Service = { + # ExecStart = "${pkgs.keyd}/bin/keyd-application-mapper"; + # }; + # }; + + # Wayland, X, etc. support for session vars + systemd.user.sessionVariables = config.home.sessionVariables; + +}