Skip to content

Gamepad navigation

Zephyr can be driven with a gamepad. Useful when you've got a controller plugged in for couch play and don't want to grab the keyboard to switch profiles between games.

Supported controllers

Anything the browser exposes through the standard navigator.getGamepads() API. Zephyr detects Xbox, PlayStation, and Nintendo controllers by name and adapts the on-screen button labels accordingly; everything else is treated as a generic gamepad.

If your gamepad shows up in your OS's controller test page, it'll work in Zephyr.

Activation

Gamepad navigation is off by default. Turn it on in Settings -> Gamepad -> Enable gamepad navigation. Once enabled, Zephyr shows the connected controller's name in the same Settings section and a button-legend bar appears at the bottom of the app while a controller is connected.

Default bindings

Using Xbox button names; PS equivalents in parens.

ButtonAction
Left stick / D-padMove focus between elements
A (Cross)Activate the focused element. On a text input, opens the on-screen keyboard.
B (Circle)Close an open dropdown or modal (sends Escape otherwise).
Y (Triangle)Multi-select: hold while moving the stick to chain-select mod cards.
LB / RB (L1/R1)Switch tab inside a tabbed view, or move between sidebar pages if no tabs are present.
RT (R2)Focus the filter/search row of the current page.
Start (Options)Focus the launch button.
Select / Back (Share)Focus the batch-action bar (when one is visible).
Right stickScroll the focused panel.

The hint bar at the bottom of the app shows the most relevant buttons while a controller is connected.

On-screen keyboard

Pressing A on a text field opens an on-screen keyboard you can navigate with the stick. Useful for entering profile names, search queries, and similar short input. For long input (like editing a config file's text area), it's still usually faster to plug in a USB keyboard.

Disconnect handling

If your controller disconnects mid-action, Zephyr drops its inputs and waits for a reconnection. Reconnecting picks up where you left off.

Limitations

  • The randomizer's YAML editor is mostly typeable but really wants a keyboard.
  • The config editor works for sliders / toggles / dropdowns; complex multi-line text inputs are clunky on gamepad.
  • Browser-based flows like Discord OAuth open in a system browser, which gamepad won't drive.

Customization

Bindings aren't user-configurable yet. If you want, say, Y for "back" instead of B because that's how your favourite app does it, open an issue - gamepad customization is on the wishlist.

Released under GPL-3.0.