github y3owk1n/neru v1.55.0

5 hours ago

1.55.0 (2026-09-21)

This release adds bisect mode, a new way to reach a target by halving the screen until the cursor lands on it, with no labels to read. Grid and recursive grid can now start from the focused window instead of the whole display, and one hotkey can cycle through --strategy or --capture-scope values. Overlay labels shrink to fit their cells instead of vanishing. On macOS, overlays no longer go missing on every Space but one after a fullscreen exit. neru stop now pauses everything it says it does.

Migration Guide

Warning

Every valid config still loads, but four behaviours change.

Primary+Shift+B now launches bisect mode.
The new launcher merges in as a default. If you already bind that chord, keep your binding and disable the launcher:

[hotkeys]
"Primary+Shift+B" = "__disabled__"

Recursive grid and bisect labels no longer disappear at depth.
Labels used to hide as soon as a cell dropped below the autohide threshold. They now shrink to fit, and hide only below min_font_size (default 6). To get the old behaviour back exactly:

[recursive_grid.ui]
min_font_size = 20   # set equal to font_size

font_size is now the largest size a label draws at, in [recursive_grid.ui], [bisect.ui], [grid.ui] and [monitor_select.ui].

neru stop refuses every command until neru start.
Scroll mode, declared modes, neru action, neru run, neru macro and global hotkeys all used to keep working while stopped. They now reply with ERR_NOT_RUNNING. Lifecycle, status, configuration and the preference toggles still answer. Scripts that ran neru action while stopped get an error instead of a silent success.

On Windows, a repeated monitor name gets its device name as a suffix.
Two displays that both report "Generic PnP Monitor" are now told apart, so a move_monitor --name that matched the bare name may need the suffixed form. Run neru monitor_select to see the names in use.


Bisect

  • A new mode that narrows a region by halves. neru bisect starts from the active screen and draws it divided in four. h, j, k, l keep the left, bottom, top or right half, y, u, b, n keep a quadrant, and the cursor moves to the centre of what is left. Backspace takes the last cut back and Space starts over. Ten quadrant cuts take a 1920 by 1080 screen down to two pixels
  • --capture-scope window starts from the focused window, --toggle closes the mode on a second press, and --cursor-selection-mode hold keeps the real cursor still while a stand-in marks the centre. Backtick toggles following
  • Bind action bisect --direction <cut> with the eight cuts left, right, up, down, up_left, up_right, down_left, down_right. --count <n> applies the cut several times in one press, so a key can keep a quarter or a sixteenth, and one backspace undoes the whole press
  • Arrow keys nudge the cursor 10px per press, as in recursive grid. The letter keys cut
  • A [bisect] section with enabled, capture_scope, [bisect.hotkeys], [[bisect.app_configs]], [bisect.animation], [bisect.ui] and [mode_indicator.bisect], in the recursive grid's shape and defaults

Grid and recursive grid

  • Both modes can start from the focused window. Set grid.capture_scope or recursive_grid.capture_scope to "window", set it on an app_configs entry, or pass --capture-scope window for one activation. The grid covers the window clipped to the active screen, so recursive grid's first cut is a third of the window rather than of the display. Nothing focused, or a platform with no focused-window source, warns and falls back to the screen

Hotkeys and CLI

  • One binding can cycle through values. --strategy on hints and --capture-scope on hints, grid, recursive_grid and bisect accept a comma list. Entering the mode uses the first entry. Running the same command while the mode is open steps to the next entry, starting from whatever the session is really using, and wraps at the end. A single value behaves as before
[hotkeys]
"Primary+Shift+H" = "hints --strategy axtree,vision"

[grid.hotkeys]
"Ctrl+W" = "grid --capture-scope window,screen"
  • A list cannot be combined with --toggle, and only one flag per command may take a list. A --strategy list refuses --split-word

Overlay

  • Labels shrink to fit. Recursive grid and bisect cell labels and the sub-key preview scale down with the cell, grid labels draw at one smaller size for the whole grid when the font is too large, and the monitor picker keeps the key and monitor name inside the badge. New min_font_size in [recursive_grid.ui] and [bisect.ui]
  • On Linux and Windows, badges and indicators are sized from measured text instead of a fixed width per character, so wide labels no longer clip and narrow ones no longer sit in loose boxes

macOS

  • Overlays come back after a fullscreen exit. Leaving fullscreen destroys a Space, and macOS could pin Neru's hidden overlay windows to the Space they last appeared on, so hints and grids on every other Space drew nowhere until a restart. Every overlay show now checks that the window is on the active Space and repairs it when not

Windows

Note

Windows implementations are mainly contributor driven, feel free to help improving it!

  • Hints stay inside the focused window. Chromium leaves controls laid out past the window edge marked on screen, so Edge with vertical tabs drew a column of hints below the window. Elements are now clipped to the window's visible frame
  • hints.visible_check_enabled now works on Windows. Each control's centre is hit-tested, and controls hidden under panels, popups or other windows are dropped
  • Two monitors with the same driver name are both reachable from monitor_select and move_monitor. Before, both resolved to the first display

Linux

Note

Linux implementations are mainly contributor driven, feel free to help improving it!

  • A Wayland scroll no longer carries the held modifier. Binding ctrl+j to action scroll_down used to scroll and zoom at once. Scrolls now release the chord's modifiers around themselves, as clicks already did
  • Neru builds from source on distros whose pipewire package emits -fno-strict-overflow, such as Ubuntu 26.04

Every platform

  • neru stop exits the open mode and unregisters every hotkey at once, and neru start re-registers them without waiting for a focus change. The systray toggle does the same
  • Two identical monitors on macOS are both reachable from monitor_select

Features

  • cli: add ability to cycle --strategy and --capture-scope (#1690) (8181c1d)
  • modes: add bisect mode (#1678) (e67045c)
  • modes: repeat a bisect cut with --count in one press (#1682) (5dbfcee)
  • modes: support --capture-screen for grid and recursive grid (#1686) (6576c70)
  • overlay: scale label fonts down to fit their cells and badges (#1692) (1f70879)

Bug Fixes

  • config: use arrow key for mouse move in bisect for consistency (#1681) (7484b67)
  • darwin: repair overlays pinned to one space after a fullscreen exit (#1687) (c32e3dc)
  • lifecycle: make neru stop pause every mode, action and hotkey (#1689) (570042a)
  • linux: build on distros whose pipewire emits -fno-strict-overflow (#1697) (22c3edc)
  • modes: keep every monitor reachable when displays share a name (#1676) (f7ccc96)
  • scroll: release held modifiers around a Wayland scroll (#1683) (437f35e)
  • windows: keep hints inside the focused window frame (#1688) (1187d94)

Don't miss a new neru release

NewReleases is sending notifications on new releases.