Hyprspace is a Hyprland overview / workspace-expo plugin. It renders a top or bottom workspace strip, shows live workspace thumbnails, and lets you switch or move windows between workspaces.
This fork is adapted for current Hyprland with Lua-based configuration instead of the old .conf / Hyprlang plugin config flow.
- Live workspace overview with window thumbnails
- Multi-monitor support
- Mouse drag/drop between workspaces
- Optional gesture support
- Lua-native configuration
hyprpminstall support
- Hyprland with plugin support
- Hyprland development headers / pkg-config metadata for manual builds
- A recent C++ compiler with C++23 support
Build the plugin from the repo root:
cd ~/.config/Hyprspace
make allThat produces:
~/.config/Hyprspace/Hyprspace.so
Load it manually:
hyprctl plugin load ~/.config/Hyprspace/Hyprspace.soTo unload it:
hyprctl plugin unload ~/.config/Hyprspace/Hyprspace.soIf this repo is pushed to Git and the updated hyprpm.toml is included, install it with:
hyprpm add https://github.com/0xl30/Hyprspace.git
hyprpm enable HyprspaceExamples:
hyprpm add https://github.com/0xl30/Hyprspace.git
hyprpm enable HyprspaceNotes:
hyprpmmatches your Hyprland commit againstcommit_pinsinhyprpm.toml.- For Hyprland
v0.55.2, this repo already includes a matching pin. - After updating plugin code, commit and push before expecting
hyprpmto fetch the new version.
Add this to start-up plugins.lua:
require("Hyprspace.Hyprspace").setup()This is the preferred setup for hyprpm installs and already-loaded plugins.
If you want local manual loading from the Lua helper instead of loading the .so yourself, use:
require("Hyprspace.Hyprspace").setup({
plugin_path = HOME .. "/.config/Hyprspace/Hyprspace.so",
})Use that only for a manual local build. Do not pass plugin_path when the plugin is managed by hyprpm.
Add a keybind in keybinds.lua:
hl.unbind("SUPER + A")
hl.bind("SUPER + A", function()
if hl.plugin and hl.plugin.Hyprspace and type(hl.plugin.Hyprspace.overview) == "function" then
hl.plugin.Hyprspace.overview("toggle")
end
end)This file does not need to require(...) the helper directly.
After changing the Lua config:
hyprctl reloadAfter rebuilding the plugin binary:
cd ~/.config/Hyprspace
make all
hyprctl plugin unload ~/.config/Hyprspace/Hyprspace.so
hyprctl plugin load ~/.config/Hyprspace/Hyprspace.so
hyprctl reloadIf the plugin is installed through hyprpm, use:
hyprpm update
hyprpm reload
hyprctl reloadThe helper module exports:
local hyprspace = require("Hyprspace.Hyprspace")
hyprspace.setup()
hyprspace.apply_config()
hyprspace.toggle()
hyprspace.overview("open")
hyprspace.overview("close")
hyprspace.reload()Once the plugin is loaded, you can also call:
hl.plugin.Hyprspace.overview("toggle")
hl.plugin.Hyprspace.overview("open")
hl.plugin.Hyprspace.overview("close")The plugin is configured from Hyprspace.lua. The helper builds a Lua config table and applies it through hl.config(...).
plugin = {
hyprspace = {
panel_height = 220,
panel_border_width = 2,
workspace_margin = 10,
reserved_area = 35,
workspace_border_size = 1,
center_aligned = true,
on_bottom = false,
draw_active_workspace = true,
hide_real_layers = false,
affect_strut = false,
override_gaps = true,
gaps_in = 20,
gaps_out = 60,
auto_drag = true,
auto_scroll = true,
exit_on_click = true,
exit_on_switch = false,
disable_gestures = false,
swipe_fingers = 3,
swipe_distance = 300,
swipe_force_speed = 30,
swipe_cancel_ratio = 0.5,
click_release_threshold_ms = 200,
}
}panel_colorpanel_border_colorworkspace_active_backgroundworkspace_inactive_backgroundworkspace_active_borderworkspace_inactive_borderdrag_alphadisable_blur
panel_heightpanel_border_widthworkspace_marginreserved_areaworkspace_border_sizeadaptive_heightcenter_alignedon_bottomhide_background_layershide_top_layershide_overlay_layersdraw_active_workspacehide_real_layersaffect_strutoverride_gapsgaps_ingaps_out
auto_dragauto_scrollexit_on_clickswitch_on_dropexit_on_switchshow_new_workspaceshow_empty_workspaceshow_special_workspaceexit_key
disable_gesturesreverse_swipeswipe_fingersswipe_distanceswipe_force_speedswipe_cancel_ratioswipe_thresholdswipe_closed_paddingworkspace_scroll_speedclick_release_threshold_ms
override_anim_speed
By default, Hyprspace.lua reads colors from:
~/.config/matugen/generated/hyprland-colors.lua
If that file does not exist, Hyprspace falls back to built-in colors.
The helper converts Matugen rgba(rrggbbaa) strings into the integer color format expected by the plugin.
Check that the plugin is actually loaded:
hyprctl pluginsIf you are using a manual build, load the .so first.
Make sure source/plugins.lua calls:
require("Hyprspace.Hyprspace").setup()Then run:
hyprctl reloadCheck:
- the repo URL is correct
hyprpm.tomlcontains a pin for your current Hyprland commit- the plugin builds cleanly on that commit
Check the latest Hyprland crash report under:
~/.cache/hyprland/
and verify the plugin was built against the same Hyprland version you are running.