Tab Shelf Cleaner: I had 47 tabs open. I built a Chrome extension to fix it.
At some point I had 47 tabs open. Not 47 things I was doing. 47 things I had opened, forgotten, and kept alive out of some vague sense that I'd need them later.
This is a real AI-built Chrome extension created in one weekend using ChatGPT 5.5. It tracks how long tabs have been open and flags the ones you've forgotten. Here's what worked, what failed, and what got cut.
The problem isn't opening tabs. It's the gap between opening one and actually doing something with it. That gap turns into days. Days turn into weeks. You end up with a browser full of tabs you don't recognise, can't close, and won't act on.
I needed something that would surface the old ones and ask me what I was doing with them. Before building, I ran the idea through my build decision filter to check it was worth the time. It was. So I built Tab Shelf Cleaner over a weekend using ChatGPT 5.5.
Every build on this site follows the same constraint: if it can't be finished in a weekend, it doesn't get built. See other tools I've built like this.
What it does
Tab Shelf Cleaner tracks how long each tab has been open and how long since you last visited it. Once a tab has been open for 7 days and untouched for 3, it gets flagged as stale.
You get a review list. For each stale tab you can open it, close it, or snooze it for a week if you're genuinely planning to come back to it. Your tab data lives in browser storage. No account, no sync, nothing leaves your machine.
The staleness logic uses both conditions, not just one. A tab you opened last week but used yesterday won't get flagged. It has to be both old and inactive.
The note field
The thing I added that wasn't in the original plan: a note for the active tab.
When you open the popup, there's a small text area for whatever tab you're currently on. You type in why you opened it. "Checking this library for the auth rewrite." "Wanted to read this later." "No idea, opened it three weeks ago."
It sounds minor. In practice it's the most useful part of the whole thing. When the review list comes up two weeks later, you can see exactly what you were thinking. Or you can see that you wrote "check this out maybe" and immediately close it without guilt.
I didn't plan this feature. I added it mid-build because I realised the review list alone wouldn't be enough. Without context, I'd just snooze everything rather than decide.
The prompt I used
I built this in ChatGPT 5.5 to test it out. The start prompt was deliberately structured. Instead of jumping straight to code, it asked the model to break the problem down first, propose an architecture, show the data model, then wait for approval.
That worked well. It came back with a clear file structure, a sensible tab record schema, and a breakdown of which Chrome events to use for what. Once I approved it, it built the extension. The core was done in one session.
Here is the full prompt I used:
You are building a small personal Chrome extension called Tab Shelf Cleaner.
Goal:
Create a Manifest V3 Chrome extension that tracks how long browser tabs have been open and when they were last actively used. The extension should show a review list of tabs that have been open longer than a chosen threshold and inactive longer than a chosen threshold.Important constraints:
- Personal tool only.
- No auth.
- No database.
- No external API.
- No cloud sync.
- Store all data locally using chrome.storage.local.
- Keep the UI simple and clean.
- Do not overbuild.Core features:
1. Track tabs when they are created or first discovered.
2. Store tabId, windowId, url, title, openedAt, lastActiveAt, lastSeenAt, pinned, audible.
3. Update lastActiveAt when a tab becomes active.
4. Update title/url when a tab changes.
5. Remove tab data when a tab closes.
6. On extension startup, scan current open tabs and add missing ones.
7. Use chrome.alarms to periodically refresh tracked tab data.
8. Popup should show: total tracked tabs, number of tabs needing review, button to open review page.
9. Review page should list tabs that meet both conditions: opened longer than openThresholdDays and inactive longer than inactiveThresholdDays.
10. Each listed tab should have: title, domain, open age, inactive age, Open button, Close button, Keep button.
11. Keep button should hide the tab from review for 7 days.
12. Settings page should allow: openThresholdDays, inactiveThresholdDays, ignorePinnedTabs, ignoreAudibleTabs.Tech:
- Manifest V3
- Plain JavaScript, HTML, CSS
- No build tools unless necessary
- Use chrome.tabs, chrome.storage, chrome.alarms
- Keep file structure simple.Before writing code:
1. Propose the file structure.
2. Explain the event flow.
3. Explain the storage schema.
4. Then wait for approval before implementing.
The constraint that mattered most: no frameworks, no external APIs, no build tools. That kept every file small and readable. If something breaks, you can find it.
What got cut
A badge counter on the extension icon showing how many stale tabs you have. Cut it. The popup shows the same number and a badge is one more thing to maintain and test.
An export function. Cut it. If you're reviewing your stale tabs, you don't need to export them anywhere. The ones worth keeping either get snoozed or bookmarked properly.
Auto-close after review. Considered it, cut it immediately. Anything that closes tabs without me deciding feels wrong for a personal tool.
What I'm watching this week
The snooze button. My instinct is to hit Keep on everything rather than decide. If I'm doing that consistently, the thresholds are probably wrong, or I'm using snooze as a way to avoid making a call.
I'm also curious whether the note field changes how I open tabs in the first place. Knowing I'll have to write a reason might make me more deliberate before opening something new. That would be the better outcome.
The extension won't be going on the Chrome Web Store. This was a personal test — built to see how ChatGPT 5.5 handles a structured, constraint-heavy prompt. It does what I needed it to do, and that's enough.
What building this in ChatGPT 5.5 was like
The structured prompt made a real difference. A model given a vague goal produces a lot of code quickly, some of which you don't need. ChatGPT 5.5 given specific constraints and told to plan first produced something I could actually read and approve before any code was written.
The thing it got right on its own: the rehydration logic for browser restarts. When Brave restarts, the extension needs to reconcile the stored tab data against whatever tabs are actually open. That's fiddly to get right. It handled it cleanly without me specifying how.
The thing I changed: the settings page originally had no visual feedback when you saved. I added a "Saved" confirmation that clears after 1.5 seconds. Small thing, but it matters when you're not sure if a click registered.
Built and shipped: 5 tools (and counting).
One weekend. One problem. No frameworks, no backend, no account. The extension works.
Whether it changes how I use tabs is the real test. That's what I'm watching next.