Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
48561ef
chore: update
shunkakinoki Feb 7, 2026
f017f53
feat(hyprland): add fingerprint auth, screenshot tools, and Wayland e…
shunkakinoki Feb 7, 2026
23101a2
test(hyprland): add spec files for hyprland helper scripts
shunkakinoki Feb 7, 2026
32a3943
feat(hyprland): add Walker launcher as Spotlight/Raycast replacement
shunkakinoki Feb 7, 2026
e5dee93
feat(hyprland): bind Walker to Framework+Space
shunkakinoki Feb 7, 2026
b2f61d3
fix(walker): remove programs.walker module, use xdg config only
shunkakinoki Feb 7, 2026
ffa0f20
fix(matic): use renamed logind HandlePowerKey setting
shunkakinoki Feb 7, 2026
5262b10
fix: use pkgs.nixfmt instead of deprecated nixfmt-rfc-style
shunkakinoki Feb 7, 2026
e7dee32
feat(hyprland): add dynamic wallpaper via timewall, fix v0.53 windowr…
shunkakinoki Feb 7, 2026
3776fab
fix(waybar): use wofi wifi picker instead of nm-connection-editor
shunkakinoki Feb 7, 2026
fb41e76
fix(hyprland): rename ignorezero to ignore_zero for v0.53
shunkakinoki Feb 7, 2026
383369d
fix(hyprland): replace ignorezero with ignore_alpha for v0.53
shunkakinoki Feb 7, 2026
cc38075
fix(hyprland): add toggle to wofi-wifi so it can be dismissed
shunkakinoki Feb 7, 2026
880ef02
feat(hyprland): replace waybar/swaync/wofi/wob with HyprPanel
shunkakinoki Feb 7, 2026
b270944
fix(hyprland): use full nix store path for hyprpanel exec-once
shunkakinoki Feb 7, 2026
5f725df
feat(hyprland): add Walker custom commands, noanim, and config refine…
shunkakinoki Feb 7, 2026
35be2a8
fix(hyprland): fix invalid noanim layerrule syntax for v0.53
shunkakinoki Feb 7, 2026
708d6cb
fix(ghostty): force Dracula theme instead of auto-detecting light/dark
shunkakinoki Feb 7, 2026
12e8184
revert(ghostty): restore auto light/dark theme detection
shunkakinoki Feb 7, 2026
335e3ab
fix(hyprland): restart xdg portals on startup to pick up dark mode
shunkakinoki Feb 7, 2026
13f16d0
feat(hyprland): frosted glass bar, workspace icons, discord, tmux clear
shunkakinoki Feb 7, 2026
b939f0e
fix(matic): enable upower for HyprPanel battery widget
shunkakinoki Feb 7, 2026
f5c4f5d
fix(tmux): remove vim-tmux-navigator to restore ctrl+l clear
shunkakinoki Feb 7, 2026
9e81026
fix(hyprland): remove duplicate bluetooth tray icon from blueman service
shunkakinoki Feb 7, 2026
d1d9e26
feat(hyprpanel): replace default dashboard shortcuts with Chrome, Sla…
shunkakinoki Feb 7, 2026
727cef3
feat(wallpaper): add declarative dynamic wallpaper module
shunkakinoki Feb 7, 2026
6bb49de
feat(fish,tmux): add tmux session shortcuts and brighter active pane …
shunkakinoki Feb 7, 2026
ecfe830
feat(wallpaper): replace swww+timewall with mpvpaper aerial video
shunkakinoki Feb 7, 2026
9ecbddb
fix(matic): route XDG Settings portal to GTK for dark mode detection
shunkakinoki Feb 7, 2026
3cc717c
fix(hyprpanel): use flat keys for dashboard shortcuts
shunkakinoki Feb 7, 2026
9b769b2
fix(hyprpanel): set scaling priority to hyprland for menu positioning
shunkakinoki Feb 7, 2026
673ac73
fix(hyprland): sequence portal restarts for reliable dark mode detection
shunkakinoki Feb 7, 2026
7c14a9b
fix(hyprpanel): embed proper Nerd Font icons for Chrome and Slack sho…
shunkakinoki Feb 7, 2026
6055105
fix(wallpaper): use ALL instead of '*' for mpvpaper output
shunkakinoki Feb 7, 2026
88e0cbd
fix(hyprpanel): add Ghostty and folder icons for dashboard shortcuts
shunkakinoki Feb 7, 2026
d5c2e02
fix(wallpaper): fill screen with panscan, black bg, transparent locks…
shunkakinoki Feb 7, 2026
752815a
fix(wallpaper): add no-keepaspect to force video to fill 3:2 screen
shunkakinoki Feb 7, 2026
5729266
fix(wallpaper): crop 16:9 video to 3:2 for Framework display
shunkakinoki Feb 7, 2026
a8f8815
feat(hyprpanel): translucent frosted notifications and always-visible…
shunkakinoki Feb 7, 2026
194b422
fix(hyprlock): restore screenshot background, add seconds to clock
shunkakinoki Feb 7, 2026
600ed5b
feat(wallpaper): shuffle 4 Apple Aerial videos via playlist
shunkakinoki Feb 7, 2026
62c6937
fix(ghostty): force Dracula theme, portal dark mode detection unreliable
shunkakinoki Feb 7, 2026
98fe51c
feat(hyprland): add translucent opacity to Google Chrome
shunkakinoki Feb 7, 2026
77dfecd
feat(hyprland): translucent opacity for Chrome/Slack, disabled in ful…
shunkakinoki Feb 7, 2026
3db5160
fix(hyprland): remove forced workspace assignments for Chrome/Slack/D…
shunkakinoki Feb 7, 2026
925ade9
fix(hyprland): fix invalid match:fullscreen syntax for opacity rules
shunkakinoki Feb 7, 2026
3f1512e
fix(hyprland): use correct match:fullscreen syntax with space separator
shunkakinoki Feb 7, 2026
05e3df5
fix(hyprland): change lock screen binding to Super+Shift+L
shunkakinoki Feb 7, 2026
96f5341
feat(wallpaper): switch from mpvpaper to linux-wallpaperengine
shunkakinoki Feb 7, 2026
b78219c
fix(hyprland): increase window opacity from 95/90% to 97/95%
shunkakinoki Feb 7, 2026
37e389a
feat(hyprland): add translucent opacity to VS Code
shunkakinoki Feb 7, 2026
8733e3a
feat(hyprpanel): replace Dracula theme with frosty translucent design
shunkakinoki Feb 7, 2026
72d9fd2
feat(wallpaper): set Workshop wallpaper to 3603712208
shunkakinoki Feb 7, 2026
e06f064
feat(wallpaper): switch to Workshop wallpaper 3602362048
shunkakinoki Feb 7, 2026
c86eaf6
fix(hyprland): remove fullscreen opacity override breaking translucency
shunkakinoki Feb 7, 2026
004df5d
Revert "fix(hyprland): remove fullscreen opacity override breaking tr…
shunkakinoki Feb 7, 2026
4c001d6
fix(hyprland): restore opacity to 0.95/0.90 with fullscreen override
shunkakinoki Feb 7, 2026
f7ffe11
fix(hyprland): broaden Chrome class match and keep fullscreen override
shunkakinoki Feb 7, 2026
bbabfe8
fix(hyprland): remove override keyword from fullscreen opacity rule
shunkakinoki Feb 7, 2026
d7f815a
fix(hyprland): remove fullscreen opacity rule to debug Chrome translu…
shunkakinoki Feb 7, 2026
0b9695c
feat(hyprland): restore fullscreen opacity override
shunkakinoki Feb 7, 2026
de8cfe1
feat(hyprland): lower Chrome and VS Code opacity to 90/85% for visibi…
shunkakinoki Feb 7, 2026
f578378
refactor: remove unused wallpaper module
shunkakinoki Feb 7, 2026
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
4 changes: 4 additions & 0 deletions config/claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
{
"model": "opus",
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
},
"cleanupPeriodDays": 99999,
"enabledPlugins": {
"commit-commands@claude-plugins-official": true,
Expand Down
6 changes: 2 additions & 4 deletions config/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,8 @@ in
[
./gtk
./hyprland
./swaync
./waybar
./wlogout
./wofi
./hyprpanel
./walker
]
else
[ ]
Expand Down
25 changes: 24 additions & 1 deletion config/ghostty/config
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#

auto-update-channel = tip
theme = dark:Dracula,light:Catppuccin Latte
# theme = dark:Dracula,light:Catppuccin Latte
theme = Dracula
background-opacity = 0.8
confirm-close-surface = true
macos-option-as-alt = true
Expand All @@ -26,3 +27,25 @@ keybind = super+shift+left=move_tab:-1
keybind = super+shift+up=move_tab:-1
keybind = super+shift+right=move_tab:1
keybind = super+shift+down=move_tab:1

# Navigate between splits (Vim-style)
keybind = super+h=goto_split:left
keybind = super+j=goto_split:down
keybind = super+k=goto_split:up
keybind = super+l=goto_split:right
Comment on lines +31 to +35

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 | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

find . -type f \( -name "*.conf" -o -name "hyprland.conf" \) | head -20

Repository: shunkakinoki/dotfiles

Length of output: 226


🏁 Script executed:

cat ./config/hyprland/hyprland.conf

Repository: shunkakinoki/dotfiles

Length of output: 15718


Keybind conflict with Hyprland will break split navigation.

super+h/j/k/l are already bound in Hyprland for window focus movement (lines 355–358 in config/hyprland/hyprland.conf). Since Hyprland is the compositor, these keybinds will be intercepted at the global level before Ghostty receives them, making Ghostty's split navigation keybinds completely inoperative. Use different modifiers, such as ctrl+shift+h/j/k/l or alt+h/j/k/l.

🤖 Prompt for AI Agents
In `@config/ghostty/config` around lines 30 - 34, The Ghostty keybinds using the
super modifier (entries like keybind = super+h=goto_split:left, keybind =
super+j=goto_split:down, keybind = super+k=goto_split:up, keybind =
super+l=goto_split:right) conflict with Hyprland's global super+h/j/k/l bindings
and will never reach Ghostty; update these four keybind lines to use a different
modifier (for example ctrl+shift+h/j/k/l or alt+h/j/k/l) so the
goto_split:left/down/up/right commands can be received by Ghostty.


# Create new splits
keybind = ctrl+shift+backslash=new_split:right
keybind = ctrl+shift+minus=new_split:down

# Split management
keybind = ctrl+shift+z=toggle_split_zoom
keybind = ctrl+shift+e=equalize_splits
keybind = ctrl+shift+w=close_surface

# Split border styling
split-divider-color = #88c0d0

# Active panel highlighting (dim unfocused splits)
unfocused-split-opacity = 0.7
unfocused-split-fill = #1e1e2e
15 changes: 12 additions & 3 deletions config/hyprland/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
}:
let
hyprexpoPlugin = pkgs.hyprlandPlugins.hyprexpo;
wallpaper = "${pkgs.nixos-artwork.wallpapers.nineish-catppuccin-mocha-alt}/share/backgrounds/nixos/nix-wallpaper-nineish-catppuccin-mocha-alt.png";
in
{
wayland.windowManager.hyprland = {
Expand All @@ -15,8 +14,7 @@ in
systemd.enable = false;
extraConfig = ''
plugin = ${hyprexpoPlugin}/lib/libhyprexpo.so
exec-once = ${pkgs.swww}/bin/swww-daemon
exec-once = sleep 1 && ${pkgs.swww}/bin/swww img ${wallpaper}
exec-once = ${pkgs.hyprpanel}/bin/hyprpanel
''
+ builtins.readFile ./hyprland.conf;
};
Expand All @@ -29,4 +27,15 @@ in
source = ./hyprlock.conf;
force = true;
};

