A plugin for Hyprland that implements a workspace overview feature similar to that of KDE Plasma, GNOME and macOS, aimed to provide a efficient way of workspace and window management.
[!NOTE] This plugin is still maintained, by combined efforts of me and all the awesome contributors. However, I do not have as much time that I could spend on this plugin as before, and Hyprland is a rapidly changing codebase. Therefore, at this time, I could not guarantee that new issues could be resolved promptly. I appreciate your acknowledgement and support for this project!
P.S.: I could recommend giving niri a try for anyone who is considering an alternative to Hyprland. It is a scrolling window manager that offers a great built-in overview feature that allows dragging windows in-between workspaces just like this plugin does. It also has better workspace management as it cleans up empty workspaces like GNOME does.
https://github.com/KZDKM/Hyprspace/assets/41317840/ed1a585a-30d5-4a79-a6da-8cc0713828f9
To build, have hyprland headers installed and under the repo directory do:
make all
Then use hyprctl plugin load followed by the absolute path to the .so file to load, you could add this to your exec-once to load the plugin on startup
hyprpm add https://github.com/KZDKM/Hyprspace
hyprpm enable Hyprspace
Refer to the Hyprland wiki on plugins, but your flake might look like this:
{
inputs = {
# Hyprland is **such** eye candy
hyprland = {
type = "git";
url = "https://github.com/hyprwm/Hyprland";
submodules = true;
inputs.nixpkgs.follows = "nixpkgs";
};
Hyprspace = {
url = "github:KZDKM/Hyprspace";
# Hyprspace uses latest Hyprland. We declare this to keep them in sync.
inputs.hyprland.follows = "hyprland";
};
};
... # your normal setup with hyprland
wayland.windowManager.hyprland.plugins = [
# ... whatever
inputs.Hyprspace.packages.${pkgs.system}.Hyprspace
];
}
overview:toggle or perform a workspace swipe vertically would open / close the panel.overview:toggle dispatcher to toggle workspace overview on current monitoroverview:close to close the overview on current monitor if openedoverview:open to open the overview on current monitor if closedall argument to these dispatchers would toggle / open / close overview on all monitorsStarting with Hyprland 0.55+, the configuration format has transitioned to Lua as the default (~/.config/hypr/hyprland.lua).
Plugin settings are structured nested within the hl.config() table under plugin.overview.
hl.config({
plugin = {
overview = {
panelColor = "#1e1e2e",
panelBorderColor = "#cba6f7",
workspaceActiveBackground = "rgba(49, 50, 68, 0.8)",
workspaceActiveBorder = "rgb(203, 166, 247)",
onBottom = false,
autoDrag = true,
-- Add other overview settings here
}
}
})
To invoke dispatchers, Hyprspace registers Lua wrapper functions in the hl.plugin.overview namespace. These can be bound in your configuration, run inside callbacks, or executed from the command line.
The following Lua functions are available:
hl.plugin.overview.toggle(arg): Toggles the overview on the current monitor.hl.plugin.overview.open(arg): Opens the overview on the current monitor.hl.plugin.overview.close(arg): Closes the overview on the current monitor.hyprland.lua:When binding Lua wrapper functions using hl.bind, you must wrap the call in a function definition:
-- Toggle overview on the current monitor using SUPER + TAB
hl.bind("SUPER + TAB", function()
hl.plugin.overview.toggle()
end, { description = "Toggle Hyprspace overview" })
-- Toggle overview on all monitors
hl.bind("SUPER + SHIFT + TAB", function()
hl.plugin.overview.toggle("all")
end, { description = "Toggle Hyprspace overview on all monitors" })
plugin:overview:panelColorplugin:overview:panelBorderColorplugin:overview:workspaceActiveBackgroundplugin:overview:workspaceInactiveBackgroundplugin:overview:workspaceActiveBorderplugin:overview:workspaceInactiveBorderplugin:overview:dragAlpha overrides the alpha of window when dragged in overview (0 - 1, 0 = transparent, 1 = opaque)plugin:overview:disableBlurplugin:overview:panelHeightplugin:overview:panelBorderWidthplugin:overview:onBottom whether if panel should be on bottom instead of topplugin:overview:workspaceMargin spacing of workspaces with eachother and the edge of the panelplugin:overview:reservedArea padding on top of the panel, for Macbook camera notchplugin:overview:workspaceBorderSizeplugin:overview:centerAligned whether if workspaces should be aligned at the center (KDE / macOS style) or at the left (Windows style)plugin:overview:hideBackgroundLayers do not draw background and bottom layers in overviewplugin:overview:hideTopLayers do not draw top layers in overviewplugin:overview:hideOverlayLayers do not draw overlay layers in overviewplugin:overview:hideRealLayers whether to hide layers in actual workspaceplugin:overview:drawActiveWorkspace draw the active workspace in overview as-isplugin:overview:overrideGaps whether if overview should override the layout gaps in the current workspace using the following valuesplugin:overview:gapsInplugin:overview:gapsOutplugin:overview:affectStrut whether the panel should push window aside, disabling this option also disables overrideGapswindows curve for a slide-in animationplugin:overview:overrideAnimSpeed to override the animation speedplugin:overview:autoDrag mouse click always drags window when overview is openplugin:overview:autoScroll mouse scroll on active workspace area always switch workspaceplugin:overview:exitOnClick mouse click without dragging exits overviewplugin:overview:switchOnDrop switch to the workspace when a window is droppped into itplugin:overview:exitOnSwitch overview exits when overview is switched by clicking on workspace view or by switchOnDropplugin:overview:showNewWorkspace add a new empty workspace at the end of workspaces viewplugin:overview:showEmptyWorkspace show empty workspaces that are inbetween non-empty workspacesplugin:overview:showSpecialWorkspace defaults to falseplugin:overview:disableGesturesplugin:overview:reverseSwipe reverses the direction of swipe gesture, for macOS peeps?plugin:overview:exitKey key used to exit overview mode (default: Escape). Leave empty to disable keyboard exit.gestures:workspace_swipe_fingersgestures:workspace_swipe_cancel_ratiogestures:workspace_swipe_min_speed_to_force211 followers · starred Jul 2026
965 followers · starred Jan 2026
359 followers · starred Aug 2024
62 followers · starred Apr 2024
A plugin for Hyprland that implements a workspace overview feature similar to that of KDE Plasma, GNOME and macOS, aimed to provide a efficient way of workspace and window management.
[!NOTE] This plugin is still maintained, by combined efforts of me and all the awesome contributors. However, I do not have as much time that I could spend on this plugin as before, and Hyprland is a rapidly changing codebase. Therefore, at this time, I could not guarantee that new issues could be resolved promptly. I appreciate your acknowledgement and support for this project!
P.S.: I could recommend giving niri a try for anyone who is considering an alternative to Hyprland. It is a scrolling window manager that offers a great built-in overview feature that allows dragging windows in-between workspaces just like this plugin does. It also has better workspace management as it cleans up empty workspaces like GNOME does.
https://github.com/KZDKM/Hyprspace/assets/41317840/ed1a585a-30d5-4a79-a6da-8cc0713828f9
To build, have hyprland headers installed and under the repo directory do:
make all
Then use hyprctl plugin load followed by the absolute path to the .so file to load, you could add this to your exec-once to load the plugin on startup
hyprpm add https://github.com/KZDKM/Hyprspace
hyprpm enable Hyprspace
Refer to the Hyprland wiki on plugins, but your flake might look like this:
{
inputs = {
# Hyprland is **such** eye candy
hyprland = {
type = "git";
url = "https://github.com/hyprwm/Hyprland";
submodules = true;
inputs.nixpkgs.follows = "nixpkgs";
};
Hyprspace = {
url = "github:KZDKM/Hyprspace";
# Hyprspace uses latest Hyprland. We declare this to keep them in sync.
inputs.hyprland.follows = "hyprland";
};
};
... # your normal setup with hyprland
wayland.windowManager.hyprland.plugins = [
# ... whatever
inputs.Hyprspace.packages.${pkgs.system}.Hyprspace
];
}
overview:toggle or perform a workspace swipe vertically would open / close the panel.overview:toggle dispatcher to toggle workspace overview on current monitoroverview:close to close the overview on current monitor if openedoverview:open to open the overview on current monitor if closedall argument to these dispatchers would toggle / open / close overview on all monitorsStarting with Hyprland 0.55+, the configuration format has transitioned to Lua as the default (~/.config/hypr/hyprland.lua).
Plugin settings are structured nested within the hl.config() table under plugin.overview.
hl.config({
plugin = {
overview = {
panelColor = "#1e1e2e",
panelBorderColor = "#cba6f7",
workspaceActiveBackground = "rgba(49, 50, 68, 0.8)",
workspaceActiveBorder = "rgb(203, 166, 247)",
onBottom = false,
autoDrag = true,
-- Add other overview settings here
}
}
})
To invoke dispatchers, Hyprspace registers Lua wrapper functions in the hl.plugin.overview namespace. These can be bound in your configuration, run inside callbacks, or executed from the command line.
The following Lua functions are available:
hl.plugin.overview.toggle(arg): Toggles the overview on the current monitor.hl.plugin.overview.open(arg): Opens the overview on the current monitor.hl.plugin.overview.close(arg): Closes the overview on the current monitor.hyprland.lua:When binding Lua wrapper functions using hl.bind, you must wrap the call in a function definition:
-- Toggle overview on the current monitor using SUPER + TAB
hl.bind("SUPER + TAB", function()
hl.plugin.overview.toggle()
end, { description = "Toggle Hyprspace overview" })
-- Toggle overview on all monitors
hl.bind("SUPER + SHIFT + TAB", function()
hl.plugin.overview.toggle("all")
end, { description = "Toggle Hyprspace overview on all monitors" })
plugin:overview:panelColorplugin:overview:panelBorderColorplugin:overview:workspaceActiveBackgroundplugin:overview:workspaceInactiveBackgroundplugin:overview:workspaceActiveBorderplugin:overview:workspaceInactiveBorderplugin:overview:dragAlpha overrides the alpha of window when dragged in overview (0 - 1, 0 = transparent, 1 = opaque)plugin:overview:disableBlurplugin:overview:panelHeightplugin:overview:panelBorderWidthplugin:overview:onBottom whether if panel should be on bottom instead of topplugin:overview:workspaceMargin spacing of workspaces with eachother and the edge of the panelplugin:overview:reservedArea padding on top of the panel, for Macbook camera notchplugin:overview:workspaceBorderSizeplugin:overview:centerAligned whether if workspaces should be aligned at the center (KDE / macOS style) or at the left (Windows style)plugin:overview:hideBackgroundLayers do not draw background and bottom layers in overviewplugin:overview:hideTopLayers do not draw top layers in overviewplugin:overview:hideOverlayLayers do not draw overlay layers in overviewplugin:overview:hideRealLayers whether to hide layers in actual workspaceplugin:overview:drawActiveWorkspace draw the active workspace in overview as-isplugin:overview:overrideGaps whether if overview should override the layout gaps in the current workspace using the following valuesplugin:overview:gapsInplugin:overview:gapsOutplugin:overview:affectStrut whether the panel should push window aside, disabling this option also disables overrideGapswindows curve for a slide-in animationplugin:overview:overrideAnimSpeed to override the animation speedplugin:overview:autoDrag mouse click always drags window when overview is openplugin:overview:autoScroll mouse scroll on active workspace area always switch workspaceplugin:overview:exitOnClick mouse click without dragging exits overviewplugin:overview:switchOnDrop switch to the workspace when a window is droppped into itplugin:overview:exitOnSwitch overview exits when overview is switched by clicking on workspace view or by switchOnDropplugin:overview:showNewWorkspace add a new empty workspace at the end of workspaces viewplugin:overview:showEmptyWorkspace show empty workspaces that are inbetween non-empty workspacesplugin:overview:showSpecialWorkspace defaults to falseplugin:overview:disableGesturesplugin:overview:reverseSwipe reverses the direction of swipe gesture, for macOS peeps?plugin:overview:exitKey key used to exit overview mode (default: Escape). Leave empty to disable keyboard exit.gestures:workspace_swipe_fingersgestures:workspace_swipe_cancel_ratiogestures:workspace_swipe_min_speed_to_force211 followers · starred Jul 2026
965 followers · starred Jan 2026
359 followers · starred Aug 2024
62 followers · starred Apr 2024