AI tab groups for Chrome, with your own API key.
Tab Declutter sorts the tabs in your current Chrome window into named tab groups. It asks the AI provider you choose, using your own API key. Pick a lens, click once, and undo in one click if you don't like the result.
Tab groups only help when someone names and maintains them. Tab Declutter does that work when you ask. It never runs in the background and never touches other windows.
Choose a lens to decide what "belongs together" means:
| Lens | Groups tabs by | Example group names |
|---|---|---|
| Project (default) | the goal they serve, across sites | "Fix login redirect", "Find a flat" |
| Topic | the subject they are about | "Kotlin coroutines", "Berlin flats" |
| Session | when you opened or last used them | "Just now: CI failure", "Yesterday: flat search" |
| Next step | what you still need to do | "Act now", "Read later", "Reference", "Probably done" |
You can also write your own lens in Settings.
- Undo restores the previous order, groups, names, colors, and collapsed state for tabs that still exist.
- Keyboard shortcut: press Alt+Shift+G (⌥⇧G on macOS) to group with your last-used lens without opening the popup. The toolbar badge shows progress and the number of groups made. Change the shortcut at
chrome://extensions/shortcuts. - Pinned and split-view tabs stay where they are. Tabs that don't clearly fit stay ungrouped.
Tab Declutter is on the Chrome Web Store. To install a release by hand instead:
- Download
tab-declutter-v0.2.0.zipfrom the latest release. - Unzip it.
- Open
chrome://extensions. - Turn on Developer mode.
- Select Load unpacked and choose the unzipped folder.
Requires Chrome 140 or newer.
git clone https://github.com/iurysza/tab-declutter.git
cd tab-declutter
bun install --frozen-lockfile
bun run buildLoad the generated dist/ folder from chrome://extensions.
- Open Tab Declutter Settings.
- Choose a provider, then enter the exact model ID and your API key.
- For an OpenAI-compatible service, add its base URL.
- Select Save settings and allow access to that provider when Chrome asks.
- Open the popup, pick a lens, and select Group N tabs.
| Provider | You need |
|---|---|
| OpenAI | API key and model ID |
| Anthropic | API key and model ID |
| Google Generative AI | API key and model ID |
| OpenAI-compatible | API key, model ID, and base URL |
Custom endpoints must use HTTPS. localhost, 127.0.0.1, and [::1] may use HTTP for development.
Tab Declutter has no account, backend, analytics, or telemetry. It uses no content scripts. Requests go straight from your browser to the provider you chose.
A grouping request sends:
- the lens name and instruction;
- each eligible tab's title and URL, with credentials, query strings, fragments, and local file paths removed;
- a temporary reference such as
T1instead of Chrome's tab ID; - for the Session lens only: a rounded time since each tab was last used, such as "25 min ago", and which tab opened it, as a
Treference.
Tab Declutter never reads page contents, browsing history, bookmarks, cookies, or form data.
Your API key stays in chrome.storage.local in this Chrome profile. It is only sent to your provider to authenticate. The Undo snapshot stays in chrome.storage.session. Chrome asks for provider access only when you select Save settings.
Permissions:
tabsreads and organizes tabs in the active window.tabGroupscreates, names, and restores groups.storagekeeps settings and one Undo snapshot.
Read the full privacy policy.
Tab titles and URLs are treated as untrusted data. The model's answer is checked against a schema before any tab moves. Unknown references, duplicate assignments, blank names, and one-tab groups are dropped.
Before the first change, Tab Declutter saves the current layout. If grouping fails partway through, it restores that layout. If restoring also fails, the snapshot stays available through Undo.
Run the local OpenAI-compatible fixture:
bun run mock:providerIn Settings, choose OpenAI-compatible, use the printed base URL, set the model to tab-declutter-fixture, and enter any non-empty key. The fixture groups T1 and T2 as Fixture workstream.
Use Bun 1.4.2, matching the packageManager pin and CI. Commit the text bun.lock when dependencies change.
bun install --frozen-lockfile
bun run dev
bun run checkbun run check runs strict TypeScript, Oxlint, the tests, the production build, and the project contract check.
Domain logic in src/domain/ has no Chrome dependency. Use cases in src/application/ depend on ports and are tested with in-memory fakes. Chrome, storage, and AI SDK calls live in src/adapters/. Read the architecture guide for the full map.
Store images are generated from the real UI with store-assets/generate.sh.
- Chrome only.
- Active window only.
- One level of Undo.
- Closed tabs can't be restored.
- The Session lens can't see when a tab was opened, because Chrome doesn't expose it. It uses last-used time, which tab opened it, and tab order instead.
- OpenAI-compatible providers must support the API shape the AI SDK expects.
- Restoring is best-effort if tabs move, open, or close during grouping or Undo.