xdg.configFile."hypr/scripts/toggle-terminal.sh" = {
source = ./scripts/toggle-terminal.sh;
executable = true;
force = true;
};
xdg.configFile."hypr/scripts/record-screen.sh" = {
source = ./scripts/record-screen.sh;
executable = true;
force = true;
};
}
1 change: 1 addition & 0 deletions config/hyprland/hypridle.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ general {
lock_cmd = pidof hyprlock || hyprlock
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = hyprctl dispatch dpms on
inhibit_sleep = 3
}

# Dim screen after 2.5 minutes
Expand Down
141 changes: 113 additions & 28 deletions config/hyprland/hyprland.conf
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,24 @@ $mod = SUPER
# =============================================================================
env = XCURSOR_THEME,Adwaita
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
env = HYPRCURSOR_THEME,Adwaita
env = GTK_THEME,Adwaita:dark
env = GDK_SCALE,1.5
env = QT_AUTO_SCREEN_SCALE_FACTOR,1
env = QT_QPA_PLATFORM,wayland
env = SDL_VIDEODRIVER,wayland
env = MOZ_ENABLE_WAYLAND,1
env = ELECTRON_OZONE_PLATFORM_HINT,wayland
env = OZONE_PLATFORM,wayland
Comment on lines +34 to +35

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

