From 048c7fb888fb874ab5178ad64caeb066d31eca65 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 20:57:20 +0100 Subject: [PATCH 1/7] hyprland: Refactor to accommodate more DEs --- modules/home/de/hyprland/classic.nix | 51 +++++++++++++++++++ modules/home/de/hyprland/default.nix | 42 --------------- modules/home/programs/hyprland/default.nix | 12 +++++ .../{de => programs}/hyprland/keybinds.nix | 14 +---- .../{de => programs}/hyprland/settings.nix | 2 +- modules/home/services/cliphist.nix | 11 ++-- users/seb/home.nix | 3 ++ 7 files changed, 72 insertions(+), 63 deletions(-) create mode 100644 modules/home/de/hyprland/classic.nix delete mode 100644 modules/home/de/hyprland/default.nix create mode 100644 modules/home/programs/hyprland/default.nix rename modules/home/{de => programs}/hyprland/keybinds.nix (83%) rename modules/home/{de => programs}/hyprland/settings.nix (97%) diff --git a/modules/home/de/hyprland/classic.nix b/modules/home/de/hyprland/classic.nix new file mode 100644 index 0000000..43d1c62 --- /dev/null +++ b/modules/home/de/hyprland/classic.nix @@ -0,0 +1,51 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + options.custom.de.hyprland.classic.enable = lib.mkEnableOption ""; + + config = lib.mkIf config.custom.de.hyprland.classic.enable { + custom = { + programs = { + hyprland.enable = true; + rofi.enable = true; + hyprlock.enable = true; + }; + + services = { + wpaperd.enable = true; + hypridle.enable = true; + waybar.enable = true; + cliphist.enable = true; + }; + }; + + services.dunst.enable = true; + + home.packages = [ + pkgs.playerctl + pkgs.grimblast + ]; + + wayland.windowManager.hyprland.extraConfig = lib.mkBefore '' + # Variables + $play-pause = playerctl --ignore-player=firefox play-pause + $play-next = playerctl --ignore-player=firefox next + $play-previous = playerctl --ignore-player=firefox previous + $mute = wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + $volume-up = wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ + $volume-down = wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- + $mute-mic = wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle + + # Launch programs + bind = SUPER, R, exec, rofi -show drun + bind = SUPER, V, exec, rofi-clipboard + + # Manage session + bindrl = SUPER CONTROL, L, exec, loginctl lock-session + ''; + }; +} diff --git a/modules/home/de/hyprland/default.nix b/modules/home/de/hyprland/default.nix deleted file mode 100644 index 972ac3f..0000000 --- a/modules/home/de/hyprland/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ - config, - osConfig, - pkgs, - lib, - ... -}: -{ - options.custom.de.hyprland.enable = lib.mkEnableOption "" // { - default = osConfig.custom.de.hyprland.enable; - }; - - config = lib.mkIf config.custom.de.hyprland.enable { - wayland.windowManager.hyprland = { - enable = true; - package = null; - portalPackage = null; - }; - - home.packages = [ - pkgs.playerctl - pkgs.grimblast - ]; - - custom = { - services = { - wpaperd.enable = true; - hypridle.enable = true; - waybar.enable = true; - cliphist.enable = true; - }; - - programs = { - rofi.enable = true; - hyprlock.enable = true; - btop.enable = true; - }; - }; - - services.dunst.enable = true; - }; -} diff --git a/modules/home/programs/hyprland/default.nix b/modules/home/programs/hyprland/default.nix new file mode 100644 index 0000000..f0ad28a --- /dev/null +++ b/modules/home/programs/hyprland/default.nix @@ -0,0 +1,12 @@ +{ config, lib, ... }: +{ + options.custom.programs.hyprland.enable = lib.mkEnableOption ""; + + config = lib.mkIf config.custom.programs.hyprland.enable { + wayland.windowManager.hyprland = { + enable = true; + package = null; + portalPackage = null; + }; + }; +} diff --git a/modules/home/de/hyprland/keybinds.nix b/modules/home/programs/hyprland/keybinds.nix similarity index 83% rename from modules/home/de/hyprland/keybinds.nix rename to modules/home/programs/hyprland/keybinds.nix index e6bf1eb..26c5ba8 100644 --- a/modules/home/de/hyprland/keybinds.nix +++ b/modules/home/programs/hyprland/keybinds.nix @@ -1,30 +1,19 @@ { config, lib, ... }: { - config = lib.mkIf config.custom.de.hyprland.enable { + config = lib.mkIf config.custom.programs.hyprland.enable { wayland.windowManager.hyprland.extraConfig = '' # Bindflags: # r = release # e = repeat # l = locked - # Variables - $play-pause = playerctl --ignore-player=firefox play-pause - $play-next = playerctl --ignore-player=firefox next - $play-previous = playerctl --ignore-player=firefox previous - $mute = wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle - $volume-up = wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ - $volume-down = wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- - $mute-mic = wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle - # Essentials bind = SUPER SHIFT, C, killactive, bind = SUPER SHIFT, V, togglefloating, bind = SUPER SHIFT, F, fullscreen, 0 # Launch programs - bind = SUPER, R, exec, rofi -show drun bind = SUPER, RETURN, exec, kitty - bind = SUPER, V, exec, rofi-clipboard bind = SUPER, B, exec, firefox bind = SUPER, C, exec, code @@ -61,7 +50,6 @@ bindrl = SUPER CONTROL, R, exec, reboot bindrl = SUPER CONTROL, H, exec, systemctl hibernate bindrl = SUPER CONTROL, S, exec, systemctl sleep - bindrl = SUPER CONTROL, L, exec, loginctl lock-session bindrl = SUPER CONTROL, B, exec, sleep 1 && hyprctl dispatch dpms off # Control media diff --git a/modules/home/de/hyprland/settings.nix b/modules/home/programs/hyprland/settings.nix similarity index 97% rename from modules/home/de/hyprland/settings.nix rename to modules/home/programs/hyprland/settings.nix index cd2aca7..04fe2a7 100644 --- a/modules/home/de/hyprland/settings.nix +++ b/modules/home/programs/hyprland/settings.nix @@ -1,6 +1,6 @@ { config, lib, ... }: { - config = lib.mkIf config.custom.de.hyprland.enable { + config = lib.mkIf config.custom.programs.hyprland.enable { wayland.windowManager.hyprland.settings = { input = { kb_layout = "de"; diff --git a/modules/home/services/cliphist.nix b/modules/home/services/cliphist.nix index f12b310..9fc643a 100644 --- a/modules/home/services/cliphist.nix +++ b/modules/home/services/cliphist.nix @@ -8,11 +8,6 @@ options.custom.services.cliphist.enable = lib.mkEnableOption ""; config = lib.mkIf config.custom.services.cliphist.enable { - assertions = lib.singleton { - assertion = config.custom.programs.rofi.enable; - message = "Cliphist requires Rofi"; - }; - services.cliphist = { enable = true; extraOptions = [ ]; @@ -23,7 +18,9 @@ home.packages = [ pkgs.wl-clipboard - (pkgs.writeScriptBin "rofi-clipboard" "cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy") - ]; + ] + ++ lib.optional config.custom.programs.rofi.enable ( + pkgs.writeScriptBin "rofi-clipboard" "cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy" + ); }; } diff --git a/users/seb/home.nix b/users/seb/home.nix index 92a3b33..fd7d1dd 100644 --- a/users/seb/home.nix +++ b/users/seb/home.nix @@ -19,6 +19,8 @@ custom = { sops.enable = true; + de.hyprland.classic.enable = true; + programs = { shell = { zsh.enable = true; @@ -32,6 +34,7 @@ vscode.enable = true; firefox.enable = true; libreoffice.enable = true; + btop.enable = true; }; }; From 7cc0460181e27165cbde57730a22adfc8be52488 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 20:58:24 +0100 Subject: [PATCH 2/7] noctalia(-shell): Init modules --- flake.lock | 43 +++++++++++ flake.nix | 5 ++ modules/home/de/hyprland/noctalia.nix | 41 ++++++++++ modules/home/programs/noctalia-shell.nix | 96 ++++++++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 modules/home/de/hyprland/noctalia.nix create mode 100644 modules/home/programs/noctalia-shell.nix diff --git a/flake.lock b/flake.lock index 6b29af2..83139e9 100644 --- a/flake.lock +++ b/flake.lock @@ -290,6 +290,48 @@ "type": "github" } }, + "noctalia": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "noctalia-qs": "noctalia-qs" + }, + "locked": { + "lastModified": 1772659442, + "narHash": "sha256-F1oSoSwGvBiqtSfGU9YzsjL9sP6IQDYQeUIQbXma70U=", + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "rev": "c56fa106b7d8c6ae3034ce6d706bc35432ac9ea6", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-shell", + "type": "github" + } + }, + "noctalia-qs": { + "inputs": { + "nixpkgs": [ + "noctalia", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772227064, + "narHash": "sha256-f821ZSoGpa/aXrWq0gPpea9qBnX8KDyavGKkptz2Mog=", + "owner": "noctalia-dev", + "repo": "noctalia-qs", + "rev": "0741d27d2f7db567270f139c5d1684614ecf9863", + "type": "github" + }, + "original": { + "owner": "noctalia-dev", + "repo": "noctalia-qs", + "type": "github" + } + }, "radicale-birthday-calendar": { "flake": false, "locked": { @@ -320,6 +362,7 @@ "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs_2", "nixpkgs-unstable": "nixpkgs-unstable", + "noctalia": "noctalia", "radicale-birthday-calendar": "radicale-birthday-calendar", "sops": "sops", "statix": "statix", diff --git a/flake.nix b/flake.nix index f251142..c7a0fd7 100644 --- a/flake.nix +++ b/flake.nix @@ -37,6 +37,11 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + noctalia = { + url = "github:noctalia-dev/noctalia-shell"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + vscode-extensions = { url = "github:nix-community/nix-vscode-extensions"; inputs.nixpkgs.follows = "nixpkgs"; diff --git a/modules/home/de/hyprland/noctalia.nix b/modules/home/de/hyprland/noctalia.nix new file mode 100644 index 0000000..8614bcf --- /dev/null +++ b/modules/home/de/hyprland/noctalia.nix @@ -0,0 +1,41 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + options.custom.de.hyprland.noctalia.enable = lib.mkEnableOption ""; + + config = lib.mkIf config.custom.de.hyprland.noctalia.enable { + custom = { + programs = { + hyprland.enable = true; + noctalia-shell.enable = true; + }; + + services.cliphist.enable = true; + }; + + home.packages = [ pkgs.grimblast ]; + + wayland.windowManager.hyprland.extraConfig = lib.mkBefore '' + # Variables + $ipc = noctalia-shell ipc call + $play-pause = $ipc media playPause + $play-next = $ipc media next + $play-previous = $ipc media previous + $mute = $ipc volume muteOutput + $volume-up = $ipc volume increase + $volume-down = $ipc volume decrease + $mute-mic = $ipc volume muteInput + + # Launch programs + bind = SUPER, R, exec, $ipc launcher toggle + bind = SUPER, V, exec, $ipc launcher clipboard + + # Manage session + bindrl = SUPER CONTROL, L, exec, $ipc lockScreen lock + ''; + }; +} diff --git a/modules/home/programs/noctalia-shell.nix b/modules/home/programs/noctalia-shell.nix new file mode 100644 index 0000000..eec02ff --- /dev/null +++ b/modules/home/programs/noctalia-shell.nix @@ -0,0 +1,96 @@ +{ + config, + osConfig, + inputs, + lib, + ... +}: +{ + imports = [ inputs.noctalia.homeModules.default ]; + + options.custom.programs.noctalia-shell.enable = lib.mkEnableOption ""; + + config = lib.mkIf config.custom.programs.noctalia-shell.enable { + programs.noctalia-shell = { + enable = true; + systemd.enable = true; + settings = { + general = { + animationSpeed = 1.8; + enableShadows = false; + compactLockScreen = true; + autoStartAuth = true; + allowPasswordWithFprintd = true; + showSessionButtonsOnLockScreen = false; + avatarImage = "/home/seb/Pictures/face"; + telemetryEnabled = false; + }; + ui.boxBorderEnabled = true; + colorSchemes = { + darkMode = + { + dark = true; + light = false; + } + .${config.custom.theme}; + predefinedScheme = "GitHub Dark"; + }; + wallpaper = { + enabled = true; + directory = "/home/seb/Pictures/Wallpapers"; + transitionType = "fade"; + transitionDuration = 1000; + automationEnabled = true; + randomIntervalSec = 1800; + }; + bar = { + barType = "simple"; + position = "bottom"; + density = "default"; + fontScale = 1.2; + widgetSpacing = 10; + widgets = { + left = lib.singleton { + id = "Clock"; + formatHorizontal = "HH:mm ddd, d MMM"; + tooltipFormat = "yyyy-MM-dd HH:mm"; + }; + center = lib.singleton { + id = "Workspace"; + }; + right = [ + { id = "Tray"; } + { + id = "NotificationHistory"; + hideWhenZeroUnread = true; + } + { id = "Volume"; } + (lib.optionalAttrs osConfig.custom.networking.underlay.wireless.enable { id = "Network"; }) + (lib.optionalAttrs osConfig.custom.services.bluetooth.enable { id = "Bluetooth"; }) + (lib.optionalAttrs config.custom.programs.brightnessctl.enable { id = "Brightness"; }) + { + id = "Battery"; + displayMode = "icon-hover"; + } + ]; + }; + }; + dock.enabled = false; + appLauncher = { + overviewLayer = true; + showCategories = false; + enableSessionSearch = false; + enableSettingsSearch = false; + enableWindowsSearch = false; + enableClipboardHistory = true; + }; + location.name = "Darmstadt"; + sessionMenu = { + largeButtonsStyle = false; + countdownDuration = 3000; + }; + audio.mprisBlacklist = "firefox"; + }; + }; + }; +} From 3e0325cffa5ecd70b733987d1dbde91500a4bbfd Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 21:01:05 +0100 Subject: [PATCH 3/7] home: Switch to hyprland-noctalia --- users/seb/home.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/seb/home.nix b/users/seb/home.nix index fd7d1dd..dbfb930 100644 --- a/users/seb/home.nix +++ b/users/seb/home.nix @@ -19,7 +19,7 @@ custom = { sops.enable = true; - de.hyprland.classic.enable = true; + de.hyprland.noctalia.enable = true; programs = { shell = { From fd16dd8aa3e379db9ba6cdaf7b56462c145d9b36 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 21:18:28 +0100 Subject: [PATCH 4/7] noctalia-shell: Fine tune --- modules/home/programs/noctalia-shell.nix | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/home/programs/noctalia-shell.nix b/modules/home/programs/noctalia-shell.nix index eec02ff..345c50c 100644 --- a/modules/home/programs/noctalia-shell.nix +++ b/modules/home/programs/noctalia-shell.nix @@ -84,12 +84,22 @@ enableWindowsSearch = false; enableClipboardHistory = true; }; + osd.enabledTypes = [ + 0 + 1 + 2 + 3 + ]; location.name = "Darmstadt"; sessionMenu = { largeButtonsStyle = false; countdownDuration = 3000; }; audio.mprisBlacklist = "firefox"; + location = { + firstDayOfWeek = 1; + showWeekNumberInCalendar = true; + }; }; }; }; From 13d5b9c3f67de04474bc3baeb9dda2042a8ff735 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 21:23:16 +0100 Subject: [PATCH 5/7] ci: Cancel in progress workflows when pushing new commits --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b7cfd0..d580eec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,9 @@ on: workflow_dispatch: push: branches: [main] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: parse-flake: runs-on: ubuntu-latest From 5b0ddf5c54d8ad0dcd351319f7f1b6493b9016a6 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 21:25:23 +0100 Subject: [PATCH 6/7] vscode: Attempt theme fix --- modules/home/programs/vscode.nix | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/home/programs/vscode.nix b/modules/home/programs/vscode.nix index 50c8231..c54dddc 100644 --- a/modules/home/programs/vscode.nix +++ b/modules/home/programs/vscode.nix @@ -42,12 +42,6 @@ "extensions.autoCheckUpdates" = false; "editor.fontFamily" = "JetBrainsMono Nerd Font"; "workbench.iconTheme" = "material-icon-theme"; - "workbench.colorTheme" = - { - dark = "GitHub Dark"; - light = "GitHub Light"; - } - .${config.custom.theme}; "workbench.sideBar.location" = "right"; "workbench.editor.decorations.colors" = false; "editor.renderWhitespace" = "none"; @@ -68,6 +62,12 @@ "github.copilot.enable"."*" = false; "chat.fontSize" = 15; "chat.editor.fontSize" = 15; + "workbench.colorTheme" = + { + dark = "GitHub Dark"; + light = "GitHub Light"; + } + .${config.custom.theme}; } ); in From d0c8b770ac244ee1e660a79a0d9ab48f0e8cf5f0 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 5 Mar 2026 21:27:45 +0100 Subject: [PATCH 7/7] ci: Don't notify on cancel --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d580eec..03e23b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,7 +99,7 @@ jobs: -d "Commit \`${GITHUB_SHA::7}\` deployed successfully." \ https://ntfy.sh/splitleaf - name: Notify failure - if: needs.deploy.result != 'success' + if: needs.deploy.result == 'failure' run: | curl -s \ -H "Title: CI: Deploy failed" \