Skip to content

Configuration Options

This is the complete runtime option reference for plugin:hyprexpo:* settings. Use the short key names inside a plugin { hyprexpo { ... } } block, or use the fully qualified names when setting options elsewhere in Hyprland config.

Hyprland 0.55 deprecated the custom keyword API that older HyprExpo configs used. HyprExpo no longer registers hyprexpo_gesture or hyprexpo_workspace_method. Use plugin:hyprexpo:workspace_method for workspace placement and the Lua API for gestures.

Example Shape

ini
plugin {
    hyprexpo {
        columns = 3
        gaps_in = 5
        gaps_out = 0
        bg_col = rgb(111111)
        workspace_method = center current
        keynav_enable = 1
        label_enable = 1
        border_width = 2
    }
}

In hyprland.lua, use hl.config() with a nested plugin.hyprexpo table:

lua
hl.config({
    plugin = {
        hyprexpo = {
            columns = 3,
            gaps_in = 5,
            gaps_out = 0,
            bg_col = "rgb(111111)",
            workspace_method = "center current",
            keynav_enable = 1,
            label_enable = 1,
            border_width = 2,
        },
    },
})

hl.plugin.hyprexpo is the Lua helper namespace for dispatchers and gestures; it is not the configuration block.

PR #605 Compatibility Keys

These keys are registered for the active-overview port and are intentionally separate from the richer sandwichfarm config surface. They are kept for later integration and should not replace the newer keys below.

keytypelegacy meaningnewer sandwichfarm counterpart
plugin:hyprexpo:dynamic_gridintopt-in dynamic workspace enumeration (default: off)no direct equivalent yet
plugin:hyprexpo:fill_gapsintexpand min..max workspace IDs when dynamicno direct equivalent yet
plugin:hyprexpo:mru_sortintput the current workspace firstno direct equivalent yet
plugin:hyprexpo:active_highlight_colcoloractive tile highlight colorborder_color_current
plugin:hyprexpo:active_highlight_borderintactive tile highlight widthborder_width
plugin:hyprexpo:hover_highlight_colcolorhovered tile highlight colorborder_color_hover
plugin:hyprexpo:hover_highlight_borderinthovered tile highlight widthborder_width
plugin:hyprexpo:label_posstringlegacy underscore anchor such as top_rightlabel_position (top-right)
plugin:hyprexpo:label_sizeintlegacy badge size; text renders at roughly half this sizelabel_font_size
plugin:hyprexpo:label_colcolorlegacy label tintlabel_color / label_color_default
plugin:hyprexpo:show_workspace_namesintlegacy name/number toggleshow_workspace_numbers and label_text_mode
plugin:hyprexpo:enable_keyboard_navintlegacy keyboard-navigation togglekeynav_enable
plugin:hyprexpo:enable_drag_moveintlegacy drag-move toggleno direct equivalent yet
plugin:hyprexpo:animate_entryintlegacy open animation toggleno direct equivalent yet
plugin:hyprexpo:wallpaper_bgintdraw the monitor wallpaper behind the overview tilesoptional active-overview extension

Enable the active-workspace layout explicitly; all compatibility options default to the existing fixed-grid behavior:

ini
plugin {
    hyprexpo {
        dynamic_grid = 1
        fill_gaps = 0
        mru_sort = 0
        show_workspace_names = 1
        label_pos = top_right
        label_size = 48
        wallpaper_bg = 1
    }
}

Layout and Behavior

keytypedescriptiondefault
plugin:hyprexpo:columnsintdesktops per row, clamped to 1..73
plugin:hyprexpo:gaps_inintspacing between tiles in pixels5
plugin:hyprexpo:gaps_outintouter margin around the grid in pixels0
plugin:hyprexpo:bg_colcolorgrid background color0xFF111111
plugin:hyprexpo:workspace_methodstringplacement: center current or first <workspace>center current
plugin:hyprexpo:skip_emptybool intskip empty workspaces using selector m when enabled0
plugin:hyprexpo:max_workspaceintwhen skip_empty = 0, cap sequential overview tiles at this workspace ID; 0 keeps Hyprland selector behavior0
plugin:hyprexpo:gesture_distanceintswipe distance considered complete200
plugin:hyprexpo:gesture_fingersintfingers for the interactive swipe gesture; 0 disables, otherwise 2-90
plugin:hyprexpo:gesture_directionstringswipe direction: up, down, left, right, vertical, horizontal, pinchup
plugin:hyprexpo:cancel_keystringcomma-separated key names that close overview without selecting; none or off disablesescape
plugin:hyprexpo:show_cursorbool intkeep the cursor visible while overview is open; set 0 for old hidden-cursor behavior1
plugin:hyprexpo:show_pinned_windowsbool intrender pinned/PiP windows in workspace preview thumbnails; default 0 hides them from previews only0

Pinned windows, including browser Picture-in-Picture windows, stay pinned and visible in normal Hyprland. By default HyprExpo hides them only while capturing workspace preview thumbnails so they do not appear on every tile. Set show_pinned_windows = 1 to opt in to the old preview behavior.