OZONE_PLATFORM=wayland may conflict with ELECTRON_OZONE_PLATFORM_HINT.

ELECTRON_OZONE_PLATFORM_HINT=wayland (line 34) lets Electron apps gracefully choose Wayland when available. OZONE_PLATFORM=wayland (line 35) is a hard override for all Chromium-based apps — it can break apps that don't fully support Wayland (e.g., some Electron apps may crash or have rendering issues). With both set, the hard override wins, making the hint redundant.

Consider removing OZONE_PLATFORM and relying on the hint alone, unless you've verified all your Chromium/Electron apps work under forced Wayland.

🤖 Prompt for AI Agents
In `@config/hyprland/hyprland.conf` around lines 34 - 35, The configuration sets
both ELECTRON_OZONE_PLATFORM_HINT and OZONE_PLATFORM to "wayland", which forces
Chromium-based apps to Wayland and can override the Electron hint; remove or
comment out the hard override by deleting or disabling the env entry for
OZONE_PLATFORM (the line setting OZONE_PLATFORM,wayland) so only
ELECTRON_OZONE_PLATFORM_HINT remains, unless you've explicitly tested all
Chromium/Electron apps under forced Wayland and want to keep the override.

env = GDK_BACKEND,wayland

# =============================================================================
# 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

# Status bar
exec-once = waybar

