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/configuration.nix b/configuration.nix index 1338b26..31d792b 100644 --- a/configuration.nix +++ b/configuration.nix @@ -13,8 +13,6 @@ # Bootloader. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; - boot.kernelParams = [ "usbcore.autosuspend=-1" ]; - # Boot time optimizations boot.loader.timeout = 0; # Boot immediately without waiting for user input @@ -75,8 +73,13 @@ hardware.graphics = { enable = true; enable32Bit = true; - # Add OpenCL support for CPU-based operations - extraPackages = with pkgs; [ pocl ]; + # Add OpenCL support via Rusticl (recommended by NixOS wiki for DaVinci Resolve) + extraPackages = with pkgs; [ mesa.opencl ]; + }; + + # Enable Rusticl for AMD Radeon GPUs (DaVinci Resolve) + environment.variables = { + RUSTICL_ENABLE = "radeonsi"; }; # Enable keyd for key remapping @@ -139,6 +142,7 @@ geary # Email gnome-tour gnome-font-viewer # Have font-manager + nautilus # Using Nemo ]; # Configure keymap in X11 @@ -185,6 +189,9 @@ # Framework-specific services # Enable fwupd for BIOS updates (distributed through LVFS) services.fwupd.enable = true; + + # Enable periodic TRIM for NVMe/SSD health + services.fstrim.enable = true; # Enable automatic garbage collection to prevent old generations from slowing boot nix.gc = { @@ -193,6 +200,7 @@ options = "--delete-older-than 7d"; }; nix.settings.auto-optimise-store = true; + nix.optimise.automatic = true; # Optimize Nix for RAM - use more memory for builds nix.settings = { @@ -243,6 +251,13 @@ # RAM optimizations for 96GB system # Disable swap usage (set swappiness to 0) - with 96GB RAM, never need swap + # v4l2loopback for OBS Virtual Camera + boot.extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ]; + boot.kernelModules = [ "v4l2loopback" ]; + boot.extraModprobeConfig = '' + options v4l2loopback devices=1 video_nr=1 card_label="OBS Virtual Camera" exclusive_caps=1 + ''; + boot.kernel.sysctl = { "vm.swappiness" = 0; # Never swap to disk "vm.vfs_cache_pressure" = 50; # Keep more filesystem cache in RAM @@ -278,14 +293,15 @@ # $ nix search wget environment.systemPackages = with pkgs; [ git - helix # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. wget vim - docker docker-compose nh ]; + programs.steam.enable = true; + programs.nix-index-database.comma.enable = true; + environment.variables.EDITOR = "helix"; environment.sessionVariables = { TERMINAL = "kitty"; @@ -325,11 +341,16 @@ }; # GameCube adapter udev rules for Slippi/Dolphin + # Disable USB autosuspend for Framework's problematic devices (fingerprint reader, USB-C hub) services.udev.extraRules = '' # GameCube adapter USB device (vendor ID 057e, product ID 0337) SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", MODE="0666" # GameCube adapter HID device (needed for Dolphin to access controllers) KERNEL=="hidraw*", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", MODE="0666", GROUP="input" + # Disable autosuspend for Framework fingerprint reader + ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="27a6", ATTR{power/autosuspend}="-1" + # Disable autosuspend for Framework USB-C hub controllers + ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="32ac", ATTR{power/autosuspend}="-1" ''; # Open ports in the firewall. @@ -346,19 +367,4 @@ # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). system.stateVersion = "25.05"; # Did you read the comment? - # Set user profile picture for GNOME - # Set user profile picture for GNOME - system.activationScripts.script.text = '' - mkdir -p /var/lib/AccountsService/{icons,users} - img="/home/jet/Documents/nix-config/cat.png" - if [ -f "$img" ]; then - cp "$img" /var/lib/AccountsService/icons/jet - echo -e "[User]\nIcon=/var/lib/AccountsService/icons/jet\n" > /var/lib/AccountsService/users/jet - chown root:root /var/lib/AccountsService/users/jet - chmod 0600 /var/lib/AccountsService/users/jet - chown root:root /var/lib/AccountsService/icons/jet - chmod 0444 /var/lib/AccountsService/icons/jet - fi - ''; - } diff --git a/flake.lock b/flake.lock index 28acfe9..1742cfa 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,46 @@ { "nodes": { + "claude-code-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772252606, + "narHash": "sha256-SiIhFq4XbD3LmODQ2mTtakRBnjBn/KoSgAOId1cL1Ks=", + "owner": "ryoppippi", + "repo": "claude-code-overlay", + "rev": "b1ebf027412136bbbe4202741c3d48721644bc4b", + "type": "github" + }, + "original": { + "owner": "ryoppippi", + "repo": "claude-code-overlay", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733312601, + "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -7,11 +48,11 @@ ] }, "locked": { - "lastModified": 1771531206, - "narHash": "sha256-1R3Wx6KUkMb4x4E5UOhW9p6rqiexzSGGWxZqSHqW5n0=", + "lastModified": 1772569491, + "narHash": "sha256-bdr6ueeXO1Xg91sFkuvaysYF0mVdwHBpdyhTjBEWv+s=", "owner": "nix-community", "repo": "home-manager", - "rev": "91be7cce763fa4022c7cf025a71b0c366d1b6e77", + "rev": "924e61f5c2aeab38504028078d7091077744ab17", "type": "github" }, "original": { @@ -28,11 +69,11 @@ ] }, "locked": { - "lastModified": 1771102945, - "narHash": "sha256-e5NfW8NhC3qChR8bHVni/asrig/ZFzd1wzpq+cEE/tg=", + "lastModified": 1772330611, + "narHash": "sha256-UZjPc/d5XRxvjDbk4veAO4XFdvx6BUum2l40V688Xq8=", "owner": "nix-community", "repo": "home-manager", - "rev": "ff5e5d882c51f9a032479595cbab40fd04f56399", + "rev": "58fd7ff0eec2cda43e705c4c0585729ec471d400", "type": "github" }, "original": { @@ -41,13 +82,33 @@ "type": "github" } }, + "nix-index-database": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772341813, + "narHash": "sha256-/PQ0ubBCMj/MVCWEI/XMStn55a8dIKsvztj4ZVLvUrQ=", + "owner": "nix-community", + "repo": "nix-index-database", + "rev": "a2051ff239ce2e8a0148fa7a152903d9a78e854f", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-index-database", + "type": "github" + } + }, "nixos-hardware": { "locked": { - "lastModified": 1771423359, - "narHash": "sha256-yRKJ7gpVmXbX2ZcA8nFi6CMPkJXZGjie2unsiMzj3Ig=", + "lastModified": 1771969195, + "narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "740a22363033e9f1bb6270fbfb5a9574067af15b", + "rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e", "type": "github" }, "original": { @@ -58,11 +119,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1771369470, - "narHash": "sha256-0NBlEBKkN3lufyvFegY4TYv5mCNHbi5OmBDrzihbBMQ=", + "lastModified": 1772542754, + "narHash": "sha256-WGV2hy+VIeQsYXpsLjdr4GvHv5eECMISX1zKLTedhdg=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0182a361324364ae3f436a63005877674cf45efb", + "rev": "8c809a146a140c5c8806f13399592dbcb1bb5dc4", "type": "github" }, "original": { @@ -72,11 +133,35 @@ "type": "github" } }, + "nur": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772583385, + "narHash": "sha256-3m4A+B/CnrG3xUeZbOw1OoLdSvB+7I/zZTW4fLM1go0=", + "owner": "nix-community", + "repo": "NUR", + "rev": "29adb5e8129c1020e59ca0a76b2a40d0e4a74eb1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "root": { "inputs": { + "claude-code-overlay": "claude-code-overlay", "home-manager": "home-manager", + "nix-index-database": "nix-index-database", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", + "nur": "nur", "zen-browser": "zen-browser" } }, @@ -88,11 +173,11 @@ ] }, "locked": { - "lastModified": 1771562861, - "narHash": "sha256-6oT3rF68W8HERLXvFfEkpz8xpAVLKZsY1ZuR/BbDTO8=", + "lastModified": 1772517053, + "narHash": "sha256-aBuL2TFnyBLR+t6iBlKnTWWzprXYKQQIaV0IuCSPPeE=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "7783a3adf3d5a9599a82c75a44c7482e70398ac2", + "rev": "32e9673aee2ae994ced561247918952398a3e933", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 0089da0..beae9c2 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,18 @@ url = "github:0xc000022070/zen-browser-flake"; inputs.nixpkgs.follows = "nixpkgs"; }; + nix-index-database = { + url = "github:nix-community/nix-index-database"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + nur = { + url = "github:nix-community/NUR"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + claude-code-overlay = { + url = "github:ryoppippi/claude-code-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = inputs@{ @@ -27,6 +39,7 @@ ./configuration.nix nixos-hardware.nixosModules.framework-amd-ai-300-series home-manager.nixosModules.home-manager + inputs.nix-index-database.nixosModules.default { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; @@ -36,23 +49,26 @@ } { nixpkgs.overlays = [ - (final: prev: { - - antigravity = prev.antigravity.overrideAttrs (oldAttrs: rec { - version = "1.18.3"; - src = prev.fetchurl { - url = "https://edgedl.me.gvt1.com/edgedl/release2/j0qc3/antigravity/stable/1.18.3-4739469533380608/linux-x64/Antigravity.tar.gz"; - hash = "sha256:0f4n3i45gjr36hidpvibzn3p2jla2r7wg91ybmf2akafjn6f8zsc"; - }; - }); - - antigravity-fhs = final.antigravity.fhs; - - }) + inputs.nur.overlays.default + inputs.claude-code-overlay.overlays.default ]; } ]; }; }; + + devShells.x86_64-linux.default = + let + pkgs = nixpkgs.legacyPackages.x86_64-linux; + nhs = pkgs.writeShellScriptBin "nhs" '' + nh os switch --hostname framework --impure path:. "$@" + ''; + in + pkgs.mkShell { + packages = [ + pkgs.nh + nhs + ]; + }; }; } diff --git a/hardware-configuration.nix b/hardware-configuration.nix index 15c86a4..09d89e5 100644 --- a/hardware-configuration.nix +++ b/hardware-configuration.nix @@ -25,14 +25,7 @@ options = [ "fmask=0077" "dmask=0077" ]; }; - # Add swap file for hibernation support - # This creates a 96GB swap file to match your RAM capacity - swapDevices = [ - { - device = "/swapfile"; - size = 98304; # 96GB in MB - } - ]; + swapDevices = [ ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's diff --git a/home.nix b/home.nix index 4ef65bd..0d7e113 100644 --- a/home.nix +++ b/home.nix @@ -5,19 +5,10 @@ home.username = "jet"; home.homeDirectory = "/home/jet"; - home.stateVersion = "23.05"; + home.stateVersion = "25.05"; - # Define configuration directory - # Note: we can't use config.home.homeDirectory in the let block if we're also defining it in the set - # recursively without strict evaluation issues sometimes, but here it should be fine if we just use the string. - # Safer to just use /home/jet or home.homeDirectory if it was passed in. - # Actually, `config.home.homeDirectory` is safe to use inside simple attribute sets. - # Let's use a let binding for clarity. - # Configure GNOME settings - dconf.settings = let - nixConfigDirectory = "${config.home.homeDirectory}/Documents/nix-config"; - in { + dconf.settings = { "org/gnome/desktop/interface" = { clock-format = "12h"; clock-show-weekday = true; @@ -28,11 +19,6 @@ "org/gnome/system/location" = { enabled = true; }; - "org/gnome/desktop/background" = { - picture-uri = "file://${nixConfigDirectory}/cat.png"; - picture-uri-dark = "file://${nixConfigDirectory}/cat.png"; - picture-options = "wallpaper"; - }; "org/gnome/settings-daemon/plugins/power" = { sleep-inactive-ac-type = "nothing"; }; @@ -74,31 +60,22 @@ home.packages = with pkgs; [ # CLI Tools bat - eza ripgrep tree - wget unzip - zoxide - direnv - nh - google-chrome + hyfetch # Development - git gh - jujutsu - helix + tea mkp224o - claude-code nixfmt # Terminal - kitty - zellij nerd-fonts.commit-mono fastfetch # Desktop / GUI + thunderbird vlc gimp3 inkscape @@ -108,12 +85,14 @@ element-desktop zulip logseq - steam prismlauncher nemo-with-extensions + file-roller font-manager - antigravity-fhs - appimage-run + claude-code + kdePackages.kdenlive + vesktop + obs-studio # GNOME Extensions gnomeExtensions.hide-top-bar @@ -121,9 +100,6 @@ gnomeExtensions.system-monitor-next gnomeExtensions.clipboard-indicator gnomeExtensions.emoji-copy - - # Virtualization/Containerization - docker ]; @@ -132,8 +108,6 @@ OCL_ICD_VENDORS = "/etc/OpenCL/vendors"; POCL_DEVICES = "cpu"; BROWSER = "zen"; - # Set FLAKE for nh - NH_FLAKE = "${config.home.homeDirectory}/Documents/nix-config"; }; programs.helix = { @@ -195,6 +169,10 @@ icons = "always"; enableBashIntegration = true; git = true; + extraOptions = [ + "--group-directories-first" + "--all" + ]; }; programs.zoxide = { @@ -211,10 +189,12 @@ programs.bash = { enable = true; shellAliases = { - ll = "eza -l"; - la = "eza -la"; - ".." = "cd .."; - c = "cd && ls"; + "dr" = "direnv reload"; + "da" = "direnv allow"; + "nfu" = "nix flake update"; + "c" = "claude"; + "." = "z .."; + ".." = "z .."; j = "jj"; jgf = "jj git fetch"; jgp = "jj git push"; @@ -222,16 +202,28 @@ jbs = "jj bookmark set"; jd = "jj describe"; js = "jj show"; + jss = "jj show -s"; + jab = "jj abandon"; + jsp = "jj split"; je = "jj edit --ignore-immutable"; jall = "jj log -r 'all()'"; jn = "jj new"; jdiff = "jj diff"; jsq = "jj squash"; - nhs = "nh os switch"; - nd = "nix develop"; h = "hx"; vanity = "mkp224o-amd64-64-24k -d noisebridgevanitytor noisebridge{2..7}"; }; + initExtra = '' + # Automatically list directory contents when changing directories + auto_l_on_cd() { + if [ "$__LAST_PWD" != "$PWD" ]; then + l + __LAST_PWD="$PWD" + fi + } + export PROMPT_COMMAND="auto_l_on_cd; $PROMPT_COMMAND" + __LAST_PWD="$PWD" + ''; }; programs.kitty = { @@ -282,12 +274,70 @@ # Configure Zen Browser with about:config settings programs.zen-browser = { enable = true; + suppressXdgMigrationWarning = true; policies = { + DisableTelemetry = true; + DisableFirefoxStudies = true; + DisablePocket = true; + DontCheckDefaultBrowser = true; + DisableAppUpdate = true; + DisableMasterPasswordCreation = true; + DisablePasswordReveal = true; + DisableProfileImport = true; + ExtensionUpdate = false; + OfferToSaveLogins = false; + DisableFirefoxAccounts = true; + DisableFormHistory = true; + DisableSafeMode = true; + DisableSetDesktopBackground = true; + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + HardwareAcceleration = true; + NoDefaultBookmarks = true; + PasswordManagerEnabled = false; Preferences = { "zen.theme.border-radius" = 0; "zen.theme.content-element-separation" = 0; }; }; + profiles.default = { + isDefault = true; + settings = { + "identity.fxaccounts.enabled" = false; + }; + extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ + ublock-origin + onepassword-password-manager + sponsorblock + darkreader + vimium + return-youtube-dislikes + react-devtools + firefox-color + pay-by-privacy + translate-web-pages + user-agent-string-switcher + copy-selected-tabs-to-clipboard + dearrow + violentmonkey + tst-indent-line + ]; + search = { + default = "SearXNG"; + privateDefault = "SearXNG"; + force = true; + engines = { + "SearXNG" = { + urls = [{ template = "https://search.extremist.software/search?q={searchTerms}"; }]; + definedAliases = [ "@s" ]; + }; + }; + }; + }; }; # Override the Kitty desktop entry to always launch in fullscreen @@ -301,6 +351,28 @@ comment = "Fast, featureful, GPU based terminal emulator"; }; + # Extract archives on double-click + xdg.desktopEntries.extract-here = { + name = "Extract Here"; + exec = "file-roller --extract-here %U"; + icon = "file-roller"; + type = "Application"; + categories = ["Utility"]; + mimeType = [ + "application/zip" + "application/x-tar" + "application/x-compressed-tar" + "application/x-bzip-compressed-tar" + "application/x-xz-compressed-tar" + "application/x-zstd-compressed-tar" + "application/gzip" + "application/x-7z-compressed" + "application/x-rar" + "application/x-rar-compressed" + ]; + noDisplay = true; + }; + # Autostart applications using proper desktop files xdg.autostart = { enable = true; @@ -320,9 +392,24 @@ "x-scheme-handler/about" = "zen.desktop"; "x-scheme-handler/unknown" = "zen.desktop"; "inode/directory" = "nemo.desktop"; + "application/zip" = "extract-here.desktop"; + "application/x-tar" = "extract-here.desktop"; + "application/x-compressed-tar" = "extract-here.desktop"; + "application/x-bzip-compressed-tar" = "extract-here.desktop"; + "application/x-xz-compressed-tar" = "extract-here.desktop"; + "application/x-zstd-compressed-tar" = "extract-here.desktop"; + "application/gzip" = "extract-here.desktop"; + "application/x-7z-compressed" = "extract-here.desktop"; + "application/x-rar" = "extract-here.desktop"; + "application/x-rar-compressed" = "extract-here.desktop"; }; }; + gtk = { + enable = true; + gtk3.extraConfig.gtk-application-prefer-dark-theme = 1; + }; + # Enable rootless Podman with Home Manager services.podman = { enable = true;