Degoog Docs

Shortcuts

Shortcuts are keyboard-triggered extension modules. The core app keeps / for search focus; the rest of the default shortcuts are installed through the extension store so they can be updated, removed, and distributed like other extension types.

Where shortcuts live

Local shortcuts live in data/shortcuts. A local file can be a flat JavaScript file such as data/shortcuts/my-action-shortcut.js, or a store package can install a shortcut directory under the same root. Store repositories declare shortcuts with a top-level shortcuts array in package.json.

{
  "shortcuts": [
    {
      "name": "Next tab",
      "description": "Switch to the next visible results tab.",
      "path": "shortcuts/next-tab",
      "version": "1.0.0"
    }
  ]
}

Shortcut module shape

A shortcut module exports an object with a name, optional description, a default binding, and a run function. The run function receives a browser-side context for DOM manipulation.

export default {
  name: "Focus first result",
  description: "Move focus to the first visible result link.",
  defaultBinding: { key: "j", alt: true },
  run({ document }) {
    document.querySelector("#results-list a.result-title")?.focus();
  },
};

Numeric shortcuts use kind: "numeric". Their binding stores only modifiers, and the engine registers one binding per digit, mapping the recorded modifier plus 1 through 9 to the same shortcut. The digit that was pressed is read from event.key inside run, so a single numeric shortcut covers all nine keys. The trigger range is fixed to 19.

export default {
  name: "Switch tab by number",
  kind: "numeric",
  defaultBinding: { alt: true },
  run({ document, event }) {
    const n = Number(event.key);
    document.querySelectorAll(".results-tab")[n - 1]?.click();
  },
};

Bindings and settings

User-selected bindings are stored in plugin-settings.json under the shortcuts settings id. The stored values are only the mapping overrides; shortcut source code remains in data/shortcuts or in installed store extension folders.

To rebind a shortcut, click its recorder button in the Shortcuts tab and press the new combination. For numeric shortcuts the recorder prompts for a modifier plus any key, and only the modifiers are saved. Press Escape while recording to cancel, and use the reset action to return a shortcut to its default binding.

Modifier labels are rendered per platform: macOS shows the standard symbols (, , , ), Windows shows Win for the meta key, and Linux shows Super. The extension store catalog also renders a shortcut's default binding as CSS keycaps in place of a screenshot.

Creating shortcuts in the UI

Settings includes a Shortcuts tab with an add shortcut action. The editor scaffolds the module syntax, supports syntax highlighting, and handles Tab and Shift+Tab indentation inside the code area. Saving writes a local editable shortcut file to data/shortcuts and reloads the shortcut registry.

Enabling and disabling shortcuts

Each store-installed or locally created shortcut has an on/off toggle on its card in the Shortcuts tab. Toggling writes the disabled setting for that shortcut, the same value exposed on the Extensions tab, so the two stay in sync. A disabled shortcut is skipped when the page registers shortcuts, so it stops firing on the next page load. The built-in / search focus action is part of the core app rather than an extension, so it can be rebound or reset but not disabled.

Deleting shortcuts

The Shortcuts tab can delete editable local shortcut files created in data/shortcuts. Store-installed shortcuts are managed through the store install or uninstall flow, so deleting from the Shortcuts tab does not remove store package files.