mousemaster is a keyboard mouse and key remapper for Windows, with a macOS build that runs as root through the Karabiner virtual HID device. It composes modes, combos and commands from a properties file. Flash covers its mouse side natively on macOS, with the Accessibility permission only, and leaves key remapping to the tools that do it best.
| mousemaster | Flash |
|---|---|
Normal mode: continuous movement with acceleration (ijkl, hjkl) |
mouse_pointer: the layout’s hjkl or the arrows, accelerating while held; [hints] pointer_step, pointer_acceleration, pointer_max_step |
| Slow movement while a modifier is held | Shift: the 2-point fine step |
| Press, release, toggle a button; drag | m , . in pointer mode, v to hold the button; enter_hold_mode (HOLD) from NORMAL or INSERT |
| Jump to the screen edges, window edges, window centre | mouse_warp --area=window|screen --edge=center|top|bottom|left|right |
| Wheel scrolling | ctrl+e / ctrl+y and ctrl+d / ctrl+u in NORMAL, h / l sideways, scroll_target to pick the area |
| Hint grid (labels across the screen) | mouse_grid: one keyboard-shaped step per keypress, mouse_grid --zoom-to-depth=N to start deeper |
Recursive hint grid (3×3, cursor follows) |
mouse_grid --bisect (halves and quarters) or the keyboard grid with mouse_grid_cursor_follow = true |
| Grid mode: shrink, move, snap to the grid’s edges | Bisect halves; the arrows slide the region; Shift-arrows snap the pointer to an edge |
| UI hints (accessibility) | mouse_target, Flash’s default |
| Vision UI hints (screen capture) | Not available: Flash never reads screen pixels |
| Screen selection mode | mouse_screens: one label per display, the pointer lands on its centre; Tab in the grid moves to the next display |
| Position history: save, hints, cycle, per app | mouse_position --action=save|hints|next|previous|unsave|clear; [hints] position_history_size, position_history_scope = "app" |
| Center mouse after Alt-Tab | [hints] pointer_follows_focus = true |
| Cursor indicator by mouse state | The pointer-mode ring changes colour while a button is held; the window border shows the mode |
| Zoom | Not available: magnifying needs Screen Recording |
| Idle mode, mode history, mode after an unhandled key | NORMAL, INSERT, COMMAND and TERMINAL; leave_mode; unmapped NORMAL keys are swallowed by design |
| App-specific combos | [mode.apps."<bundle id>".<mode>.mappings] |
Macros (+leftctrl +v -v -leftctrl) |
send_key --keys=cmd+v, send_keys |
| Combos: holds, taps, tap-dances, timed sequences; key aliases; virtual keys | Not in Flash. Flash’s keyboard tap only decides which key it swallows. Keep Karabiner-Elements or kanata for remapping; they run alongside Flash |
| Cheatsheet while a key is held | ? opens the key mappings: your layout with the bindings of the mode you pick under it |
| Hint appearance (fonts, gradients, animations) | [overlay] colours, font size and placement. No animations: hints are drawn in one commit |
docs/examples/mousemaster/flash.toml
follows the neo-mousekeys layout: one chord enters pointer mode, ijkl is the
pointer’s cluster through the arrows, and the hint, grid and screen modes sit on
f, g and c of NORMAL:
[hints]
pointer_step = 10
pointer_acceleration = 8
pointer_max_step = 120
pointer_follows_focus = true
position_history_scope = "app"
[mode.all.mappings]
"alt+e" = ["flash", "enter_normal_mode"]
[mode.normal.mappings]
"i" = ["flash", "mouse_pointer"]
"g" = ["flash", "mouse_grid", "--bisect"]
"c" = ["flash", "mouse_screens"]
"p" = ["flash", "mouse_position", "--action=hints"]
"P" = ["flash", "mouse_position", "--action=save"]