Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 5 additions & 14 deletions config/hyprland/hyprland.conf
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ exec-once = hypridle
exec-once = hyprsunset

# Clipboard persistence
exec-once = wl-clip-persist --clipboard regular & clipse -listen
exec-once = wl-clip-persist --clipboard regular

# =============================================================================
# Monitor (Framework 13" 2256x1504)
Expand Down Expand Up @@ -187,11 +187,6 @@ windowrule = move 100%-340 60, $meetPip
# Settings management (float for audio/bluetooth GUIs)
windowrule = float on, match:class ^(org.pulseaudio.pavucontrol|.blueman-manager-wrapped|blueman-manager)$

# Clipse clipboard manager (float centered)
windowrule = float on, match:class ^(clipse)$
windowrule = size 622 652, match:class ^(clipse)$
windowrule = stay_focused on, match:class ^(clipse)$

# Suppress maximize for all windows
windowrule = suppress_event maximize, match:class .*

Expand Down Expand Up @@ -265,7 +260,7 @@ bind = $mod SHIFT, W, exec, hyprctl -j clients | jq -r '.[] | select(.workspace.
bind = $mod, Q, killactive,
bind = $mod SHIFT, F, togglefloating,
bind = CTRL ALT SHIFT SUPER, F, exec, hyprctl --batch "dispatch movetoworkspace empty; dispatch fullscreen 0"
bind = SUPER CTRL, F, fullscreen, 0
bind = SUPER CTRL, F, fullscreen, 1
bind = $mod SHIFT, Q, exec, hyprpanel toggleWindow power-menu
bind = $mod, TAB, hyprexpo:expo, toggle

Expand All @@ -282,8 +277,8 @@ 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, H, movetoworkspace, r-1
bind = $mod SHIFT, L, movetoworkspace, r+1
bind = $mod SHIFT, K, movewindow, u
bind = $mod SHIFT, J, movewindow, d

Expand Down Expand Up @@ -385,10 +380,6 @@ bind = $mod, PRINT, exec, hyprpicker -a
# Clipboard manager (cliphist + rofi, auto-paste on selection)
bind = $mod SHIFT, V, exec, cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy && sleep 0.1 && wtype -M ctrl -k v -m ctrl

# Clipboard manager TUI with image preview (clipse)
# Use $mod+Ctrl+V instead of Hyper+V to avoid xremap conflict (Hyper+V → Ctrl+V)
bind = $mod CTRL, V, exec, ghostty --class clipse -e clipse

# =============================================================================
# Media / Hardware Keys (Framework 13 AI 300)
# =============================================================================
Expand Down Expand Up @@ -437,7 +428,7 @@ binde = CTRL ALT SHIFT SUPER, minus, exec, hyprctl -j monitors | jq -r '.[0].sca
# =============================================================================
# Lock Screen
# =============================================================================
bind = $mod SHIFT, L, exec, hyprlock
bind = CTRL ALT SHIFT SUPER, L, exec, hyprlock