# Notification daemon
exec-once = swaync
exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal

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

Portal restart chain is fragile with hardcoded sleeps.

If any systemctl --user restart command fails, the && chain aborts and downstream portals won't restart. Consider using ; instead of && so all three restarts are attempted regardless, or splitting into separate exec-once lines.

♻️ Proposed fix
-exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal
+exec-once = sleep 1; systemctl --user restart xdg-desktop-portal-hyprland; sleep 0.5; systemctl --user restart xdg-desktop-portal-gtk; sleep 0.5; systemctl --user restart xdg-desktop-portal
📝 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
exec-once = sleep 1 && systemctl --user restart xdg-desktop-portal-hyprland && sleep 0.5 && systemctl --user restart xdg-desktop-portal-gtk && sleep 0.5 && systemctl --user restart xdg-desktop-portal
exec-once = sleep 1; systemctl --user restart xdg-desktop-portal-hyprland; sleep 0.5; systemctl --user restart xdg-desktop-portal-gtk; sleep 0.5; systemctl --user restart xdg-desktop-portal
🤖 Prompt for AI Agents
In `@config/hyprland/hyprland.conf` at line 43, The exec-once command string is
fragile because it uses && so a failure in any systemctl --user restart call
aborts the rest; update the exec-once line (the command after exec-once) to
either use ; between the three systemctl --user restart invocations so all
restarts are attempted regardless of failures, or split the operations into
separate exec-once entries so each systemctl restart runs independently (refer
to the existing exec-once line that contains the sleep and systemctl --user
restart calls).


# Clipboard history
exec-once = wl-paste --type text --watch cliphist store
Expand All @@ -46,8 +49,11 @@ 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
# Blue light filter
exec-once = hyprsunset

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

# =============================================================================
# Monitor (Framework 13" 2256x1504)
Expand Down Expand Up @@ -136,6 +142,7 @@ animations {
animation = borderangle, 1, 30, liner, loop
animation = fade, 1, 3, default
animation = workspaces, 1, 3, snap
animation = specialWorkspace, 1, 3, snap, slidevert
}

# =============================================================================
Expand All @@ -145,24 +152,78 @@ misc {
disable_hyprland_logo = true
disable_splash_rendering = true
force_default_wallpaper = 0
focus_on_activate = true
background_color = rgb(000000)
}

ecosystem {
no_update_news = true
}

# =============================================================================
# Window Rules
# =============================================================================
windowrule = float 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 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
# Screen-share indicator (auto-hide to special workspace)
$shareIndicator = match:title ^(.*)(is sharing (your screen|a window).*)$
windowrule = no_focus on, $shareIndicator
windowrule = workspace special:share silent, $shareIndicator

# Google Meet PIP
$meetPip = match:title ^(Meet - .+)$
windowrule = float on, $meetPip
windowrule = pin on, $meetPip
windowrule = size 320 540, $meetPip
windowrule = move 100%-340 60, $meetPip

# Workspace assignments removed — forced workspace rules apply to ALL
# windows of that class (including Cmd+N new windows), breaking expected
# behavior. Use Super+G/S/D focus-or-launch bindings instead.

# 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 .*

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

