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. Shortcuts never fire while you're typing in an input, textarea, select, or contenteditable field, so search boxes and form fields behave normally.
Configure keyboard shortcuts
Keyboard shortcuts are controlled through config.hotkeys:
# 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
}
endSet 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.
Global shortcuts
These shortcuts are available from anywhere in the admin panel.
| Keys | Action |
|---|---|
| ? | Open/close the keyboard shortcuts modal |
| Cmd+K / Ctrl+K | Focus the global search |
| Shift+\ | Toggle the sidebar |
| Shift+T | Focus the page content (then Tab into it) |
| Shift+K | Toggle the shortcut key badges |
| B | Go back |
| r r r | Reload the page (preserves scroll position) |
| ↑ / ↓ | Navigate options inside a modal |
| Esc | Close 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.
| Keys | Action |
|---|---|
| Shift+M | Cycle the color scheme (auto / light / dark) |
| Shift+N | Cycle the neutral theme |
| Shift+A | Cycle the accent color |
Index view
| Keys | Action |
|---|---|
| / | Focus the resource search input |
| C | Create a new record |
| A | Open the actions menu |
| J / K | Focus the table and move to the next / previous row |
| ↑ / ↓ | Navigate rows (once the table is focused) |
| ↵ | Open the focused record |
| Space | Select / deselect the row |
| Esc | Clear row focus / deselect rows |
| V T | Switch to table view |
| V G | Switch to grid view |
| V M | Switch 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
| Keys | Action |
|---|---|
| E | Edit the record |
| D | Delete the record |
| A | Open the actions menu |
| I | Go back to the index |
Edit view
| Keys | Action |
|---|---|
| Cmd+↵ / Ctrl+↵ | Submit the form |
| I | Go back to the index |
| Esc | Unfocus the current field |
Action modal
| Keys | Action |
|---|---|
| Cmd+↵ / Ctrl+↵ | Run the action |
| Esc | Cancel / close the modal |
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.
# 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
}
endThe menu item automatically renders a key badge next to its label and registers the binding. Hotkey strings use @github/hotkey syntax — 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:
class Avo::Resources::Post < Avo::BaseResource
self.hotkey = "g p"
endAdd 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:
<a href="/avo/posts/new" data-hotkey="c">New post</a>To offer platform alternatives (Mac vs. non-Mac), space-separate the variants:
<button data-hotkey="Meta+Enter Control+Enter">Save</button>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.