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.