🧩 Analysis chain

🌐 Web query:

Hyprland v0.53 windowrule suppress_event syntax documentation

💡 Result:

In Hyprland v0.53, window rules use the new windowrule syntax (named blocks or anonymous one-liners). (wiki.hypr.land)

suppress_event effect (new syntax)

**suppress_event** takes one or more event types, space-separated. Supported event types are: fullscreen, maximize, activate, activatefocus, fullscreenoutput. (wiki.hypr.land)

Anonymous rule example

windowrule = match:class .*, suppress_event maximize

(ignores maximize requests from any window) (wiki.hypr.land)

Named rule example

windowrule {
  name = suppress-maximize
  match:class = .*
  suppress_event = maximize
}

(wiki.hypr.land)

Citations:


Reorder the windowrule components to match documented v0.53 syntax.

suppress_event is valid in Hyprland v0.53, but the order of match conditions and effects should be: match conditions first, then suppress_event. Update to:

windowrule = match:class .*, suppress_event maximize
🤖 Prompt for AI Agents
In `@config/hyprland/hyprland.conf` at line 195, The windowrule line uses the
wrong component order for Hyprland v0.53; locate the "windowrule" entry (the
line containing "suppress_event maximize, match:class .*") and reorder the
components so match conditions come first and effects/suppressors after—i.e.,
change the sequence to have "match:class .*" before "suppress_event" and
"maximize" to conform to the documented v0.53 syntax.


# Slight opacity for visual depth
windowrule = opacity 0.95 0.90, match:class ^(com.mitchellh.ghostty)$
windowrule = opacity 0.90 0.85, match:class ^(google-chrome.*)$
windowrule = opacity 0.95 0.90, match:class ^(Slack)$
windowrule = opacity 0.90 0.85, match:class ^(code-url-handler)$

# Full opacity in fullscreen
windowrule = opacity 1.0 override 1.0 override, match:fullscreen 1

# Ghostty scratchpad
windowrule = workspace special:scratchpad silent, match:class ^(ghostty-scratchpad)$
windowrule = float on, match:class ^(ghostty-scratchpad)$
windowrule = size 90% 70%, match:class ^(ghostty-scratchpad)$
windowrule = center on, match:class ^(ghostty-scratchpad)$

# Prevent wofi animation
layerrule = animation slide, match:namespace ^(wofi)$
# =============================================================================
# Layer Rules
# =============================================================================
# Blur for HyprPanel bar (frosted glass)
layerrule = blur on, match:namespace ^(bar-\d+)$
layerrule = ignore_alpha 0.3, match:namespace ^(bar-\d+)$

# Blur for HyprPanel notifications (frosted glass)
layerrule = blur on, match:namespace ^(notifications-window)$
layerrule = ignore_alpha 0.3, match:namespace ^(notifications-window)$

# Blur for walker
layerrule = blur on, match:namespace ^(walker)$
layerrule = ignore_alpha on, match:namespace ^(walker)$
layerrule = animation slide top, match:namespace ^(walker)$

# =============================================================================
# App Launch Hotkeys (Super + letter)
Expand All @@ -173,15 +234,22 @@ bind = $mod, S, exec, hyprctl clients -j | grep -q '"class": "Slack"' && hyprctl
bind = $mod, C, exec, cursor
bind = $mod, P, exec, gtk-launch 1password
bind = $mod, M, exec, gtk-launch signal-desktop
bind = $mod, D, exec, hyprctl clients -j | grep -q '"class": "discord"' && hyprctl dispatch focuswindow class:discord || discord
bind = $mod, N, exec, ghostty -e yazi

# =============================================================================
# System GUIs (WiFi / Bluetooth / Audio)
# =============================================================================
bind = $mod, I, exec, hyprpanel toggleWindow network-menu
bind = $mod, B, exec, blueman-manager
bind = $mod, A, exec, pavucontrol

# =============================================================================
# Launcher & Clipboard
# =============================================================================
bind = CTRL ALT SHIFT, SPACE, exec, walker
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
bind = $mod, E, exec, emote

# =============================================================================
# Window Management
Expand All @@ -190,7 +258,7 @@ 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 SHIFT, Q, exec, hyprpanel toggleWindow power-menu
bind = $mod, TAB, hyprexpo:expo, toggle

# Focus (vim keys)
Expand Down Expand Up @@ -259,9 +327,27 @@ bindm = $mod, mouse:272, movewindow
bindm = $mod, mouse:273, resizewindow

