A Chrome extension (Manifest V3) that replicates Arc's tab switcher: a keyboard-driven overlay for cycling through the 5 most recently used tabs, styled after macOS Cmd+Tab.
Hold Control, tap Q to cycle forward. Release Control to jump to the highlighted tab. Quick-tap to toggle to the previous tab.
| Key | Action |
|---|---|
Ctrl+Q |
Open switcher / cycle forward through MRU tabs |
Ctrl+Shift+Q |
Cycle backward |
Release Ctrl |
Commit to highlighted tab |
Quick tap Ctrl+Q |
Jump straight to previous tab |
Ctrl here is the physical Control key (mapped as MacCtrl in the manifest). Chrome's manifest syntax treats the Ctrl token as Command on Mac, which is why the command uses MacCtrl+Q — Command+Q is already the "Quit Chrome" shortcut.
You can rebind these at chrome://extensions/shortcuts.
- Clone or download this repo.
- Open
chrome://extensions/and enable Developer mode (top right). - Click Load unpacked and select the project folder.
- Verify the shortcut binding at
chrome://extensions/shortcuts.
background.js— Service worker maintaining a per-window MRU list of tab IDs, command dispatch, favicon prefetching + base64 data-URL conversion (to bypass page CSP on favicon loads), and cycle state management. Commands are serialized through a promise chain to prevent session races. Favicons are cached in memory and prefetched on startup +tabs.onUpdated.overlay.js— Content script injected on every page atdocument_end. Renders a Shadow-DOM overlay, listens forCtrlkeyup andblurto commit, and handles re-injection into orphaned isolated worlds after extension reload.manifest.json— MV3 manifest withtabs,storage,scriptingpermissions and<all_urls>host access.
The overlay cannot render on chrome://, chrome-extension://, the Web Store, or the PDF viewer — content scripts are not allowed there. On those pages the extension falls back to active tab-switching (no visual), and cycles through all 5 MRU tabs including the origin so you can always return to it.
Control release detection requires an injectable origin tab. If you cycle onto a restricted tab and release Control there, the idle timer (8s) handles the commit.
/manifest.json — MV3 manifest + command bindings
/background.js — service worker (MRU, commands, favicons, session state)
/overlay.js — content script + Shadow-DOM overlay
Both files have a const DEBUG = true; at the top. Flip to false to silence the [TS] / [TS-cs] console output. Service worker logs appear in the extension's dedicated DevTools window (chrome://extensions/ → "service worker"); content script logs appear in the page's DevTools console.