Building Tab Manager++: A Chrome Extension Born from Tab Chaos
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:
- Start from the open-source base — Tab Manager Plus gave me a mental model of how Chrome extension tab management works.
- Build with AI as copilot — I used ChatGPT to scaffold the Chrome Manifest V3 boilerplate, iterate on the popup UI, and debug the
chrome.tabsandchrome.storageAPIs. - 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.