# =============================================================================
# Screenshot
# Scratchpad & Recording
# =============================================================================
bind = $mod CTRL, T, exec, ~/.config/hypr/scripts/toggle-terminal.sh
bind = $mod SHIFT, R, exec, ~/.config/hypr/scripts/record-screen.sh

# Quick previous-window toggle (like macOS Cmd+`)
bind = $mod, GRAVE, focuscurrentorlast

# =============================================================================
# Screenshot (grim+slurp+swappy for annotated, hyprshot for quick)
# =============================================================================
bind = $mod SHIFT, S, exec, grim -g "$(slurp)" - | swappy -f -
bind = , PRINT, exec, hyprshot -m region
bind = SHIFT, PRINT, exec, hyprshot -m window
bind = CTRL, PRINT, exec, hyprshot -m output

# Color picker
bind = $mod, PRINT, exec, hyprpicker -a

# Clipboard manager (clipse)
bind = CTRL $mod, V, exec, ghostty --class clipse -e clipse

# =============================================================================
# Media / Hardware Keys (Framework 13 AI 300)
Expand All @@ -273,8 +359,8 @@ bindl = , F1, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
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%+
bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
bindel = , F3, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
Comment on lines +362 to +363

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

Volume can exceed 100% — consider adding a limit.

wpctl set-volume without -l allows the volume to go above 100%, which can cause distortion or unexpected loudness. Adding -l 1.0 caps it at 100%.

🔊 Proposed fix
-bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume `@DEFAULT_AUDIO_SINK`@ 5%+
-bindel = , F3, exec, wpctl set-volume `@DEFAULT_AUDIO_SINK`@ 5%+
+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%+
🤖 Prompt for AI Agents
In `@config/hyprland/hyprland.conf` around lines 353 - 354, The volume bind
entries (bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume
`@DEFAULT_AUDIO_SINK`@ 5%+ and bindel = , F3, exec, wpctl set-volume
`@DEFAULT_AUDIO_SINK`@ 5%+) can push volume above 100%; update both wpctl
invocations to include the limit flag (-l 1.0) so they become wpctl set-volume
-l 1.0 `@DEFAULT_AUDIO_SINK`@ 5%+ to cap at 100%, leaving the rest of the binding
unchanged.

# F4: Previous track
bindl = , XF86AudioPrev, exec, playerctl previous
bindl = , F4, exec, playerctl previous
Expand All @@ -297,9 +383,8 @@ bindl = , F9, exec, hyprctl -j monitors | jq -r '.[0].scale' | awk '{if($1>1.3)
# 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 -
# F11: Print screen (full output via hyprshot)
bind = , F11, exec, hyprshot -m output

# =============================================================================
# Display Zoom (Framework + / - , macOS-style)
Expand All @@ -312,12 +397,12 @@ binde = CTRL ALT SHIFT, minus, exec, hyprctl -j monitors | jq -r '.[0].scale' |
# =============================================================================
# Lock Screen
# =============================================================================
bind = $mod CTRL, L, exec, hyprlock
bind = $mod SHIFT, L, exec, hyprlock

@cubic-dev-ai cubic-dev-ai Bot Feb 7, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2: The new lock screen binding reuses $mod SHIFT, L, which is already bound to movewindow, r earlier in the config. This creates a keybinding conflict and can prevent either moving windows right or locking the screen from working reliably.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At config/hyprland/hyprland.conf, line 399:

<comment>The new lock screen binding reuses `$mod SHIFT, L`, which is already bound to `movewindow, r` earlier in the config. This creates a keybinding conflict and can prevent either moving windows right or locking the screen from working reliably.</comment>

<file context>
@@ -396,7 +396,7 @@ binde = CTRL ALT SHIFT, minus, exec, hyprctl -j monitors | jq -r '.[0].scale' |
 # Lock Screen
 # =============================================================================
-bind = $mod CTRL, L, exec, hyprlock
+bind = $mod SHIFT, L, exec, hyprlock
 
 # =============================================================================
</file context>
Suggested change
bind = $mod SHIFT, L, exec, hyprlock
bind = $mod CTRL, L, exec, hyprlock
Fix with Cubic


# =============================================================================
# Notification Toggle
# =============================================================================
bind = $mod SHIFT, D, exec, swaync-client -t -sw
bind = $mod SHIFT, D, exec, hyprpanel toggleWindow notifications-center

# =============================================================================
# Plugins
Expand Down
Loading
Loading