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:rowsintfixed-grid rows, positive values clamped to 1..7; 0 or negative values follow columns0
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:overview_modestringauto detects Hyprland's native scrolling layout on the triggering workspace and opens the scrolling overview for it; grid always opens the classic workspace grid regardless of detected layout. Unrecognized values behave as autoauto
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
plugin:hyprexpo:scrolling_thumbnail_budgetintscrolling thumbnail budget multiplier m, clamped to 1..16; total capture pixels are bounded by m * W * H for monitor size W x H4
plugin:hyprexpo:scrolling_input_debugbool intenable deterministic input and loaded native mutation acceptance dispatchers; leave disabled outside disposable testing0

Rectangular fixed grids ​

Set positive rows to choose the height independently of columns. For example, this makes a five-column, two-row grid with ten slots:

lua
hl.config({plugin = {hyprexpo = {
    columns = 5,
    rows = 2,
    dynamic_grid = 0,
    skip_empty = 0,
}}})

Workspace previews retain their aspect ratio and the grid is centered with letterboxing as needed. Empty and not-yet-created workspaces remain available as selection and drag/drop targets. A workspace cap may leave non-selectable padding inside the configured rectangle; it does not shrink the grid.

The default rows = 0 inherits the column count, preserving existing square-grid behavior. It does not derive rows from workspace count. rows has no effect on dynamic_grid = 1 or native scrolling-layout overviews. The existing first-anchor growth can increase columns when uncapped, but explicit rows stay fixed.

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.

The scrolling budget is shared across every tight target thumbnail in the active overview. A per-target cap is applied first; if the requested total still exceeds m * W * H, every target is scaled by the same square-root factor, with a 16-pixel minimum fallback. This bounds GPU memory without dropping offscreen columns from the overview. See Scrolling Overview.

Trackpad gesture ​

gesture_fingers and gesture_direction register the interactive, follow-your-finger expo gesture from plain config. They remain expo-only; registering the cancel action requires hl.plugin.hyprexpo.gesture{} in a Lua config. Hyprland selects either hyprlang or Lua for the whole config and a .lua cannot be sourced from a .conf, so hyprlang users need these keys to reach the expo 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, rows, 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.