From 0f51bf1abb2fa202ac04a948a68755f05bdaa1b3 Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Fri, 25 Jul 2025 10:24:08 +0200 Subject: [PATCH] fixes and improvements --- devshells/python_310/flake.lock | 61 +++++++++ devshells/python_310/flake.nix | 22 ++++ devshells/python_310_cuda/flake.lock | 25 ++++ devshells/python_310_cuda/flake.nix | 44 +++++++ flake.lock | 116 ++++++++++++++++-- flake.nix | 32 ++++- hosts/alex-desktop/default.nix | 90 ++++++++++++++ hosts/alex-desktop/hardware-configuration.nix | 41 +++++++ hosts/alex-desktop/user.nix | 70 +++++++++++ quit-on-input.lua | 10 ++ resources/black.mp4 | Bin 0 -> 758751 bytes resources/black.png | 0 resources/blank.png | Bin 0 -> 545 bytes .../scripts}/waybar/amixer-toggle.sh | 0 .../scripts}/waybar/brightness.sh | 0 .../scripts}/waybar/colorpicker.sh | 0 .../scripts}/waybar/cpu_linux.sh | 0 .../scripts}/waybar/myUpdates.sh | 0 .../scripts}/waybar/myupdate.sh | 0 .../scripts}/waybar/powerdraw.sh | 0 .../scripts}/waybar/weather.sh | 0 system/common.nix | 2 +- system/cpu/amd/default.nix | 5 + system/gpu/nvidia/ampere/default.nix | 10 ++ system/modules/desktop_tools.nix | 20 ++- system/modules/dev.nix | 13 +- system/modules/docker.nix | 8 +- system/modules/entertainment.nix | 7 ++ system/modules/gaming.nix | 19 +++ system/modules/keyd.nix | 13 +- system/modules/latex.nix | 7 ++ system/modules/ml_dev.nix | 23 ++++ system/modules/mullvad.nix | 12 ++ system/modules/sway.nix | 4 +- system/pc/audio/pipewire.nix | 1 + user/common.nix | 9 ++ user/modules/alacritty.nix | 22 ++-- user/modules/common.nix | 8 -- user/modules/dev.nix | 8 ++ user/modules/dev_helpers.nix | 17 +++ user/modules/gammastep.nix | 2 +- user/modules/mako.nix | 29 +++++ user/modules/sway.nix | 30 +++-- user/modules/waybar.nix | 14 +-- user/modules/zellij.nix | 2 +- wl-copy | 47 +++++++ 46 files changed, 780 insertions(+), 63 deletions(-) create mode 100644 devshells/python_310/flake.lock create mode 100644 devshells/python_310/flake.nix create mode 100644 devshells/python_310_cuda/flake.lock create mode 100644 devshells/python_310_cuda/flake.nix create mode 100755 hosts/alex-desktop/default.nix create mode 100644 hosts/alex-desktop/hardware-configuration.nix create mode 100755 hosts/alex-desktop/user.nix create mode 100644 quit-on-input.lua create mode 100644 resources/black.mp4 create mode 100644 resources/black.png create mode 100644 resources/blank.png rename {scripts => resources/scripts}/waybar/amixer-toggle.sh (100%) rename {scripts => resources/scripts}/waybar/brightness.sh (100%) rename {scripts => resources/scripts}/waybar/colorpicker.sh (100%) rename {scripts => resources/scripts}/waybar/cpu_linux.sh (100%) rename {scripts => resources/scripts}/waybar/myUpdates.sh (100%) rename {scripts => resources/scripts}/waybar/myupdate.sh (100%) rename {scripts => resources/scripts}/waybar/powerdraw.sh (100%) rename {scripts => resources/scripts}/waybar/weather.sh (100%) create mode 100644 system/cpu/amd/default.nix create mode 100644 system/gpu/nvidia/ampere/default.nix mode change 100755 => 100644 system/modules/dev.nix create mode 100644 system/modules/entertainment.nix create mode 100644 system/modules/gaming.nix create mode 100644 system/modules/latex.nix create mode 100644 system/modules/ml_dev.nix create mode 100644 system/modules/mullvad.nix create mode 100644 user/common.nix delete mode 100644 user/modules/common.nix create mode 100644 user/modules/dev.nix create mode 100644 user/modules/dev_helpers.nix create mode 100644 user/modules/mako.nix create mode 100644 wl-copy diff --git a/devshells/python_310/flake.lock b/devshells/python_310/flake.lock new file mode 100644 index 0000000..adf40ff --- /dev/null +++ b/devshells/python_310/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "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" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1752480373, + "narHash": "sha256-JHQbm+OcGp32wAsXTE/FLYGNpb+4GLi5oTvCxwSoBOA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "62e0f05ede1da0d54515d4ea8ce9c733f12d9f08", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devshells/python_310/flake.nix b/devshells/python_310/flake.nix new file mode 100644 index 0000000..917c3ce --- /dev/null +++ b/devshells/python_310/flake.nix @@ -0,0 +1,22 @@ +{ + description = "Bare Python 3.10 dev shell without sphinx"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { nixpkgs, flake-utils, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; }; + in { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + python310 + gcc + ]; + }; + } + ); +} diff --git a/devshells/python_310_cuda/flake.lock b/devshells/python_310_cuda/flake.lock new file mode 100644 index 0000000..61a95f2 --- /dev/null +++ b/devshells/python_310_cuda/flake.lock @@ -0,0 +1,25 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1752747119, + "narHash": "sha256-2Kp9St3Pbsmu+xMsobLcgzzUxPvZR7alVJWyuk2BAPc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fa0ef8a6bb1651aa26c939aeb51b5f499e86b0ec", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devshells/python_310_cuda/flake.nix b/devshells/python_310_cuda/flake.nix new file mode 100644 index 0000000..65f900e --- /dev/null +++ b/devshells/python_310_cuda/flake.nix @@ -0,0 +1,44 @@ + { + description = "Python 3.10 development environment"; + outputs = { self, nixpkgs }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + }; + in { + devShells.${system}.default = (pkgs.buildFHSEnv { + name = "nvidia-fuck-you"; + targetPkgs = pkgs: (with pkgs; [ + python310 + cudaPackages_12.cudatoolkit + python310Packages.pytorch-bin + python310Packages.pip + python310Packages.sphinx + gcc + linuxPackages.nvidia_x11 + libGLU libGL + xorg.libXi xorg.libXmu freeglut + xorg.libXext xorg.libX11 xorg.libXv xorg.libXrandr zlib + ncurses5 stdenv.cc binutils + ffmpeg + + # I daily drive the fish shell + # you can remove this, the default is bash + fish + + ]); + + profile = '' + export LD_LIBRARY_PATH="${pkgs.linuxPackages.nvidia_x11}/lib" + export CUDA_PATH="${pkgs.cudatoolkit}" + export EXTRA_LDFLAGS="-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib" + export EXTRA_CCFLAGS="-I/usr/include" + ''; + + # again, you can remove this if you like bash + runScript = "fish"; + }).env; + }; + } diff --git a/flake.lock b/flake.lock index 2b4f72a..cf16dc0 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,20 @@ { "nodes": { + "flake-compat": { + "locked": { + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -7,33 +22,95 @@ ] }, "locked": { - "lastModified": 1726989464, - "narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=", + "lastModified": 1752544374, + "narHash": "sha256-ReX0NG6nIAEtQQjLqeu1vUU2jjZuMlpymNtb4VQYeus=", "owner": "nix-community", "repo": "home-manager", - "rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176", + "rev": "2e00ed310c218127e02ffcf28ddd4e0f669fde3e", "type": "github" }, "original": { "owner": "nix-community", - "ref": "release-24.05", + "ref": "release-25.05", "repo": "home-manager", "type": "github" } }, + "nix-alien": { + "inputs": { + "flake-compat": "flake-compat", + "nix-index-database": "nix-index-database", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1752566074, + "narHash": "sha256-hWPv6S5lFn6qOQdSL5Ad/m0mge2ALTC8WEAR7c6YWcE=", + "owner": "thiagokokada", + "repo": "nix-alien", + "rev": "ccf263b7ac5f44f89fd990594b09aa52de3d6585", + "type": "github" + }, + "original": { + "owner": "thiagokokada", + "repo": "nix-alien", + "type": "github" + } + }, + "nix-index-database": { + "inputs": { + "nixpkgs": [ + "nix-alien", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1752441837, + "narHash": "sha256-FMH1OSSJp8Cx8MZHXz6KckxJGbCnVMotZNAH3v2WneU=", + "owner": "nix-community", + "repo": "nix-index-database", + "rev": "839e02dece5845be3a322e507a79712b73a96ba2", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-index-database", + "type": "github" + } + }, + "nix-ld": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1752564969, + "narHash": "sha256-4858rI66/cpCFZR+iHl6sklXZQ11f9WdlHG5n/ZAS/Q=", + "owner": "Mic92", + "repo": "nix-ld", + "rev": "5b4edcb0357c684b69f406c808646135ee985f8a", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "nix-ld", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1751943650, - "narHash": "sha256-7orTnNqkGGru8Je6Un6mq1T8YVVU/O5kyW4+f9C1mZQ=", + "lastModified": 1751984180, + "narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "88983d4b665fb491861005137ce2b11a9f89f203", + "rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0", "type": "github" }, "original": { - "id": "nixpkgs", - "ref": "nixos-25.05", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs-unstable": { @@ -52,10 +129,27 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1751943650, + "narHash": "sha256-7orTnNqkGGru8Je6Un6mq1T8YVVU/O5kyW4+f9C1mZQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "88983d4b665fb491861005137ce2b11a9f89f203", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-25.05", + "type": "indirect" + } + }, "root": { "inputs": { "home-manager": "home-manager", - "nixpkgs": "nixpkgs", + "nix-alien": "nix-alien", + "nix-ld": "nix-ld", + "nixpkgs": "nixpkgs_2", "nixpkgs-unstable": "nixpkgs-unstable" } } diff --git a/flake.nix b/flake.nix index 85215ef..ad3b1df 100644 --- a/flake.nix +++ b/flake.nix @@ -4,11 +4,23 @@ inputs = { nixpkgs.url = "nixpkgs/nixos-25.05"; nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; - home-manager.url = "github:nix-community/home-manager/release-24.05"; + + home-manager.url = "github:nix-community/home-manager/release-25.05"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; + + nix-alien.url = "github:thiagokokada/nix-alien"; + + nix-ld.url = "github:Mic92/nix-ld"; + # this line assume that you also have nixpkgs as an input + nix-ld.inputs.nixpkgs.follows = "nixpkgs"; }; - outputs = { self, nixpkgs, home-manager, ... }: { + outputs = { self, nixpkgs, nixpkgs-unstable, home-manager, nix-ld, ... }: + let + system = "x86_64-linux"; # or aarch64-linux + pkgs = import nixpkgs { inherit system; }; + in + { nixosConfigurations = { dev-vm = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; @@ -20,6 +32,7 @@ ./hosts/dev-vm/default.nix ]; }; + alex-laptop = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; specialArgs = { @@ -30,6 +43,21 @@ ./hosts/alex-laptop/default.nix ]; }; + + alex-desktop = nixpkgs.lib.nixosSystem { + specialArgs = { + inherit self system; + }; + modules = [ + ./system/common.nix + ./hosts/alex-desktop/default.nix + home-manager.nixosModules.home-manager + #nix-ld.nixosModules.nix-ld + # The module in this repository defines a new module under (programs.nix-ld.dev) instead of (programs.nix-ld) + # to not collide with the nixpkgs version. + #{ programs.nix-ld.dev.enable = true; } + ]; + }; }; }; } diff --git a/hosts/alex-desktop/default.nix b/hosts/alex-desktop/default.nix new file mode 100755 index 0000000..08a135b --- /dev/null +++ b/hosts/alex-desktop/default.nix @@ -0,0 +1,90 @@ +{ config, pkgs, lib, home-manager, ... }: + +{ + imports = [ + ../../system/modules/sway.nix + ../../system/modules/dev.nix + ../../system/modules/ml_dev.nix + ../../system/modules/latex.nix + ../../system/modules/docker.nix + ../../system/modules/bluetooth.nix + ../../system/modules/desktop_tools.nix + ../../system/modules/keyd.nix + ../../system/modules/entertainment.nix + ../../system/modules/gaming.nix + + ../../system/cpu/amd + #../../system/gpu/nvidia/ampere + ../../system/pc/ssd + ../../system/pc/audio/pipewire.nix + ../../system/modules/mullvad.nix + + ./hardware-configuration.nix + + ./user.nix + ]; + environment.systemPackages = with pkgs; [ + keymapp + ]; + + home-manager.useUserPackages = true; + home-manager.useGlobalPkgs = true; + + boot.loader.efi.canTouchEfiVariables = true; + boot.loader.grub = { + enable = true; + version = 2; + efiSupport = true; + enableCryptodisk = true; + device = "nodev"; + }; + + boot.initrd.luks.devices = { + crypted = { + device = "/dev/disk/by-uuid/58ae6681-79a6-418e-94e1-8ed298b19e7c"; + preLVM = true; + }; + }; + + boot.kernelParams = [ "kvm.enable_virt_at_load=0" ]; + + console.keyMap = "us-acentos"; + + hardware.graphics.enable = true; + services.xserver.videoDrivers = [ "nvidia" ]; + hardware.nvidia = { + modesetting.enable = true; + powerManagement.enable = true; + powerManagement.finegrained = false; + open = false; + nvidiaSettings = true; + package = config.boot.kernelPackages.nvidiaPackages.stable; + }; + + # hibernation setup + boot.resumeDevice = "/dev/disk/by-uuid/3876d89-a80d-4422-b852-d308fec68d4a"; + + # Suspend first + + # Define time delay for hibernation + systemd.sleep.extraConfig = '' + HibernateDelaySec=30m + SuspendState=mem + ''; + + # networking and connection + networking.hostName = "alex-desktop"; + + hardware.bluetooth.powerOnBoot = true; + + # time and localization + time.timeZone = "Europe/Berlin"; + + # users + programs.fish.enable = true; + users.users.alex = { + isNormalUser = true; + extraGroups = [ "wheel" "video" "network" "audio" "networkmanager" "vboxusers" "docker" ]; + shell = pkgs.fish; + }; +} diff --git a/hosts/alex-desktop/hardware-configuration.nix b/hosts/alex-desktop/hardware-configuration.nix new file mode 100644 index 0000000..45bc3f3 --- /dev/null +++ b/hosts/alex-desktop/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" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/9f30b01a-fe8d-42e5-925e-02b971513c32"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/8D94-3117"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/33876d89-a80d-4422-b852-d308fec68d4a"; } + ]; + + # 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.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.wlp5s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/alex-desktop/user.nix b/hosts/alex-desktop/user.nix new file mode 100755 index 0000000..9c03975 --- /dev/null +++ b/hosts/alex-desktop/user.nix @@ -0,0 +1,70 @@ +{ config, lib, pkgs, home-manager, ... }: +{ + home-manager.users.alex= { + imports = [ + (import ../../user/common.nix ) + ../../user/modules/sway.nix + ../../user/modules/mako.nix + ../../user/modules/rofi.nix + ../../user/modules/waybar.nix + ../../user/modules/terminal.nix + ../../user/modules/ranger.nix + ../../user/modules/fish.nix + ../../user/modules/alacritty.nix + ../../user/modules/zellij.nix + ../../user/modules/dev.nix + ../../user/modules/dev_helpers.nix + ]; + home.packages = with pkgs; [ + neovim + ]; + # set custom scree resolution and refresh rate + wayland.windowManager.sway = { + config= { + output = { + "HDMI-A-1"= { + resolution = "3840x2160@120HZ"; + }; + }; + bars = [ + { + command = "waybar"; + mode = "hide"; + hiddenState = "hide"; + } + ]; + }; + }; + + # place waybar on the bottom + programs.waybar = { + settings.main = lib.mkMerge [{ + position = lib.mkForce "bottom"; + ipc = true; + }]; + }; + + # turn off swaylock background image + programs.swaylock.settings = lib.mkForce { + color = "000000"; + }; + services.swayidle.timeouts = [ + { + timeout = 300; + command = "${pkgs.bash}/bin/bash -c '${pkgs.mpv}/bin/mpv --fs --no-audio --image-display-duration=inf --loop --no-osc /home/alex/nixos/resources/blank.png & echo $! > /home/alex/black_screen.pid;'"; + #resumeCommand = "${pkgs.bash}/bin/bash -c '${pkgs.procps}/bin/pkill -U $(id -u) -x mpv; ${pkgs.coreutils}/bin/rm -f /tmp/black_screen.pid'"; + resumeCommand = "${pkgs.bash}/bin/bash -c 'pid=$(${pkgs.coreutils}/bin/cat /home/alex/black_screen.pid); ${pkgs.coreutils}/bin/kill $pid && ${pkgs.coreutils}/bin/rm /home/alex/black_screen.pid'"; + + + } + ]; + + # put notifications to bottom right + services.mako = { + settings = { + anchor = "bottom-righ"; + }; + }; + + }; +} diff --git a/quit-on-input.lua b/quit-on-input.lua new file mode 100644 index 0000000..47e9a0d --- /dev/null +++ b/quit-on-input.lua @@ -0,0 +1,10 @@ +local function quit() + mp.command("quit") +end + +-- Bind to every sane input type +mp.add_forced_key_binding(nil, "any_key", quit) +mp.add_forced_key_binding("MBTN_LEFT", "left_click", quit) +mp.add_forced_key_binding("MBTN_RIGHT", "right_click", quit) +mp.add_forced_key_binding("WHEEL_UP", "scroll_up", quit) +mp.add_forced_key_binding("WHEEL_DOWN", "scroll_down", quit) diff --git a/resources/black.mp4 b/resources/black.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6187b5e5bafdfe0b1eb2258c8fda5834f4a9b45c GIT binary patch literal 758751 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 Br1$^; literal 0 HcmV?d00001 diff --git a/resources/black.png b/resources/black.png new file mode 100644 index 0000000..e69de29 diff --git a/resources/blank.png b/resources/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..199c3f02656a972766d0d4b34df1baeeff045004 GIT binary patch literal 545 zcmV++0^a?JP)EX>4Tx04R}tkv&MmKpe$iQ>7x64rUN>$WS}kMWr~_DionYs1;guFuC*#nplz) z7e~Rh;NZt%)xpJCR|i)?5c~jf7n~Gbq{ROvg%&X$9QWhhy~o`>RO3ER}m$?O|3ib>eB_sHPi~FXTPe zIB#**YYo=9Cx2nMXe=*ro#q(QSimA=NKny06*bt1(`t}nAxrxyAOEQ9m&v7)s|rSr zd2B$3;`+h=;CHuHX=>6-3a5bn7svS+2SU3*yXiRJ$BxrJ0fNuKmC^NYw1AmU(wki^ zdIUtafs5;|rtSfkJHW_OT`?6`3eprxCE)#xzNr8V-vWcHUT>X!oIU_K>MC;s92^3% zGG(v%ynCRxw|~!c`uhRy?sC}lvr@wV000SaNLh0L04^f{04^f|c%?sf00007bV*G` z2k8e76gM6J^6TvY000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0000C jNkl#Hd literal 0 HcmV?d00001 diff --git a/scripts/waybar/amixer-toggle.sh b/resources/scripts/waybar/amixer-toggle.sh similarity index 100% rename from scripts/waybar/amixer-toggle.sh rename to resources/scripts/waybar/amixer-toggle.sh diff --git a/scripts/waybar/brightness.sh b/resources/scripts/waybar/brightness.sh similarity index 100% rename from scripts/waybar/brightness.sh rename to resources/scripts/waybar/brightness.sh diff --git a/scripts/waybar/colorpicker.sh b/resources/scripts/waybar/colorpicker.sh similarity index 100% rename from scripts/waybar/colorpicker.sh rename to resources/scripts/waybar/colorpicker.sh diff --git a/scripts/waybar/cpu_linux.sh b/resources/scripts/waybar/cpu_linux.sh similarity index 100% rename from scripts/waybar/cpu_linux.sh rename to resources/scripts/waybar/cpu_linux.sh diff --git a/scripts/waybar/myUpdates.sh b/resources/scripts/waybar/myUpdates.sh similarity index 100% rename from scripts/waybar/myUpdates.sh rename to resources/scripts/waybar/myUpdates.sh diff --git a/scripts/waybar/myupdate.sh b/resources/scripts/waybar/myupdate.sh similarity index 100% rename from scripts/waybar/myupdate.sh rename to resources/scripts/waybar/myupdate.sh diff --git a/scripts/waybar/powerdraw.sh b/resources/scripts/waybar/powerdraw.sh similarity index 100% rename from scripts/waybar/powerdraw.sh rename to resources/scripts/waybar/powerdraw.sh diff --git a/scripts/waybar/weather.sh b/resources/scripts/waybar/weather.sh similarity index 100% rename from scripts/waybar/weather.sh rename to resources/scripts/waybar/weather.sh diff --git a/system/common.nix b/system/common.nix index b4b63b9..872a80f 100644 --- a/system/common.nix +++ b/system/common.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, pkgs, system, nix-alien, ... }: { system.stateVersion = "25.05"; diff --git a/system/cpu/amd/default.nix b/system/cpu/amd/default.nix new file mode 100644 index 0000000..10ec6fd --- /dev/null +++ b/system/cpu/amd/default.nix @@ -0,0 +1,5 @@ +{ config, lib, ... }: + +{ + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/system/gpu/nvidia/ampere/default.nix b/system/gpu/nvidia/ampere/default.nix new file mode 100644 index 0000000..5e8d48f --- /dev/null +++ b/system/gpu/nvidia/ampere/default.nix @@ -0,0 +1,10 @@ +{ lib, config, ... }: +let + nvidiaPackage = config.hardware.nvidia.package; +in +{ + imports = [ ../. ]; + + # enable the open source drivers if the package supports it + hardware.nvidia.open = lib.mkOverride 990 (nvidiaPackage ? open && nvidiaPackage ? firmware); +} diff --git a/system/modules/desktop_tools.nix b/system/modules/desktop_tools.nix index d06c1ac..1e0b623 100644 --- a/system/modules/desktop_tools.nix +++ b/system/modules/desktop_tools.nix @@ -8,8 +8,26 @@ brave firefox chromium - + + thunderbird + # misc + zotero + evince + pcmanfm + krusader + + # graphic and image stuff + gimp + nomacs + + # video playing + vlc + mpv + + qbittorrent + nextcloud-client + ]; diff --git a/system/modules/dev.nix b/system/modules/dev.nix old mode 100755 new mode 100644 index 3f11cf8..7032076 --- a/system/modules/dev.nix +++ b/system/modules/dev.nix @@ -1,11 +1,22 @@ { config, lib, pkgs, ... }: - { environment.systemPackages = with pkgs; [ jdk jetbrains.pycharm-professional + #(jetbrains.plugins.addPlugins jetbrains.pycharm-professional ["github-copilot"]) + R mongodb-compass ]; + virtualisation.virtualbox.host.enable = true; + virtualisation.virtualbox.host.enableExtensionPack = true; + programs.nix-ld.enable = true; + programs.nix-ld.libraries = with pkgs; [ + zlib # numpy + libgcc # sqlalchemy + # that's where the shared libs go, you can find which one you need using + # nix-locate --top-level libstdc++.so.6 (replace this with your lib) + # ^ this requires `nix-index` pkg + ]; } diff --git a/system/modules/docker.nix b/system/modules/docker.nix index 39088f4..2d88281 100644 --- a/system/modules/docker.nix +++ b/system/modules/docker.nix @@ -1,8 +1,8 @@ { config, lib, pkgs, ... }: { virtualisation.docker.enable = true; - virtualisation.docker.rootless = { - enable = true; - setSocketVariable = true; - }; + #virtualisation.docker.rootless = { + # enable = true; + # setSocketVariable = true; + #}; } diff --git a/system/modules/entertainment.nix b/system/modules/entertainment.nix new file mode 100644 index 0000000..f8d5db8 --- /dev/null +++ b/system/modules/entertainment.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + environment.systemPackages = with pkgs; [ + spotify + ffmpeg + ]; +} diff --git a/system/modules/gaming.nix b/system/modules/gaming.nix new file mode 100644 index 0000000..de9bf65 --- /dev/null +++ b/system/modules/gaming.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: +{ + environment.systemPackages = with pkgs; [ + (lutris.override { + extraLibraries = pkgs: [ + # List library dependencies here + ]; + }) + wineWowPackages.stable # 32/64-bit Wine + winetricks + lutris + vulkan-tools # for testing Vulkan + libpulseaudio # often needed for audio in Wine games + protonup-qt + ]; + + + programs.steam.enable = true; +} diff --git a/system/modules/keyd.nix b/system/modules/keyd.nix index 241abbd..d254774 100644 --- a/system/modules/keyd.nix +++ b/system/modules/keyd.nix @@ -10,6 +10,7 @@ main = { capslock = "layer(capslayer)"; "'" = "G-'"; + rightcontrol = "rightcontrol"; }; otherlayer = {}; capslayer = { @@ -35,10 +36,10 @@ # Optional, but makes sure that when you type the make palm rejection work with keyd # https://github.com/rvaiya/keyd/issues/723 - environment.etc."libinput/local-overrides.quirks".text = '' - [Serial Keyboards] - MatchUdevType=keyboard - MatchName=keyd virtual keyboard - AttrKeyboardIntegration=internal - ''; + #environment.etc."libinput/local-overrides.quirks".text = '' + # [Serial Keyboards] + # MatchUdevType=keyboard + # MatchName=keyd virtual keyboard + # AttrKeyboardIntegration=internal + #''; } diff --git a/system/modules/latex.nix b/system/modules/latex.nix new file mode 100644 index 0000000..9c6e087 --- /dev/null +++ b/system/modules/latex.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + environment.systemPackages = with pkgs; [ + texlive.combined.scheme-full + biber + ]; +} diff --git a/system/modules/ml_dev.nix b/system/modules/ml_dev.nix new file mode 100644 index 0000000..6e17a31 --- /dev/null +++ b/system/modules/ml_dev.nix @@ -0,0 +1,23 @@ +{ config, pkgs, ... }: +{ + nix.settings = { + substituters = [ + "https://nix-community.cachix.org" + ]; + trusted-public-keys = [ + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + environment.systemPackages = with pkgs; [ + cudaPackages.cudatoolkit + cudaPackages.cudnn + ]; + hardware.nvidia-container-toolkit.enable = true; + environment.variables = { + CUDA_HOME = "${pkgs.cudaPackages.cudatoolkit}"; + CUDNN_PATH = "${pkgs.cudaPackages.cudnn}"; + }; + systemd.services.docker.serviceConfig = { + Environment = "DOCKER_CLI_EXPERIMENTAL=enabled"; + }; +} diff --git a/system/modules/mullvad.nix b/system/modules/mullvad.nix new file mode 100644 index 0000000..987efc9 --- /dev/null +++ b/system/modules/mullvad.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +let + mullvad-autostart = pkgs.makeAutostartItem { + name = "mullvad-vpn"; + package = pkgs.mullvad-vpn; + }; +in +{ + services.mullvad-vpn.enable = true; + services.mullvad-vpn.package = pkgs.mullvad-vpn; + environment.systemPackages = [ mullvad-autostart ]; +} diff --git a/system/modules/sway.nix b/system/modules/sway.nix index 2181c79..0ea62d7 100644 --- a/system/modules/sway.nix +++ b/system/modules/sway.nix @@ -14,14 +14,16 @@ wl-clipboard mako + libnotify ]; programs.dconf.enable = true; services.greetd = { enable = true; + vt = 2; # clean login screen, no startup logs settings = { default_session = { - command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway"; + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd 'sway --unsupported-gpu'"; user = "greeter"; }; }; diff --git a/system/pc/audio/pipewire.nix b/system/pc/audio/pipewire.nix index 91be448..5421a37 100644 --- a/system/pc/audio/pipewire.nix +++ b/system/pc/audio/pipewire.nix @@ -4,6 +4,7 @@ # Install tools environment.systemPackages = with pkgs; [ pavucontrol + playerctl ]; # Enable PipeWire and its PulseAudio compatibility layer diff --git a/user/common.nix b/user/common.nix new file mode 100644 index 0000000..5663782 --- /dev/null +++ b/user/common.nix @@ -0,0 +1,9 @@ +{ config, pkgs, system, ... }: + +{ + home.packages = with pkgs; [ + ]; + home.stateVersion = "25.05"; + +} + diff --git a/user/modules/alacritty.nix b/user/modules/alacritty.nix index 3fab37c..cf47f9c 100644 --- a/user/modules/alacritty.nix +++ b/user/modules/alacritty.nix @@ -4,17 +4,17 @@ enable = true; settings = { terminal.shell = { - program = "/bin/sh"; - args = [ - "-c" - '' - if command -v zellij >/dev/null 2>&1; then - exec zellij - else - exec "${SHELL:-/bin/bash}" - fi - '' - ]; + program = "${pkgs.fish}/bin/fish"; +# args = [ +# "-c" +# '' +# if command -v zellij >/dev/null 2>&1; then +# exec zellij +# else +# exec "${SHELL:-/bin/bash}" +# fi +# '' +# ]; }; }; }; diff --git a/user/modules/common.nix b/user/modules/common.nix deleted file mode 100644 index db8e55b..0000000 --- a/user/modules/common.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, pkgs, ... }: - -{ - home.packages = with pkgs; [ - ]; - home.stateVersion = "24.05"; -} - diff --git a/user/modules/dev.nix b/user/modules/dev.nix new file mode 100644 index 0000000..03db9f9 --- /dev/null +++ b/user/modules/dev.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: +{ + # pyenv setup + programs.pyenv = { + enable = true; + enableFishIntegration = true; + }; +} diff --git a/user/modules/dev_helpers.nix b/user/modules/dev_helpers.nix new file mode 100644 index 0000000..03d8035 --- /dev/null +++ b/user/modules/dev_helpers.nix @@ -0,0 +1,17 @@ +{ config, pkgs, ... }: + +let + devScript = pkgs.writeShellScriptBin "dev" '' + if [ -z "$1" ]; then + echo "Usage: dev " + exit 1 + fi + + nix develop ~/nixos/devshells/$1 + ''; +in +{ + home.packages = [ + devScript + ]; +} diff --git a/user/modules/gammastep.nix b/user/modules/gammastep.nix index 8632b4b..eeab822 100644 --- a/user/modules/gammastep.nix +++ b/user/modules/gammastep.nix @@ -6,7 +6,7 @@ provider = "geoclue2"; tray = true; temperature = { - night = 1700; + night = 2500; }; }; } diff --git a/user/modules/mako.nix b/user/modules/mako.nix new file mode 100644 index 0000000..da84c27 --- /dev/null +++ b/user/modules/mako.nix @@ -0,0 +1,29 @@ +{ pkgs, lib, ... }: +{ + services.mako = { + enable = true; + settings = { + actions = true; + sort = "-time"; + anchor = lib.mkDefault "top-right"; + background-color = "#000000"; + border-color = "#88c0d0"; + border-radius = 0; + default-timeout = 10000; + font = "monospace 20"; + height = 150; + width = 400; + icons = true; + ignore-timeout = false; + layer = "overlay"; + markup = true; + + # Section example + "urgency=high" = { + border-color = "fc0f0f"; + default-timeout = 0; + + }; + }; + }; +} diff --git a/user/modules/sway.nix b/user/modules/sway.nix index 9274acc..1466624 100644 --- a/user/modules/sway.nix +++ b/user/modules/sway.nix @@ -35,8 +35,16 @@ in terminal = "alacritty"; startup = [ { command = "blueman-applet";} + { command = "mullvad-vpn";} + { command = "swaymsg workspace 1";} + { command = "thunderbird";} + { command = "nextcloud";} + { command = "spotify";} + { command = "brave";} + { command = "alacritty";} ]; defaultWorkspace = "1"; + workspaceAutoBackAndForth = true; bars = []; fonts = { names = [ "MesloLGS NF" ]; @@ -144,18 +152,17 @@ in value = "workspace ${key}"; } { - name = "${mod}+Ctrl+${key}"; + name = "${mod}+Shift+${key}"; value = "move container to workspace ${key}"; } { - name = "${mod}+Shift+${key}"; + name = "${mod}+Ctrl+${key}"; value = "move container to workspace ${key}; workspace ${key}"; } - ]) (lib.range 0 8)); + ]) (lib.range 1 9)); assigns = { - "2: web" = [{ class = "^Brave$"; }]; - "9: mail" = [{ class = "Thunderbird"; }]; + "9: mail" = [{ app_id = "thunderbird"; }]; }; modes = { @@ -213,7 +220,7 @@ in }; }; extraConfig = '' - default_border pixel 1 + default_border pixel 2 floating_modifier ${mod} # === Floating Windows === @@ -224,8 +231,15 @@ in for_window [class="Blueman-manager"] floating enable border normal for_window [class="GParted"] floating enable border normal for_window [class="pavucontrol"] floating enable - for_window [class="Volume Control"] floating enable - for_window [class="(?i)VirtualBox"] floating enable border normal + for_window [title="Volume Control"] floating enable + for_window [class="Spotify"] move scratchpad + + # Float all windows with "VirtualBox" in the title + for_window [class=".*VirtualBox.*"] floating enable + # EXCEPT: unfloat those that also contain "Manager" or "Machine" + for_window [class=".*VirtualBox Manager.*"] floating disable + for_window [class=".*VirtualBox Machine"] floating disable + ''; }; } diff --git a/user/modules/waybar.nix b/user/modules/waybar.nix index 2eb3557..2f69d6d 100644 --- a/user/modules/waybar.nix +++ b/user/modules/waybar.nix @@ -1,6 +1,6 @@ { config, lib, pkgs, ... }: let - scriptDir = ./../../scripts/waybar; + scriptDir = ./../../resources/scripts/waybar; # Get all files in the scriptDir scriptFiles = builtins.filter (name: @@ -28,11 +28,11 @@ in { programs.waybar = { enable = true; systemd.enable = true; - settings = [{ + settings.main = lib.mkMerge [{ command = "waybar"; layer = "top"; - position = "top"; - "modules-left" = [ + position = lib.mkDefault "top"; + "modules-left" = lib.mkDefault [ "tray" #"custom/cpu_linux" "cpu" @@ -41,8 +41,8 @@ in { "disk" "custom/nvidia" ]; - "modules-center" = [ "sway/window" ]; - "modules-right" = [ + "modules-center" = lib.mkDefault [ "sway/window" ]; + "modules-right" = lib.mkDefault [ "group/blight" "custom/colorpicker" "idle_inhibitor" @@ -219,7 +219,7 @@ in { } window#waybar { - background: transparent; + background: black; } .modules-right { diff --git a/user/modules/zellij.nix b/user/modules/zellij.nix index 8d8e1c6..eb50fc4 100644 --- a/user/modules/zellij.nix +++ b/user/modules/zellij.nix @@ -2,7 +2,7 @@ { programs.zellij = { enable = true; - enableFishIntegration = true; + #enableFishIntegration = true; settings = { theme = "dracula"; copy_on_select = true; diff --git a/wl-copy b/wl-copy new file mode 100644 index 0000000..4ecdbe0 --- /dev/null +++ b/wl-copy @@ -0,0 +1,47 @@ +{ + description = "NixOS config with modules, host overrides, and Home Manager"; + + inputs = { + nixpkgs.url = "nixpkgs/nixos-25.05"; + nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + home-manager.url = "github:nix-community/home-manager/release-25.05"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + nix-alien.url = "github:thiagokokada/nix-alien"; + }; + + outputs = { self, nixpkgs, home-manager, nix-alien, ... }: { + nixosConfigurations = { + dev-vm = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = { + inherit home-manager; + }; + modules = [ + ./common.nix + ./hosts/dev-vm/default.nix + ]; + }; + alex-laptop = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = { + inherit home-manager; + }; + modules = [ + ./system/common.nix + ./hosts/alex-laptop/default.nix + ]; + }; + alex-desktop= nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = { + inherit home-manager; + inherit (self.inputs) nix-alien; + }; + modules = [ + ./system/common.nix + ./hosts/alex-desktop/default.nix + ]; + }; + }; + }; +}