Actions Ring
Open an eight-slot radial launcher at the cursor, with per-app layouts, custom icons and labels, and device haptics.
The Actions Ring is a radial launcher: press its trigger and eight actions fan out around the pointer, ready to pick. It is host-side UI — a separate overlay process renders the ring and the agent executes the chosen action — so a device with a rebindable button can open one, and the layout can change per application.
Opening and dismissing it
The trigger is the ShowActionsRing action. On an MX Master 4 the Haptic
Sense Panel — the touch-sensitive thumb rest — carries it by default. To open
the ring from a different control, choose Show Actions Ring in that button's
action picker. You can also bind ShowActionsRing in
config.toml. The action is deliberately absent from
the ring's own slot picker, because one ring cannot open another.
The ring opens at the current cursor position, on the display the cursor is on. Click a slot — or hover it and release the trigger — to run its action. To leave without picking anything, press the trigger again, hit the × in the middle, or (on macOS) click anywhere outside the ring. An untouched ring expires on its own after a few seconds.
Slots
The eight positions are named clockwise from twelve o'clock: Top, TopRight,
Right, BottomRight, Bottom, BottomLeft, Left, TopLeft. Out of the
box they carry Cut, Copy, Paste, Browser Forward, Play/Pause, Browser Back,
Undo, and Redo.
Each populated slot holds:
- An action — any binding action except
ShowActionsRingitself (a ring cannot open another ring) andNone(an empty slot is simply an absent entry, so clearing a slot removes it). - An optional icon — pick from the built-in gallery, or leave it to inherit the action's own icon.
- An optional label — free text shown on hover. Custom labels render exactly
as written and are never localized, which is what makes several
RunShellCommandslots distinguishable instead of all reading "Run Command".
From the GUI
Select the device and open its Actions Ring tab: it appears for pointer devices with rebindable buttons, and for any device with a haptic panel. The editor shows the ring as it will appear, with a row of controls:
- Enabled — whether
ShowActionsRingopens this device's ring at all. - Haptic feedback — play device feedback when hovering and activating a slot,
on hardware that supports it (HID++
0x19b0hapticFeedback). Off leaves the ring silent. - Slot editor — click a slot to choose its action, its icon (Use action icon keeps the derived one), and a custom label; Clear slot empties it.
Per-application rings
Use the editor's Profile selector to choose the default layout or an application. An app without a saved layout previews the default; the first slot edit copies the default into a complete app-specific layout. Removing that profile restores the default ring without removing the app's button overrides. The app selected for editing does not force the runtime profile: the foreground application determines which ring opens.
A per-app ring is a complete layout, not a sparse overlay: when the frontmost app matches, that layout replaces the default one wholesale, so every slot you want has to be listed. This differs from per-app button bindings, where unlisted buttons fall through to the global map.
In the config
The ring lives under [devices.<key>.action_ring] in
config.toml:
[devices."receiver:aabbccdd:slot:1".action_ring]
enabled = true
haptics = true
# Omit `icon` to use the action's own icon; omit `label` to use its name;
# omit a slot entirely to leave that position empty.
[devices."receiver:aabbccdd:slot:1".action_ring.default.slots]
Top = { action = "Cut" }
TopRight = { action = "Copy", icon = "Copy" }
Right = { action = "Paste", label = "Paste It" }
BottomRight = { action = "BrowserForward" }
Bottom = { action = "PlayPause" }
BottomLeft = { action = "BrowserBack" }
Left = { action = "Undo" }
TopLeft = { action = { OpenApplication = { path = "/Applications/Safari.app", display_name = "Safari" } } }
# A per-app ring is a complete layout, not an overlay.
[devices."receiver:aabbccdd:slot:1".action_ring.per_app."com.microsoft.VSCode".slots]
Top = { action = "Cut" }
TopRight = { action = "Copy" }
Right = { action = "Redo" }
BottomRight = { action = "NextTab" }
Bottom = { action = "ShowDesktop" }
BottomLeft = { action = "PrevTab" }
Left = { action = "Undo" }
TopLeft = { action = "Paste" }Ring layouts match the foreground app identifier exactly: a bundle id on
macOS, the WM_CLASS class (X11 / GNOME) or xdg-shell app_id (wlroots) on
Linux, and a lower-cased executable path on Windows. The ring uses the same
selectors as button overlays, including the Windows exe:<name>.exe
fallback; an exact path wins when both forms exist. Prefer the app the agent
has observed in the foreground.
See Per-app profiles.
Status: the ring overlay is rendered by the agent's GPUI helper on macOS,
Linux, and Windows; dismiss-on-outside-click is macOS-only today. Haptic
feedback needs a device that reports HID++ 0x19b0, such as the MX Master 4;
every other device opens the ring silently. See
0x19b0 hapticFeedback for the
protocol detail.