diff --git a/flake.lock b/flake.lock index 909ccdc..aefdd3e 100644 --- a/flake.lock +++ b/flake.lock @@ -10,11 +10,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1747514353, - "narHash": "sha256-E1WjB+zvDw4x058mg3MIdK5j2huvnNpTEEt2brhg2H8=", + "lastModified": 1747575206, + "narHash": "sha256-NwmAFuDUO/PFcgaGGr4j3ozG9Pe5hZ/ogitWhY+D81k=", "owner": "ryantm", "repo": "agenix", - "rev": "6697e8babbd8f323dfd5e28f160a0128582c128b", + "rev": "4835b1dc898959d8547a871ef484930675cb47f1", "type": "github" }, "original": { @@ -67,6 +67,27 @@ "type": "github" } }, + "disko": { + "inputs": { + "nixpkgs": [ + "nixpkgs-stable" + ] + }, + "locked": { + "lastModified": 1736864502, + "narHash": "sha256-ItkIZyebGvNH2dK9jVGzJHGPtb6BSWLN8Gmef16NeY0=", + "owner": "nix-community", + "repo": "disko", + "rev": "0141aabed359f063de7413f80d906e1d98c0c123", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "v1.11.0", + "repo": "disko", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -111,16 +132,16 @@ ] }, "locked": { - "lastModified": 1747331121, - "narHash": "sha256-3MmiUN/jOHBHQUnjqzg6qKArc17j2OS6jisEppDY4g8=", + "lastModified": 1748665073, + "narHash": "sha256-RMhjnPKWtCoIIHiuR9QKD7xfsKb3agxzMfJY8V9MOew=", "owner": "nix-community", "repo": "home-manager", - "rev": "1eec32f0efe3b830927989767a9e6ece0d82d608", + "rev": "282e1e029cb6ab4811114fc85110613d72771dea", "type": "github" }, "original": { "owner": "nix-community", - "ref": "release-24.11", + "ref": "release-25.05", "repo": "home-manager", "type": "github" } @@ -132,11 +153,11 @@ ] }, "locked": { - "lastModified": 1747439237, - "narHash": "sha256-5rCGrnkglKKj4cav1U3HC+SIUNJh08pqOK4spQv9RjA=", + "lastModified": 1748830238, + "narHash": "sha256-EB+LzYHK0D5aqxZiYoPeoZoOzSAs8eqBDxm3R+6wMKU=", "owner": "nix-community", "repo": "home-manager", - "rev": "ae755329092c87369b9e9a1510a8cf1ce2b1c708", + "rev": "c7fdb7e90bff1a51b79c1eed458fb39e6649a82a", "type": "github" }, "original": { @@ -179,11 +200,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1747327360, - "narHash": "sha256-LSmTbiq/nqZR9B2t4MRnWG7cb0KVNU70dB7RT4+wYK4=", + "lastModified": 1748693115, + "narHash": "sha256-StSrWhklmDuXT93yc3GrTlb0cKSS0agTAxMGjLKAsY8=", "owner": "nixos", "repo": "nixpkgs", - "rev": "e06158e58f3adee28b139e9c2bcfcc41f8625b46", + "rev": "910796cabe436259a29a72e8d3f5e180fc6dfacc", "type": "github" }, "original": { @@ -195,16 +216,16 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1747335874, - "narHash": "sha256-IKKIXTSYJMmUtE+Kav5Rob8SgLPnfnq4Qu8LyT4gdqQ=", + "lastModified": 1748708770, + "narHash": "sha256-q8jG2HJWgooWa9H0iatZqBPF3bp0504e05MevFmnFLY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ba8b70ee098bc5654c459d6a95dfc498b91ff858", + "rev": "a59eb7800787c926045d51b70982ae285faa2346", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.11", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } @@ -213,6 +234,7 @@ "inputs": { "agenix": "agenix", "deploy-rs": "deploy-rs", + "disko": "disko", "home-manager": "home-manager_2", "home-manager-stable": "home-manager-stable", "impermanence": "impermanence", diff --git a/flake.nix b/flake.nix index 8fe5b99..b86c103 100644 --- a/flake.nix +++ b/flake.nix @@ -3,14 +3,19 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05"; home-manager = { url = "github:nix-community/home-manager/master"; inputs.nixpkgs.follows = "nixpkgs"; }; home-manager-stable = { - url = "github:nix-community/home-manager/release-24.11"; + url = "github:nix-community/home-manager/release-25.05"; + inputs.nixpkgs.follows = "nixpkgs-stable"; + }; + + disko = { + url = "github:nix-community/disko?ref=v1.11.0"; inputs.nixpkgs.follows = "nixpkgs-stable"; }; @@ -36,10 +41,11 @@ nixpkgs-stable, home-manager, home-manager-stable, + disko, agenix, deploy-rs, - impermanence, nix-flatpak, + impermanence, ... }: { @@ -62,6 +68,7 @@ defaultModules = [ ./hosts/${hostname}.nix agenix.nixosModules.default + disko.nixosModules.default hm.nixosModules.default impermanence.nixosModules.impermanence nix-flatpak.nixosModules.nix-flatpak @@ -79,7 +86,11 @@ } ]; serverModules = [ - self.nixosModules.qbittorrent + { + nixpkgs.overlays = [ + self.overlays.serverOverlay + ]; + } ]; typeModules = if type == "server" then serverModules else workstationModules; allModules = defaultModules ++ typeModules ++ extraModules; @@ -105,6 +116,12 @@ alexandria = mkHost { hostname = "alexandria"; type = "server"; + extraModules = [ self.nixosModules.qbittorrent ]; + }; + trantor = mkHost { + hostname = "trantor"; + type = "server"; + system = "aarch64-linux"; }; }; @@ -113,6 +130,9 @@ }; workstationOverlay = final: prev: { plasticity = nixpkgs.legacyPackages."x86_64-linux".callPackage ./packages/plasticity.nix { }; + toggleaudiosink = + nixpkgs.legacyPackages."x86_64-linux".callPackage ./packages/toggleaudiosink.nix + { }; }; serverOverlay = final: prev: { }; @@ -134,6 +154,18 @@ }; }; + trantor = { + hostname = "trantor"; + profiles = { + system = { + user = "root"; + sshUser = "root"; + remoteBuild = true; + path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.alexandria; + }; + }; + }; + io = { hostname = "io"; profiles = { diff --git a/hosts/modules/alexandria/default.nix b/hosts/modules/alexandria/default.nix index d33bd6d..2816fef 100644 --- a/hosts/modules/alexandria/default.nix +++ b/hosts/modules/alexandria/default.nix @@ -19,7 +19,7 @@ in ./jellyfin.nix ./librespeed.nix ./memos.nix - ./nextcloud.nix + # ./nextcloud.nix ./nginx.nix ./searx.nix ./services.nix diff --git a/hosts/modules/alexandria/networking.nix b/hosts/modules/alexandria/networking.nix index f518b12..722303c 100644 --- a/hosts/modules/alexandria/networking.nix +++ b/hosts/modules/alexandria/networking.nix @@ -9,7 +9,7 @@ 25565 # Minecraft ]; allowedUDPPorts = [ - 24454 # Minecraft Simple Voice Chat + 19132 # Minecraft Bedrock 25565 # Minecraft ]; }; diff --git a/hosts/modules/alexandria/nextcloud.nix b/hosts/modules/alexandria/nextcloud.nix index 04d7407..456f88c 100644 --- a/hosts/modules/alexandria/nextcloud.nix +++ b/hosts/modules/alexandria/nextcloud.nix @@ -9,7 +9,7 @@ services = { nextcloud = { enable = true; - package = pkgs.nextcloud30; + package = pkgs.nextcloud31; datadir = "/data/nextcloud"; hostName = "cloud.baduhai.dev"; configureRedis = true; diff --git a/hosts/modules/default.nix b/hosts/modules/default.nix index c877354..bc290b2 100644 --- a/hosts/modules/default.nix +++ b/hosts/modules/default.nix @@ -5,7 +5,6 @@ ./boot.nix ./console.nix ./desktop.nix - ./flatpak.nix ./impermanence.nix ./locale.nix ./networking.nix diff --git a/hosts/modules/desktop.nix b/hosts/modules/desktop.nix index 59502ee..2ac53c4 100644 --- a/hosts/modules/desktop.nix +++ b/hosts/modules/desktop.nix @@ -18,14 +18,6 @@ # Workstation specific configuration (lib.mkIf hostType.isWorkstation { services = { - displayManager.sddm = { - enable = true; - wayland = { - enable = true; - compositor = "kwin"; - }; - }; - desktopManager.plasma6.enable = true; pipewire = { enable = true; alsa.enable = true; @@ -34,9 +26,20 @@ jack.enable = true; wireplumber.enable = true; }; + greetd = { + enable = true; + settings.default_session.command = "${pkgs.greetd.tuigreet}/bin/tuigreet --remember --asterisks --time"; + }; }; - - # programs.hyprland.enable = true; + programs.niri.enable = true; + environment.systemPackages = with pkgs; [ + anyrun + foot + gsettings-desktop-schemas + swaybg + swww + xwayland-satellite + ]; hardware = { xpadneo.enable = true; @@ -52,7 +55,6 @@ enable = true; xdgOpenUsePortal = true; extraPortals = with pkgs; [ - kdePackages.xdg-desktop-portal-kde xdg-desktop-portal-gtk xdg-desktop-portal-gnome ]; diff --git a/hosts/modules/flatpak.nix b/hosts/modules/flatpak.nix deleted file mode 100644 index 39d57d9..0000000 --- a/hosts/modules/flatpak.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ - hostType, - lib, - ... -}: - -{ - config = lib.mkMerge [ - # Common configuration - { - } - - # Server specific configuration - (lib.mkIf hostType.isServer { - }) - - # Workstation specific configuration - (lib.mkIf hostType.isWorkstation { - services.flatpak = { - enable = true; - packages = [ - "com.github.k4zmu2a.spacecadetpinball" - "com.github.tchx84.Flatseal" - "com.steamgriddb.SGDBoop" - "app.zen_browser.zen" - "io.github.Foldex.AdwSteamGtk" - "io.itch.itch" - "org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08" - ]; - uninstallUnmanaged = true; - update.auto.enable = true; - }; - }) - ]; -} diff --git a/hosts/modules/impermanence.nix b/hosts/modules/impermanence.nix index 5ba5f6e..7c5c7d6 100644 --- a/hosts/modules/impermanence.nix +++ b/hosts/modules/impermanence.nix @@ -27,14 +27,12 @@ ]; directories = [ "/etc/NetworkManager/system-connections" - "/etc/waydroid-extra/images/" "/var/lib/bluetooth" "/var/lib/flatpak" "/var/lib/nixos" "/var/lib/systemd/coredump" "/var/lib/systemd/timers" "/var/lib/tailscale" - "/var/lib/waydroid" "/var/log" ]; }; diff --git a/hosts/modules/networking.nix b/hosts/modules/networking.nix index 63459d0..30dd7b5 100644 --- a/hosts/modules/networking.nix +++ b/hosts/modules/networking.nix @@ -18,7 +18,10 @@ enable = true; extraUpFlags = [ "--operator=user" ]; }; - openssh.enable = true; + openssh = { + enable = true; + settings.PermitRootLogin = "no"; + }; }; } diff --git a/hosts/modules/programs.nix b/hosts/modules/programs.nix index d364637..5253677 100644 --- a/hosts/modules/programs.nix +++ b/hosts/modules/programs.nix @@ -1,5 +1,6 @@ { hostType, + inputs, lib, pkgs, ... @@ -32,9 +33,10 @@ ls = "${pkgs.eza}/bin/eza --icons --group-directories-first"; neofetch = "fastfetch"; tree = "ls --tree"; - tsh = "ssh -o RequestTTY=yes $argv tmux -u -CC new -A -s tmux-main"; syscleanup = "sudo nix-collect-garbage -d; sudo /run/current-system/bin/switch-to-configuration boot"; }; + + services.flatpak.enable = lib.mkDefault false; } # Server specific configuration @@ -42,133 +44,121 @@ }) # Workstation specific configuration - (lib.mkIf hostType.isWorkstation ( - let - kdepkgs = with pkgs.kdePackages; [ - ark - dolphin-plugins - kolourpaint + (lib.mkIf hostType.isWorkstation ({ + environment.systemPackages = with pkgs; [ + ### Dev Tools ### + bat + deploy-rs + fd + fzf + nixfmt-rfc-style + nix-init + nix-output-monitor + ripgrep + ### Internet Browsers & Communication ### + beeper + brave + tor-browser + vesktop + ### Office & Productivity ### + aspell + aspellDicts.de + aspellDicts.en + aspellDicts.en-computers + aspellDicts.pt_BR + libreoffice-qt + obsidian + (octaveFull.withPackages (octavePackages: with octavePackages; [ signal ])) + onlyoffice-desktopeditors + rnote + ### Graphics & Design ### + gimp + inkscape + orca-slicer + plasticity + ### Gaming & Entertainment ### + clonehero + heroic + mangohud + prismlauncher + ### System Utilities ### + adwaita-icon-theme + junction + kara + kde-rounded-corners + libfido2 + morewaita-icon-theme + nautilus + mission-center + p7zip + qbittorrent + quickemu + quickgui + rustdesk + steam-run + toggleaudiosink + unrar + ### Media ### + mpv + obs-studio + qview + ]; + + programs = { + adb.enable = true; + steam = { + enable = true; + extraCompatPackages = [ pkgs.proton-ge-bin ]; + }; + dconf.enable = true; + nix-ld.enable = true; + kdeconnect.enable = true; + partition-manager.enable = true; + gamemode.enable = true; + appimage = { + enable = true; + binfmt = true; + }; + nh = { + enable = true; + flake = "/home/user/Projects/personal/nix-config"; + }; + }; + + fonts = { + fontDir.enable = true; + packages = with pkgs; [ + corefonts + inter + nerd-fonts.hack + noto-fonts-cjk-sans + roboto ]; - kwrite = pkgs.symlinkJoin { - name = "kwrite"; - paths = [ pkgs.kdePackages.kate ]; - postBuild = '' - rm -rf $out/bin/kate \ - $out/bin/.kate-wrapped \ - $out/share/applications/org.kde.kate.desktop \ - $out/share/man \ - $out/share/icons/hicolor/*/apps/kate.png \ - $out/share/icons/hicolor/scalable/apps/kate.svg \ - $out/share/appdata/org.kde.kate.appdata.xml - ''; - }; - in - { - environment.systemPackages = - with pkgs; - [ - ### Dev Tools ### - bat - deploy-rs - fd - fzf - nixfmt-rfc-style - nix-init - nix-output-monitor - ripgrep - ### Internet Browsers & Communication ### - beeper - brave - microsoft-edge - nextcloud-client - tor-browser - vesktop - ### Office & Productivity ### - aspell - aspellDicts.de - aspellDicts.en - aspellDicts.en-computers - aspellDicts.pt_BR - kwrite - libreoffice-qt - obsidian - (octaveFull.withPackages (octavePackages: with octavePackages; [ signal ])) - onlyoffice-desktopeditors - rnote - ### Graphics & Design ### - gimp - inkscape - orca-slicer - plasticity - ### Gaming & Entertainment ### - clonehero - heroic - mangohud - prismlauncher - protonup - ### System Utilities ### - adwaita-icon-theme - junction - kara - kde-rounded-corners - libfido2 - # lilipod BROKEN - mission-center - p7zip - qbittorrent - quickemu - quickgui - rustdesk - steam-run - unrar - ### Media ### - mpv - obs-studio - qview - ] - ++ kdepkgs; + }; - programs = { - adb.enable = true; - steam.enable = true; - dconf.enable = true; - nix-ld.enable = true; - kdeconnect.enable = true; - partition-manager.enable = true; - gamemode.enable = true; - appimage = { - enable = true; - binfmt = true; - }; - nh = { - enable = true; - flake = "/home/user/Projects/personal/nix-config"; - }; - }; - - fonts = { - fontDir.enable = true; - packages = with pkgs; [ - corefonts - inter - nerd-fonts.hack - noto-fonts-cjk-sans - roboto - ]; - }; - - environment.plasma6.excludePackages = ( - with pkgs.kdePackages; - [ - discover - elisa - gwenview - kate - khelpcenter - oxygen - ] - ); - } - )) + services.flatpak = { + enable = true; + packages = [ + ### Dev Tools ### + ### Internet Browsers & Communication ### + "app.zen_browser.zen" + ### Office & Productivity ### + ### Graphics & Design ### + "com.boxy_svg.BoxySVG" + ### Gaming & Entertainment ### + "com.github.k4zmu2a.spacecadetpinball" + "io.itch.itch" + "io.mrarm.mcpelauncher" + "org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08" + ### System Utilities ### + "com.github.tchx84.Flatseal" + "io.github.Foldex.AdwSteamGtk" + "com.steamgriddb.SGDBoop" + ### Media ### + ]; + uninstallUnmanaged = true; + update.auto.enable = true; + }; + })) ]; } diff --git a/hosts/modules/trantor/boot.nix b/hosts/modules/trantor/boot.nix new file mode 100644 index 0000000..35b8cb6 --- /dev/null +++ b/hosts/modules/trantor/boot.nix @@ -0,0 +1,9 @@ +{ ... }: + +{ + boot = { + loader.efi.efiSysMountPoint = "/boot"; + initrd.systemd.enable = true; + kernel.sysctl."net.ipv4.ip_forward" = 1; + }; +} diff --git a/hosts/modules/trantor/default.nix b/hosts/modules/trantor/default.nix new file mode 100644 index 0000000..9bdb292 --- /dev/null +++ b/hosts/modules/trantor/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./boot.nix + ./disko.nix + ./hardware-configuration.nix + ./networking.nix + ]; +} diff --git a/hosts/modules/trantor/disko.nix b/hosts/modules/trantor/disko.nix new file mode 100644 index 0000000..39599f4 --- /dev/null +++ b/hosts/modules/trantor/disko.nix @@ -0,0 +1,32 @@ +{ + disko.devices = { + disk = { + main = { + type = "disk"; + device = "/dev/sda"; + content = { + type = "gpt"; + partitions = { + boot = { + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + root = { + size = "100%"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + }; + }; + }; + }; + }; + }; + }; +} diff --git a/hosts/modules/trantor/hardware-configuration.nix b/hosts/modules/trantor/hardware-configuration.nix new file mode 100644 index 0000000..d5cc31f --- /dev/null +++ b/hosts/modules/trantor/hardware-configuration.nix @@ -0,0 +1,27 @@ +{ + lib, + modulesPath, + ... +}: + +{ + imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; + + boot = { + kernelModules = [ ]; + extraModulePackages = [ ]; + initrd = { + availableKernelModules = [ + "xhci_pci" + "virtio_pci" + "virtio_scsi" + "usbhid" + ]; + kernelModules = [ ]; + }; + }; + + networking.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux"; +} diff --git a/hosts/modules/trantor/networking.nix b/hosts/modules/trantor/networking.nix new file mode 100644 index 0000000..cb7b88a --- /dev/null +++ b/hosts/modules/trantor/networking.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + networking = { + firewall = { + allowedTCPPorts = [ 25566 ]; + allowedUDPPorts = [ 25566 ]; + }; + }; +} diff --git a/hosts/modules/users.nix b/hosts/modules/users.nix index 96f1ba5..e463781 100644 --- a/hosts/modules/users.nix +++ b/hosts/modules/users.nix @@ -20,17 +20,13 @@ "wheel" ]; openssh.authorizedKeys.keys = [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKcwF1yuWEfYGScNocEbs0AmGxyTIzGc4/IhpU587SJE" - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA1v3+q3EaruiiStWjubEJWvtejam/r41uoOpCdwJtLL" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA1v3+q3EaruiiStWjubEJWvtejam/r41uoOpCdwJtLL user@rotterdam" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3Y0PVpGfJHonqDS7qoCFhqzUvqGq9I9sax+F9e/5cs user@io" ]; hashedPassword = "$6$Pj7v/CpstyuWQQV0$cNujVDhfMBdwlGVEnnd8t71.kZPixbo0u25cd.874iaqLTH4V5fa1f98V5zGapjQCz5JyZmsR94xi00sUrntT0"; }; root = { shell = pkgs.fish; - openssh.authorizedKeys.keys = [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKcwF1yuWEfYGScNocEbs0AmGxyTIzGc4/IhpU587SJE" - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA1v3+q3EaruiiStWjubEJWvtejam/r41uoOpCdwJtLL" - ]; hashedPassword = "!"; }; }; diff --git a/hosts/modules/virtualisation.nix b/hosts/modules/virtualisation.nix index fb2c156..232459a 100644 --- a/hosts/modules/virtualisation.nix +++ b/hosts/modules/virtualisation.nix @@ -32,7 +32,6 @@ virtualisation = { libvirtd.enable = true; lxd.enable = true; - waydroid.enable = true; }; }) ]; diff --git a/hosts/trantor.nix b/hosts/trantor.nix new file mode 100644 index 0000000..4a02556 --- /dev/null +++ b/hosts/trantor.nix @@ -0,0 +1,13 @@ +{ ... }: + +{ + networking.hostName = "trantor"; + + imports = [ + ./modules/trantor + ./modules + ]; + + nix.nixPath = [ "nixos-config=${./trantor.nix}" ]; +} + diff --git a/packages/toggleaudiosink.nix b/packages/toggleaudiosink.nix new file mode 100644 index 0000000..623346f --- /dev/null +++ b/packages/toggleaudiosink.nix @@ -0,0 +1,48 @@ +{ + pkgs ? import { }, +}: + +pkgs.writeShellScriptBin "toggleaudiosink" '' + #!/usr/bin/env bash + + sound_server="pipewire" + + # Grab a count of how many audio sinks we have + sink_count=$(${pkgs.pulseaudio}/bin/pactl list sinks | grep -c "Sink #[[:digit:]]") + # Create an array of the actual sink IDs + sinks=() + mapfile -t sinks < <(${pkgs.pulseaudio}/bin/pactl list sinks | grep 'Sink #[[:digit:]]' | sed -n -e 's/.*Sink #\([[:digit:]]\)/\1/p') + # Get the ID of the active sink + active_sink_name=$(${pkgs.pulseaudio}/bin/pactl info | grep 'Default Sink:' | sed -n -e 's/.*Default Sink:[[:space:]]\+\(.*\)/\1/p') + active_sink=$(${pkgs.pulseaudio}/bin/pactl list sinks | grep -B 2 "$active_sink_name" | sed -n -e 's/Sink #\([[:digit:]]\)/\1/p' | head -n 1) + + # Get the ID of the last sink in the array + final_sink=''${sinks[$((sink_count - 1))]} + + # Find the index of the active sink + for index in "''${!sinks[@]}"; do + if [[ "''${sinks[$index]}" == "$active_sink" ]]; then + active_sink_index=$index + fi + done + + # Default to the first sink in the list + next_sink=''${sinks[0]} + next_sink_index=0 + + # If we're not at the end of the list, move up the list + if [[ $active_sink -ne $final_sink ]]; then + next_sink_index=$((active_sink_index + 1)) + next_sink=''${sinks[$next_sink_index]} + fi + + # Change the default sink + # Get the name of the next sink + next_sink_name=$(${pkgs.pulseaudio}/bin/pactl list sinks | grep -C 2 "Sink #$next_sink" | sed -n -e 's/.*Name:[[:space:]]\+\(.*\)/\1/p' | head -n 1) + ${pkgs.pulseaudio}/bin/pactl set-default-sink "$next_sink_name" + + # Move all inputs to the new sink + for app in $(${pkgs.pulseaudio}/bin/pactl list sink-inputs | sed -n -e 's/.*Sink Input #\([[:digit:]]\)/\1/p'); do + ${pkgs.pulseaudio}/bin/pactl "move-sink-input $app $next_sink" + done +'' diff --git a/readme.md b/readme.md index f19ab12..9daeedb 100644 --- a/readme.md +++ b/readme.md @@ -2,6 +2,7 @@ All my personal Nix and NixOS hosts, in a flake. |Host|Description|Nixpkgs version| |:---|:---:|---:| -|alexandria|Personal server/NAS|24.05| +|alexandria|Personal server/NAS|25.05| |io|Mobile workstation|unstable| |rotterdam|Workstation|unstable| +|trantor|VPS in Oracle Cloud|25.05| diff --git a/users/modules/programs.nix b/users/modules/programs.nix index 55e4488..6558ea2 100644 --- a/users/modules/programs.nix +++ b/users/modules/programs.nix @@ -19,7 +19,6 @@ programs = { bash = { enable = true; - historyFile = "~/.cache/bash_history"; }; helix = { diff --git a/users/modules/user/default.nix b/users/modules/user/default.nix index 173f040..660553d 100644 --- a/users/modules/user/default.nix +++ b/users/modules/user/default.nix @@ -2,7 +2,7 @@ { imports = [ - # ./hyprland.nix ./programs.nix + ./home.nix ]; } diff --git a/users/modules/user/home.nix b/users/modules/user/home.nix new file mode 100644 index 0000000..869d579 --- /dev/null +++ b/users/modules/user/home.nix @@ -0,0 +1,24 @@ +{ pkgs, ... }: + +{ + home.pointerCursor = { + package = pkgs.kdePackages.breeze; + name = "Breeze_Light"; + gtk.enable = true; + x11.enable = true; + }; + + gtk = { + enable = true; + iconTheme = { + package = pkgs.morewaita-icon-theme; + name = "MoreWaita"; + }; + gtk3.extraConfig = { + gtk-decoration-layout = "appmenu:"; + }; + gtk4.extraConfig = { + gtk-decoration-layout = "appmenu:"; + }; + }; +} diff --git a/users/modules/user/hyprland.nix b/users/modules/user/hyprland.nix deleted file mode 100644 index e895922..0000000 --- a/users/modules/user/hyprland.nix +++ /dev/null @@ -1,299 +0,0 @@ -{ - lib, - pkgs, - ... -}: - -let - heightfittr = pkgs.writeShellApplication { - name = "heightfittr"; - runtimeInputs = with pkgs; [ - socat - hyprland - ]; - text = '' - function handle { - case "$1" in - *openwindow*) - hyprctl dispatch scroller:fitheight all > /dev/null - ;; - *closewindow*) - hyprctl dispatch scroller:fitheight all > /dev/null - ;; - esac - } - socat - "UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | while read -r line; do - handle "$line" - done - ''; - }; - - scrollermodetoggle = pkgs.writeShellApplication { - name = "scrollermodetoggle"; - runtimeInputs = with pkgs; [ hyprland ]; - text = '' - if [ -f "$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/colmode" ]; then - rm "$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/colmode" - hyprctl --batch 'dispatch scroller:setmode row; notify 2 1000 0 "Row Mode"' - else - touch "$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/colmode" - hyprctl --batch 'dispatch scroller:setmode col; notify 2 1000 0 "Column Mode"' - fi - ''; - }; -in - -{ - wayland.windowManager.hyprland = { - enable = true; - plugins = with pkgs.hyprlandPlugins; [ hyprscroller ]; - extraConfig = '' - ################ - ### MONITORS ### - ################ - monitor=,preferred,auto,1 - - ################# - ### AUTOSTART ### - ################# - # exec-once = ${pkgs.gnome-settings-daemon}/libexec/gsd-rfkill - # exec-once = waybar - # exec-once = syshud - exec-once = ${lib.getExe heightfittr} - env = XCURSOR_SIZE,24 - env = HYPRCURSOR_SIZE,24 - - ##################### - ### LOOK AND FEEL ### - ##################### - general { - gaps_in = 5 - gaps_out = 20 - border_size = 2 - resize_on_border = true - allow_tearing = false - layout = scroller - } - misc { - font_family = Inter - } - plugin { - scroller { - column_default_width = onethird - focuswrap = false - column_widths = onethird onehalf twothirds - center_row_if_space_available = true - } - } - decoration { - rounding = 10 - rounding_power = 2 - dim_inactive = true - dim_strength = 0.3 - shadow { - enabled = true - range = 4 - render_power = 3 - } - blur { - enabled = true - size = 8 - passes = 1 - vibrancy = 0.1696 - } - layerrule = blur, waybar - layerrule = ignorealpha 0.5, waybar - layerrule = ignorezero, waybar - } - animations { - enabled = yes, please :) - bezier = easeOutQuint,0.23,1,0.32,1 - bezier = easeInOutCubic,0.65,0.05,0.36,1 - bezier = linear,0,0,1,1 - bezier = almostLinear,0.5,0.5,0.75,1.0 - bezier = quick,0.15,0,0.1,1 - animation = global, 1, 1, default - animation = border, 1, 1, easeOutQuint - animation = windows, 1, 1, easeOutQuint - animation = windowsIn, 1, 1, easeOutQuint, popin 87% - animation = windowsOut, 1, 1, linear, popin 87% - animation = fadeIn, 1, 1, almostLinear - animation = fadeOut, 1, 1, almostLinear - animation = fade, 1, 1, quick - animation = layers, 1, 1, easeOutQuint - animation = layersIn, 1, 1, easeOutQuint, fade - animation = layersOut, 1, 1, linear, fade - animation = fadeLayersIn, 1, 1, almostLinear - animation = fadeLayersOut, 1, 1, almostLinear - animation = workspaces, 1, 1, almostLinear, slidevert - } - misc { - force_default_wallpaper = 0 - disable_hyprland_logo = true - } - - ############# - ### INPUT ### - ############# - input { - kb_layout = us - kb_variant = altgr-intl - follow_mouse = 1 - sensitivity = 0 - accel_profile = flat - natural_scroll = true - touchpad { - natural_scroll = true - clickfinger_behavior = true - } - } - - ################### - ### KEYBINDINGS ### - ################### - $mainMod = SUPER - $terminal = ghostty - $menu = ulauncher-toggle - # APP SHORTCUTS - bind = ALT, SPACE, exec, $menu - bind = $mainMod, RETURN, exec, $terminal - # SESSION MANAGEMENT - bind = CTRL ALT, DELETE, exit, - bind = $mainMod, mouse_up, exec, hyprnome - bind = $mainMod, mouse_down, exec, hyprnome --previous - bind = CTRL ALT, j, exec, hyprnome - bind = CTRL ALT, k, exec, hyprnome --previous - bind = $mainMod CTRL ALT, j, exec, hyprnome --move - bind = $mainMod CTRL ALT, k, exec, hyprnome --move --previous - bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ - bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- - bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle - bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle - bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ - bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- - bindl = , XF86AudioNext, exec, playerctl next - bindl = , XF86AudioPause, exec, playerctl play-pause - bindl = , XF86AudioPlay, exec, playerctl play-pause - bindl = , XF86AudioPrev, exec, playerctl previous - bind = CTRL ALT SHIFT, a, exec, bash /home/user/.local/bin/toggle-audio-output.sh - # WINDOW MANAGEMENT - bind = ALT, F4, killactive, - bind = $mainMod, space, togglefloating, - bind = $mainMod, f, fullscreen - bindm = $mainMod, mouse:272, movewindow - bindm = $mainMod, mouse:273, resizewindow - bind = SUPER, h, movefocus, l - bind = SUPER, l, movefocus, r - bind = SUPER, k, movefocus, u - bind = SUPER, j, movefocus, d - bind = $mainMod CTRL, h, movewindow, l - bind = $mainMod CTRL, l, movewindow, r - bind = $mainMod CTRL, k, movewindow, u - bind = $mainMod CTRL, j, movewindow, d - bind = $mainMod, v, exec, ${lib.getExe scrollermodetoggle} - bind = $mainMod, r, scroller:cyclewidth, next - bind = $mainMod CTRL, r, scroller:cyclewidth, prev - bind = $mainMod, p, scroller:pin, - bind = $mainMod, c, scroller:alignwindow, center - bind = $mainMod CTRL, f, scroller:fitsize, all - - #################### - ### WINDOW RULES ### - #################### - windowrulev2 = suppressevent maximize, class:.* - windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 - # ulauncher - windowrule = float, ulauncher - windowrule = pin, ulauncher - windowrule = noborder, ulauncher - windowrule = noshadow, ulauncher - windowrule = nomaxsize, ulauncher - windowrule = noblur, ulauncher - windowrulev2 = animation slide top, class:^(ulauncher)$ - # browsers - windowrulev2 = plugin:scroller:columnwidth onehalf, class:(firefox) - windowrulev2 = plugin:scroller:columnwidth onehalf, class:(zen) - windowrulev2 = plugin:scroller:columnwidth onehalf, class:(brave) - ''; - }; - - services = { - # swaync = { - # enable = true; - # settings = { - # positionX = "left"; - # positionY = "top"; - # layer = "overlay"; - # control-center-layer = "top"; - # layer-shell = true; - # cssPriority = "application"; - # control-center-margin-top = 20; - # control-center-margin-bottom = 20; - # control-center-margin-right = 20; - # control-center-margin-left = 20; - # notification-2fa-action = true; - # notification-inline-replies = false; - # notification-icon-size = 64; - # notification-body-image-height = 100; - # notification-body-image-width = 200; - # timeout = 10; - # timeout-low = 5; - # timeout-critical = 0; - # fit-to-screen = true; - # relative-timestamps = true; - # control-center-width = 500; - # control-center-height = 600; - # notification-window-width = 500; - # keyboard-shortcuts = true; - # image-visibility = "when-available"; - # transition-time = 200; - # hide-on-clear = false; - # hide-on-action = true; - # script-fail-notify = true; - # widgets = [ - # "inhibitors" - # "title" - # "dnd" - # "notifications" - # "mpris" - # ]; - # widget-config = { - # inhibitors = { - # text = "Inhibitors"; - # button-text = "Clear All"; - # clear-all-button = true; - # }; - # title = { - # text = "Notifications"; - # clear-all-button = true; - # button-text = "Clear All"; - # }; - # dnd = { - # text = "Do Not Disturb"; - # }; - # mpris = { - # image-size = 96; - # image-radius = 12; - # }; - # }; - # }; - # }; - # clipman.enable = true; - }; - - # programs = { - # hyprlock.enable = true; - # }; - - home.packages = with pkgs; [ - brightnessctl - ghostty - hyprnome - playerctl - swaynotificationcenter - syshud - ulauncher - waybar - # inputs.mithril.packages.${pkgs.system}.mithril-control-center - ]; -} diff --git a/users/modules/user/programs.nix b/users/modules/user/programs.nix index 65985d8..9b25dbb 100644 --- a/users/modules/user/programs.nix +++ b/users/modules/user/programs.nix @@ -57,10 +57,13 @@ settings = { add_newline = false; format = '' - $directory$git_branch$git_status$nix_shell + $hostname$directory$git_branch$git_status$nix_shell [ ❯ ](bold green) ''; right_format = "$cmd_duration$character"; + hostname = { + ssh_symbol = " "; + }; character = { error_symbol = "[](red)"; success_symbol = "[󱐋](green)"; @@ -111,10 +114,6 @@ (lib.mkIf hostType.isWorkstation { fonts.fontconfig.enable = true; - # home.packages = with pkgs; [ - # ulauncher - # ]; - programs = { password-store.package = pkgs.pass-wayland; @@ -137,46 +136,6 @@ }; }; }; - - gtk = { - gtk3.extraConfig = { - gtk-decoration-layout = "appmenu:"; - }; - gtk4.extraConfig = { - gtk-decoration-layout = "appmenu:"; - }; - }; - - # systemd.user.services.ulauncher = { - # Unit = { - # Description = "Ulauncher Application Launcher"; - # After = [ "graphical-session.target" ]; - # }; - # Service = { - # Type = "simple"; - # Environment = - # let - # pydeps = pkgs.python3.withPackages ( - # pp: with pp; [ - # # dependencies for ulauncher-albert-calculate-anything - # parsedatetime - # pint - # pytz - # requests - # simpleeval - # ] - # ); - # in - # [ - # "PYTHONPATH=${pydeps}/${pydeps.sitePackages}" - # ]; - # ExecStart = pkgs.writeShellScript "ulauncher-env-wrapper.sh" '' - # export PATH="''${XDG_BIN_HOME}:$HOME/.nix-profile/bin:/etc/profiles/per-user/$USER/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin" - # export GDK_BACKEND=wayland - # exec ${pkgs.ulauncher}/bin/ulauncher --hide-window - # ''; - # }; - # }; }) ]; }