From 32caab0339b95882ecb61cdc0b1807b68bdf2191 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Fri, 6 Feb 2026 05:37:12 +0000 Subject: [PATCH 01/50] chore: update --- home-manager/packages/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/home-manager/packages/default.nix b/home-manager/packages/default.nix index 36c8b15a1..06a033a0c 100644 --- a/home-manager/packages/default.nix +++ b/home-manager/packages/default.nix @@ -119,6 +119,7 @@ with pkgs; _1password-gui chromium clickup + emote ffmpeg ghostty github-desktop From 98990d99bc81f4b7e796bd96e62101cf88ce05b9 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Fri, 6 Feb 2026 08:34:35 +0000 Subject: [PATCH 02/50] chore: update --- home-manager/packages/default.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/home-manager/packages/default.nix b/home-manager/packages/default.nix index 06a033a0c..3e0c56946 100644 --- a/home-manager/packages/default.nix +++ b/home-manager/packages/default.nix @@ -114,6 +114,7 @@ with pkgs; powertop tailscale trashy + xclip ] ++ lib.optionals (stdenv.isLinux && isDesktop) [ _1password-gui @@ -127,4 +128,5 @@ with pkgs; signal-desktop slack vlc + vscode ] From 8a70a458e958c2de0f6120c6f8890e9f5574e8fd Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Fri, 6 Feb 2026 09:00:47 +0000 Subject: [PATCH 03/50] feat(matic): add hyprland keyd agenix --- config/hyprland/default.nix | 7 +++ config/hyprland/hyprland.conf | 9 ++++ config/keyd/default.conf | 16 +++++++ config/keyd/default.nix | 13 ++++++ named-hosts/galactica/secrets.nix | 3 ++ named-hosts/matic/default.nix | 78 +++++++++++++++++++++++++------ named-hosts/matic/secrets.nix | 23 +++++++++ 7 files changed, 136 insertions(+), 13 deletions(-) create mode 100644 config/hyprland/default.nix create mode 100644 config/hyprland/hyprland.conf create mode 100644 config/keyd/default.conf create mode 100644 config/keyd/default.nix create mode 100644 named-hosts/matic/secrets.nix diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix new file mode 100644 index 000000000..162132b52 --- /dev/null +++ b/config/hyprland/default.nix @@ -0,0 +1,7 @@ +{ config, ... }: +{ + xdg.configFile."hypr/hyprland.conf" = { + source = ./hyprland.conf; + force = true; + }; +} diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf new file mode 100644 index 000000000..4b7eb4863 --- /dev/null +++ b/config/hyprland/hyprland.conf @@ -0,0 +1,9 @@ +$mod = SUPER + +exec-once = dbus-update-activation-environment --systemd --all +exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_RUNTIME_DIR HYPRLAND_INSTANCE_SIGNATURE XDG_SESSION_DESKTOP + +# Global hotkeys (Caps Lock / Framework key mapped to Super) +bind = $mod, T, exec, gtk-launch ghostty +bind = $mod, S, exec, gtk-launch slack +bind = $mod, G, exec, gtk-launch google-chrome diff --git a/config/keyd/default.conf b/config/keyd/default.conf new file mode 100644 index 000000000..840e59ee0 --- /dev/null +++ b/config/keyd/default.conf @@ -0,0 +1,16 @@ +[ids] +* + +[main] +# Caps Lock as Super (global hotkey modifier) +capslock = layer(meta) + +# Framework key (update key name with `keyd monitor` if needed) +prog1 = layer(meta) +f13 = layer(meta) + +# Right Shift double-tap -> Caps Lock (tap twice) +rightshift = overload(shift, oneshot(rshift)) + +[rshift] +rightshift = capslock diff --git a/config/keyd/default.nix b/config/keyd/default.nix new file mode 100644 index 000000000..f6b3cf182 --- /dev/null +++ b/config/keyd/default.nix @@ -0,0 +1,13 @@ +{ ... }: +{ + services.keyd.enable = true; + + # Optional: silence the setgid warning (nice to have, not required for functionality) + users.groups.keyd = { }; + systemd.services.keyd.serviceConfig = { + CapabilityBoundingSet = [ "CAP_SETGID" ]; + AmbientCapabilities = [ "CAP_SETGID" ]; + }; + + environment.etc."keyd/default.conf".source = ./default.conf; +} diff --git a/named-hosts/galactica/secrets.nix b/named-hosts/galactica/secrets.nix index 790302c11..5297ec165 100644 --- a/named-hosts/galactica/secrets.nix +++ b/named-hosts/galactica/secrets.nix @@ -3,10 +3,13 @@ let galactica = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEKze2jlpV7SyTKA2ezqbumpCiDn+5Sj4z5SxrqfzesX shunkakinoki@gmail.com"; # Kyber's SSH public key kyber = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO0IZtP3KSzY6GVSZ+R+VQYYfu3sEOVaQGDblQxAtwNM ubuntu@kyber"; + # Matic's SSH public key + matic = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIQqWYSDaaoazVNOrAimCpUxNgaLe9Von237zIoox3E5 skakinoki@matic"; # All machines that can decrypt shared secrets allMachines = [ galactica kyber + matic ]; in { diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index f45df9f6b..4aeb411dd 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -33,6 +33,9 @@ inputs.nixpkgs.lib.nixosSystem { # Kolide launcher ./kolide.nix + # Keyd configuration + ../../config/keyd + # Base system configuration ( { config, lib, ... }: @@ -89,10 +92,27 @@ inputs.nixpkgs.lib.nixosSystem { # Power management services.power-profiles-daemon.enable = true; - # Desktop environment (GNOME) + # Desktop environment (Hyprland) services.xserver.enable = true; services.displayManager.gdm.enable = true; - services.desktopManager.gnome.enable = true; + services.displayManager.defaultSession = "hyprland"; + services.desktopManager.gnome.enable = false; + + programs.hyprland = { + enable = true; + xwayland.enable = true; + withUWSM = true; + }; + + programs.dconf.enable = true; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-hyprland + xdg-desktop-portal-gtk + ]; + }; # WiFi MT7925e fix (disable ASPM) boot.extraModprobeConfig = '' @@ -193,18 +213,50 @@ inputs.nixpkgs.lib.nixosSystem { }; home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; - home-manager.users.${username} = import ../../home-manager { - inherit username; - # Override host detection for matic (isDesktop = true) - inputs = inputs // { - host = (import ../../lib/host.nix) // { - isDesktop = true; - }; + home-manager.users.${username} = + { config, lib, ... }: + { + imports = [ + (import ../../home-manager { + inherit username; + # Override host detection for matic (isDesktop = true) + inputs = inputs // { + host = (import ../../lib/host.nix) // { + isDesktop = true; + }; + }; + lib = inputs.nixpkgs.lib; + pkgs = pkgs; + config = { }; + }) + ../../config/hyprland + ]; + + # Agenix configuration for GitHub SSH key + age.identityPaths = [ "/home/${username}/.ssh/id_ed25519" ]; + age.secrets = builtins.mapAttrs ( + name: value: + { + file = value.file; + } + // ( + if name == "keys/id_github.age" then + { + # Deploy GitHub SSH key to ~/.ssh/ with correct permissions + path = "/home/${username}/.ssh/id_ed25519_github"; + mode = "0600"; + } + else + { } + ) + ) (import ./secrets.nix); + + # Ensure SSH directory exists before agenix tries to deploy secrets + home.activation.ensureSshDirectory = config.lib.dag.entryBefore [ "writeBoundary" ] '' + $DRY_RUN_CMD mkdir -p $VERBOSE_ARG ${config.home.homeDirectory}/.ssh + $DRY_RUN_CMD chmod $VERBOSE_ARG 700 ${config.home.homeDirectory}/.ssh + ''; }; - lib = inputs.nixpkgs.lib; - pkgs = pkgs; - config = { }; - }; } ] ++ (if falconDebExists then [ ./falcon.nix ] else [ ]); # CrowdStrike Falcon (only if .deb exists) diff --git a/named-hosts/matic/secrets.nix b/named-hosts/matic/secrets.nix new file mode 100644 index 000000000..9cd09f508 --- /dev/null +++ b/named-hosts/matic/secrets.nix @@ -0,0 +1,23 @@ +# Matic secrets - managed by agenix +# To add a new secret: +# 1. Add the secret definition here +# 2. Run: make encrypt-key-matic KEY_FILE=/path/to/secret +let + # Galactica's SSH public key + galactica = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEKze2jlpV7SyTKA2ezqbumpCiDn+5Sj4z5SxrqfzesX shunkakinoki@gmail.com"; + # Matic's SSH public key + matic = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIQqWYSDaaoazVNOrAimCpUxNgaLe9Von237zIoox3E5 skakinoki@matic"; + # All machines that can decrypt shared secrets + allMachines = [ + galactica + matic + ]; +in +{ + # Shared SSH key for GitHub authentication (synced from galactica) + # This is the id_github key from galactica, which is the GitHub-authorized key + "keys/id_github.age" = { + file = ../galactica/keys/id_ed25519.age; + publicKeys = allMachines; + }; +} From 7e5d92f07794355058e4dd45c4281ff394ccac7b Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Fri, 6 Feb 2026 23:36:52 +0900 Subject: [PATCH 04/50] chore: update --- config/codex/config.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/codex/config.toml b/config/codex/config.toml index 6b436a083..5d982d044 100644 --- a/config/codex/config.toml +++ b/config/codex/config.toml @@ -7,6 +7,8 @@ notify = [ suppress_unstable_features_warning = true web_search = "cached" +model = "gpt-5.3-codex" +model_reasoning_effort = "medium" [features] ghost_commit = false From eda686856378579b0784309490c10764062ecd5d Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:27:15 +0900 Subject: [PATCH 05/50] feat: enhance Hyprland configuration with new components and styles --- config/default.nix | 17 ++ config/gtk/default.nix | 35 ++++ config/hyprland/default.nix | 8 + config/hyprland/hypridle.conf | 31 ++++ config/hyprland/hyprland.conf | 268 +++++++++++++++++++++++++++++- config/hyprland/hyprlock.conf | 38 +++++ config/keyd/default.conf | 19 ++- config/swaync/config.json | 34 ++++ config/swaync/default.nix | 11 ++ config/swaync/style.css | 119 +++++++++++++ config/waybar/config.jsonc | 113 +++++++++++++ config/waybar/default.nix | 11 ++ config/waybar/style.css | 133 +++++++++++++++ config/wlogout/default.nix | 11 ++ config/wlogout/layout | 30 ++++ config/wlogout/style.css | 49 ++++++ config/wofi/config | 15 ++ config/wofi/default.nix | 11 ++ config/wofi/style.css | 58 +++++++ home-manager/default.nix | 2 +- home-manager/packages/default.nix | 17 ++ named-hosts/matic/default.nix | 21 ++- 22 files changed, 1043 insertions(+), 8 deletions(-) create mode 100644 config/gtk/default.nix create mode 100644 config/hyprland/hypridle.conf create mode 100644 config/hyprland/hyprlock.conf create mode 100644 config/swaync/config.json create mode 100644 config/swaync/default.nix create mode 100644 config/swaync/style.css create mode 100644 config/waybar/config.jsonc create mode 100644 config/waybar/default.nix create mode 100644 config/waybar/style.css create mode 100644 config/wlogout/default.nix create mode 100644 config/wlogout/layout create mode 100644 config/wlogout/style.css create mode 100644 config/wofi/config create mode 100644 config/wofi/default.nix create mode 100644 config/wofi/style.css diff --git a/config/default.nix b/config/default.nix index 093ad5335..131aca6f2 100644 --- a/config/default.nix +++ b/config/default.nix @@ -1,3 +1,7 @@ +{ inputs }: +let + inherit (inputs.host) isDesktop; +in [ ./aichat ./amp @@ -23,3 +27,16 @@ ./starship ./zellij ] +++ ( + if isDesktop then + [ + ./gtk + ./hyprland + ./swaync + ./waybar + ./wlogout + ./wofi + ] + else + [ ] +) diff --git a/config/gtk/default.nix b/config/gtk/default.nix new file mode 100644 index 000000000..e0aac758a --- /dev/null +++ b/config/gtk/default.nix @@ -0,0 +1,35 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + gtk = lib.mkIf pkgs.stdenv.isLinux { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + iconTheme = { + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + }; + cursorTheme = { + name = "Adwaita"; + size = 24; + }; + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; + + dconf.settings = lib.mkIf pkgs.stdenv.isLinux { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; +} diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index 162132b52..2e84003a9 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -4,4 +4,12 @@ source = ./hyprland.conf; force = true; }; + xdg.configFile."hypr/hypridle.conf" = { + source = ./hypridle.conf; + force = true; + }; + xdg.configFile."hypr/hyprlock.conf" = { + source = ./hyprlock.conf; + force = true; + }; } diff --git a/config/hyprland/hypridle.conf b/config/hyprland/hypridle.conf new file mode 100644 index 000000000..9298810d8 --- /dev/null +++ b/config/hyprland/hypridle.conf @@ -0,0 +1,31 @@ +general { + lock_cmd = pidof hyprlock || hyprlock + before_sleep_cmd = loginctl lock-session + after_sleep_cmd = hyprctl dispatch dpms on +} + +# Dim screen after 2.5 minutes +listener { + timeout = 150 + on-timeout = brightnessctl -s set 10 + on-resume = brightnessctl -r +} + +# Lock screen after 5 minutes +listener { + timeout = 300 + on-timeout = loginctl lock-session +} + +# Turn off display after 5.5 minutes +listener { + timeout = 330 + on-timeout = hyprctl dispatch dpms off + on-resume = hyprctl dispatch dpms on +} + +# Suspend after 30 minutes +listener { + timeout = 1800 + on-timeout = systemctl suspend +} diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 4b7eb4863..f5fbc19a9 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -1,9 +1,273 @@ +# ============================================================================= +# Dracula Colors +# ============================================================================= +$background = rgb(282a36) +$currentline = rgb(44475a) +$foreground = rgb(f8f8f2) +$comment = rgb(6272a4) +$cyan = rgb(8be9fd) +$green = rgb(50fa7b) +$orange = rgb(ffb86c) +$pink = rgb(ff79c6) +$purple = rgb(bd93f9) +$red = rgb(ff5555) +$yellow = rgb(f1fa8c) + +# ============================================================================= +# Variables +# ============================================================================= $mod = SUPER +# ============================================================================= +# Environment +# ============================================================================= +env = XCURSOR_THEME,Adwaita +env = XCURSOR_SIZE,24 +env = GTK_THEME,Adwaita:dark + +# ============================================================================= +# Startup +# ============================================================================= exec-once = dbus-update-activation-environment --systemd --all exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_RUNTIME_DIR HYPRLAND_INSTANCE_SIGNATURE XDG_SESSION_DESKTOP -# Global hotkeys (Caps Lock / Framework key mapped to Super) +# Status bar +exec-once = waybar + +# Notification daemon +exec-once = swaync + +# Clipboard history +exec-once = wl-paste --type text --watch cliphist store +exec-once = wl-paste --type image --watch cliphist store + +# Idle management +exec-once = hypridle + +# Volume/brightness OSD +exec-once = rm -f /tmp/wobpipe && mkfifo /tmp/wobpipe && tail -f /tmp/wobpipe | wob + +# ============================================================================= +# Monitor (Framework 13" 2256x1504) +# ============================================================================= +monitor = , preferred, auto, 1.5 + +# ============================================================================= +# Input +# ============================================================================= +input { + kb_layout = us + follow_mouse = 1 + sensitivity = 0 + + touchpad { + natural_scroll = true + tap-to-click = true + drag_lock = true + } +} + +gestures { + workspace_swipe = true + workspace_swipe_fingers = 3 +} + +# ============================================================================= +# General +# ============================================================================= +general { + gaps_in = 4 + gaps_out = 8 + border_size = 3 + col.active_border = $purple $pink 45deg + col.inactive_border = $currentline + layout = dwindle + allow_tearing = false + resize_on_border = true +} + +dwindle { + pseudotile = true + preserve_split = true +} + +# ============================================================================= +# Decoration +# ============================================================================= +decoration { + rounding = 8 + + blur { + enabled = true + size = 5 + passes = 3 + new_optimizations = true + xray = true + } + + shadow { + enabled = true + range = 15 + render_power = 3 + color = $background + } +} + +# ============================================================================= +# Animations +# ============================================================================= +animations { + enabled = true + + bezier = wind, 0.05, 0.9, 0.1, 1.05 + bezier = winIn, 0.1, 1.1, 0.1, 1.1 + bezier = winOut, 0.3, -0.3, 0, 1 + bezier = liner, 1, 1, 1, 1 + + animation = windows, 1, 6, wind, slide + animation = windowsIn, 1, 6, winIn, slide + animation = windowsOut, 1, 5, winOut, slide + animation = windowsMove, 1, 5, wind, slide + animation = border, 1, 1, liner + animation = borderangle, 1, 30, liner, loop + animation = fade, 1, 10, default + animation = workspaces, 1, 5, wind +} + +# ============================================================================= +# Misc +# ============================================================================= +misc { + disable_hyprland_logo = true + disable_splash_rendering = true + force_default_wallpaper = 0 +} + +# ============================================================================= +# Window Rules +# ============================================================================= +windowrulev2 = float, class:^(wofi)$ +windowrulev2 = stayfocused, class:^(wofi)$ +windowrulev2 = float, class:^(1Password)$ +windowrulev2 = float, title:^(Picture-in-Picture)$ +windowrulev2 = pin, title:^(Picture-in-Picture)$ + +# Notification center blur +layerrule = blur, swaync-control-center +layerrule = blur, swaync-notification-window +layerrule = ignorezero, swaync-control-center +layerrule = ignorezero, swaync-notification-window + +# Prevent wofi animation +layerrule = noanim, ^(wofi)$ + +# ============================================================================= +# App Launch Hotkeys (Super + letter) +# ============================================================================= bind = $mod, T, exec, gtk-launch ghostty -bind = $mod, S, exec, gtk-launch slack bind = $mod, G, exec, gtk-launch google-chrome +bind = $mod, S, exec, gtk-launch slack +bind = $mod, C, exec, gtk-launch cursor +bind = $mod, P, exec, gtk-launch 1password +bind = $mod, M, exec, gtk-launch signal-desktop +bind = $mod, N, exec, ghostty -e yazi + +# ============================================================================= +# Launcher & Clipboard +# ============================================================================= +bind = $mod, D, exec, wofi --show drun +bind = $mod, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy + +# ============================================================================= +# Window Management +# ============================================================================= +bind = $mod, Q, killactive, +bind = $mod, F, togglefloating, +bind = $mod SHIFT, F, fullscreen, +bind = $mod SHIFT, Q, exec, wlogout + +# Focus (vim keys) +bind = $mod, H, movefocus, l +bind = $mod, L, movefocus, r +bind = $mod, K, movefocus, u +bind = $mod, J, movefocus, d + +# Focus (arrow keys) +bind = $mod, left, movefocus, l +bind = $mod, right, movefocus, r +bind = $mod, up, movefocus, u +bind = $mod, down, movefocus, d + +# Move windows (vim keys) +bind = $mod SHIFT, H, movewindow, l +bind = $mod SHIFT, L, movewindow, r +bind = $mod SHIFT, K, movewindow, u +bind = $mod SHIFT, J, movewindow, d + +# Move windows (arrow keys) +bind = $mod SHIFT, left, movewindow, l +bind = $mod SHIFT, right, movewindow, r +bind = $mod SHIFT, up, movewindow, u +bind = $mod SHIFT, down, movewindow, d + +# Resize windows +binde = $mod CTRL, left, resizeactive, -20 0 +binde = $mod CTRL, right, resizeactive, 20 0 +binde = $mod CTRL, up, resizeactive, 0 -20 +binde = $mod CTRL, down, resizeactive, 0 20 + +# ============================================================================= +# Workspaces +# ============================================================================= +bind = $mod, 1, workspace, 1 +bind = $mod, 2, workspace, 2 +bind = $mod, 3, workspace, 3 +bind = $mod, 4, workspace, 4 +bind = $mod, 5, workspace, 5 +bind = $mod, 6, workspace, 6 +bind = $mod, 7, workspace, 7 +bind = $mod, 8, workspace, 8 +bind = $mod, 9, workspace, 9 + +bind = $mod SHIFT, 1, movetoworkspace, 1 +bind = $mod SHIFT, 2, movetoworkspace, 2 +bind = $mod SHIFT, 3, movetoworkspace, 3 +bind = $mod SHIFT, 4, movetoworkspace, 4 +bind = $mod SHIFT, 5, movetoworkspace, 5 +bind = $mod SHIFT, 6, movetoworkspace, 6 +bind = $mod SHIFT, 7, movetoworkspace, 7 +bind = $mod SHIFT, 8, movetoworkspace, 8 +bind = $mod SHIFT, 9, movetoworkspace, 9 + +# Scroll through workspaces +bind = $mod, mouse_down, workspace, e+1 +bind = $mod, mouse_up, workspace, e-1 + +# Mouse window management +bindm = $mod, mouse:272, movewindow +bindm = $mod, mouse:273, resizewindow + +# ============================================================================= +# Screenshot +# ============================================================================= +bind = $mod SHIFT, S, exec, grim -g "$(slurp)" - | swappy -f - +bind = , Print, exec, grim -g "$(slurp)" - | swappy -f - + +# ============================================================================= +# Media / Hardware Keys +# ============================================================================= +bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print int($2*100)}' > /tmp/wobpipe +bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print int($2*100)}' > /tmp/wobpipe +bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = , XF86MonBrightnessUp, exec, brightnessctl set 5%+ && brightnessctl -m | awk -F, '{print substr($4,0,length($4)-1)}' > /tmp/wobpipe +bindel = , XF86MonBrightnessDown, exec, brightnessctl set 5%- && brightnessctl -m | awk -F, '{print substr($4,0,length($4)-1)}' > /tmp/wobpipe + +# ============================================================================= +# Lock Screen +# ============================================================================= +bind = $mod CTRL, L, exec, hyprlock + +# ============================================================================= +# Notification Toggle +# ============================================================================= +bind = $mod SHIFT, D, exec, swaync-client -t -sw diff --git a/config/hyprland/hyprlock.conf b/config/hyprland/hyprlock.conf new file mode 100644 index 000000000..9edc57e7c --- /dev/null +++ b/config/hyprland/hyprlock.conf @@ -0,0 +1,38 @@ +background { + monitor = + path = screenshot + blur_passes = 3 + blur_size = 8 + contrast = 0.8 + brightness = 0.7 + vibrancy = 0.17 +} + +input-field { + monitor = + size = 250, 50 + outline_thickness = 3 + dots_size = 0.26 + dots_spacing = 0.15 + dots_center = true + outer_color = rgb(bd93f9) + inner_color = rgb(282a36) + font_color = rgb(f8f8f2) + fade_on_empty = true + placeholder_text = Password... + hide_input = false + position = 0, -20 + halign = center + valign = center +} + +label { + monitor = + text = $TIME + color = rgb(f8f8f2) + font_size = 64 + font_family = JetBrainsMono Nerd Font + position = 0, 80 + halign = center + valign = center +} diff --git a/config/keyd/default.conf b/config/keyd/default.conf index 840e59ee0..9fa65a94c 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -2,15 +2,26 @@ * [main] -# Caps Lock as Super (global hotkey modifier) +# Caps Lock = pure Super (for Hyprland hotkeys) capslock = layer(meta) -# Framework key (update key name with `keyd monitor` if needed) -prog1 = layer(meta) -f13 = layer(meta) +# Right Alt = pure Super (right-hand mirror of Caps Lock) +rightalt = layer(meta) + +# Framework key = macOS-style Command (copy/paste/undo) +prog1 = layer(cmd_mac) +f13 = layer(cmd_mac) # Right Shift double-tap -> Caps Lock (tap twice) rightshift = overload(shift, oneshot(rshift)) [rshift] rightshift = capslock + +[cmd_mac] +# macOS-style shortcuts via Ctrl +c = C-c +v = C-v +x = C-x +z = C-z +a = C-a diff --git a/config/swaync/config.json b/config/swaync/config.json new file mode 100644 index 000000000..d9d6b1c26 --- /dev/null +++ b/config/swaync/config.json @@ -0,0 +1,34 @@ +{ + "$schema": "/etc/xdg/swaync/configSchema.json", + "positionX": "right", + "positionY": "top", + "layer": "overlay", + "control-center-width": 420, + "control-center-height": 600, + "notification-window-width": 380, + "notification-icon-size": 48, + "notification-body-image-height": 100, + "notification-body-image-width": 200, + "timeout": 5, + "timeout-low": 3, + "timeout-critical": 0, + "fit-to-screen": true, + "relative-timestamps": true, + "hide-on-action": true, + "hide-on-clear": true, + "widgets": [ + "title", + "dnd", + "notifications" + ], + "widget-config": { + "title": { + "text": "Notifications", + "clear-all-button": true, + "button-text": "Clear" + }, + "dnd": { + "text": "Do Not Disturb" + } + } +} diff --git a/config/swaync/default.nix b/config/swaync/default.nix new file mode 100644 index 000000000..0bf0a28d0 --- /dev/null +++ b/config/swaync/default.nix @@ -0,0 +1,11 @@ +{ config, ... }: +{ + xdg.configFile."swaync/config.json" = { + source = ./config.json; + force = true; + }; + xdg.configFile."swaync/style.css" = { + source = ./style.css; + force = true; + }; +} diff --git a/config/swaync/style.css b/config/swaync/style.css new file mode 100644 index 000000000..9e09f66bb --- /dev/null +++ b/config/swaync/style.css @@ -0,0 +1,119 @@ +.notification-row { + outline: none; +} + +.notification-row:focus, +.notification-row:hover { + background: #44475a; +} + +.notification { + border-radius: 12px; + margin: 4px 8px; + padding: 0; + border: 2px solid #44475a; + background: #282a36; +} + +.notification-content { + padding: 8px; +} + +.close-button { + background: #ff5555; + color: #282a36; + border-radius: 50%; + margin: 4px; + padding: 2px; + min-width: 20px; + min-height: 20px; +} + +.close-button:hover { + background: #ff79c6; +} + +.notification-default-action, +.notification-action { + border-radius: 8px; + margin: 4px; + padding: 4px 8px; + background: #44475a; + color: #f8f8f2; + border: none; +} + +.notification-default-action:hover, +.notification-action:hover { + background: #6272a4; +} + +.summary { + font-weight: bold; + font-size: 14px; + color: #f8f8f2; +} + +.body { + font-size: 13px; + color: #f8f8f2; +} + +.time { + font-size: 11px; + color: #6272a4; + margin-right: 8px; +} + +.control-center { + background: #282a36; + border: 2px solid #44475a; + border-radius: 12px; + margin: 8px; + padding: 8px; +} + +.control-center-list { + background: transparent; +} + +.widget-title { + color: #f8f8f2; + font-size: 16px; + font-weight: bold; + margin: 8px; +} + +.widget-title > button { + background: #bd93f9; + color: #282a36; + border-radius: 8px; + padding: 4px 12px; + border: none; + font-weight: bold; +} + +.widget-title > button:hover { + background: #ff79c6; +} + +.widget-dnd { + color: #f8f8f2; + margin: 4px 8px; + font-size: 14px; +} + +.widget-dnd > switch { + background: #44475a; + border-radius: 12px; + border: 2px solid #6272a4; +} + +.widget-dnd > switch:checked { + background: #bd93f9; +} + +.widget-dnd > switch slider { + background: #f8f8f2; + border-radius: 50%; +} diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc new file mode 100644 index 000000000..a3a95e267 --- /dev/null +++ b/config/waybar/config.jsonc @@ -0,0 +1,113 @@ +{ + "layer": "top", + "position": "top", + "height": 36, + "spacing": 4, + + "modules-left": ["hyprland/workspaces"], + "modules-center": ["clock"], + "modules-right": [ + "pulseaudio", + "backlight", + "battery", + "network", + "bluetooth", + "tray", + "custom/notification" + ], + + "hyprland/workspaces": { + "format": "{icon}", + "format-icons": { + "active": "", + "default": "" + }, + "on-click": "activate", + "sort-by-number": true + }, + + "clock": { + "format": "{:%a %b %d %H:%M}", + "tooltip-format": "{calendar}", + "calendar": { + "mode": "month", + "weeks-pos": "left", + "format": { + "months": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}" + } + } + }, + + "pulseaudio": { + "format": "{icon} {volume}%", + "format-muted": "󰝟 muted", + "format-icons": { + "default": ["󰕿", "󰖀", "󰕾"] + }, + "on-click": "pavucontrol", + "scroll-step": 5, + "tooltip": true + }, + + "backlight": { + "format": "{icon} {percent}%", + "format-icons": ["󰃞", "󰃟", "󰃠"], + "tooltip": true + }, + + "battery": { + "interval": 30, + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-charging": "󰂄 {capacity}%", + "format-plugged": "󰂄 {capacity}%", + "format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"], + "tooltip-format": "{timeTo}\n{capacity}% - {power}W" + }, + + "network": { + "format-wifi": "󰤨 {essid}", + "format-ethernet": "󰈀 {ipaddr}", + "format-disconnected": "󰤭 disconnected", + "tooltip-format-wifi": "{essid} ({signalStrength}%)\n{ipaddr}", + "tooltip-format-ethernet": "{ifname}\n{ipaddr}", + "on-click": "nm-connection-editor" + }, + + "bluetooth": { + "format": "󰂯", + "format-connected": "󰂱 {num_connections}", + "format-disabled": "󰂲", + "tooltip-format": "{status}\n{device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}", + "on-click": "blueman-manager" + }, + + "tray": { + "icon-size": 16, + "spacing": 8 + }, + + "custom/notification": { + "tooltip": false, + "format": "{icon}", + "format-icons": { + "notification": "󰂚", + "none": "󰂜", + "dnd-notification": "󰂛", + "dnd-none": "󰪑" + }, + "return-type": "json", + "exec-if": "which swaync-client", + "exec": "swaync-client -swb", + "on-click": "swaync-client -t -sw", + "on-click-right": "swaync-client -d -sw", + "escape": true + } +} diff --git a/config/waybar/default.nix b/config/waybar/default.nix new file mode 100644 index 000000000..88d5c2824 --- /dev/null +++ b/config/waybar/default.nix @@ -0,0 +1,11 @@ +{ config, ... }: +{ + xdg.configFile."waybar/config.jsonc" = { + source = ./config.jsonc; + force = true; + }; + xdg.configFile."waybar/style.css" = { + source = ./style.css; + force = true; + }; +} diff --git a/config/waybar/style.css b/config/waybar/style.css new file mode 100644 index 000000000..ddc57d51d --- /dev/null +++ b/config/waybar/style.css @@ -0,0 +1,133 @@ +/* Dracula */ +@define-color background #282a36; +@define-color currentline #44475a; +@define-color foreground #f8f8f2; +@define-color comment #6272a4; +@define-color cyan #8be9fd; +@define-color green #50fa7b; +@define-color orange #ffb86c; +@define-color pink #ff79c6; +@define-color purple #bd93f9; +@define-color red #ff5555; +@define-color yellow #f1fa8c; + +* { + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 13px; + min-height: 0; +} + +window#waybar { + background-color: @background; + color: @foreground; + border-bottom: 2px solid @currentline; +} + +tooltip { + background-color: @background; + border: 1px solid @comment; + border-radius: 8px; + color: @foreground; +} + +#workspaces button { + padding: 0 8px; + color: @comment; + border-radius: 6px; + margin: 3px 2px; + background-color: transparent; +} + +#workspaces button.active { + color: @background; + background-color: @purple; +} + +#workspaces button:hover { + background-color: @currentline; + color: @foreground; +} + +#clock { + color: @foreground; + font-weight: bold; +} + +#pulseaudio { + color: @cyan; +} + +#pulseaudio.muted { + color: @comment; +} + +#backlight { + color: @yellow; +} + +#battery { + color: @green; +} + +#battery.warning { + color: @yellow; +} + +#battery.critical { + color: @red; + animation: blink 1s linear infinite; +} + +@keyframes blink { + to { + color: @background; + background-color: @red; + } +} + +#battery.charging { + color: @green; +} + +#network { + color: @cyan; +} + +#network.disconnected { + color: @comment; +} + +#bluetooth { + color: @purple; +} + +#bluetooth.disabled { + color: @comment; +} + +#tray { + color: @foreground; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#custom-notification { + color: @orange; + padding: 0 6px; +} + +/* Module spacing */ +#pulseaudio, +#backlight, +#battery, +#network, +#bluetooth, +#tray, +#clock, +#custom-notification { + padding: 0 10px; + margin: 3px 0; + border-radius: 6px; +} diff --git a/config/wlogout/default.nix b/config/wlogout/default.nix new file mode 100644 index 000000000..31e3f5204 --- /dev/null +++ b/config/wlogout/default.nix @@ -0,0 +1,11 @@ +{ config, ... }: +{ + xdg.configFile."wlogout/layout" = { + source = ./layout; + force = true; + }; + xdg.configFile."wlogout/style.css" = { + source = ./style.css; + force = true; + }; +} diff --git a/config/wlogout/layout b/config/wlogout/layout new file mode 100644 index 000000000..bcb426522 --- /dev/null +++ b/config/wlogout/layout @@ -0,0 +1,30 @@ +{ + "label" : "lock", + "action" : "hyprlock", + "text" : "Lock", + "keybind" : "l" +} +{ + "label" : "logout", + "action" : "hyprctl dispatch exit", + "text" : "Logout", + "keybind" : "e" +} +{ + "label" : "suspend", + "action" : "systemctl suspend", + "text" : "Suspend", + "keybind" : "s" +} +{ + "label" : "reboot", + "action" : "systemctl reboot", + "text" : "Reboot", + "keybind" : "r" +} +{ + "label" : "shutdown", + "action" : "systemctl poweroff", + "text" : "Shutdown", + "keybind" : "p" +} diff --git a/config/wlogout/style.css b/config/wlogout/style.css new file mode 100644 index 000000000..86cee1020 --- /dev/null +++ b/config/wlogout/style.css @@ -0,0 +1,49 @@ +window { + background-color: rgba(40, 42, 54, 0.9); + font-family: "JetBrainsMono Nerd Font", monospace; +} + +button { + background-color: #44475a; + border-radius: 12px; + margin: 10px; + padding: 20px; + color: #f8f8f2; + font-size: 18px; + border: 2px solid #6272a4; + background-repeat: no-repeat; + background-position: center; + background-size: 48px; +} + +button:focus, +button:hover { + background-color: #6272a4; + border-color: #bd93f9; + outline: none; +} + +button:active { + background-color: #bd93f9; + color: #282a36; +} + +#lock { + background-image: image(url("/usr/share/wlogout/icons/lock.png")); +} + +#logout { + background-image: image(url("/usr/share/wlogout/icons/logout.png")); +} + +#suspend { + background-image: image(url("/usr/share/wlogout/icons/suspend.png")); +} + +#reboot { + background-image: image(url("/usr/share/wlogout/icons/reboot.png")); +} + +#shutdown { + background-image: image(url("/usr/share/wlogout/icons/shutdown.png")); +} diff --git a/config/wofi/config b/config/wofi/config new file mode 100644 index 000000000..678ed7bd7 --- /dev/null +++ b/config/wofi/config @@ -0,0 +1,15 @@ +width=600 +height=400 +location=center +show=drun +prompt=Search... +filter_rate=100 +allow_markup=true +no_actions=true +halign=fill +orientation=vertical +content_halign=fill +insensitive=true +allow_images=true +image_size=24 +layer=overlay diff --git a/config/wofi/default.nix b/config/wofi/default.nix new file mode 100644 index 000000000..11116bbfb --- /dev/null +++ b/config/wofi/default.nix @@ -0,0 +1,11 @@ +{ config, ... }: +{ + xdg.configFile."wofi/config" = { + source = ./config; + force = true; + }; + xdg.configFile."wofi/style.css" = { + source = ./style.css; + force = true; + }; +} diff --git a/config/wofi/style.css b/config/wofi/style.css new file mode 100644 index 000000000..45c29b8fc --- /dev/null +++ b/config/wofi/style.css @@ -0,0 +1,58 @@ +window { + margin: 0; + border: 2px solid #bd93f9; + border-radius: 12px; + background-color: #282a36; + font-family: "JetBrainsMono Nerd Font", monospace; + font-size: 14px; +} + +#input { + margin: 8px; + padding: 8px 12px; + border: none; + border-radius: 8px; + background-color: #44475a; + color: #f8f8f2; + font-size: 14px; +} + +#input:focus { + border: 2px solid #bd93f9; +} + +#inner-box { + margin: 4px 8px; +} + +#outer-box { + margin: 0; + padding: 0; +} + +#scroll { + margin: 0; +} + +#text { + color: #f8f8f2; + margin: 0 4px; +} + +#entry { + padding: 6px 8px; + border-radius: 8px; +} + +#entry:selected { + background-color: #bd93f9; + color: #282a36; +} + +#entry:hover { + background-color: #44475a; +} + +#img { + margin-right: 8px; +} diff --git a/home-manager/default.nix b/home-manager/default.nix index 7425553a3..c83866c39 100644 --- a/home-manager/default.nix +++ b/home-manager/default.nix @@ -7,7 +7,7 @@ ... }: let - hmConfig = import ../config; + hmConfig = import ../config { inherit inputs; }; packages = import ./packages { inherit pkgs inputs; }; misc = import ./misc; modules = import ./modules; diff --git a/home-manager/packages/default.nix b/home-manager/packages/default.nix index 3e0c56946..97b77207f 100644 --- a/home-manager/packages/default.nix +++ b/home-manager/packages/default.nix @@ -118,15 +118,32 @@ with pkgs; ] ++ lib.optionals (stdenv.isLinux && isDesktop) [ _1password-gui + brightnessctl chromium clickup + cliphist emote ffmpeg ghostty github-desktop google-chrome + grim + hypridle + hyprlock + libnotify + networkmanagerapplet + pavucontrol + playerctl signal-desktop slack + slurp + swappy + swaynotificationcenter vlc vscode + waybar + wl-clipboard + wlogout + wob + wofi ] diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index 4aeb411dd..2c6594f4d 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -92,6 +92,26 @@ inputs.nixpkgs.lib.nixosSystem { # Power management services.power-profiles-daemon.enable = true; + # Auto timezone (via geolocation) + services.geoclue2.enable = true; + services.localtimed.enable = true; + + # Audio (PipeWire) + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + wireplumber.enable = true; + }; + services.pulseaudio.enable = false; + security.rtkit.enable = true; + + # Bluetooth + hardware.bluetooth.enable = true; + hardware.bluetooth.powerOnBoot = true; + services.blueman.enable = true; + # Desktop environment (Hyprland) services.xserver.enable = true; services.displayManager.gdm.enable = true; @@ -229,7 +249,6 @@ inputs.nixpkgs.lib.nixosSystem { pkgs = pkgs; config = { }; }) - ../../config/hyprland ]; # Agenix configuration for GitHub SSH key From 74a9b5dd8c1b7ceb054a0d4e8cec865569d06550 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:41:29 +0900 Subject: [PATCH 06/50] feat(matic): add SSH and GPG key configurations for agenix deployment --- named-hosts/galactica/secrets.nix | 6 +++ named-hosts/matic/default.nix | 72 +++++++++++++++++++++++++++++++ named-hosts/matic/secrets.nix | 6 +++ 3 files changed, 84 insertions(+) diff --git a/named-hosts/galactica/secrets.nix b/named-hosts/galactica/secrets.nix index 5297ec165..1c7cb4416 100644 --- a/named-hosts/galactica/secrets.nix +++ b/named-hosts/galactica/secrets.nix @@ -13,6 +13,12 @@ let ]; in { + # SSH key for GitHub authentication (shared with all machines) + "keys/id_ed25519.age" = { + file = ./keys/id_ed25519.age; + publicKeys = allMachines; + }; + # GPG key (shared with all machines for commit signing) "keys/gpg.age" = { file = ./keys/gpg.age; diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index 2c6594f4d..00b23896b 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -275,6 +275,78 @@ inputs.nixpkgs.lib.nixosSystem { $DRY_RUN_CMD mkdir -p $VERBOSE_ARG ${config.home.homeDirectory}/.ssh $DRY_RUN_CMD chmod $VERBOSE_ARG 700 ${config.home.homeDirectory}/.ssh ''; + + # Ensure agenix config directory exists + home.activation.ensureAgenixDirectory = config.lib.dag.entryBefore [ "writeBoundary" ] '' + $DRY_RUN_CMD mkdir -p $VERBOSE_ARG ${config.home.homeDirectory}/.config/agenix + $DRY_RUN_CMD chmod $VERBOSE_ARG 700 ${config.home.homeDirectory}/.config/agenix + ''; + + # Manually deploy agenix secrets during activation + # This ensures secrets are deployed even if the agenix activation hook doesn't run properly + home.activation.deployAgenixSecrets = config.lib.dag.entryAfter [ "writeBoundary" ] '' + # Decrypt and deploy GitHub SSH key if it doesn't exist + if [[ ! -f "${config.home.homeDirectory}/.ssh/id_ed25519_github" ]]; then + echo "Deploying GitHub SSH key from agenix..." + SECRET_FILE="${builtins.toString ../galactica/keys/id_ed25519.age}" + if [[ -f "$SECRET_FILE" ]]; then + $DRY_RUN_CMD ${pkgs.rage}/bin/rage -d -i ${config.home.homeDirectory}/.ssh/id_ed25519 "$SECRET_FILE" -o ${config.home.homeDirectory}/.ssh/id_ed25519_github + $DRY_RUN_CMD chmod $VERBOSE_ARG 0600 ${config.home.homeDirectory}/.ssh/id_ed25519_github + echo "✅ GitHub SSH key deployed successfully" + else + echo "⚠️ Warning: Secret file not found at $SECRET_FILE" + fi + fi + ''; + + # Import GPG key from agenix (all systems with dotfiles) + # Fails silently if SSH key isn't authorized to decrypt + home.activation.importGpgKey = config.lib.dag.entryAfter [ "linkGeneration" ] '' + $VERBOSE_ECHO "🔑 Starting GPG key import process..." + GPG_SECRET_FILE="${config.home.homeDirectory}/dotfiles/named-hosts/galactica/keys/gpg.age" + GPG_TEMP_FILE="${config.home.homeDirectory}/.config/agenix/gpg.key" + + # Create agenix directory if it doesn't exist + mkdir -p "${config.home.homeDirectory}/.config/agenix" + + if [[ -f "$GPG_SECRET_FILE" ]]; then + # Check if key is already imported + if ! ${pkgs.gnupg}/bin/gpg --list-secret-keys 2>/dev/null | grep -q "C2E97FCFF482925D"; then + echo "Importing GPG key from agenix..." + # Try to decrypt - will fail silently if SSH key isn't authorized + if ${pkgs.rage}/bin/rage -d -i ${config.home.homeDirectory}/.ssh/id_ed25519 -o "$GPG_TEMP_FILE" "$GPG_SECRET_FILE" 2>/dev/null; then + ${pkgs.gnupg}/bin/gpg --batch --import "$GPG_TEMP_FILE" 2>/dev/null + rm -f "$GPG_TEMP_FILE" + echo "✅ GPG key imported successfully" + fi + else + $VERBOSE_ECHO "ℹ️ GPG key already imported" + fi + fi + ''; + + # GPG configuration for commit signing + programs.gpg = { + enable = true; + settings = { + default-key = "shunkakinoki@gmail.com"; + }; + }; + + # GPG agent configuration + services.gpg-agent = { + enable = true; + enableSshSupport = false; + pinentry.package = pkgs.pinentry-tty; + defaultCacheTtl = 94608000; # 3 years + maxCacheTtl = 94608000; # 3 years + }; + + # GPG_TTY is set in fish shell init instead of sessionVariables + # because it needs to be evaluated dynamically per shell session + programs.fish.interactiveShellInit = lib.mkAfter '' + set -gx GPG_TTY (tty) + ''; }; } ] diff --git a/named-hosts/matic/secrets.nix b/named-hosts/matic/secrets.nix index 9cd09f508..5b365c32f 100644 --- a/named-hosts/matic/secrets.nix +++ b/named-hosts/matic/secrets.nix @@ -20,4 +20,10 @@ in file = ../galactica/keys/id_ed25519.age; publicKeys = allMachines; }; + + # GPG key for commit signing (synced from galactica) + "keys/gpg.age" = { + file = ../galactica/keys/gpg.age; + publicKeys = allMachines; + }; } From 210b92e6ddd38235a726a628fff4bea81d2fe5c5 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:42:21 +0900 Subject: [PATCH 07/50] feat(matic): update secrets.nix to reflect synchronization from galactica --- named-hosts/matic/secrets.nix | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/named-hosts/matic/secrets.nix b/named-hosts/matic/secrets.nix index 5b365c32f..cb41aa23e 100644 --- a/named-hosts/matic/secrets.nix +++ b/named-hosts/matic/secrets.nix @@ -1,27 +1,18 @@ -# Matic secrets - managed by agenix -# To add a new secret: -# 1. Add the secret definition here -# 2. Run: make encrypt-key-matic KEY_FILE=/path/to/secret +# Matic secrets - synced from galactica via agenix let - # Galactica's SSH public key galactica = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEKze2jlpV7SyTKA2ezqbumpCiDn+5Sj4z5SxrqfzesX shunkakinoki@gmail.com"; - # Matic's SSH public key matic = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIQqWYSDaaoazVNOrAimCpUxNgaLe9Von237zIoox3E5 skakinoki@matic"; - # All machines that can decrypt shared secrets allMachines = [ galactica matic ]; in { - # Shared SSH key for GitHub authentication (synced from galactica) - # This is the id_github key from galactica, which is the GitHub-authorized key "keys/id_github.age" = { file = ../galactica/keys/id_ed25519.age; publicKeys = allMachines; }; - # GPG key for commit signing (synced from galactica) "keys/gpg.age" = { file = ../galactica/keys/gpg.age; publicKeys = allMachines; From 9112ab7be273b99861432943b254493984f63677 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:43:24 +0900 Subject: [PATCH 08/50] feat(matic): update GPG and SSH key files for synchronization --- named-hosts/galactica/keys/gpg.age | Bin 1236 -> 1346 bytes named-hosts/galactica/keys/id_ed25519.age | Bin 786 -> 896 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/named-hosts/galactica/keys/gpg.age b/named-hosts/galactica/keys/gpg.age index b8b81d91b6d7f0409bbc20169ceea23b940daee4..cb2fe18b777e0f283213c6590090a5b496aa67e7 100644 GIT binary patch delta 1319 zcmV+?1=#x33Bn4HEPp~aGID7*FimDyVo^CWO<72Bad=Q#Phoa$a&3B8Qd(_BS}{;o zWp+$hMGA3OQd&YaFi1%&Yiwj^O<6Kic2!qWVmDcBVs=Y+D`#;~c~EILS$9fLO$seO zAaiqQEoEdfH8n9gAaG1fM@nZPXhJo1L1{;LMm0@JMs+eacYj$!Rx5C5H&S_7b!0Jb zLt=JeWHvEpM0t023NTevZDm$VPfbf`RA^N>FHlBHVN^#nVQ6|mWJ7sQNn&SbYBgv^ zbu>dX3N1b$b8~1dWn?lnH8D9Lc2i13F?S#|SYlCON@Gk}G*eA*D{gu-ayM33Fluvi zb!#(oFlSYBQh!rHV?;)0Z7^#JP;yIXOh#EUY;8(WcTz`DX-aG`FjaAEP)bWjWKK(C zdMk4>Ib>98MMzBwEiEk|HdT62PiikyZ&fr`OE_|FS7|mmVJlBTYGPzlFIrPMNm)ZO zZ&`O$O=@EbDO$UE=o+i#8W}!QjT}+{)fZ|`6LS>y1%HzrB9>TV&D$d!@y0`gXr_?ML4Ytd!Fod z@jhI>HD^|=b@^Inqp-H*cQyV-D;Q1b{9a#9GPNFAL(*A#q`mZ?d%sWd)efD!j-DSm z;hSCd)7_kX&ME=3*iq`U=qtV1N9U+A=_6%oqJOK=8z``8r1+qBx1NJ`ZL-ejEJ8+4 ze8LaiizNB-lv?K%8#~^LzB!wv+>A7oJR858zoNa&dJ_zBi8*9n#9OS48B@Ra{!VnHm6&;2p zG!Mi;{&tiu7mYmSc_~`fKK+tgXb;AxTy&$QF`dD46iI4FKI3RtmbBm<|KQ1wY4jX( zZ2UulhIl!N1u0+^7XTVQK~2(|DStzS#Oi;r@S?+Wi?u~mokn0~=wYKaXh0tP)otgm zN@PT|e#n;Nd^QSfcZwKQxXM_#l%hw;LTg d&kRiss$pFjNuJ@!H>1h>>nNj=vZd~n-#M9GNwNR{ delta 1208 zcmV;p1V{VA3e*XZEPqvYX)SAS7MGAk=GGeR~uFl#GQ zMnYCZW<^zIcS}}P3Qt5UXlGC|NoY@EVryqJSZ-;0O>;GDV>nk(I81XfcyLEiGix+P zVPiRS3N0-yAa+P^VRm|QD>+MAXKyfBX-!&YFL-20c6n85b1!XbWouzsR7WpWa9Uzb z3MKjzjS<*X*?(y_9D*X|?AdQqw}U*?Ju^WwGLVZKZZRFK6~gYc)YBD&zSkr z#Jj$PW^zAC*E)ON?s%QO<@&eE*({Zsi{Km z0k!LH4S%RCx_CpH_cykf!d{En;s@j(nHfU%^O06kJ}uWDZR)RmAJi;I?B9+97DE3t z-8&BcG%txq-EqK52s3e(*oHrz?Z~(8oavcqm{MF*Bq$S)_fW_MMhs}kp`49&C-ybv zIA)E%C`<5L*I7GAl%x&?GR1A@+_6HP7VS4(x_?0Yb4y^=hF|(o+epDmtMMndn`)f> zgU1$Pa73)b(OW_(d1`{p%OAT*MT>8}sTpFk+3QkNG-X?{zQfAAIZ~pc70F7NNa|v6 z^*KY=ITBY$u8bTE%+)VuPa-niy{y(4ujWQpQFF$DaAU+60rtQv?V1}M3${b15I^)w zT7NO=esdNjIe*g+(k9<;@sP=Cdz-e>Y^gb7Ww(k&EmxJNhm>$Y&xLrhm{;r}+bII_thwiT%Jg0wTq;T1_*=OVl_K zsk*BS@$6&S4QQP;cJ~bp0P~;5hTZS3+*)Ir*mYke=X)}K&qCM|j1zG70z>qGO}>y$ezH|c zUhndIgG|I@SzWy7n<@{r@Abu#3e|8^f!(eBC%ycg44mo$cjGe+rgLS#NP7)rurjJW z)r0wFj%3hJ@(!Xl4J8k~8YZl;G%>9?^dlEpHZKow-%BvOtuBZrO#A~Ggrb_^k^%C& WPALhEXA6Kg*Cp`Y%lzlo78EB$gDCL; diff --git a/named-hosts/galactica/keys/id_ed25519.age b/named-hosts/galactica/keys/id_ed25519.age index 2a2570a0206f93b7e1ca3298008a66c78b02b1a1..f66c54b89f279a5d6660f655713ff3fcde463f73 100644 GIT binary patch delta 865 zcmV-n1D^bn27m{UEPrA(Y*c7sW=VQtV{k-GVoozoVKHrHN-;E5WocnSVpLRbQDG}i zPe*5MX9{9yb4GV}dU#baMrUa?R#jmyGca~HSy^IqY-vQEp^pb2(agG*mTNMo~&IaYZk2 zZA&+5bZvQ2L`PK$EiEk|GEi?aY)WM-XID2`T5ectc~?$mD@jdlP-}2OS}{RWT1rZ0 zaZ7SoGH^HwRUolUA-ab(sTj7|d3m)cDhJ)1yfAnfcyUMNUpUQT-mEg@`UdeShvuw})xkrB@*=#!kEw;YSf>{NNL#lwJFn9)AT4a3k0dsOjc-TSxHuMZDeb4W?^+`RWW&XPHskGb1_9@Gg32W zHB@dfNeWtHX+$?dYH3zgFm*~*MNefbWNtNKYE(=wadU23M>bUz7czZjb3NTi7ZB;ooXIV8wc`{a4On6vKGihyDN@Yz!XjODhbv0!)N>epS zR5xU63N0-yAahT6IcRkspr+ofwKcS45j#)S(R8Fv@Uu9luVrufH|(pS z%dFbPu0AjKHe`l(vnUKxaTntA*O>awbUveV?~>qUB7dV6)_Oplywy=wD9oL}gPZu* zAGxnm@0;Ca?GSIr1x`ZGul6=;Gp2aXp-N8KCYrTO#XSv3B&>i11@>K@*OgX(P-351 z%v9oh4FZ05I`V4P1+^?-FF*bOUxyIihwS@^#Wd3|md|i!U@kmrs3YqCZbLC! z5!b6;wz8O*h(o~*zc~h9$E Date: Sat, 7 Feb 2026 00:54:22 +0900 Subject: [PATCH 09/50] feat(hyprland): update window rule syntax and remove workspace swipe fingers setting --- config/hyprland/hyprland.conf | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index f5fbc19a9..d823ff22c 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -69,7 +69,6 @@ input { gestures { workspace_swipe = true - workspace_swipe_fingers = 3 } # ============================================================================= @@ -146,11 +145,11 @@ misc { # ============================================================================= # Window Rules # ============================================================================= -windowrulev2 = float, class:^(wofi)$ -windowrulev2 = stayfocused, class:^(wofi)$ -windowrulev2 = float, class:^(1Password)$ -windowrulev2 = float, title:^(Picture-in-Picture)$ -windowrulev2 = pin, title:^(Picture-in-Picture)$ +windowrule = float, class:^(wofi)$ +windowrule = stayfocused, class:^(wofi)$ +windowrule = float, class:^(1Password)$ +windowrule = float, title:^(Picture-in-Picture)$ +windowrule = pin, title:^(Picture-in-Picture)$ # Notification center blur layerrule = blur, swaync-control-center From 5bd84148501f695540645266e833bc3295414a1b Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:56:26 +0900 Subject: [PATCH 10/50] feat(hyprland): update gesture settings and refine window rules syntax --- config/hyprland/hyprland.conf | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index d823ff22c..7591e9eff 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -67,9 +67,7 @@ input { } } -gestures { - workspace_swipe = true -} +gesture = 3, horizontal, workspace # ============================================================================= # General @@ -145,20 +143,20 @@ misc { # ============================================================================= # Window Rules # ============================================================================= -windowrule = float, class:^(wofi)$ -windowrule = stayfocused, class:^(wofi)$ -windowrule = float, class:^(1Password)$ -windowrule = float, title:^(Picture-in-Picture)$ -windowrule = pin, title:^(Picture-in-Picture)$ +windowrule = float on, match:class ^(wofi)$ +windowrule = stayfocused on, match:class ^(wofi)$ +windowrule = float on, match:class ^(1Password)$ +windowrule = float on, match:title ^(Picture-in-Picture)$ +windowrule = pin on, match:title ^(Picture-in-Picture)$ # Notification center blur -layerrule = blur, swaync-control-center -layerrule = blur, swaync-notification-window -layerrule = ignorezero, swaync-control-center -layerrule = ignorezero, swaync-notification-window +layerrule = blur on, match:namespace swaync-control-center +layerrule = blur on, match:namespace swaync-notification-window +layerrule = ignore_alpha 0.0, match:namespace swaync-control-center +layerrule = ignore_alpha 0.0, match:namespace swaync-notification-window # Prevent wofi animation -layerrule = noanim, ^(wofi)$ +layerrule = animation slide, match:namespace ^(wofi)$ # ============================================================================= # App Launch Hotkeys (Super + letter) From 518d5071f0052e37a7668edbda46cebfd4db34a2 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:57:14 +0900 Subject: [PATCH 11/50] feat(hyprland): refine window animation settings for improved performance --- config/hyprland/hyprland.conf | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 7591e9eff..c78980caa 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -116,19 +116,17 @@ decoration { animations { enabled = true - bezier = wind, 0.05, 0.9, 0.1, 1.05 - bezier = winIn, 0.1, 1.1, 0.1, 1.1 - bezier = winOut, 0.3, -0.3, 0, 1 + bezier = snap, 0.2, 1.0, 0.3, 1.0 bezier = liner, 1, 1, 1, 1 - animation = windows, 1, 6, wind, slide - animation = windowsIn, 1, 6, winIn, slide - animation = windowsOut, 1, 5, winOut, slide - animation = windowsMove, 1, 5, wind, slide + animation = windows, 1, 2, snap, slide + animation = windowsIn, 1, 2, snap, slide + animation = windowsOut, 1, 2, snap, slide + animation = windowsMove, 1, 2, snap, slide animation = border, 1, 1, liner animation = borderangle, 1, 30, liner, loop - animation = fade, 1, 10, default - animation = workspaces, 1, 5, wind + animation = fade, 1, 3, default + animation = workspaces, 1, 3, snap } # ============================================================================= From 4c364db5d8fc9f4b7d384ee27e1c05269806b389 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:57:34 +0900 Subject: [PATCH 12/50] feat(hyprland): update window rule for wofi to focus on activation --- config/hyprland/hyprland.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index c78980caa..7d1341162 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -142,7 +142,7 @@ misc { # Window Rules # ============================================================================= windowrule = float on, match:class ^(wofi)$ -windowrule = stayfocused on, match:class ^(wofi)$ +windowrule = focusonactivate on, match:class ^(wofi)$ windowrule = float on, match:class ^(1Password)$ windowrule = float on, match:title ^(Picture-in-Picture)$ windowrule = pin on, match:title ^(Picture-in-Picture)$ From 92ea474e6d190fad22e42376a44c057a87493b36 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 00:58:09 +0900 Subject: [PATCH 13/50] feat(hyprland): change key binding for killing active window from Q to W --- config/hyprland/hyprland.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 7d1341162..405a2c9b4 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -176,7 +176,7 @@ bind = $mod, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy # ============================================================================= # Window Management # ============================================================================= -bind = $mod, Q, killactive, +bind = $mod, W, killactive, bind = $mod, F, togglefloating, bind = $mod SHIFT, F, fullscreen, bind = $mod SHIFT, Q, exec, wlogout From 8bc9e03eb13b5e47ee241036e190fa78396d1172 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:00:29 +0900 Subject: [PATCH 14/50] feat(hyprland): update workspace format to display workspace ID --- config/waybar/config.jsonc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index a3a95e267..37780dc81 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -17,11 +17,7 @@ ], "hyprland/workspaces": { - "format": "{icon}", - "format-icons": { - "active": "", - "default": "" - }, + "format": "{id}", "on-click": "activate", "sort-by-number": true }, From c7bb5be00d68ab258b281ea4e3afce20b89fc443 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:00:58 +0900 Subject: [PATCH 15/50] feat(hyprland): update gesture setting for horizontal workspace navigation --- config/hyprland/hyprland.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 405a2c9b4..630051262 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -67,7 +67,7 @@ input { } } -gesture = 3, horizontal, workspace +gesture = 4, horizontal, workspace # ============================================================================= # General From 41affebdd1dfe2fe3fe55914709228a72a89afda Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:01:27 +0900 Subject: [PATCH 16/50] feat(hyprland): add gesture setting for three-finger horizontal workspace navigation --- config/hyprland/hyprland.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 630051262..5f9c31e79 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -67,6 +67,7 @@ input { } } +gesture = 3, horizontal, workspace gesture = 4, horizontal, workspace # ============================================================================= From eb743281722912ed9a4c3a7d6dbfc9aa663c4842 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:01:54 +0900 Subject: [PATCH 17/50] feat(hyprland): update app launch hotkeys to use application IDs --- config/hyprland/hyprland.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 5f9c31e79..99d267c05 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -160,10 +160,10 @@ layerrule = animation slide, match:namespace ^(wofi)$ # ============================================================================= # App Launch Hotkeys (Super + letter) # ============================================================================= -bind = $mod, T, exec, gtk-launch ghostty -bind = $mod, G, exec, gtk-launch google-chrome +bind = $mod, T, exec, gtk-launch com.mitchellh.ghostty +bind = $mod, G, exec, gtk-launch com.google.Chrome bind = $mod, S, exec, gtk-launch slack -bind = $mod, C, exec, gtk-launch cursor +bind = $mod, C, exec, gtk-launch code bind = $mod, P, exec, gtk-launch 1password bind = $mod, M, exec, gtk-launch signal-desktop bind = $mod, N, exec, ghostty -e yazi From addf2617b012cc088a8648629c9534c8e6258e4a Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:02:43 +0900 Subject: [PATCH 18/50] feat(hyprland): update clipboard binding to use Shift modifier and add new launcher binding for Visual Studio Code --- config/hyprland/hyprland.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 99d267c05..44abd8cc0 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -171,8 +171,9 @@ bind = $mod, N, exec, ghostty -e yazi # ============================================================================= # Launcher & Clipboard # ============================================================================= +bind = $mod, V, exec, gtk-launch code bind = $mod, D, exec, wofi --show drun -bind = $mod, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy +bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy # ============================================================================= # Window Management From 5fff3b68530326c57b479a28c4412e07bfce4bdb Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:04:10 +0900 Subject: [PATCH 19/50] feat(hyprland): remove redundant window rule for wofi focus behavior --- config/hyprland/hyprland.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 44abd8cc0..a455aa9b3 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -143,7 +143,6 @@ misc { # Window Rules # ============================================================================= windowrule = float on, match:class ^(wofi)$ -windowrule = focusonactivate on, match:class ^(wofi)$ windowrule = float on, match:class ^(1Password)$ windowrule = float on, match:title ^(Picture-in-Picture)$ windowrule = pin on, match:title ^(Picture-in-Picture)$ From ebfee4ba85e1e98ec254240fba113182da54b9ff Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:04:26 +0900 Subject: [PATCH 20/50] feat(hyprland): update app launch bindings to use direct commands --- config/hyprland/hyprland.conf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index a455aa9b3..c84984830 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -159,10 +159,10 @@ layerrule = animation slide, match:namespace ^(wofi)$ # ============================================================================= # App Launch Hotkeys (Super + letter) # ============================================================================= -bind = $mod, T, exec, gtk-launch com.mitchellh.ghostty -bind = $mod, G, exec, gtk-launch com.google.Chrome -bind = $mod, S, exec, gtk-launch slack -bind = $mod, C, exec, gtk-launch code +bind = $mod, T, exec, ghostty +bind = $mod, G, exec, google-chrome-stable +bind = $mod, S, exec, slack +bind = $mod, C, exec, cursor bind = $mod, P, exec, gtk-launch 1password bind = $mod, M, exec, gtk-launch signal-desktop bind = $mod, N, exec, ghostty -e yazi @@ -170,7 +170,7 @@ bind = $mod, N, exec, ghostty -e yazi # ============================================================================= # Launcher & Clipboard # ============================================================================= -bind = $mod, V, exec, gtk-launch code +bind = $mod, V, exec, code bind = $mod, D, exec, wofi --show drun bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy From ec059c704f04231cef8647bbe1dd6af128d6667b Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:13:48 +0900 Subject: [PATCH 21/50] feat(hyprland): integrate Hyprland and its plugins into the Nix configuration --- config/hyprland/default.nix | 18 +- config/hyprland/hyprland.conf | 17 +- flake.lock | 527 +++++++++++++++++++++++++++++++++- flake.nix | 7 + named-hosts/matic/default.nix | 4 +- 5 files changed, 562 insertions(+), 11 deletions(-) diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index 2e84003a9..835fc207b 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -1,9 +1,19 @@ -{ config, ... }: { - xdg.configFile."hypr/hyprland.conf" = { - source = ./hyprland.conf; - force = true; + config, + inputs, + pkgs, + ... +}: +{ + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = false; + plugins = [ + inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo + ]; + extraConfig = builtins.readFile ./hyprland.conf; }; + xdg.configFile."hypr/hypridle.conf" = { source = ./hypridle.conf; force = true; diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index c84984830..81e4a16ac 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -69,6 +69,8 @@ input { gesture = 3, horizontal, workspace gesture = 4, horizontal, workspace +gesture = 3, up, dispatcher:hyprexpo:expo toggle +gesture = 4, up, dispatcher:hyprexpo:expo toggle # ============================================================================= # General @@ -179,8 +181,9 @@ bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl- # ============================================================================= bind = $mod, W, killactive, bind = $mod, F, togglefloating, -bind = $mod SHIFT, F, fullscreen, +bind = $mod SHIFT, F, fullscreen, 0 bind = $mod SHIFT, Q, exec, wlogout +bind = $mod, TAB, hyprexpo:expo, toggle # Focus (vim keys) bind = $mod, H, movefocus, l @@ -267,3 +270,15 @@ bind = $mod CTRL, L, exec, hyprlock # Notification Toggle # ============================================================================= bind = $mod SHIFT, D, exec, swaync-client -t -sw + +# ============================================================================= +# Plugins +# ============================================================================= +plugin { + hyprexpo { + columns = 3 + gap_size = 5 + bg_col = rgb(282a36) + workspace_method = first 1 + } +} diff --git a/flake.lock b/flake.lock index cf8cb8bd8..d9c808919 100644 --- a/flake.lock +++ b/flake.lock @@ -25,6 +25,39 @@ "type": "github" } }, + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1769428758, + "narHash": "sha256-0G/GzF7lkWs/yl82bXuisSqPn6sf8YGTnbEdFOXvOfU=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "def5e74c97370f15949a67c62e61f1459fcb0e15", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, "cachix": { "inputs": { "devenv": [ @@ -122,6 +155,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -302,6 +351,28 @@ "type": "github" } }, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -322,6 +393,355 @@ "type": "github" } }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1753964049, + "narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprgraphics": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1769284023, + "narHash": "sha256-xG34vwYJ79rA2wVC8KFuM8r36urJTG6/csXx7LiiSYU=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "13c536659d46893596412d180449353a900a1d31", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprgraphics": "hyprgraphics", + "hyprland-guiutils": "hyprland-guiutils", + "hyprland-protocols": "hyprland-protocols", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "hyprwire": "hyprwire", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems_2", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1770330959, + "narHash": "sha256-OPmJ6dBL615GGX7ENJXtJm4zeMv5uXDjmO8WB1MI5wM=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "562171ab668e7ee98a9d2bbb62a9477ad2b1e24e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-guiutils": { + "inputs": { + "aquamarine": [ + "hyprland", + "aquamarine" + ], + "hyprgraphics": [ + "hyprland", + "hyprgraphics" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprtoolkit": "hyprtoolkit", + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1767023960, + "narHash": "sha256-R2HgtVS1G3KSIKAQ77aOZ+Q0HituOmPgXW9nBNkpp3Q=", + "owner": "hyprwm", + "repo": "hyprland-guiutils", + "rev": "c2e906261142f5dd1ee0bfc44abba23e2754c660", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-guiutils", + "type": "github" + } + }, + "hyprland-plugins": { + "inputs": { + "hyprland": [ + "hyprland" + ], + "nixpkgs": [ + "hyprland-plugins", + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland-plugins", + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1769285097, + "narHash": "sha256-eVD4U3Oqzz0VU9ylJ5wo76xDcYKv2CpiiRXq4Is4QdA=", + "owner": "hyprwm", + "repo": "hyprland-plugins", + "rev": "06c0749a0dac978d89b1a76ae6adc76a3c15dbfa", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-plugins", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1765214753, + "narHash": "sha256-P9zdGXOzToJJgu5sVjv7oeOGPIIwrd9hAUAP3PsmBBs=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "3f3860b869014c00e8b9e0528c7b4ddc335c21ab", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1767983607, + "narHash": "sha256-8C2co8NYfR4oMOUEsPROOJ9JHrv9/ktbJJ6X1WsTbXc=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "d4037379e6057246b408bbcf796cf3e9838af5b2", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprtoolkit": { + "inputs": { + "aquamarine": [ + "hyprland", + "hyprland-guiutils", + "aquamarine" + ], + "hyprgraphics": [ + "hyprland", + "hyprland-guiutils", + "hyprgraphics" + ], + "hyprlang": [ + "hyprland", + "hyprland-guiutils", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprland-guiutils", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprland-guiutils", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "hyprland-guiutils", + "nixpkgs" + ], + "systems": [ + "hyprland", + "hyprland-guiutils", + "systems" + ] + }, + "locked": { + "lastModified": 1764592794, + "narHash": "sha256-7CcO+wbTJ1L1NBQHierHzheQGPWwkIQug/w+fhTAVuU=", + "owner": "hyprwm", + "repo": "hyprtoolkit", + "rev": "5cfe0743f0e608e1462972303778d8a0859ee63e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprtoolkit", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1766253372, + "narHash": "sha256-1+p4Kw8HdtMoFSmJtfdwjxM4bPxDK9yg27SlvUMpzWA=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "51a4f93ce8572e7b12b7284eb9e6e8ebf16b4be9", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1763640274, + "narHash": "sha256-Uan1Nl9i4TF/kyFoHnTq1bd/rsWh4GAK/9/jDqLbY5A=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "f6cf414ca0e16a4d30198fd670ec86df3c89f671", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "hyprwire": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1769202094, + "narHash": "sha256-gdJr/vWWLRW85ucatSjoBULPB2dqBJd/53CZmQ9t91Q=", + "owner": "hyprwm", + "repo": "hyprwire", + "rev": "a45ca05050d22629b3c7969a926d37870d7dd75c", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwire", + "type": "github" + } + }, "mk-shell-bin": { "locked": { "lastModified": 1677004959, @@ -500,16 +920,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1769527094, - "narHash": "sha256-xV20Alb7ZGN7qujnsi5lG1NckSUmpIb05H2Xar73TDc=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "afce96367b2e37fc29afb5543573cd49db3357b7", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -529,6 +949,22 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1769527094, + "narHash": "sha256-xV20Alb7ZGN7qujnsi5lG1NckSUmpIb05H2Xar73TDc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "afce96367b2e37fc29afb5543573cd49db3357b7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nur": { "inputs": { "flake-parts": "flake-parts_4", @@ -550,6 +986,29 @@ "type": "github" } }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat_2", + "gitignore": "gitignore_2", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769069492, + "narHash": "sha256-Efs3VUPelRduf3PpfPP2ovEB4CXT7vHf8W+xc49RL/U=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "a1ef738813b15cf8ec759bdff5761b027e3e1d23", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { "agenix": "agenix", @@ -557,12 +1016,14 @@ "flake-parts": "flake-parts_2", "foundry": "foundry", "home-manager": "home-manager", + "hyprland": "hyprland", + "hyprland-plugins": "hyprland-plugins", "mk-shell-bin": "mk-shell-bin", "neovim-nightly-overlay": "neovim-nightly-overlay", "nix-darwin": "nix-darwin", "nix2container": "nix2container", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "nur": "nur", "treefmt-nix": "treefmt-nix_2" } @@ -582,6 +1043,21 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -623,6 +1099,47 @@ "repo": "treefmt-nix", "type": "github" } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1761431178, + "narHash": "sha256-xzjC1CV3+wpUQKNF+GnadnkeGUCJX+vgaWIZsnz9tzI=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "4b8801228ff958d028f588f0c2b911dbf32297f9", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 3e7191ed7..0d9746e99 100644 --- a/flake.nix +++ b/flake.nix @@ -51,6 +51,13 @@ nixos-hardware = { url = "github:NixOS/nixos-hardware/master"; }; + hyprland = { + url = "github:hyprwm/Hyprland"; + }; + hyprland-plugins = { + url = "github:hyprwm/hyprland-plugins"; + inputs.hyprland.follows = "hyprland"; + }; }; outputs = diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index 00b23896b..1290601e7 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -120,6 +120,9 @@ inputs.nixpkgs.lib.nixosSystem { programs.hyprland = { enable = true; + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + portalPackage = + inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; xwayland.enable = true; withUWSM = true; }; @@ -129,7 +132,6 @@ inputs.nixpkgs.lib.nixosSystem { xdg.portal = { enable = true; extraPortals = with pkgs; [ - xdg-desktop-portal-hyprland xdg-desktop-portal-gtk ]; }; From 3b7bd2e5d55b57534c5b749f850cfae2db74ee00 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:18:11 +0900 Subject: [PATCH 22/50] feat(hyprland): enhance media and hardware key bindings for improved functionality --- config/hyprland/hyprland.conf | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 81e4a16ac..19e1eb1a0 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -250,16 +250,33 @@ bindm = $mod, mouse:273, resizewindow # Screenshot # ============================================================================= bind = $mod SHIFT, S, exec, grim -g "$(slurp)" - | swappy -f - -bind = , Print, exec, grim -g "$(slurp)" - | swappy -f - # ============================================================================= -# Media / Hardware Keys +# Media / Hardware Keys (Framework 13 AI 300) # ============================================================================= -bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print int($2*100)}' > /tmp/wobpipe -bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print int($2*100)}' > /tmp/wobpipe +# F1: Mute speaker bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle -bindel = , XF86MonBrightnessUp, exec, brightnessctl set 5%+ && brightnessctl -m | awk -F, '{print substr($4,0,length($4)-1)}' > /tmp/wobpipe -bindel = , XF86MonBrightnessDown, exec, brightnessctl set 5%- && brightnessctl -m | awk -F, '{print substr($4,0,length($4)-1)}' > /tmp/wobpipe +# F2: Volume down +bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +# F3: Volume up +bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ +# F4: Previous track +bindl = , XF86AudioPrev, exec, playerctl previous +# F5: Next track +bindl = , XF86AudioNext, exec, playerctl next +# F6: Play/pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPause, exec, playerctl play-pause +# F7: Brightness down +bindel = , XF86MonBrightnessDown, exec, brightnessctl set 5%- +# F8: Brightness up +bindel = , XF86MonBrightnessUp, exec, brightnessctl set 5%+ +# F9: Display toggle +bindl = , XF86Display, exec, hyprctl keyword monitor "eDP-1, toggle" +# F10: Airplane mode +bindl = , XF86RFKill, exec, nmcli radio wifi toggle +# F11: Print screen +bind = , Print, exec, grim -g "$(slurp)" - | swappy -f - # ============================================================================= # Lock Screen From 9b5516c9d513c8ccc7f0ddf9347a513c3024c0cc Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:19:05 +0900 Subject: [PATCH 23/50] feat(hyprland): update clock format to include full date and time --- config/waybar/config.jsonc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index 37780dc81..ec2a9ba57 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -23,7 +23,8 @@ }, "clock": { - "format": "{:%a %b %d %H:%M}", + "interval": 1, + "format": "{:%Y/%m/%d %H:%M:%S}", "tooltip-format": "{calendar}", "calendar": { "mode": "month", From 879744edffd085390d66d582939c7bb0915d765f Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:19:15 +0900 Subject: [PATCH 24/50] feat(hyprland): add CPU and memory modules to waybar configuration --- config/waybar/config.jsonc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index ec2a9ba57..726855004 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -7,6 +7,8 @@ "modules-left": ["hyprland/workspaces"], "modules-center": ["clock"], "modules-right": [ + "cpu", + "memory", "pulseaudio", "backlight", "battery", @@ -38,6 +40,18 @@ } }, + "cpu": { + "interval": 5, + "format": " {usage}%", + "tooltip-format": "{avg_frequency} GHz\n{usage}% used" + }, + + "memory": { + "interval": 5, + "format": " {percentage}%", + "tooltip-format": "{used:0.1f} / {total:0.1f} GiB" + }, + "pulseaudio": { "format": "{icon} {volume}%", "format-muted": "󰝟 muted", From c2619807e2036fb5b2a8392424ce9be51579188f Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:19:20 +0900 Subject: [PATCH 25/50] feat(hyprland): add color definitions for CPU and memory modules in waybar style --- config/waybar/style.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/waybar/style.css b/config/waybar/style.css index ddc57d51d..1c90f234c 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -53,6 +53,14 @@ tooltip { font-weight: bold; } +#cpu { + color: @green; +} + +#memory { + color: @orange; +} + #pulseaudio { color: @cyan; } From 0a3b3c116715d7bf300ae3e481424e94cd935c0c Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:19:40 +0900 Subject: [PATCH 26/50] feat(hyprland): add spacing for CPU and memory modules in waybar style --- config/waybar/style.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/waybar/style.css b/config/waybar/style.css index 1c90f234c..cbe9e604d 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -127,6 +127,8 @@ tooltip { } /* Module spacing */ +#cpu, +#memory, #pulseaudio, #backlight, #battery, From 31dcb7e1adda26c8982c900eba55ad7fa0dd0515 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:20:53 +0900 Subject: [PATCH 27/50] feat(hyprland): update waybar color scheme for CPU and memory modules --- Makefile | 11 +++++++++-- config/waybar/style.css | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 9b9ad692d..0c1ca11ab 100644 --- a/Makefile +++ b/Makefile @@ -749,7 +749,7 @@ launchctl-ollama: ## Restart ollama launchd agent. ##@ Systemd Services (Linux) .PHONY: systemctl -systemctl: systemctl-cliproxyapi systemctl-openclaw systemctl-code-syncer systemctl-docker-postgres systemctl-dotfiles-updater systemctl-ollama ## Restart all systemd user services. +systemctl: systemctl-cliproxyapi systemctl-code-syncer systemctl-docker-postgres systemctl-dotfiles-updater systemctl-ollama systemctl-openclaw systemctl-waybar ## Restart all systemd user services. .PHONY: systemctl-cliproxyapi systemctl-cliproxyapi: ## Pull latest image and restart cliproxyapi systemd user service. @@ -757,7 +757,6 @@ systemctl-cliproxyapi: ## Pull latest image and restart cliproxyapi systemd user @systemctl --user restart cliproxyapi.service || true @echo "✅ cliproxyapi restarted" - .PHONY: systemctl-code-syncer systemctl-code-syncer: ## Restart code-syncer systemd user service. @echo "🔄 Restarting code-syncer..." @@ -788,6 +787,14 @@ systemctl-openclaw: ## Restart OpenClaw gateway systemd user service. @systemctl --user restart openclaw-gateway.service || true @echo "✅ openclaw restarted" +.PHONY: systemctl-waybar +systemctl-waybar: ## Restart waybar. + @echo "🔄 Restarting waybar..." + @pkill waybar 2>/dev/null || true + @sleep 1 + @hyprctl dispatch exec waybar 2>/dev/null || true + @echo "✅ waybar restarted" + ##@ Git Submodule .PHONY: git-submodule-sync diff --git a/config/waybar/style.css b/config/waybar/style.css index cbe9e604d..6e6b66a39 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -54,11 +54,11 @@ tooltip { } #cpu { - color: @green; + color: @orange; } #memory { - color: @orange; + color: @green; } #pulseaudio { From 4d157287ef7019e701db4d3fcc9ab67813535ecf Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:29:20 +0900 Subject: [PATCH 28/50] chore: add hyprland cachix binary cache globally --- Makefile | 4 ++-- named-hosts/matic/default.nix | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 0c1ca11ab..215a4f223 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,8 @@ DOCKER_IMAGE_TAGGED := $(DOCKER_IMAGE_NAME_BASE):$(GIT_COMMIT_SHA) NIX_EXEC := $(shell which nix) # Common cache settings (only applied when user is trusted to avoid warnings) -NIX_SUBSTITUTERS := https://cache.nixos.org https://devenv.cachix.org https://cachix.cachix.org -NIX_TRUSTED_KEYS := cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw= cachix.cachix.org-1:eWNHQldwUO7G2VkjpnjDbWwy4KQ/HNxht7H4SSoMckM= +NIX_SUBSTITUTERS := https://cache.nixos.org https://devenv.cachix.org https://cachix.cachix.org https://hyprland.cachix.org +NIX_TRUSTED_KEYS := cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw= cachix.cachix.org-1:eWNHQldwUO7G2VkjpnjDbWwy4KQ/HNxht7H4SSoMckM= hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc= NIX_CACHIX_CONF := /etc/nix/cachix.conf # Check if user is trusted (to avoid "ignoring untrusted substituter" warnings) NIX_USER_TRUSTED := $(shell grep -qE "trusted-users.*=.*(\\*|$(shell whoami))" /etc/nix/nix.conf 2>/dev/null && echo "yes" || echo "no") diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index 1290601e7..ac8ff945c 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -170,9 +170,6 @@ inputs.nixpkgs.lib.nixosSystem { "nix-command" "flakes" ]; - substituters = [ - "https://cache.nixos.org" - ]; trusted-users = [ "root" username From 48b5822a33408661a66693b72479ecc59f5c98cd Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:31:02 +0900 Subject: [PATCH 29/50] feat(hyprland): update gesture configuration for workspace management --- config/hyprland/hyprland.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 19e1eb1a0..151f1f16e 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -67,10 +67,10 @@ input { } } -gesture = 3, horizontal, workspace -gesture = 4, horizontal, workspace -gesture = 3, up, dispatcher:hyprexpo:expo toggle -gesture = 4, up, dispatcher:hyprexpo:expo toggle +gestures { + workspace_swipe = true + workspace_swipe_fingers = 3 +} # ============================================================================= # General From f833a86b6d83b2d413e3f377f1f8761e504bc6bd Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:35:16 +0900 Subject: [PATCH 30/50] feat(hyprland): update gesture configuration for workspace management --- config/hyprland/hyprland.conf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 151f1f16e..ace2d3b2a 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -67,10 +67,8 @@ input { } } -gestures { - workspace_swipe = true - workspace_swipe_fingers = 3 -} +gesture = 3, horizontal, workspace +gesture = 4, horizontal, workspace # ============================================================================= # General @@ -297,5 +295,6 @@ plugin { gap_size = 5 bg_col = rgb(282a36) workspace_method = first 1 + gesture_distance = 300 } } From e542a545e1efc6f5647f0548fd29d37ca0502ba7 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:36:09 +0900 Subject: [PATCH 31/50] feat(hyprland): update fullscreen binding to use hyprctl for workspace management --- config/hyprland/hyprland.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index ace2d3b2a..af522ad61 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -179,7 +179,7 @@ bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl- # ============================================================================= bind = $mod, W, killactive, bind = $mod, F, togglefloating, -bind = $mod SHIFT, F, fullscreen, 0 +bind = $mod SHIFT, F, exec, hyprctl --batch "dispatch movetoworkspace empty; dispatch fullscreen 0" bind = $mod SHIFT, Q, exec, wlogout bind = $mod, TAB, hyprexpo:expo, toggle From b1c864d31295214e9bd5f94f38bf3887799f99b2 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:37:08 +0900 Subject: [PATCH 32/50] feat(hyprland): add package definition for hyprland in default.nix --- config/hyprland/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index 835fc207b..8b81dac44 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -7,6 +7,7 @@ { wayland.windowManager.hyprland = { enable = true; + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; systemd.enable = false; plugins = [ inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo From ede5b9e447b7b1a5e2477a681e7627b41bcaaa8b Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:51:38 +0900 Subject: [PATCH 33/50] feat(hyprland): refactor plugin configuration for hyprexpo in default.nix --- config/hyprland/default.nix | 10 +++-- flake.lock | 84 ++++++++++++++++++------------------- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index 8b81dac44..8d112fb45 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -4,15 +4,17 @@ pkgs, ... }: +let + hyprexpoPlugin = inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo; +in { wayland.windowManager.hyprland = { enable = true; package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; systemd.enable = false; - plugins = [ - inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo - ]; - extraConfig = builtins.readFile ./hyprland.conf; + extraConfig = '' + plugin = ${hyprexpoPlugin}/lib/libhyprexpo.so + '' + builtins.readFile ./hyprland.conf; }; xdg.configFile."hypr/hypridle.conf" = { diff --git a/flake.lock b/flake.lock index d9c808919..3a67f9e9f 100644 --- a/flake.lock +++ b/flake.lock @@ -12,11 +12,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1762618334, - "narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=", + "lastModified": 1770165109, + "narHash": "sha256-9VnK6Oqai65puVJ4WYtCTvlJeXxMzAp/69HhQuTdl/I=", "owner": "ryantm", "repo": "agenix", - "rev": "fcdea223397448d35d9b31f798479227e80183f6", + "rev": "b027ee29d959fda4b60b57566d64c98a202e0feb", "type": "github" }, "original": { @@ -126,11 +126,11 @@ ] }, "locked": { - "lastModified": 1769723052, - "narHash": "sha256-pVUZ6DoKfIh6RhhTS2GVUukNeDm6qjXM7/hoUrr0x2Q=", + "lastModified": 1770390537, + "narHash": "sha256-REdgcXkdHHsLMNhPbTP1laBaSX5MAgWnuD9dou3CoQU=", "owner": "cachix", "repo": "devenv", - "rev": "12c672b3ec4e2cfe189636e9200bc70f7a478781", + "rev": "d6f45cc00829254a9a6f8807c8fbfaf3efa7e629", "type": "github" }, "original": { @@ -197,11 +197,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1768135262, - "narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=", + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", "type": "github" }, "original": { @@ -218,11 +218,11 @@ ] }, "locked": { - "lastModified": 1768135262, - "narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=", + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", "type": "github" }, "original": { @@ -290,11 +290,11 @@ ] }, "locked": { - "lastModified": 1769671018, - "narHash": "sha256-F70HHQtEVwpM14/DlFkyTA20sXtWMNVfqDoLLCm4BVI=", + "lastModified": 1770362352, + "narHash": "sha256-M1TbOR4PFVrnMYsxrObK9N8ZVOriMoMAwifx994bBqc=", "owner": "shazow", "repo": "foundry.nix", - "rev": "f843a7245c3cbdf3364c640198039a4186c30444", + "rev": "506da7b70d32763ad022f452907c6f39b1035a66", "type": "github" }, "original": { @@ -380,11 +380,11 @@ ] }, "locked": { - "lastModified": 1769723138, - "narHash": "sha256-kgkwjs33YfJasADIrHjHcTIDs3wNX0xzJhnUP+oldEw=", + "lastModified": 1770318660, + "narHash": "sha256-yFVde8QZK7Dc0Xa8eQDsmxLX4NJNfL1NKfctSyiQgMY=", "owner": "nix-community", "repo": "home-manager", - "rev": "175532b6275b34598a0ceb1aef4b9b4006dd4073", + "rev": "471e6a065f9efed51488d7c51a9abbd387df91b8", "type": "github" }, "original": { @@ -766,11 +766,11 @@ ] }, "locked": { - "lastModified": 1769731486, - "narHash": "sha256-FubWXQX1k1qyVKWiGNVSw2bQ2TD739PRqRsLXS/b2y0=", + "lastModified": 1770336287, + "narHash": "sha256-czvrg8uyf2VWRmbobsthTAIJCg1GH4mEekyW01AvHco=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "0d454d45604a3215057806757beda9bc7390d59e", + "rev": "1cd999cdf20536ac6a6d1aa17ba0242eefd2312b", "type": "github" }, "original": { @@ -782,11 +782,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1769723720, - "narHash": "sha256-gmlHBj1nGfOBaCMEfgHdy/4sbuBXDaVIWNGJVPP+vNw=", + "lastModified": 1770334851, + "narHash": "sha256-FvT3T0l8eNr1Hv+D1Sj1jM/2vLkonLxpadTk6gdYHAo=", "owner": "neovim", "repo": "neovim", - "rev": "52cd9dcff260decda860cf154873b298d10c1208", + "rev": "db133879b2a115cdf982b2899f154f1851d59a60", "type": "github" }, "original": { @@ -821,11 +821,11 @@ ] }, "locked": { - "lastModified": 1769197468, - "narHash": "sha256-EhbVSjqhjykjIzF1FetpEwxjSMXg4ubHpkuEnE0y23A=", + "lastModified": 1770388968, + "narHash": "sha256-i7V6Iz9MZXZntMsJTFV3udH4Cx5NPkiETbhEBPMZEec=", "owner": "cachix", "repo": "nix", - "rev": "6174571301a92afce9b7296d5babdc56972695b7", + "rev": "f68c42c011c5fd48bb8be79071f729c131f35304", "type": "github" }, "original": { @@ -842,11 +842,11 @@ ] }, "locked": { - "lastModified": 1768764703, - "narHash": "sha256-5ulSDyOG1U+1sJhkJHYsUOWEsmtLl97O0NTVMvgIVyc=", + "lastModified": 1770184146, + "narHash": "sha256-DsqnN6LvXmohTRaal7tVZO/AKBuZ02kPBiZKSU4qa/k=", "owner": "LnL7", "repo": "nix-darwin", - "rev": "0fc4e7ac670a0ed874abacf73c4b072a6a58064b", + "rev": "0d7874ef7e3ba02d58bebb871e6e29da36fa1b37", "type": "github" }, "original": { @@ -936,11 +936,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1765674936, - "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=", + "lastModified": 1769909678, + "narHash": "sha256-cBEymOf4/o3FD5AZnzC3J9hLbiZ+QDT/KDuyHXVJOpM=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85", + "rev": "72716169fe93074c333e8d0173151350670b824c", "type": "github" }, "original": { @@ -951,11 +951,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1769527094, - "narHash": "sha256-xV20Alb7ZGN7qujnsi5lG1NckSUmpIb05H2Xar73TDc=", + "lastModified": 1770169770, + "narHash": "sha256-awR8qIwJxJJiOmcEGgP2KUqYmHG4v/z8XpL9z8FnT1A=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "afce96367b2e37fc29afb5543573cd49db3357b7", + "rev": "aa290c9891fa4ebe88f8889e59633d20cc06a5f2", "type": "github" }, "original": { @@ -973,11 +973,11 @@ ] }, "locked": { - "lastModified": 1769745905, - "narHash": "sha256-huISbiqnYDtwjXDVV8NmMyMNAHVNPosiKxCQ9chvWbs=", + "lastModified": 1770392205, + "narHash": "sha256-twpTMfpAknPqMxjwUqyv6fvaw+xLs3MhMKLxqXbO3zw=", "owner": "nix-community", "repo": "NUR", - "rev": "9c0ebcd2bebba1e9fa3335aa280361495d86a715", + "rev": "dbad547d939147cbc5313215a4722d276316c225", "type": "github" }, "original": { @@ -1087,11 +1087,11 @@ ] }, "locked": { - "lastModified": 1769691507, - "narHash": "sha256-8aAYwyVzSSwIhP2glDhw/G0i5+wOrren3v6WmxkVonM=", + "lastModified": 1770228511, + "narHash": "sha256-wQ6NJSuFqAEmIg2VMnLdCnUc0b7vslUohqqGGD+Fyxk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "28b19c5844cc6e2257801d43f2772a4b4c050a1b", + "rev": "337a4fe074be1042a35086f15481d763b8ddc0e7", "type": "github" }, "original": { From 54e0a1c843e68b9d3a1a8b050d15ce56c92bb070 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 01:51:53 +0900 Subject: [PATCH 34/50] feat(hyprland): fix formatting of extraConfig in default.nix --- config/hyprland/default.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index 8d112fb45..78199c03a 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -14,7 +14,8 @@ in systemd.enable = false; extraConfig = '' plugin = ${hyprexpoPlugin}/lib/libhyprexpo.so - '' + builtins.readFile ./hyprland.conf; + '' + + builtins.readFile ./hyprland.conf; }; xdg.configFile."hypr/hypridle.conf" = { From 80ad0edf0ac5e1ca065fa59a8c843b2d2e3e3599 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:14:18 +0900 Subject: [PATCH 35/50] feat(hyprland): update Hyprland URL to specific version v0.53.3 in flake.nix and modify lock file entries --- flake.lock | 31 ++++++++++++++++--------------- flake.nix | 2 +- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/flake.lock b/flake.lock index 3a67f9e9f..c0e727553 100644 --- a/flake.lock +++ b/flake.lock @@ -45,11 +45,11 @@ ] }, "locked": { - "lastModified": 1769428758, - "narHash": "sha256-0G/GzF7lkWs/yl82bXuisSqPn6sf8YGTnbEdFOXvOfU=", + "lastModified": 1767654173, + "narHash": "sha256-mhG+EgXJU0hiFzX1dPqrVTw5geza/ZvJlRVMnxryBP4=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "def5e74c97370f15949a67c62e61f1459fcb0e15", + "rev": "534c88e2f20ee728123464dba28c441d55be14c3", "type": "github" }, "original": { @@ -438,11 +438,11 @@ ] }, "locked": { - "lastModified": 1769284023, - "narHash": "sha256-xG34vwYJ79rA2wVC8KFuM8r36urJTG6/csXx7LiiSYU=", + "lastModified": 1768238867, + "narHash": "sha256-7pYinsOU0liNUzODFoDCx3ai+jqwDi39AIIuFgtYVnA=", "owner": "hyprwm", "repo": "hyprgraphics", - "rev": "13c536659d46893596412d180449353a900a1d31", + "rev": "583331e06581cf4a4113d5adafc969e821512c19", "type": "github" }, "original": { @@ -468,15 +468,16 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1770330959, - "narHash": "sha256-OPmJ6dBL615GGX7ENJXtJm4zeMv5uXDjmO8WB1MI5wM=", + "lastModified": 1769284926, + "narHash": "sha256-KqZHDwwVRq2I1RiNjh5XM6NOU51DA0EvAeYTcItBy8E=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "562171ab668e7ee98a9d2bbb62a9477ad2b1e24e", + "rev": "dd220efe7b1e292415bd0ea7161f63df9c95bfd3", "type": "github" }, "original": { "owner": "hyprwm", + "ref": "v0.53.3", "repo": "Hyprland", "type": "github" } @@ -729,11 +730,11 @@ ] }, "locked": { - "lastModified": 1769202094, - "narHash": "sha256-gdJr/vWWLRW85ucatSjoBULPB2dqBJd/53CZmQ9t91Q=", + "lastModified": 1769109506, + "narHash": "sha256-LkQIKoyabNz8EqqAlTTTAcszPl3Dk7df8ctJj7Ah7kc=", "owner": "hyprwm", "repo": "hyprwire", - "rev": "a45ca05050d22629b3c7969a926d37870d7dd75c", + "rev": "ee9c7e8dc2e1552d1028d18d20ea410f75512f74", "type": "github" }, "original": { @@ -920,11 +921,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1769461804, - "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", + "lastModified": 1769018530, + "narHash": "sha256-MJ27Cy2NtBEV5tsK+YraYr2g851f3Fl1LpNHDzDX15c=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", + "rev": "88d3861acdd3d2f0e361767018218e51810df8a1", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 0d9746e99..4a1aeeba3 100644 --- a/flake.nix +++ b/flake.nix @@ -52,7 +52,7 @@ url = "github:NixOS/nixos-hardware/master"; }; hyprland = { - url = "github:hyprwm/Hyprland"; + url = "github:hyprwm/Hyprland/v0.53.3"; }; hyprland-plugins = { url = "github:hyprwm/hyprland-plugins"; From cf3ac9204eccf71b40e3561dafccfb7b7195d0ca Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:18:29 +0900 Subject: [PATCH 36/50] Revert "feat(hyprland): update Hyprland URL to specific version v0.53.3 in flake.nix and modify lock file entries" This reverts commit 80ad0edf0ac5e1ca065fa59a8c843b2d2e3e3599. --- flake.lock | 31 +++++++++++++++---------------- flake.nix | 2 +- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/flake.lock b/flake.lock index c0e727553..3a67f9e9f 100644 --- a/flake.lock +++ b/flake.lock @@ -45,11 +45,11 @@ ] }, "locked": { - "lastModified": 1767654173, - "narHash": "sha256-mhG+EgXJU0hiFzX1dPqrVTw5geza/ZvJlRVMnxryBP4=", + "lastModified": 1769428758, + "narHash": "sha256-0G/GzF7lkWs/yl82bXuisSqPn6sf8YGTnbEdFOXvOfU=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "534c88e2f20ee728123464dba28c441d55be14c3", + "rev": "def5e74c97370f15949a67c62e61f1459fcb0e15", "type": "github" }, "original": { @@ -438,11 +438,11 @@ ] }, "locked": { - "lastModified": 1768238867, - "narHash": "sha256-7pYinsOU0liNUzODFoDCx3ai+jqwDi39AIIuFgtYVnA=", + "lastModified": 1769284023, + "narHash": "sha256-xG34vwYJ79rA2wVC8KFuM8r36urJTG6/csXx7LiiSYU=", "owner": "hyprwm", "repo": "hyprgraphics", - "rev": "583331e06581cf4a4113d5adafc969e821512c19", + "rev": "13c536659d46893596412d180449353a900a1d31", "type": "github" }, "original": { @@ -468,16 +468,15 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1769284926, - "narHash": "sha256-KqZHDwwVRq2I1RiNjh5XM6NOU51DA0EvAeYTcItBy8E=", + "lastModified": 1770330959, + "narHash": "sha256-OPmJ6dBL615GGX7ENJXtJm4zeMv5uXDjmO8WB1MI5wM=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "dd220efe7b1e292415bd0ea7161f63df9c95bfd3", + "rev": "562171ab668e7ee98a9d2bbb62a9477ad2b1e24e", "type": "github" }, "original": { "owner": "hyprwm", - "ref": "v0.53.3", "repo": "Hyprland", "type": "github" } @@ -730,11 +729,11 @@ ] }, "locked": { - "lastModified": 1769109506, - "narHash": "sha256-LkQIKoyabNz8EqqAlTTTAcszPl3Dk7df8ctJj7Ah7kc=", + "lastModified": 1769202094, + "narHash": "sha256-gdJr/vWWLRW85ucatSjoBULPB2dqBJd/53CZmQ9t91Q=", "owner": "hyprwm", "repo": "hyprwire", - "rev": "ee9c7e8dc2e1552d1028d18d20ea410f75512f74", + "rev": "a45ca05050d22629b3c7969a926d37870d7dd75c", "type": "github" }, "original": { @@ -921,11 +920,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1769018530, - "narHash": "sha256-MJ27Cy2NtBEV5tsK+YraYr2g851f3Fl1LpNHDzDX15c=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "88d3861acdd3d2f0e361767018218e51810df8a1", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 4a1aeeba3..0d9746e99 100644 --- a/flake.nix +++ b/flake.nix @@ -52,7 +52,7 @@ url = "github:NixOS/nixos-hardware/master"; }; hyprland = { - url = "github:hyprwm/Hyprland/v0.53.3"; + url = "github:hyprwm/Hyprland"; }; hyprland-plugins = { url = "github:hyprwm/hyprland-plugins"; From 8012ff8d16c7a2d8bad0b5bb672bd32ec976fdd2 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:20:09 +0900 Subject: [PATCH 37/50] feat(hyprland): simplify hyprexpo plugin and package references in default.nix --- config/hyprland/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/hyprland/default.nix b/config/hyprland/default.nix index 78199c03a..d2279b80d 100644 --- a/config/hyprland/default.nix +++ b/config/hyprland/default.nix @@ -5,12 +5,12 @@ ... }: let - hyprexpoPlugin = inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo; + hyprexpoPlugin = pkgs.hyprlandPlugins.hyprexpo; in { wayland.windowManager.hyprland = { enable = true; - package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + package = pkgs.hyprland; systemd.enable = false; extraConfig = '' plugin = ${hyprexpoPlugin}/lib/libhyprexpo.so From 9a84a02dcb5cbd7df2a3be0356829775b02a86ba Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:22:14 +0900 Subject: [PATCH 38/50] feat(hyprland): remove hyprland and hyprland-plugins inputs from flake.nix and update default.nix to use pkgs directly --- flake.lock | 527 +--------------------------------- flake.nix | 7 - named-hosts/matic/default.nix | 5 +- 3 files changed, 7 insertions(+), 532 deletions(-) diff --git a/flake.lock b/flake.lock index 3a67f9e9f..a5791b8cc 100644 --- a/flake.lock +++ b/flake.lock @@ -25,39 +25,6 @@ "type": "github" } }, - "aquamarine": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1769428758, - "narHash": "sha256-0G/GzF7lkWs/yl82bXuisSqPn6sf8YGTnbEdFOXvOfU=", - "owner": "hyprwm", - "repo": "aquamarine", - "rev": "def5e74c97370f15949a67c62e61f1459fcb0e15", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "aquamarine", - "type": "github" - } - }, "cachix": { "inputs": { "devenv": [ @@ -155,22 +122,6 @@ "type": "github" } }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1767039857, - "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", - "owner": "NixOS", - "repo": "flake-compat", - "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "flake-compat", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -351,28 +302,6 @@ "type": "github" } }, - "gitignore_2": { - "inputs": { - "nixpkgs": [ - "hyprland", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "home-manager": { "inputs": { "nixpkgs": [ @@ -393,355 +322,6 @@ "type": "github" } }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1753964049, - "narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, - "hyprgraphics": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1769284023, - "narHash": "sha256-xG34vwYJ79rA2wVC8KFuM8r36urJTG6/csXx7LiiSYU=", - "owner": "hyprwm", - "repo": "hyprgraphics", - "rev": "13c536659d46893596412d180449353a900a1d31", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprgraphics", - "type": "github" - } - }, - "hyprland": { - "inputs": { - "aquamarine": "aquamarine", - "hyprcursor": "hyprcursor", - "hyprgraphics": "hyprgraphics", - "hyprland-guiutils": "hyprland-guiutils", - "hyprland-protocols": "hyprland-protocols", - "hyprlang": "hyprlang", - "hyprutils": "hyprutils", - "hyprwayland-scanner": "hyprwayland-scanner", - "hyprwire": "hyprwire", - "nixpkgs": "nixpkgs", - "pre-commit-hooks": "pre-commit-hooks", - "systems": "systems_2", - "xdph": "xdph" - }, - "locked": { - "lastModified": 1770330959, - "narHash": "sha256-OPmJ6dBL615GGX7ENJXtJm4zeMv5uXDjmO8WB1MI5wM=", - "owner": "hyprwm", - "repo": "Hyprland", - "rev": "562171ab668e7ee98a9d2bbb62a9477ad2b1e24e", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "Hyprland", - "type": "github" - } - }, - "hyprland-guiutils": { - "inputs": { - "aquamarine": [ - "hyprland", - "aquamarine" - ], - "hyprgraphics": [ - "hyprland", - "hyprgraphics" - ], - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "hyprtoolkit": "hyprtoolkit", - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1767023960, - "narHash": "sha256-R2HgtVS1G3KSIKAQ77aOZ+Q0HituOmPgXW9nBNkpp3Q=", - "owner": "hyprwm", - "repo": "hyprland-guiutils", - "rev": "c2e906261142f5dd1ee0bfc44abba23e2754c660", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-guiutils", - "type": "github" - } - }, - "hyprland-plugins": { - "inputs": { - "hyprland": [ - "hyprland" - ], - "nixpkgs": [ - "hyprland-plugins", - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland-plugins", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1769285097, - "narHash": "sha256-eVD4U3Oqzz0VU9ylJ5wo76xDcYKv2CpiiRXq4Is4QdA=", - "owner": "hyprwm", - "repo": "hyprland-plugins", - "rev": "06c0749a0dac978d89b1a76ae6adc76a3c15dbfa", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-plugins", - "type": "github" - } - }, - "hyprland-protocols": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1765214753, - "narHash": "sha256-P9zdGXOzToJJgu5sVjv7oeOGPIIwrd9hAUAP3PsmBBs=", - "owner": "hyprwm", - "repo": "hyprland-protocols", - "rev": "3f3860b869014c00e8b9e0528c7b4ddc335c21ab", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-protocols", - "type": "github" - } - }, - "hyprlang": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1767983607, - "narHash": "sha256-8C2co8NYfR4oMOUEsPROOJ9JHrv9/ktbJJ6X1WsTbXc=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "d4037379e6057246b408bbcf796cf3e9838af5b2", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprtoolkit": { - "inputs": { - "aquamarine": [ - "hyprland", - "hyprland-guiutils", - "aquamarine" - ], - "hyprgraphics": [ - "hyprland", - "hyprland-guiutils", - "hyprgraphics" - ], - "hyprlang": [ - "hyprland", - "hyprland-guiutils", - "hyprlang" - ], - "hyprutils": [ - "hyprland", - "hyprland-guiutils", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprland-guiutils", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "hyprland-guiutils", - "nixpkgs" - ], - "systems": [ - "hyprland", - "hyprland-guiutils", - "systems" - ] - }, - "locked": { - "lastModified": 1764592794, - "narHash": "sha256-7CcO+wbTJ1L1NBQHierHzheQGPWwkIQug/w+fhTAVuU=", - "owner": "hyprwm", - "repo": "hyprtoolkit", - "rev": "5cfe0743f0e608e1462972303778d8a0859ee63e", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprtoolkit", - "type": "github" - } - }, - "hyprutils": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1766253372, - "narHash": "sha256-1+p4Kw8HdtMoFSmJtfdwjxM4bPxDK9yg27SlvUMpzWA=", - "owner": "hyprwm", - "repo": "hyprutils", - "rev": "51a4f93ce8572e7b12b7284eb9e6e8ebf16b4be9", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprutils", - "type": "github" - } - }, - "hyprwayland-scanner": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1763640274, - "narHash": "sha256-Uan1Nl9i4TF/kyFoHnTq1bd/rsWh4GAK/9/jDqLbY5A=", - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "rev": "f6cf414ca0e16a4d30198fd670ec86df3c89f671", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "type": "github" - } - }, - "hyprwire": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1769202094, - "narHash": "sha256-gdJr/vWWLRW85ucatSjoBULPB2dqBJd/53CZmQ9t91Q=", - "owner": "hyprwm", - "repo": "hyprwire", - "rev": "a45ca05050d22629b3c7969a926d37870d7dd75c", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwire", - "type": "github" - } - }, "mk-shell-bin": { "locked": { "lastModified": 1677004959, @@ -920,16 +500,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1769461804, - "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", + "lastModified": 1770169770, + "narHash": "sha256-awR8qIwJxJJiOmcEGgP2KUqYmHG4v/z8XpL9z8FnT1A=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", + "rev": "aa290c9891fa4ebe88f8889e59633d20cc06a5f2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -949,22 +529,6 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1770169770, - "narHash": "sha256-awR8qIwJxJJiOmcEGgP2KUqYmHG4v/z8XpL9z8FnT1A=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "aa290c9891fa4ebe88f8889e59633d20cc06a5f2", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nur": { "inputs": { "flake-parts": "flake-parts_4", @@ -986,29 +550,6 @@ "type": "github" } }, - "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat_2", - "gitignore": "gitignore_2", - "nixpkgs": [ - "hyprland", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1769069492, - "narHash": "sha256-Efs3VUPelRduf3PpfPP2ovEB4CXT7vHf8W+xc49RL/U=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "a1ef738813b15cf8ec759bdff5761b027e3e1d23", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, "root": { "inputs": { "agenix": "agenix", @@ -1016,14 +557,12 @@ "flake-parts": "flake-parts_2", "foundry": "foundry", "home-manager": "home-manager", - "hyprland": "hyprland", - "hyprland-plugins": "hyprland-plugins", "mk-shell-bin": "mk-shell-bin", "neovim-nightly-overlay": "neovim-nightly-overlay", "nix-darwin": "nix-darwin", "nix2container": "nix2container", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "nur": "nur", "treefmt-nix": "treefmt-nix_2" } @@ -1043,21 +582,6 @@ "type": "github" } }, - "systems_2": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -1099,47 +623,6 @@ "repo": "treefmt-nix", "type": "github" } - }, - "xdph": { - "inputs": { - "hyprland-protocols": [ - "hyprland", - "hyprland-protocols" - ], - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1761431178, - "narHash": "sha256-xzjC1CV3+wpUQKNF+GnadnkeGUCJX+vgaWIZsnz9tzI=", - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "rev": "4b8801228ff958d028f588f0c2b911dbf32297f9", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 0d9746e99..3e7191ed7 100644 --- a/flake.nix +++ b/flake.nix @@ -51,13 +51,6 @@ nixos-hardware = { url = "github:NixOS/nixos-hardware/master"; }; - hyprland = { - url = "github:hyprwm/Hyprland"; - }; - hyprland-plugins = { - url = "github:hyprwm/hyprland-plugins"; - inputs.hyprland.follows = "hyprland"; - }; }; outputs = diff --git a/named-hosts/matic/default.nix b/named-hosts/matic/default.nix index ac8ff945c..fb9bba17f 100644 --- a/named-hosts/matic/default.nix +++ b/named-hosts/matic/default.nix @@ -120,9 +120,8 @@ inputs.nixpkgs.lib.nixosSystem { programs.hyprland = { enable = true; - package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; - portalPackage = - inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + package = pkgs.hyprland; + portalPackage = pkgs.xdg-desktop-portal-hyprland; xwayland.enable = true; withUWSM = true; }; From bc47c2422711b6b951d2636531ae76997d4b008b Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:24:47 +0900 Subject: [PATCH 39/50] feat(hyprland): add gesture bindings for hyprexpo and adjust plugin settings --- config/hyprland/hyprland.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index af522ad61..e560b7577 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -69,6 +69,8 @@ input { gesture = 3, horizontal, workspace gesture = 4, horizontal, workspace +bind = , swipe:3:u, hyprexpo:expo, toggle +bind = , swipe:4:u, hyprexpo:expo, toggle # ============================================================================= # General @@ -295,6 +297,7 @@ plugin { gap_size = 5 bg_col = rgb(282a36) workspace_method = first 1 + gesture_fingers = 0 gesture_distance = 300 } } From 28b68e47160eb3d97df71aeab6476fc76a5ec678 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:27:24 +0900 Subject: [PATCH 40/50] feat(hyprland): update gesture settings and enhance keyd configuration for media controls --- config/hyprland/hyprland.conf | 6 ++---- config/keyd/default.conf | 13 +++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index e560b7577..d585b9bf3 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -67,10 +67,7 @@ input { } } -gesture = 3, horizontal, workspace gesture = 4, horizontal, workspace -bind = , swipe:3:u, hyprexpo:expo, toggle -bind = , swipe:4:u, hyprexpo:expo, toggle # ============================================================================= # General @@ -297,7 +294,8 @@ plugin { gap_size = 5 bg_col = rgb(282a36) workspace_method = first 1 - gesture_fingers = 0 + gesture_fingers = 3 gesture_distance = 300 + gesture_positive = true } } diff --git a/config/keyd/default.conf b/config/keyd/default.conf index 9fa65a94c..60ff1dae5 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -12,6 +12,19 @@ rightalt = layer(meta) prog1 = layer(cmd_mac) f13 = layer(cmd_mac) +# Function row -> media keys (Framework sends F1-F12 by default) +f1 = mute +f2 = volumedown +f3 = volumeup +f4 = previoussong +f5 = nextsong +f6 = playpause +f7 = brightnessdown +f8 = brightnessup +f9 = display +f10 = rfkill +f11 = print + # Right Shift double-tap -> Caps Lock (tap twice) rightshift = overload(shift, oneshot(rshift)) From 781c776b7519b2eb909afe65878731b913d3fd86 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:29:14 +0900 Subject: [PATCH 41/50] feat(keyd): add leftmeta key mapping and update restart triggers in default.nix --- config/keyd/default.conf | 2 ++ config/keyd/default.nix | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/config/keyd/default.conf b/config/keyd/default.conf index 60ff1dae5..ce3f55ddd 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -9,6 +9,8 @@ capslock = layer(meta) rightalt = layer(meta) # Framework key = macOS-style Command (copy/paste/undo) +# leftmeta is the actual keycode on Framework 13 AI 300 +leftmeta = layer(cmd_mac) prog1 = layer(cmd_mac) f13 = layer(cmd_mac) diff --git a/config/keyd/default.nix b/config/keyd/default.nix index f6b3cf182..3bdae96c6 100644 --- a/config/keyd/default.nix +++ b/config/keyd/default.nix @@ -9,5 +9,10 @@ AmbientCapabilities = [ "CAP_SETGID" ]; }; + # Restart keyd when config changes (on make switch) + systemd.services.keyd.restartTriggers = [ + (builtins.hashFile "sha256" ./default.conf) + ]; + environment.etc."keyd/default.conf".source = ./default.conf; } From 9c54d03d8ebad39501d7d34041622f8b82fdd2ae Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:30:24 +0900 Subject: [PATCH 42/50] feat(hyprland): add key bindings for function keys to control audio and brightness --- config/hyprland/hyprland.conf | 11 +++++++++++ config/keyd/default.conf | 13 ------------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index d585b9bf3..7ba6cdbb3 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -253,27 +253,38 @@ bind = $mod SHIFT, S, exec, grim -g "$(slurp)" - | swappy -f - # ============================================================================= # F1: Mute speaker bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindl = , F1, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle # F2: Volume down bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = , F2, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- # F3: Volume up bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = , F3, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ # F4: Previous track bindl = , XF86AudioPrev, exec, playerctl previous +bindl = , F4, exec, playerctl previous # F5: Next track bindl = , XF86AudioNext, exec, playerctl next +bindl = , F5, exec, playerctl next # F6: Play/pause bindl = , XF86AudioPlay, exec, playerctl play-pause bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , F6, exec, playerctl play-pause # F7: Brightness down bindel = , XF86MonBrightnessDown, exec, brightnessctl set 5%- +bindel = , F7, exec, brightnessctl set 5%- # F8: Brightness up bindel = , XF86MonBrightnessUp, exec, brightnessctl set 5%+ +bindel = , F8, exec, brightnessctl set 5%+ # F9: Display toggle bindl = , XF86Display, exec, hyprctl keyword monitor "eDP-1, toggle" +bindl = , F9, exec, hyprctl keyword monitor "eDP-1, toggle" # F10: Airplane mode bindl = , XF86RFKill, exec, nmcli radio wifi toggle +bindl = , F10, exec, nmcli radio wifi toggle # F11: Print screen bind = , Print, exec, grim -g "$(slurp)" - | swappy -f - +bind = , F11, exec, grim -g "$(slurp)" - | swappy -f - # ============================================================================= # Lock Screen diff --git a/config/keyd/default.conf b/config/keyd/default.conf index ce3f55ddd..0a143f77c 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -14,19 +14,6 @@ leftmeta = layer(cmd_mac) prog1 = layer(cmd_mac) f13 = layer(cmd_mac) -# Function row -> media keys (Framework sends F1-F12 by default) -f1 = mute -f2 = volumedown -f3 = volumeup -f4 = previoussong -f5 = nextsong -f6 = playpause -f7 = brightnessdown -f8 = brightnessup -f9 = display -f10 = rfkill -f11 = print - # Right Shift double-tap -> Caps Lock (tap twice) rightshift = overload(shift, oneshot(rshift)) From 41dcbde937663f09e4deeda4d663932f97ee8a3d Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:34:10 +0900 Subject: [PATCH 43/50] feat(hyprland): update F9 key binding to toggle display scale between 1.0x and 1.5x --- config/hyprland/hyprland.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 7ba6cdbb3..138464ae4 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -276,9 +276,9 @@ bindel = , F7, exec, brightnessctl set 5%- # F8: Brightness up bindel = , XF86MonBrightnessUp, exec, brightnessctl set 5%+ bindel = , F8, exec, brightnessctl set 5%+ -# F9: Display toggle -bindl = , XF86Display, exec, hyprctl keyword monitor "eDP-1, toggle" -bindl = , F9, exec, hyprctl keyword monitor "eDP-1, toggle" +# F9: Toggle display scale (1.0x <-> 1.5x) +bindl = , XF86Display, exec, hyprctl -j monitors | grep -q '"scale": 1.5' && hyprctl keyword monitor "eDP-1, preferred, auto, 1.0" || hyprctl keyword monitor "eDP-1, preferred, auto, 1.5" +bindl = , F9, exec, hyprctl -j monitors | grep -q '"scale": 1.5' && hyprctl keyword monitor "eDP-1, preferred, auto, 1.0" || hyprctl keyword monitor "eDP-1, preferred, auto, 1.5" # F10: Airplane mode bindl = , XF86RFKill, exec, nmcli radio wifi toggle bindl = , F10, exec, nmcli radio wifi toggle From 4859b7aeedb8e0fbdce4139ec7c3b3ea731faa8c Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:36:54 +0900 Subject: [PATCH 44/50] feat(ghostty): add key bindings for copy and paste functionality --- config/ghostty/config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/ghostty/config b/config/ghostty/config index 02c8db8d8..10038e538 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -16,6 +16,8 @@ mouse-hide-while-typing = true clipboard-read = "allow" clipboard-paste-protection = false +keybind = ctrl+c=copy_to_clipboard +keybind = ctrl+v=paste_from_clipboard keybind = super+alt+left=previous_tab keybind = super+alt+right=next_tab keybind = super+shift+left=move_tab:-1 From 89e3008ca5fd18b0dd20ddf112c42b0a8000d760 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:46:58 +0900 Subject: [PATCH 45/50] feat(hyprland): add key binding for emoji selection and update gesture configuration --- config/hyprland/hyprland.conf | 3 ++- home-manager/packages/default.nix | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 138464ae4..a5be3f131 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -171,6 +171,7 @@ bind = $mod, N, exec, ghostty -e yazi # ============================================================================= bind = $mod, V, exec, code bind = $mod, D, exec, wofi --show drun +bind = $mod, E, exec, wofi-emoji bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy # ============================================================================= @@ -307,6 +308,6 @@ plugin { workspace_method = first 1 gesture_fingers = 3 gesture_distance = 300 - gesture_positive = true + gesture_positive = false } } diff --git a/home-manager/packages/default.nix b/home-manager/packages/default.nix index 97b77207f..e73f226a6 100644 --- a/home-manager/packages/default.nix +++ b/home-manager/packages/default.nix @@ -146,4 +146,5 @@ with pkgs; wlogout wob wofi + wofi-emoji ] From 3022a3c435727c70a58ba68d8584980e0508c543 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 02:52:46 +0900 Subject: [PATCH 46/50] feat(hyprland): update fullscreen key binding to use Ctrl+Super+F feat(keyd): add mapping for Ctrl+Super+F to trigger fullscreen in Hyprland --- config/hyprland/hyprland.conf | 2 +- config/keyd/default.conf | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index a5be3f131..d419243cd 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -179,7 +179,7 @@ bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl- # ============================================================================= bind = $mod, W, killactive, bind = $mod, F, togglefloating, -bind = $mod SHIFT, F, exec, hyprctl --batch "dispatch movetoworkspace empty; dispatch fullscreen 0" +bind = SUPER CTRL, F, fullscreen, 0 bind = $mod SHIFT, Q, exec, wlogout bind = $mod, TAB, hyprexpo:expo, toggle diff --git a/config/keyd/default.conf b/config/keyd/default.conf index 0a143f77c..ce56b3a95 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -27,3 +27,5 @@ v = C-v x = C-x z = C-z a = C-a +# Framework+Ctrl+F → Ctrl+Super+F (fullscreen in Hyprland) +C-f = C-M-f From 98945b37b39d8695531656b1606ff30615a3a664 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 03:12:59 +0900 Subject: [PATCH 47/50] feat(hyprland): update fullscreen key binding to use Ctrl+Alt+Shift+F --- config/hyprland/hyprland.conf | 1 + config/keyd/default.conf | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index d419243cd..e91f6eab8 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -179,6 +179,7 @@ bind = $mod SHIFT, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl- # ============================================================================= bind = $mod, W, killactive, bind = $mod, F, togglefloating, +bind = CTRL ALT SHIFT, F, exec, hyprctl --batch "dispatch movetoworkspace empty; dispatch fullscreen 0" bind = SUPER CTRL, F, fullscreen, 0 bind = $mod SHIFT, Q, exec, wlogout bind = $mod, TAB, hyprexpo:expo, toggle diff --git a/config/keyd/default.conf b/config/keyd/default.conf index ce56b3a95..3d2d3fa04 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -27,5 +27,5 @@ v = C-v x = C-x z = C-z a = C-a -# Framework+Ctrl+F → Ctrl+Super+F (fullscreen in Hyprland) -C-f = C-M-f +# Framework+Ctrl+F → Ctrl+Alt+Shift+F (fullscreen in Hyprland) +C-f = C-A-S-f From 2f2d4ca25176dfcd2759e7a493277a3b806c2b00 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 03:15:09 +0900 Subject: [PATCH 48/50] feat(hyprland): update fullscreen key binding to use Ctrl+Alt+Shift+F --- config/keyd/default.conf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/keyd/default.conf b/config/keyd/default.conf index 3d2d3fa04..e38901bb3 100644 --- a/config/keyd/default.conf +++ b/config/keyd/default.conf @@ -27,5 +27,7 @@ v = C-v x = C-x z = C-z a = C-a + +[cmd_mac+control] # Framework+Ctrl+F → Ctrl+Alt+Shift+F (fullscreen in Hyprland) -C-f = C-A-S-f +f = C-A-S-f From 247d0b63d1d1e09d09f5e5f26fcec5adfae025e0 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 03:17:04 +0900 Subject: [PATCH 49/50] feat(fish): add key bindings for clipboard paste functionality --- .../programs/fish/functions/fish_user_key_bindings.fish | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/home-manager/programs/fish/functions/fish_user_key_bindings.fish b/home-manager/programs/fish/functions/fish_user_key_bindings.fish index 453c73d0d..9e59c0f29 100644 --- a/home-manager/programs/fish/functions/fish_user_key_bindings.fish +++ b/home-manager/programs/fish/functions/fish_user_key_bindings.fish @@ -5,4 +5,8 @@ function fish_user_key_bindings # Exit vim insert mode with jj (like in Vim) bind -M insert jj 'set fish_bind_mode default; commandline -f repaint-mode' + + # Ctrl+V = paste from clipboard (macOS-style via keyd Framework key) + bind \cv fish_clipboard_paste + bind -M insert \cv fish_clipboard_paste end From 0d18047f044d44710ff8eb452611bb4265472ac5 Mon Sep 17 00:00:00 2001 From: Shun Kakinoki Date: Sat, 7 Feb 2026 03:19:00 +0900 Subject: [PATCH 50/50] feat(ghostty): enable clipboard write and copy-on-select functionality --- config/ghostty/config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/ghostty/config b/config/ghostty/config index 10038e538..d9ece2995 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -14,7 +14,9 @@ cursor-style = bar cursor-style-blink = true mouse-hide-while-typing = true clipboard-read = "allow" +clipboard-write = "allow" clipboard-paste-protection = false +copy-on-select = clipboard keybind = ctrl+c=copy_to_clipboard keybind = ctrl+v=paste_from_clipboard