// This config is in the KDL format: https://kdl.dev // "/-" comments out the following node. // Check the wiki for a full description of the configuration: // https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction config-notification { disable-failed } // Outputs from existing configuration output "DP-1" { mode "3440x1440@160.000" scale 1 transform "normal" position x=0 y=0 } output "HDMI-A-1" { //off mode "1440x900" scale 1 transform "normal" position x=760 y=1440 } output "DP-2" { //off mode "1920x1080@60" scale 1 transform "normal" position x=760 y=1440 } gestures { hot-corners { off } } // Input device configuration. // Find the full list of options on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Input input { keyboard { xkb { } numlock } touchpad { } mouse { } trackpoint { } focus-follows-mouse } // You can configure outputs by their name, which you can find // by running `niri msg outputs` while inside a niri instance. // The built-in laptop monitor is usually called "eDP-1". // Find more information on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs // Remember to uncomment the node by removing "/-"! // Settings that influence how windows are positioned and sized. // Find more information on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Layout layout { // Set gaps around windows in logical pixels. gaps 5 background-color "transparent" // When to center a column when changing focus, options are: // - "never", default behavior, focusing an off-screen column will keep at the left // or right edge of the screen. // - "always", the focused column will always be centered. // - "on-overflow", focusing a column will center it if it doesn't fit // together with the previously focused column. center-focused-column "never" // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. preset-column-widths { // Proportion sets the width as a fraction of the output width, taking gaps into account. // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. // The default preset widths are 1/3, 1/2 and 2/3 of the output. proportion 0.33333 proportion 0.5 proportion 0.66667 // Fixed sets the width in logical pixels exactly. // fixed 1920 } // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. // preset-window-heights { } // You can change the default width of the new windows. default-column-width { proportion 0.5; } // If you leave the brackets empty, the windows themselves will decide their initial width. // default-column-width {} // By default focus ring and border are rendered as a solid background rectangle // behind windows. That is, they will show up through semitransparent windows. // This is because windows using client-side decorations can have an arbitrary shape. // // If you don't like that, you should uncomment `prefer-no-csd` below. // Niri will draw focus ring and border *around* windows that agree to omit their // client-side decorations. // // Alternatively, you can override it with a window rule called // `draw-border-with-background`. border { off width 4 active-color "#707070" // Neutral gray inactive-color "#d0d0d0" // Light gray urgent-color "#cc4444" // Softer red } focus-ring { width 2 active-color "#808080" // Medium gray inactive-color "#505050" // Dark gray } shadow { softness 30 spread 5 offset x=0 y=5 color "#0007" } struts { } } layer-rule { match namespace="^quickshell$" place-within-backdrop true } overview { workspace-shadow { off } } // Add lines like this to spawn processes at startup. // Note that running niri as a session supports xdg-desktop-autostart, // which may be more convenient to use. // See the binds section below for more spawn examples. // This line starts waybar, a commonly used bar for Wayland compositors. spawn-at-startup "bash" "-c" "wl-paste --watch cliphist store &" spawn-at-startup "dms" "run" spawn-at-startup "xwayland-satellite" spawn-at-startup "Telegram" spawn-at-startup "vesktop" spawn-at-startup "steam" spawn-at-startup "geary" spawn-at-startup "kitty" spawn-at-startup "kitty" spawn-at-startup "kitty" spawn-at-startup "app.zen_browser.zen" spawn-at-startup "nextcloud" spawn-at-startup "element-desktop" //spawn-at-startup "Jan" spawn-at-startup "msty-studio" xwayland-satellite { path "/run/current-system/sw/bin/xwayland-satellite" } environment { XDG_CURRENT_DESKTOP "niri" QT_QPA_PLATFORM "wayland" ELECTRON_OZONE_PLATFORM_HINT "auto" QT_QPA_PLATFORMTHEME "gtk3" QT_QPA_PLATFORMTHEME_QT6 "gtk3" TERMINAL "kitty" } hotkey-overlay { skip-at-startup } prefer-no-csd screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" animations { workspace-switch { spring damping-ratio=0.80 stiffness=523 epsilon=0.0001 } window-open { duration-ms 150 curve "ease-out-expo" } window-close { duration-ms 150 curve "ease-out-quad" } horizontal-view-movement { spring damping-ratio=0.85 stiffness=423 epsilon=0.0001 } window-movement { spring damping-ratio=0.75 stiffness=323 epsilon=0.0001 } window-resize { spring damping-ratio=0.85 stiffness=423 epsilon=0.0001 } config-notification-open-close { spring damping-ratio=0.65 stiffness=923 epsilon=0.001 } screenshot-ui-open { duration-ms 200 curve "ease-out-quad" } overview-open-close { spring damping-ratio=0.85 stiffness=800 epsilon=0.0001 } } // Window rules let you adjust behavior for individual windows. // Find more information on the wiki: // https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules // Work around WezTerm's initial configure bug // by setting an empty default-column-width. window-rule { open-maximized true } window-rule { match app-id="kitty" open-on-workspace "terminal" open-maximized false default-column-width { proportion 0.33333; } } window-rule { match app-id="app.zen_browser.zen" open-on-workspace "browser" } window-rule { match app-id=r#"^org\.telegram\.desktop$"# exclude app-id=r#"^org\.telegram\.desktop$"# title="^Media viewer$" match app-id="vesktop" match app-id="Element" open-on-workspace "social" open-maximized false default-column-width { proportion 0.33333; } } window-rule { match app-id="geary" open-on-workspace "mail" } window-rule { match app-id="code" open-on-workspace "code" } window-rule { match app-id="steam" match app-id="lutris" open-on-workspace "games" } window-rule { match app-id="fsearch" match app-id="org.gnome.NautilusPreviewer" match app-id="zernity" match app-id="org.qbittorrent.qBittorrent" match app-id="org.gnome.Calculator" open-maximized false open-floating true } window-rule { match app-id="Jan" open-maximized false open-floating true default-column-width { proportion 0.2; } default-window-height { proportion 1.0; } default-floating-position x=0 y=0 relative-to="bottom-left" open-on-workspace "special" } window-rule { match app-id="MstyStudio" open-maximized false open-floating true default-column-width { proportion 0.3; } default-window-height { proportion 1.0; } default-floating-position x=0 y=0 relative-to="bottom-left" opacity 0.95 open-on-workspace "special" } window-rule { match app-id=r#"^org\.telegram\.desktop$"# title="^Media viewer$" open-fullscreen false open-floating true } window-rule { // This regular expression is intentionally made as specific as possible, // since this is the default config, and we want no false positives. // You can get away with just app-id="wezterm" if you want. match app-id=r#"^org\.wezfurlong\.wezterm$"# default-column-width {} } window-rule { match app-id=r#"^org\.gnome\."# draw-border-with-background false geometry-corner-radius 12 clip-to-geometry true } window-rule { match app-id=r#"^gnome-control-center$"# match app-id=r#"^pavucontrol$"# match app-id=r#"^nm-connection-editor$"# default-column-width { proportion 0.5; } open-floating false } window-rule { match app-id=r#"^gnome-calculator$"# match app-id=r#"^galculator$"# match app-id=r#"^blueman-manager$"# match app-id=r#"^org\.gnome\.Nautilus$"# match app-id=r#"^xdg-desktop-portal$"# open-floating true } window-rule { match app-id=r#"^org\.wezfurlong\.wezterm$"# match app-id="Alacritty" match app-id="zen" match app-id="com.mitchellh.ghostty" match app-id="kitty" draw-border-with-background false } //window-rule { // match is-active=false // opacity 0.9 //} window-rule { match app-id=r#"firefox$"# title="^Picture-in-Picture$" match app-id="zoom" open-floating true } window-rule { geometry-corner-radius 12 clip-to-geometry true } workspace "terminal" { open-on-output "DP-1" } workspace "browser" { open-on-output "DP-1" } workspace "social" { open-on-output "DP-1" } workspace "mail" { open-on-output "DP-1" } workspace "code" { open-on-output "DP-1" } workspace "games" { open-on-output "DP-1" } workspace "generic1" { open-on-output "DP-1" } workspace "generic2" { open-on-output "DP-1" } workspace "music" { open-on-output "DP-1" } workspace "windows" { open-on-output "DP-1" } workspace "special" { open-on-output "DP-1" } binds { // === System & Overview === Mod+Space { spawn "niri" "msg" "action" "toggle-overview"; } Mod+Tab repeat=false { toggle-overview; } Mod+Shift+Slash { show-hotkey-overlay; } // === AI toggle === Mod+A { spawn "~/.config/niri/scripts/togglemsty.sh"; } // === Application Launchers === Mod+Return hotkey-overlay-title="Open Terminal" { spawn "kitty"; } Mod+E { spawn "nautilus"; } Alt+Space { spawn "fsearch"; } Mod+D hotkey-overlay-title="Application Launcher" { spawn "dms" "ipc" "call" "spotlight" "toggle"; } Mod+V hotkey-overlay-title="Clipboard Manager" { spawn "dms" "ipc" "call" "clipboard" "toggle"; } Mod+M hotkey-overlay-title="Task Manager" { spawn "dms" "ipc" "call" "processlist" "toggle"; } Mod+Comma hotkey-overlay-title="Settings" { spawn "dms" "ipc" "call" "settings" "toggle"; } Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; } Mod+Shift+N hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; } // === Security === Mod+L hotkey-overlay-title="Lock Screen" { spawn "dms" "ipc" "call" "lock" "lock"; } Mod+Shift+E { quit; } Ctrl+Alt+Delete hotkey-overlay-title="Task Manager" { spawn "dms" "ipc" "call" "processlist" "toggle"; } // === Audio Controls === XF86AudioRaiseVolume allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "increment" "3"; } XF86AudioLowerVolume allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "decrement" "3"; } XF86AudioMute allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "mute"; } XF86AudioMicMute allow-when-locked=true { spawn "dms" "ipc" "call" "audio" "micmute"; } XF86AudioNext allow-when-locked=true { spawn "playerctl" "next"; } XF86AudioPrev allow-when-locked=true { spawn "playerctl" "previous"; } XF86AudioPause allow-when-locked=true { spawn "playerctl" "play-pause"; } XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause"; } XF86KbdBrightnessUp allow-when-locked=true { spawn "kbdbrite.sh" "up"; } XF86KbdBrightnessDown allow-when-locked=true { spawn "kbdbrite.sh" "down"; } // === Brightness Controls === XF86MonBrightnessUp allow-when-locked=true { spawn "dms" "ipc" "call" "brightness" "increment" "5" ""; } XF86MonBrightnessDown allow-when-locked=true { spawn "dms" "ipc" "call" "brightness" "decrement" "5" ""; } // === Calculator === XF86Calculator allow-when-locked=false { spawn "gnome-calculator"; } // === Window Management === Mod+Shift+Q repeat=false { close-window; } Mod+F { maximize-column; } Mod+Shift+F { fullscreen-window; } Mod+Shift+T { toggle-window-floating; } Mod+Shift+V { switch-focus-between-floating-and-tiling; } Mod+W { toggle-column-tabbed-display; } // === Focus Navigation === Mod+Left { focus-column-left; } Mod+Down { focus-window-down; } Mod+Up { focus-window-up; } Mod+Right { focus-column-right; } //Mod+H { focus-column-left; } //Mod+J { focus-window-down; } //Mod+K { focus-window-up; } //Mod+L { focus-column-right; } // === Window Movement === Mod+Shift+Left { move-column-left; } Mod+Shift+Down { move-window-down; } Mod+Shift+Up { move-window-up; } Mod+Shift+Right { move-column-right; } Mod+Shift+H { move-column-left; } Mod+Shift+J { move-window-down; } Mod+Shift+K { move-window-up; } Mod+Shift+L { move-column-right; } // === Column Navigation === Mod+Home { focus-column-first; } Mod+End { focus-column-last; } Mod+Ctrl+Home { move-column-to-first; } Mod+Ctrl+End { move-column-to-last; } // === Monitor Navigation === Mod+Ctrl+Left { focus-monitor-left; } //Mod+Ctrl+Down { focus-monitor-down; } //Mod+Ctrl+Up { focus-monitor-up; } Mod+Ctrl+Right { focus-monitor-right; } Mod+Ctrl+H { focus-monitor-left; } Mod+Ctrl+J { focus-monitor-down; } Mod+Ctrl+K { focus-monitor-up; } Mod+Ctrl+L { focus-monitor-right; } // === Move to Monitor === Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } Mod+Shift+Ctrl+H { move-column-to-monitor-left; } Mod+Shift+Ctrl+J { move-column-to-monitor-down; } Mod+Shift+Ctrl+K { move-column-to-monitor-up; } Mod+Shift+Ctrl+L { move-column-to-monitor-right; } // === Workspace Navigation === Mod+Page_Down { focus-workspace-down; } Mod+Page_Up { focus-workspace-up; } Mod+U { focus-workspace-down; } Mod+I { focus-workspace-up; } Mod+Ctrl+Down { move-column-to-workspace-down; } Mod+Ctrl+Up { move-column-to-workspace-up; } Mod+Ctrl+U { move-column-to-workspace-down; } Mod+Ctrl+I { move-column-to-workspace-up; } // === Move Workspaces === Mod+Shift+Page_Down { move-workspace-down; } Mod+Shift+Page_Up { move-workspace-up; } Mod+Shift+U { move-workspace-down; } Mod+Shift+I { move-workspace-up; } // === Mouse Wheel Navigation === Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } Mod+WheelScrollRight { focus-column-right; } Mod+WheelScrollLeft { focus-column-left; } Mod+Ctrl+WheelScrollRight { move-column-right; } Mod+Ctrl+WheelScrollLeft { move-column-left; } Mod+Shift+WheelScrollDown { focus-column-right; } Mod+Shift+WheelScrollUp { focus-column-left; } Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } // === Numbered Workspaces === Mod+1 { focus-workspace "terminal"; } Mod+2 { focus-workspace "browser"; } Mod+3 { focus-workspace "social"; } Mod+4 { focus-workspace "mail"; } Mod+5 { focus-workspace "code"; } Mod+6 { focus-workspace "games"; } Mod+7 { focus-workspace "generic1"; } Mod+8 { focus-workspace "generic2"; } Mod+9 { focus-workspace "music"; } Mod+0 { focus-workspace "windows"; } // === Move to Numbered Workspaces === Mod+Shift+1 { move-column-to-workspace 1; } Mod+Shift+2 { move-column-to-workspace 2; } Mod+Shift+3 { move-column-to-workspace 3; } Mod+Shift+4 { move-column-to-workspace 4; } Mod+Shift+5 { move-column-to-workspace 5; } Mod+Shift+6 { move-column-to-workspace 6; } Mod+Shift+7 { move-column-to-workspace 7; } Mod+Shift+8 { move-column-to-workspace 8; } Mod+Shift+9 { move-column-to-workspace 9; } // === Column Management === Mod+BracketLeft { consume-or-expel-window-left; } Mod+BracketRight { consume-or-expel-window-right; } Mod+Period { expel-window-from-column; } // === Sizing & Layout === Mod+R { switch-preset-column-width; } Mod+Shift+R { switch-preset-window-height; } Mod+Ctrl+R { reset-window-height; } Mod+Ctrl+F { expand-column-to-available-width; } Mod+C { center-column; } Mod+Ctrl+C { center-visible-columns; } // === Manual Sizing === Mod+Minus { set-column-width "-10%"; } Mod+Equal { set-column-width "+10%"; } Mod+Shift+Minus { set-window-height "-10%"; } Mod+Shift+Equal { set-window-height "+10%"; } // === Screenshots === Mod+Shift+S { spawn-sh "grim -g \"$(slurp -d)\" - | wl-copy"; } Shift+Print { spawn-sh "grim -g \"$(slurp -d)\" - | swappy -f -"; } Print { screenshot-screen; } //XF86Launch1 { screenshot; } //Ctrl+XF86Launch1 { screenshot-screen; } //Alt+XF86Launch1 { screenshot-window; } //Print { screenshot; } //Ctrl+Print { screenshot-screen; } //Alt+Print { screenshot-window; } // === System Controls === Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } Mod+Shift+P { power-off-monitors; } }