Skip to content
Looking for every option?See the full API reference →

Keyboard Shortcuts ​

Avo ships with a built-in keyboard shortcut system that lets users navigate and operate the admin panel without touching the mouse. Press ? at any time to open the shortcuts reference modal, which lists every shortcut available on the current page.

With no configuration, all shortcuts are enabled and each bound button or link renders a small badge — for example C on a Create button — hinting at its shortcut. A shortcut without Cmd/Ctrl or Alt never fires while you're typing in an input, textarea, select, or contenteditable field, so search boxes and form fields behave normally; a chord with one of those reaches fields.

Configure keyboard shortcuts ​

Keyboard shortcuts are controlled through config.hotkeys:

ruby
# config/initializers/avo.rb
Avo.configure do |config|
  config.hotkeys = {
    enabled: true,          # master switch for all keyboard shortcuts
    show_key_badges: true   # show the inline <kbd> badges next to buttons and links
  }
end

Set enabled: false to turn the whole system off — no shortcuts fire and the key badges disappear. Set show_key_badges: false to keep the shortcuts working but hide the inline badges from the UI.

Both default to true, so you only need to set the keys you want to change.

Change or disable a shortcut ​

Since avo >= v4.3.6

Every shortcut in the tables below has a stable ID. Rebind it, or turn it off with false, through bindings:

ruby
# config/initializers/avo.rb
Avo.configure do |config|
  config.hotkeys = {
    bindings: {
      "record.edit": "Shift+E",          # edit with Shift+E instead of E
      "record.delete": false,            # no delete shortcut at all
      "index.next_row": "j,ArrowDown",   # either key moves to the next row
      "advanced_search.open": "Mod+/"    # add-on shortcuts work the same way
    }
  }
end

Shortcuts you don't list keep their defaults. The new key shows up everywhere the old one did: it fires the action, appears on the button's badge, and is listed in the ? modal. A disabled shortcut disappears from all three.

Keys are written in the @github/hotkey format: Mod+k is Cmd+K on macOS and Ctrl+K elsewhere, a space makes a sequence (g i), and a comma lists alternatives (j,ArrowDown); badges and the ? modal show the first one. The full list of IDs is on the reference page. A key without Cmd/Ctrl or Alt never fires while you type in a field, so binding the search palette to a plain letter is safe; a chord with one reaches fields, which is how the assistant's Mod+j works.

Avo checks your bindings when the app boots and raises if an ID is misspelled, if two shortcuts that can fire on the same page share a key, or if a single key would block a sequence (binding v alone would stop V T from ever firing).

Fixed keys

Esc and Cmd/Ctrl+↵ close and submit every modal and form, so they can't be rebound. The arrow keys, ↵ and Space inside tables, menus and editors are fixed too.

Global shortcuts ​

These shortcuts are available from anywhere in the admin panel.

KeysAction
?Open/close the keyboard shortcuts modal
Cmd+K / Ctrl+KFocus the global search
Shift+\Toggle the sidebar
Shift+TFocus the page content (then Tab into it)
Shift+KToggle the shortcut key badges
BGo back
r r rReload the page (preserves scroll position)
↑ / ↓Navigate options inside a modal
EscClose modal / unfocus field

Shift+K hides or shows the inline badges for the current browser (the choice is remembered). It only works when show_key_badges isn't set to false.

Appearance shortcuts ​

Cycle the appearance settings from any page.

KeysAction
Shift+MCycle the color scheme (auto / light / dark)
Shift+NCycle the neutral theme
Shift+ACycle the accent color
Shift+SToggle the pick sound

Assistant ​

Requires the Avo AI add-on. Without it, the shortcut isn't bound and doesn't show up in the ? modal.

KeysAction
Cmd+J / Ctrl+JOpen the assistant

Its chord has a modifier, so it fires while you're typing in a field — pulling the assistant up mid-edit is the point. Rebind it to a key without Cmd/Ctrl or Alt and it stays out of fields like every other shortcut. It follows enabled like the rest, so config.hotkeys = {enabled: false} turns it off along with everything else.

Index view ​

KeysAction
/Focus the resource search input
CCreate a new record
AOpen the actions menu
J / KFocus the table and move to the next / previous row
↑ / ↓Navigate rows (once the table is focused)
↵Open the focused record
SpaceSelect / deselect the row
EEdit the focused record
DDelete the focused record
AOpen the focused row's actions list, when its row controls have one
EscClear row focus / deselect rows
V TSwitch to table view
V GSwitch to grid view
V MSwitch to map view

Use J / K to jump into the table from anywhere on the page; the arrow keys take over once a row is focused.

Show view ​

KeysAction
EEdit the record
DDelete the record
AOpen the actions menu
CCreate a new record
IGo back to the index

C follows the same authorization as the index's create button: if the user can't create the record, the key does nothing.

Edit view ​

KeysAction
Cmd+↵ / Ctrl+↵Submit the form
IGo back to the index
EscUnfocus the current field

Modals ​

KeysAction
Cmd+↵ / Ctrl+↵Submit the modal's form (run the action, attach, save)
EscCancel / close the modal

Cmd+↵ works from inside a field too, and in any modal that wraps or contains a form: action modals, the attach modal, the "Create new" modal of a belongs_to field, and modals your own views render with Avo::ModalComponent, including ones a Turbo Stream inserts. It submits with the modal's primary submit button, so that button's name/value are sent. If that button is disabled, nothing happens.

Assign hotkeys to the sidebar menu ​

The avo-menu DSL supports a hotkey: option on any item type, letting users jump straight to a sidebar section from anywhere in the admin panel.

ruby
# config/initializers/avo.rb
Avo.configure do |config|
  config.main_menu = -> {
    section "Content", icon: "tabler/outline/files" do
      resource :post, hotkey: "g p"
      resource :category, hotkey: "g c"
      link "Analytics", path: "/avo/analytics", hotkey: "g a"
    end
  }
end

The menu item automatically renders a key badge next to its label and registers the binding. Hotkey strings use the @github/hotkey format — space-separate keys for a sequence like g p.

For resource items you can set the hotkey on the resource class instead, and it applies wherever that resource appears in the menu:

ruby
class Avo::Resources::Post < Avo::BaseResource
  self.hotkey = "g p"
end

Add your own shortcuts ​

Avo binds shortcuts declaratively through data-hotkey attributes, so any button or link you render in a custom tool or partial can opt in:

html
<a href="/avo/posts/new" data-hotkey="c">New post</a>

Use Mod for a key that should be Cmd on macOS and Ctrl elsewhere, and a comma for alternatives. A space means a sequence, not an alternative:

html
<button data-hotkey="Mod+s">Save</button>
<a href="/avo/reports" data-hotkey="g r,Shift+R">Reports</a>

Bindings are re-applied on every Turbo navigation, so they survive turbo:load and turbo:frame-render without extra work.

Shortcuts hidden inside association panels ​

When a resource is rendered inside an association panel — as a has_many, has_one, or similar relation on another record's show page — some shortcuts are intentionally suppressed to avoid ambiguity:

  • Create (C) and Actions (A) — hidden because the show page may host several association panels, so a single C or A can't know which one to target.
  • Edit (E) and Delete (D) — hidden because they belong to the show view of the top-level record, not to an association row.