← Back to blog

Building Tab Manager++: A Chrome Extension Born from Tab Chaos

·
Chrome ExtensionSide ProjectAI-Assisted

The Problem

I'm a chronic tab hoarder. At any given time, I have 100+ tabs open across multiple Chrome windows — research papers, docs, half-read articles, work dashboards. Each window represents a mental context: one for job search, one for a side project, one for reading.

I'd been using Tab Manager Plus, a popular extension that shows all your tabs in a nice visual grid. It was decent for viewing tabs, but it was missing the features I actually needed:

  • Named groups that persist — I wanted to name each window/group (e.g., "Job Search", "AgentTown Dev") and have those names survive a Chrome restart.
  • Memory management — With 100+ tabs, Chrome eats RAM for breakfast. I needed a way to unload tabs from memory without closing them.
  • Save & restore — Close Chrome entirely, reopen it later, and get all my tab groups back with their names intact.

None of these existed in Tab Manager Plus. So I decided to build my own.

The Approach: AI-Assisted, One-Day Build

I didn't want to spend a week on this. The goal was a functional tool — not a polished product. So I took the simplest path:

  1. Start from the open-source base — Tab Manager Plus gave me a mental model of how Chrome extension tab management works.
  2. Build with AI as copilot — I used ChatGPT to scaffold the Chrome Manifest V3 boilerplate, iterate on the popup UI, and debug the chrome.tabs and chrome.storage APIs.
  3. Ship the core features fast — No build system, no framework. Just raw HTML + CSS + JS. The entire extension is 4 files.

The whole thing went from idea to working extension in a single day (June 4, 2025), across 4 commits:

Commit What it did
Initial commit Basic popup with grid/full view of all open tabs, grouped by window
Add unload from memory One-click chrome.tabs.discard() per group — tabs stay open but release RAM
Save and restore groups Persist tab groups + custom names to chrome.storage.local, restore across sessions
Update group name format Editable group names with inline input, auto-save on blur

Key Design Decisions

No framework, no build step. The entire extension is popup.html + popup.js + popup.css + background.js. Chrome extensions have tight sandboxing, and for a personal tool, raw JS is simpler to debug than any bundler setup.

Group identity = window ID. Chrome doesn't have a native "tab group naming" concept that persists across restarts. My solution: map windowId → custom name in chrome.storage.local. When restoring, I create new windows and remap the names to the new window IDs. Simple, but it works.

Memory unloading via chrome.tabs.discard(). This is a Chrome API that unloads a tab from memory while keeping it in the tab bar. The tab reloads when you click on it. For 100+ tabs, this can save gigabytes of RAM. I added a per-group unload button — one click to free an entire window's worth of memory.

Badge shows total tab count. The background service worker listens to tab create/remove/update events and shows the count on the extension icon. A small touch, but it keeps me honest about my tab addiction.

What I Learned

Chrome's Manifest V3 is annoying but fine. The migration from V2's background pages to V3's service workers means you can't rely on persistent state — everything needs to go through chrome.storage. But for a tab manager, that's actually the right architecture.

AI is a great copilot for API-heavy code. Chrome extension development is mostly about knowing which API to call with which parameters. ChatGPT was excellent at this — it saved me hours of reading docs. The creative decisions (what to build, how to organize groups, UX flow) were still mine.

Personal tools don't need to be pretty. Tab Manager++ looks basic. The CSS is minimal. But it does exactly what I need, and I use it every single day. The best tool is the one you actually use.

Try It

Tab Manager++ is available on the Chrome Web Store: Install Tab Manager++

The code is also open source: github.com/xingfenghe/tab_manager_plus_plus

If you're a fellow tab hoarder, give it a try. And if you build something better, let me know.