Trackpad gesture

gesture_fingers and gesture_direction register the same interactive, follow-your-finger overview gesture that hl.plugin.hyprexpo.gesture{} provides, but from plain config. Hyprland selects either hyprlang or Lua for the whole config and a .lua cannot be sourced from a .conf, so hyprlang users need this to reach the gesture at all.

ini
plugin {
    hyprexpo {
        gesture_fingers = 3
        gesture_direction = vertical
    }
}

gesture_fingers = 0 (the default) registers nothing, leaving trackpad handling entirely to Hyprland and Lua. Use a gesture_direction that does not collide with an existing Hyprland gesture = binding for the same finger count.

Bad values are rejected when the gesture is registered, not while the config is parsed. An unknown gesture_direction, or a gesture_fingers value that is neither 0 nor in 2-9, raises a notification and leaves the gesture unregistered rather than failing silently. Under the hyprlang backend these do not reach hyprctl configerrors: plugins have no API for adding entries there, and hyprlang does not run the validators attached to plugin config values.

Tile Appearance

keytypedescriptiondefault
plugin:hyprexpo:tile_roundingintcorner radius in pixels for workspace previews0
plugin:hyprexpo:tile_rounding_powerfloatrounding curve exponent2.0
plugin:hyprexpo:tile_rounding_focusintfocused tile radius; -1 inherits tile_rounding-1
plugin:hyprexpo:tile_rounding_currentintcurrent tile radius; -1 inherits tile_rounding-1
plugin:hyprexpo:tile_rounding_hoverinthovered tile radius; -1 inherits tile_rounding-1
plugin:hyprexpo:border_widthintborder thickness in pixels2
plugin:hyprexpo:border_colorstringdefault border for non-highlighted tiles; solid color or gradientempty
plugin:hyprexpo:border_color_currentstringcurrent workspace tile border; solid color or gradientrgb(66ccff)
plugin:hyprexpo:border_color_focusstringkeyboard-focused tile border; solid color or gradientrgb(ffcc66)
plugin:hyprexpo:border_color_hoverstringpointer-hovered tile border; solid color or gradientrgb(aabbcc)
plugin:hyprexpo:border_grad_currentstringdeprecated current-tile gradient fallback; use border_color_currentempty
plugin:hyprexpo:border_grad_focusstringdeprecated focused-tile gradient fallback; use border_color_focusempty
plugin:hyprexpo:border_grad_hoverstringdeprecated hovered-tile gradient fallback; use border_color_hoverempty
plugin:hyprexpo:border_stylestringdeprecated compatibility key; border style is detected from the color formatsimple

Drag-Drop Window Styling

These options style the visual feedback shown while dragging a window between workspace previews. HyprExpo renders the under-pointer drag proxy and, while the pointer is over a valid target workspace, a positional landing proxy inside that target tile. Empty border color values inherit the focused tile border, so the default look stays unchanged until you opt into drag/drop-specific styling.

The landing proxy is visual-only in this milestone. It previews drop intent; the actual release still uses the existing safe workspace move behavior.

keytypedescriptiondefault
plugin:hyprexpo:drag_drop_proxy_colorcolortranslucent dragged-window proxy before the move threshold is crossed0x24EDB342
plugin:hyprexpo:drag_drop_proxy_active_colorcolordragged-window proxy after movement is active0x3DEDB342
plugin:hyprexpo:drag_drop_proxy_border_colorstringproxy border; accepts solid colors or gradients, empty inherits border_color_focus / border_grad_focusempty
plugin:hyprexpo:drag_drop_proxy_border_widthintproxy border width; -1 inherits max(2, border_width + 1), 0 disables-1
plugin:hyprexpo:drag_drop_proxy_roundingintproxy corner radius in pixels; -1 inherits the automatic focused-tile rounding-1
plugin:hyprexpo:drag_drop_source_border_colorstringsource workspace border while a drag/drop move is active; accepts solid colors or gradients, empty inherits focus borderempty
plugin:hyprexpo:drag_drop_source_border_widthintsource workspace border width while dragging; -1 inherits border_width, 0 disables-1

Color Values

Color-backed settings such as bg_col, label_color*, label_bg_color, and selection_label_color use Hyprland color parsing. Solid border colors are strings because border settings also accept gradient specs.

Solid values:

ini
bg_col = rgb(111111)
border_color_current = rgb(66ccff)

Gradient values:

ini
border_color_current = rgba(33ccffee) rgba(00ff99ee) 45deg

Drag/drop styling values:

ini
drag_drop_proxy_color = rgba(66ccff22)
drag_drop_proxy_active_color = rgba(66ccff44)
drag_drop_proxy_border_color = rgba(66ccffee) rgba(ffcc66ee) 45deg
drag_drop_source_border_color = rgb(ffcc66)
drag_drop_proxy_border_width = 3
drag_drop_proxy_rounding = 10