# =============================================================================
# Notification Toggle
Expand Down
34 changes: 34 additions & 0 deletions home-manager/modules/bin-shells/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{ lib, pkgs, ... }:
let
inherit (pkgs.stdenv) isLinux;
in
{
config = lib.mkIf isLinux {
home.activation.binShells = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
Comment on lines +1 to +7

Copilot AI Feb 13, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This activation entry uses lib.hm.dag.entryAfter, but the other home-manager modules in this repo consistently use config.lib.dag.entryAfter. Aligning with that pattern avoids surprises and keeps the module interface consistent (also add config to the arg set if you switch).

Suggested change
{ lib, pkgs, ... }:
let
inherit (pkgs.stdenv) isLinux;
in
{
config = lib.mkIf isLinux {
home.activation.binShells = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
{ config, lib, pkgs, ... }:
let
inherit (pkgs.stdenv) isLinux;
in
{
config = lib.mkIf isLinux {
home.activation.binShells = config.lib.dag.entryAfter [ "writeBoundary" ] ''

Copilot uses AI. Check for mistakes.
SUDO_CMD=""
if command -v sudo >/dev/null 2>&1; then
SUDO_CMD="sudo"
elif [ -x /run/wrappers/bin/sudo ]; then
SUDO_CMD="/run/wrappers/bin/sudo"
elif [ -x /usr/bin/sudo ]; then
SUDO_CMD="/usr/bin/sudo"
elif [ "$(id -u)" -ne 0 ]; then
echo "Creating /bin shell symlinks requires root privileges, but sudo is not available." >&2
exit 1
Comment on lines +15 to +17

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

exit 1 aborts the entire home-manager activation, not just this step.

If sudo isn't available and the user isn't root, exit 1 will halt all remaining activation entries (config writes, service restarts, etc.). For a non-critical convenience feature like /bin symlinks, prefer logging a warning and continuing.

Proposed fix
       elif [ "$(id -u)" -ne 0 ]; then
         echo "Creating /bin shell symlinks requires root privileges, but sudo is not available." >&2
-        exit 1
+        return 0
       fi

Note: home-manager activation entries are wrapped in functions, so return is valid here and will skip only this activation step.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
elif [ "$(id -u)" -ne 0 ]; then
echo "Creating /bin shell symlinks requires root privileges, but sudo is not available." >&2
exit 1
elif [ "$(id -u)" -ne 0 ]; then
echo "Creating /bin shell symlinks requires root privileges, but sudo is not available." >&2
return 0
🤖 Prompt for AI Agents
In `@home-manager/modules/bin-shells/default.nix` around lines 15 - 17, The
current activation step aborts the entire home-manager activation by calling
exit 1 in the branch that checks elif [ "$(id -u)" -ne 0 ]; instead log the
warning ("Creating /bin shell symlinks requires root privileges, but sudo is not
available.") to stderr and replace exit 1 with a return so only this activation
entry is skipped; update the conditional branch that performs the /bin symlink
creation to return after logging when not root and sudo is unavailable.

fi

run_root_cmd() {
if [ -n "$SUDO_CMD" ]; then
''${DRY_RUN_CMD:-} "$SUDO_CMD" "$@"
else
''${DRY_RUN_CMD:-} "$@"
fi
}

run_root_cmd mkdir -p /bin
run_root_cmd ln -sf ${pkgs.bash}/bin/bash /bin/bash
run_root_cmd ln -sf ${pkgs.fish}/bin/fish /bin/fish
run_root_cmd ln -sf ${pkgs.zsh}/bin/zsh /bin/zsh
'';
Comment on lines +7 to +32

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

sudo in home-manager activation may prompt interactively or fail in non-interactive contexts.

This activation runs sudo on every home-manager switch, which could prompt for a password or fail in automated/CI contexts. Also, /run/wrappers/bin/sudo is NixOS-specific — on other Linux distros this path won't exist despite isLinux being true.

If this repo only targets NixOS, this is fine in practice. Otherwise, consider guarding with a NixOS-specific check or using a NixOS system-level module (environment.etc or system.activationScripts) which wouldn't need sudo from user space.

🤖 Prompt for AI Agents
In `@home-manager/modules/bin-shells/default.nix` around lines 7 - 12, The
activation uses /run/wrappers/bin/sudo (in home.activation.binShells) which can
prompt or be missing on non-NixOS systems; change the activation to run only on
NixOS or avoid sudo: wrap home.activation.binShells with a conditional check
(e.g., if config.system.build?.isNixos or lib.isNixos equivalent in your
codebase) so the mkdir/ln commands only run on NixOS, or remove sudo and instead
implement these links as a system-level module (environment.etc or
system.activationScripts) if you need them globally; update references to
home.activation.binShells and lib.hm.dag.entryAfter accordingly.

};
}
1 change: 1 addition & 0 deletions home-manager/modules/default.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[
./bin-shells
./cargo-globals
./openclaw
./local-binaries
Expand Down
4 changes: 2 additions & 2 deletions home-manager/modules/xremap/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ let
hyperPrefix = "C-Alt-Shift-Super-";
ctrlPrefix = "C-";
# "f" is excluded — passes through as Hyper+F for Hyprland fullscreen bind.
# See: config/hyprland/hyprland.conf (Window Management section)
# "l" is excluded — passes through as Hyper+L for Hyprland lock screen bind.
# See: config/hyprland/hyprland.conf (Window Management section, Lock Screen section)
letters = [
"a"
"b"
Expand All @@ -25,7 +26,6 @@ let
"i"
"j"
"k"
"l"
"m"
"n"
"o"
Expand Down
Loading