foxhop

⚙️ Configuration

The tabs.json target format.

~/.config/foxhop/tabs.json is the single source of truth — editable by hand, by the foxhop CLI (add / remove), or from the Raycast extension.

{
  "$schema": "./tabs.schema.json",
  "targets": [
    {
      "name": "chatgpt",
      "title": "ChatGPT",
      "match": "chatgpt.com",
      "url": "https://chatgpt.com"
    },
    {
      "name": "todoist",
      "title": "Todoist",
      "match": "todoist.com",
      "pick": "pinned"
    }
  ]
}
FieldMeaning
nameid used by foxhop focus <name>
titlehuman label (shown in Raycast)
matchsubstring matched against tab URLs
urlopened if no tab matches
strategyhow to match: hostname (default) · prefix · exact · search (url + title)
pickwhich tab when several match: recent (default) · first · pinned
navigatelet foxhop focus <name> --url <url> repoint the matching tab (default false)

By default, foxhop focus <name> --url <url> only focuses the matching tab. The URL is opened only when nothing matches. Set "navigate": true on a target (or tick Navigate the matching tab in the extension's editor, or foxhop add … --navigate) and the same command repoints the existing tab to that URL instead of leaving it where it was:

foxhop focus chatgpt --url https://chatgpt.com/c/abc123
  • The tab is chosen by the target's usual match, strategy and pick rules, and pinned tabs are included.
  • The URL must be http(s) and must itself satisfy the target's match. Anything else is refused and no tab is touched, so a ChatGPT target can never repoint an unrelated tab. This also means navigate does nothing useful with strategy: "exact".
  • If nothing matches, the URL opens in a new tab.
  • Focusing from the extension popup never navigates.

[!WARNING] Navigation replaces the page in that tab. There is no guard for an unsent draft or a half-filled form, which is one reason the option is off by default.

On this page