Workspace Labels

keytypedescriptiondefault
plugin:hyprexpo:label_enablebool intenable workspace labels1
plugin:hyprexpo:label_colorcolorlegacy accepted label color; state-specific colors below control rendering0xFFFFFFFF
plugin:hyprexpo:label_text_modestringlabel text source: token, index, or idtoken
plugin:hyprexpo:label_token_mapstringcomma-separated tokens by visible tile order; empty entries skipempty
plugin:hyprexpo:label_positionstringlabel anchor: top-left, top-right, bottom-left, bottom-right, or centercenter
plugin:hyprexpo:label_offset_xinthorizontal offset from the label anchor in pixels0
plugin:hyprexpo:label_offset_yintvertical offset from the label anchor in pixels0
plugin:hyprexpo:label_showstringvisibility rule: always, hover, focus, hover+focus, current+focus, or neveralways
plugin:hyprexpo:label_color_defaultcolordefault label text colorrgb(ffffff)
plugin:hyprexpo:label_color_hovercolorhovered label text colorrgb(eeeeee)
plugin:hyprexpo:label_color_focuscolorkeyboard-focused label text colorrgb(ffcc66)
plugin:hyprexpo:label_color_currentcolorcurrent workspace label text colorrgb(66ccff)
plugin:hyprexpo:show_workspace_numbersbool intforce labels to show workspace IDs regardless of label_text_mode0
plugin:hyprexpo:workspace_number_colorcolorforced workspace ID label colorrgb(ffffff)
plugin:hyprexpo:label_scale_hoverfloathover scale multiplier for labels1.0
plugin:hyprexpo:label_scale_focusfloatkeyboard-focus scale multiplier for labels1.0
plugin:hyprexpo:label_font_sizeintbase label font size in pixels16
plugin:hyprexpo:label_font_familystringPango font familysans
plugin:hyprexpo:label_font_boldbool intrender label text in bold0
plugin:hyprexpo:label_font_italicbool intrender label text in italic0
plugin:hyprexpo:label_text_underlinebool intunderline label text0
plugin:hyprexpo:label_text_strikethroughbool intstrikethrough label text0
plugin:hyprexpo:label_pixel_snapbool intsnap label positions to whole pixels1
plugin:hyprexpo:label_center_adjust_xintmanual center nudge in pixels for centered labels0
plugin:hyprexpo:label_center_adjust_yintmanual center nudge in pixels for centered labels0
plugin:hyprexpo:label_bg_enablebool intdraw a background bubble behind labels1
plugin:hyprexpo:label_bg_colorcolorlabel background colorrgba(00000088)
plugin:hyprexpo:label_bg_shapestringlabel background shape: circle, square, or roundedcircle
plugin:hyprexpo:label_bg_roundingintradius for rounded label backgrounds8
plugin:hyprexpo:label_paddingintbackground padding around label text in pixels8

Label token maps are comma-separated and follow visible tile order:

ini
label_text_mode = token
label_token_map = 1,2,3,4,5,6,7,8,9,0

Selection Labels

Selection labels are optional overlays used by hyprexpo:kb_select. They let normal workspace labels stay stable while selection tokens use a separate map.

keytypedescriptiondefault
plugin:hyprexpo:selection_label_enablebool intenable the separate selection-token overlay0
plugin:hyprexpo:selection_label_token_mapstringcomma-separated tokens by visible tile order; empty entries skipa,s,d,f,g,q,w,e,r,t,z,x,c,v,b
plugin:hyprexpo:selection_label_positionstringselection label anchor: top-left, top-right, bottom-left, bottom-right, or centertop-right
plugin:hyprexpo:selection_label_offset_xinthorizontal offset from the selection-label anchor in pixels6
plugin:hyprexpo:selection_label_offset_yintvertical offset from the selection-label anchor in pixels6
plugin:hyprexpo:selection_label_colorcolorselection-token text colorrgb(ffcc66)

Example token-based selection:

ini
selection_label_enable = 1
selection_label_token_map = a,s,d,f,g,q,w,e,r,t

Then bind hyprexpo:kb_select to those tokens in the overview submap.

Keyboard Navigation

keytypedescriptiondefault
plugin:hyprexpo:keynav_enablebool intenable keyboard navigation and the overview submap behavior1
plugin:hyprexpo:number_key_modestringraw digit handling: workspace, index, or passthrough for user mappingsworkspace
plugin:hyprexpo:keynav_wrap_hbool intwrap horizontally at row edges1
plugin:hyprexpo:keynav_wrap_vbool intwrap vertically at column edges1
plugin:hyprexpo:keynav_reading_orderbool intuse row-major horizontal movement instead of spatial movement0

Safe Failure Behavior

Invalid columns, workspace methods, label tokens, border colors, drag/drop border colors, gradient values, and bool-int options are expected to fail safely. The plugin should log invalid values or use a fallback instead of crashing Hyprland during render.

HyprExpo is a maintained Hyprland plugin fork.