Browser Tabs
Switch to any open tab of Chrome, Safari or Firefox
palupdated 2026-10-27ProductivityComes with pal
Comes with pal, so a new install already has it; the button finds it in pal again if you removed it. This page can't see what your pal has installed.





What it does
Every tab open in your browsers, with its favicon: enter switches to it, and you can close, mute or copy it from the list.
- Tabs from Chrome, Safari and Firefox, and any Chromium browser with remote debugging on
- Tab titles show up in the main search, so typing a page's name finds it
- While a browser is in front, its tabs come first in the main search
- Filters for All, Playing sound and This window
- Close (
cmd+w), mute (cmd+m), copy the address (cmd+c) or a markdown link (cmd+shift+c) - With Apple TV installed, a YouTube video plays on the TV (
cmd+t), from where the tab is once it has started - Firefox tabs can be listed and focused, but not closed or muted
Palettes 1
-
Browser Tabs
tabsliveOpen tabs across Chrome, Safari and Firefox.
- ↵Switch to the tab
- ⌘TPlay a YouTube video on the Apple TV, from where it is
- ⌘WClose the tab
- ⌘MMute or unmute the tab
- ⌘CCopy the URL
- ⌘⇧CCopy as a markdown link
- ⇥All, Audible, This window
Actions
- FocusSelects the tab in the browser, then raises its window; for Firefox only the window.↵
- Play on Apple TVA YouTube video, with Apple TV installed: from where the tab is once it has started (from the start on cmd+shift+t). The tab pauses as the TV takes over.⌘T
- Copy URL⌘C
- Mute / UnmuteDevTools tabs only: the page's media elements, not Chrome's tab mute.⌘M
- Copy as markdown link[title](url).⌘⇧C
- CloseNot for Firefox.⌘W
Settings
Extension, [extensions.browser-tabs]
portThe --remote-debugging-port of a Chromium browser (Chrome, Brave, Edge, Chromium). When something listens there its tabs come over the DevTools protocol, with playing and muted state; otherwise the browsers below are asked.
appsmacOS only: browsers asked over AppleScript when they are running, by app name. A Chromium browser already on the DevTools port is skipped.
firefoxRead-only: Firefox has no scripting interface, so Focus only raises its window.
firefox_sessionA sessionstore-backups/recovery.jsonlz4; empty finds the most recent profile's.
Defaults shown. Change them in pal's settings window or in the config file.
The README
Everything Browser Tabs does, key by key, from the extension's own README.md
Browser Tabs
Every open tab of your browsers, in the browsers' own order, never ranked. A live palette: listed again on every show, so tab titles are root results and typing part of one at the root finds it. Enter selects the tab in its browser and raises the window.
While a browser is the app in front (Chrome, Chromium, Brave, Edge,
Vivaldi, Arc, Safari, Firefox: the manifest's front), tabs that have
the typed word come first at the root, ahead of anything else, an exact
name included. A tab that only collects the letters does not, so the
root still answers what no tab has. Settings' "App in front" switch, on
the palette, turns it off.
The row is the tab's title (the url without its scheme when there is
none), the host is the subtitle, the favicon comes from the url; a tab
without a web url (chrome://settings) gets the browser's icon. On the
right: where it is in one run (the browser's name when more than one is
listed, window N when the browser has more than one window), and
playing (green) or muted for a tab the DevTools protocol could ask.
The url, the host and the browser's name are keywords. cmd+i shows the
browser and window over the title, sound as a chip, and the address.
Sources
Three are merged:
| source | how |
|---|---|
| DevTools protocol | a Chromium browser (Chrome, Chromium, Brave, Edge, Vivaldi, Arc) started with --remote-debugging-port=<port>: the tab list from http://127.0.0.1:<port>/json, then one WebSocket asking every page whether a media element is playing and whether it is muted, and which window it is in |
| AppleScript (macOS) | the browsers in apps that are running, over one osascript run (JavaScript for Automation): Safari, and Chrome when nothing on the port already covers it. No playing or muted state this way |
| Firefox | its session file (sessionstore-backups/recovery.jsonlz4, the newest profile's, LZ4-decoded in the extension). Read-only: its tabs list, and Focus can only raise its window |
Chrome 136 and later ignore the port flag on the default profile: it
needs --user-data-dir too.
The filter dropdown (Tab cycles it):
| filter | rows |
|---|---|
| All | everything |
| Audible | tabs a page reports as playing sound unmuted (DevTools tabs only) |
| This window | the front window of each browser |
Keyboard
| keys | action |
|---|---|
enter |
Focus: selects the tab in the browser, then hides and raises the browser window; for Firefox, "Focus window" raises its window only |
cmd+c |
Copy URL |
cmd+m |
Mute / Unmute: DevTools tabs only, sets muted on every media element in the page |
cmd+shift+c |
Copy as markdown link: [title](url) |
cmd+w |
Close the tab, last in the panel since it is destructive; not for Firefox |
tab |
Cycle All, Audible, This window |
Close and mute keep the palette open and list again. A focus, close or mute that fails keeps the panel open with a toast carrying the reason.
Setup
For the richest listing, start your Chromium browser with
--remote-debugging-port=9222 --user-data-dir=<dir>; without it, Safari
and Chrome are asked over AppleScript on macOS and Firefox is read from
its session file.
The first AppleScript run asks whether pal may control Safari (and Chrome); a refusal makes every later run fail, which the palette shows as one row, "Automation permission needed", whose action opens Privacy & Security, Automation. Raising the browser window needs Accessibility, like the Windows palette.
Settings, [extensions.browser-tabs]:
| key | type | default | what |
|---|---|---|---|
port |
number | 9222 |
The --remote-debugging-port to look at. |
apps |
list | ["Safari", "Google Chrome"] |
macOS: browsers asked over AppleScript when running, by app name. A Chromium browser already on the port is skipped. |
firefox |
bool | true |
List Firefox tabs from its session file. |
firefox_session |
path | `` | A recovery.jsonlz4 to read; empty finds the most recently written profile's. |
What it does not do
- Close or mute a Firefox tab, or select one: Firefox has no scripting interface, so its tabs are read-only.
- Playing and muted state for AppleScript tabs: only the DevTools protocol can ask the page.
- Open a new tab or a url: use Quicklinks or Bookmarks for that.
- Nothing on the port, no scriptable browser running and no Firefox session is one row saying so.
Platforms
macOS: all three sources. Linux: the DevTools protocol and Firefox only, since there is no AppleScript.