chrome.commands Stay organized with collections Save and categorize content based on your preferences.
Description
Use the commands API to add keyboard shortcuts that trigger actions in your extension, for example, an action to open the browser action or send a command to the extension.
Manifest
Concepts and usage
The Commands API allows extension developers to define specific commands, andbind them to a default key combination. Each command an extension accepts mustbe declared as properties of the"commands" object in theextension'smanifest.
The property key is used as the command's name. Command objects can take twoproperties.
suggested_keyAn optional property that declares default keyboard shortcuts for thecommand. If omitted, the command will be unbound. This property can either takea string or an object value.
A string value specifies the default keyboard shortcut that should beused across all platforms.
- An object value allows the extension developer to customize thekeyboard shortcut for each platform. When providing platform-specificshortcuts, valid object properties are
default,chromeos,linux,mac, andwindows.
SeeKey combination requirements for additional details.
- An object value allows the extension developer to customize thekeyboard shortcut for each platform. When providing platform-specificshortcuts, valid object properties are
description- A string used to provide the user with a short description of the command'spurpose. This string appears in extension keyboard shortcut management UI.Descriptions are required for standard commands, but are ignored forActioncommands.
An extension can have many commands, but may specify at most four suggestedkeyboard shortcuts. The user can manually add more shortcuts from thechrome://extensions/shortcuts dialog.
Supported Keys
The following keys are usable command shortcuts. Key definitions are casesensitive. Attempting to load an extension with an incorrectly cased key willresult in a manifest parse error at installation time.
- Alpha keys
A…Z- Numeric keys
0…9- Standard key strings
General–
Comma,Period,Home,End,PageUp,PageDown,Space,Insert,DeleteArrow keys–
Up,Down,Left,RightMedia Keys–
MediaNextTrack,MediaPlayPause,MediaPrevTrack,MediaStop- Modifier key strings
Ctrl,Alt,Shift,MacCtrl(macOS only),Option(macOS only),Command(macOS only),Search(ChromeOS only)
Key combination requirements
Extension command shortcuts must include either
CtrlorAlt.Modifierscannot be used in combination with Media Keys.
On many macOS keyboards,
Altrefers to the Option key.On macOS,
CommandorMacCtrlcan also be used in place ofCtrl,and theOptionkey can be used in place ofAlt(see next bulletpoint).
On macOS
Ctrlis automatically converted intoCommand.Commandcan also be used in the"mac"shortcut to explicitly referto the Command key.To use the Control key on macOS, replace
CtrlwithMacCtrlwhendefining the"mac"shortcut.Using
MacCtrlin the combination for another platform will cause avalidation error and prevent the extension from being installed.
Shiftis an optional modifier on all platforms.Searchis an optional modifier exclusive to ChromeOS.Certain operating system and Chrome shortcuts (e.g. window management)always take priority over Extension command shortcuts and cannot beoverridden.
Ctrl+Alt are not permitted in order to avoid conflicts with theAltGr key.Handle command events
manifest.json:
{"name":"My extension",..."commands":{"run-foo":{"suggested_key":{"default":"Ctrl+Shift+Y","mac":"Command+Shift+Y"},"description":"Run \"foo\" on the current page."},"_execute_action":{"suggested_key":{"windows":"Ctrl+Shift+Y","mac":"Command+Shift+Y","chromeos":"Ctrl+Shift+U","linux":"Ctrl+Shift+J"}}},...}In your service worker, you can bind a handler to each of the commands definedin the manifest usingonCommand.addListener. For example:
service-worker.js:
chrome.commands.onCommand.addListener((command)=>{console.log(`Command:${command}`);});Action commands
The_execute_action (Manifest V3),_execute_browser_action (Manifest V2),and_execute_page_action (Manifest V2) commands are reserved for the action oftrigger your action, browser action, or page action respectively. These commandsdon't dispatchcommand.onCommand events like standardcommands.
If you need to take action based on your popup opening, consider listening for aDOMContentLoaded event inside your popup's JavaScript.
Scope
By default, commands are scoped to the Chrome browser. This means that when thebrowser does not have focus, command shortcuts are inactive. Beginning in Chrome35, extension developers can optionally mark a command as "global". Globalcommands also work while Chromedoes not have focus.
Note: ChromeOS does not support global commands.Keyboard shortcut suggestions for global commands are limited toCtrl+Shift+[0..9]. This is a protective measure to minimize the risk ofoverriding shortcuts in other applications since if, for example,Alt+P wereto be allowed as global, the keyboard shortcut for opening a print dialog mightnot work in other applications.
End users are free to remap global commands to their preferred key combinationusing the UI exposed atchrome://extensions/shortcuts.
Example:
manifest.json:
{"name":"My extension",..."commands":{"toggle-feature-foo":{"suggested_key":{"default":"Ctrl+Shift+5"},"description":"Toggle feature foo","global":true}},...}Examples
The following examples flex the core functionality of the Commands API.
Basic command
Commands allow extensions to map logic to keyboard shortcuts that can be invokedby the user. At its most basic, a command only requires a command declaration inthe extension's manifest and a listener registration as shown in the followingexample.
manifest.json:
{"name":"Command demo - basic","version":"1.0","manifest_version":3,"background":{"service_worker":"service-worker.js"},"commands":{"inject-script":{"suggested_key":"Ctrl+Shift+Y","description":"Inject a script on the page"}}}service-worker.js:
chrome.commands.onCommand.addListener((command)=>{console.log(`Command "${command}" triggered`);});Action command
As described in theConcepts and usage section, you canalso map a command to an extension's action. The following example injects acontent script that shows an alert on the current page when the user eitherclicks the extension's action or triggers the keyboard shortcut.
manifest.json:
{"name":"Commands demo - action invocation","version":"1.0","manifest_version":3,"background":{"service_worker":"service-worker.js"},"permissions":["activeTab","scripting"],"action":{},"commands":{"_execute_action":{"suggested_key":{"default":"Ctrl+U","mac":"Command+U"}}}}service-worker.js:
chrome.action.onClicked.addListener((tab)=>{chrome.scripting.executeScript({target:{tabId:tab.id},func:contentScriptFunc,args:['action'],});});functioncontentScriptFunc(name){alert(`"${name}" executed`);}// This callback WILL NOT be called for "_execute_action"chrome.commands.onCommand.addListener((command)=>{console.log(`Command "${command}" called`);});Verify commands registered
If an extension attempts to register a shortcut that is already used by anotherextension, the second extension's shortcut won't register as expected. You canprovide a more robust end user experience by anticipating this possibility andchecking for collisions at install time.
service-worker.js:
chrome.runtime.onInstalled.addListener((details)=>{if(details.reason===chrome.runtime.OnInstalledReason.INSTALL){checkCommandShortcuts();}});// Only use this function during the initial install phase. After// installation the user may have intentionally unassigned commands.functioncheckCommandShortcuts(){chrome.commands.getAll((commands)=>{letmissingShortcuts=[];for(let{name,shortcut}ofcommands){if(shortcut===''){missingShortcuts.push(name);}}if(missingShortcuts.length >0){// Update the extension UI to inform the user that one or more// commands are currently unassigned.}});}Types
Command
Properties
- description
string optional
The Extension Command description
- name
string optional
The name of the Extension Command
- shortcut
string optional
The shortcut active for this command, or blank if not active.
Methods
getAll()
chrome.commands.getAll(): Promise<Command[]>
Returns all the registered extension commands for this extension and their shortcut (if active). Before Chrome 110, this command did not return_execute_action.
Returns
Promise<Command[]>
Chrome 96+Resolves with a list of the registered commands.
Events
Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-01-07 UTC.