Tab Suspender Pro, a Chrome extension I design, build and run

Tab Suspender Pro puts idle Chrome tabs to sleep so the browser gets its memory back. I make every part of it alone, from the service worker to the index-card look to the store release, and 4,000 people use it. Its store rating is 2.4 of 5 from 16 ratings, and the audit on this page included those reviews.

A tab’s life in Tab Suspender ProFive stages from left to right. One, an open tab, awake and holding its full memory. Two, an idle timer, one alarm per tab. Three, five guards that keep a tab awake, audio playing, an unsaved form, a pinned tab, a site on your allow list, and the active tab. Four, the tab is filed as an index card, and its address, title and icon go into a local ledger as it sleeps, so a crash can’t lose it. Five, an accent line runs back to the first stage, because pulling the card with Enter, a click or focus reloads the page and keeps the scroll. Along the bottom, the timer bug found in an agent audit. Before the fix, with DevTools closed, 0 of 2 tabs slept in 212 seconds. After the fix, 2 of 2 slept at 60 seconds.A tab’s life, from open to filed and backChrome extension, Manifest V3[1] Openawake,full memory[2] Idle timerone alarm per tab[3] Guardskeep it awake[4] Filedan index card[5] PulledEnter, clickor focusactive tabaudio playingunsaved formpinned taballow lista guard says no, the tab stays awakeaddress, title, iconwritten to a local ledgerpull the card, the page reloads and keeps its scrollThe timer bug an agent audit foundbefore, DevTools closed0 of 2 slept in 212 safter the fix2 of 2 at 60 sA tab’s life in Tab Suspender ProFive stages from left to right. One, an open tab, awake and holding its full memory. Two, an idle timer, one alarm per tab. Three, five guards that keep a tab awake, audio playing, an unsaved form, a pinned tab, a site on your allow list, and the active tab. Four, the tab is filed as an index card, and its address, title and icon go into a local ledger as it sleeps, so a crash can’t lose it. Five, an accent line runs back to the first stage, because pulling the card with Enter, a click or focus reloads the page and keeps the scroll. Along the bottom, the timer bug found in an agent audit. Before the fix, with DevTools closed, 0 of 2 tabs slept in 212 seconds. After the fix, 2 of 2 slept at 60 seconds.A tab’s life, open to filed[1] Openawake, full memory[2] Idle timerone alarm per tab[3] Guardsactive tab, audio, forms,pinned, allow list[4] Filedcard in a local ledger[5] PulledEnter, click or focusBefore the fix, 0 of 2 tabs slept in 212 s.After the fix, 2 of 2 slept at 60 s.
A tab sleeps only when no guard objects, and its address goes into a local ledger as it sleeps, so a crash or an update can’t lose it. Pulling the card brings the page back where you left it.
4,000Users on the Chrome Web Store
21Defects found in one agent audit
2 of 2Tabs asleep at 60 s after the fix
56 of 60Design direction score
A suspended tab in Tab Suspender Pro, drawn as an index card with a FILED tab, the page title, how long it has slept, a memory estimate and a green Pull the card button
A sleeping tab is an index card. Enter, Space or a click anywhere pulls it back.
The extension popup in the light theme, with memory reclaimed, a Suspend all tabs button and the list of tabs across two windows
The same popup in the dark theme
The popup in both themes. Every tab shows whether it is awake, open or filed.
How Tab Suspender Pro is wiredArchitecture of the Manifest V3 extension, version 1.0.41, as a grid of three columns and two rows. Left, one, the web page, where a content script sends an activity ping at most every 30 seconds to the service worker, and an unsaved form flag and the scroll position, asked with a 300 millisecond limit, to the guards. Center top, two, the service worker, background.js. It sleeps when idle and wakes on any event, and a wake adds only the alarms that are missing. Three alarms wake it, one suspend alarm per tab, a sweep every minute, and a license recheck every 24 hours. Center bottom, three, the guards. Any one of them keeps a tab awake, the active tab, a pinned tab, audio, your site list, a tab you exempted, an unsaved form, a pause, or too few tabs open. An accent arrow runs from the guards to four, the suspended page, a filed card that holds the address, title, icon and scroll position in its own URL. Enter, a click or focus restores it with location.replace, so Back skips it. Five, an accent line along the top runs back to the web page, which reloads and scrolls back. Along the bottom, where state lives. storage.sync holds settings and site lists, and big lists fall back to local. storage.local holds the ledger of filed tabs, up to 300 entries for 30 days, and a dashed accent line runs to it from the guards. storage.session holds last activity per tab, form flags and scroll. A license server is checked every 24 hours, and an error never revokes Pro.How the extension is wiredManifest V3, version 1.0.41[5] restore, the page reloads and scrolls back[1] Web pagecontentScript.jsactivity ping,30 s apart at mostunsaved form flagscroll position,300 ms limit[2] Service workerbackground.jssleeps when idle, wakes on any eventa wake adds only the missing alarmssuspend-tab-<id>, one per tabsweep, every minutelicense-recheck, every 24 h[3] Guards, one no keeps it awakeactive, pinned, audio, your listexempt tab, unsaved formpaused, too few tabs open[4] Suspended pagesuspended.htmlEnter, click or focuslocation.replace,so Back skips iturl, title, iconscroll x, yWhere state liveschrome.storage, three areasstorage.syncsettings, site listsbig lists fall to localstorage.localledger of filed tabs300 entries, 30 daysstorage.sessionlast activity per tabform flags, scrolllicense serverchecked every 24 herrors never revoke Pro How Tab Suspender Pro is wiredArchitecture of the Manifest V3 extension, version 1.0.41, as a grid of three columns and two rows. Left, one, the web page, where a content script sends an activity ping at most every 30 seconds to the service worker, and an unsaved form flag and the scroll position, asked with a 300 millisecond limit, to the guards. Center top, two, the service worker, background.js. It sleeps when idle and wakes on any event, and a wake adds only the alarms that are missing. Three alarms wake it, one suspend alarm per tab, a sweep every minute, and a license recheck every 24 hours. Center bottom, three, the guards. Any one of them keeps a tab awake, the active tab, a pinned tab, audio, your site list, a tab you exempted, an unsaved form, a pause, or too few tabs open. An accent arrow runs from the guards to four, the suspended page, a filed card that holds the address, title, icon and scroll position in its own URL. Enter, a click or focus restores it with location.replace, so Back skips it. Five, an accent line along the top runs back to the web page, which reloads and scrolls back. Along the bottom, where state lives. storage.sync holds settings and site lists, and big lists fall back to local. storage.local holds the ledger of filed tabs, up to 300 entries for 30 days, and a dashed accent line runs to it from the guards. storage.session holds last activity per tab, form flags and scroll. A license server is checked every 24 hours, and an error never revokes Pro.How the extension is wired[1] Web pageactivity, form flag, scroll[2] Service workera wake adds only missing alarmsone alarm per tab, sweep each min[3] Guardsactive, pinned, audio, list, forms[4] Suspended pageurl, title, icon, scroll in URLEnter, click or focus[5] restore, Back skips itWhere state livesstorage.syncsettings, site listsstorage.localledger, 300 tabsstorage.sessionactivity, form flagslicense serverchecked every 24 h
The worker can die at any moment, so nothing that matters lives in it. Timers are Chrome alarms, tab state sits in session storage, and every filed tab goes into a local ledger that survives a crash or an update.
How an 18 agent run found a timer that never firedTop, the 18 agents of one Claude Code session in about 2.5 hours, as small index cards in three groups. Build and research, eight agents, A1 to A7 and A11. Test and fix, five agents, A8, A9, A10, A12 and A13. Restyle and ship, five agents, A14 to A18. Three cards are highlighted. One, A6 audited the code without running it and found 21 defects, 2 of them P0. Two, A8 ran the QA tests in Chrome for Testing and the timer test failed with DevTools closed. Three, A9 made the fix pass, 17 of 21 defects fixed, and the second QA run passed 16 of 16 tests. Below, a chart of a tab’s countdown over 212 seconds with a 1 minute timer, in three rows. First row, before the fix with DevTools attached, the debugger keeps the service worker awake and 2 of 2 tabs sleep at 58 to 63 seconds. Second row, before the fix with DevTools closed, the way people use Chrome. The worker sleeps, an alarm wakes it at 55 seconds, and its startup code restarts all 3 countdowns. Each later wake does the same, so the countdown never reaches the line, and 0 of 2 tabs sleep in 212 seconds. Third row, after the fix, the worker is still woken at 55 seconds by the sweep but keeps the countdown, and 2 of 2 tabs sleep at 60 seconds in all 3 runs.One session, 18 agents, one timer bugabout 2.5 hours, 15 October 2026Build and research, 8A1A2A3A4A5A6[1]A7A11Test and fix, 5A8[2]A9[3]A10A12A13Restyle and ship, 5A14A15A16A17A18[1] A6 audit, code only21 defects, 2 of them P0[2] A8 QA, Chrome for Testingtimer test fails, DevTools closed[3] A9 fix pass, then QA again17 of 21 fixed, 16 of 16 passA tab’s countdown, 1 minute timer60 s, the tab should sleepbefore, DevTools attached2 of 2 at 58 to 63 sthe debugger kept the worker awakebefore, DevTools closed0 of 2 asleep in 212 seach wake restarts all 3+55 safter the fix2 of 2 at 60 s, 3 runswoken at 55 s, the countdown is kept0 s60 s120 s180 s212 s How an 18 agent run found a timer that never firedTop, the 18 agents of one Claude Code session in about 2.5 hours, as small index cards in three groups. Build and research, eight agents, A1 to A7 and A11. Test and fix, five agents, A8, A9, A10, A12 and A13. Restyle and ship, five agents, A14 to A18. Three cards are highlighted. One, A6 audited the code without running it and found 21 defects, 2 of them P0. Two, A8 ran the QA tests in Chrome for Testing and the timer test failed with DevTools closed. Three, A9 made the fix pass, 17 of 21 defects fixed, and the second QA run passed 16 of 16 tests. Below, a chart of a tab’s countdown over 212 seconds with a 1 minute timer, in three rows. First row, before the fix with DevTools attached, the debugger keeps the service worker awake and 2 of 2 tabs sleep at 58 to 63 seconds. Second row, before the fix with DevTools closed, the way people use Chrome. The worker sleeps, an alarm wakes it at 55 seconds, and its startup code restarts all 3 countdowns. Each later wake does the same, so the countdown never reaches the line, and 0 of 2 tabs sleep in 212 seconds. Third row, after the fix, the worker is still woken at 55 seconds by the sweep but keeps the countdown, and 2 of 2 tabs sleep at 60 seconds in all 3 runs.18 agents, one timer bugBuild and research, 8A1A2A3A4A5A6A7A11Test and fix, 5A8A9A10A12A13Restyle and ship, 5A14A15A16A17A18[1]A6 audit, 21 defects, 2 P0[2]A8 QA, timer test fails[3]A9 fix pass, 16 of 16 passCountdown, 1 minute timerDevTools attached, 2 of 2 at 58 to 63 sDevTools closed, 0 of 2 in 212 safter the fix, 2 of 2 at 60 s0 s60 s212 s
A code audit flagged the timer before any test ran, and a QA agent proved it. Chrome stops an idle worker and restarts it on the next event, and each restart handed every tab a fresh countdown. With DevTools open the worker never stopped, so the bug hid from every manual test.
Three design directions, scored coldThree index cards side by side, one per design direction, each with a weighted score out of 60. Hearth, tabs as coals banked under ash, 48. Tideline, tabs that go out and come back with the tide, 43. Card Catalog, a suspended tab as an index card filed in a drawer, 56, highlighted and chosen. Bottom left, how Card Catalog scored on each criterion, out of 5 with its weight. Distinctiveness 5, weight 3. Legibility at 12 pixels 5, weight 3. Dark mode 4, weight 2. Store tile 5, weight 2. Build cost 4, weight 2. Together 56. Bottom right, one shape for everything, the card with a tab and a clipped corner, which becomes the icon set and the divider pattern. No blue, no violet, no moon.Three design directions, scored coldweighted, out of 60[1] Hearthtabs as coalsbanked under ash48of 60[2] Tidelinetabs go out andcome back with the tide43of 60[3] Card Cataloga tab is an index cardfiled in a drawer56of 60chosenCard Catalog, per criteriondistinctiveness×315legibility at 12 px×315dark mode×28store tile×210build cost×2856out of 60One shape for everythinga card with a tab and a clipped cornerno blue, no violet, no moonicon setdivider pattern Three design directions, scored coldThree index cards side by side, one per design direction, each with a weighted score out of 60. Hearth, tabs as coals banked under ash, 48. Tideline, tabs that go out and come back with the tide, 43. Card Catalog, a suspended tab as an index card filed in a drawer, 56, highlighted and chosen. Bottom left, how Card Catalog scored on each criterion, out of 5 with its weight. Distinctiveness 5, weight 3. Legibility at 12 pixels 5, weight 3. Dark mode 4, weight 2. Store tile 5, weight 2. Build cost 4, weight 2. Together 56. Bottom right, one shape for everything, the card with a tab and a clipped corner, which becomes the icon set and the divider pattern. No blue, no violet, no moon.Three directions, scored cold[1] Hearthcoals banked under ash48[2] Tidelinea tide that goes out and back43[3] Card Catalogan index card filed in a drawer56Card Catalog, per criteriondistinctiveness×315legibility at 12 px×315dark mode×28store tile×210build cost×28out of 6056
Every rival ships blue or violet with a moon. A design agent proposed three directions and scored them cold. Card Catalog won because the product’s own words, tab, file and restore, are the same object as the picture.
The Card Catalog design systemSix color tokens of Tab Suspender Pro drawn as index cards, desk F6F0E4, card FFFCF5, manila E6D7B8, lamp green 1F5C47, brass B07D2C and ink 1E1B16, with a type sample and the card shape with its tab.Desk#F6F0E4token bgCard#FFFCF5token surfaceManila#E6D7B8token surface-2Lamp green#1F5C47token accentBrass#B07D2Ctoken warn-fillInk#1E1B16token inkPull the card.a suspended tab is an index card filed in a drawer, its tab still showingSuspend all tabsPROCARD CATALOG · light theme tokens
The Card Catalog tokens, drawn in the extension’s own colors.
The Your impact dashboard with total memory saved, tabs filed, a seven day bar chart, most filed sites and focus mode sessions
The impact page. Numbers stay on the computer, and sharing them is a button, not a default.
The settings page of Tab Suspender Pro
Settings, with the timer, the guards and the site list on one page.
Year
2026
Sector
Consumer software
Client or project
Own product, from Zovo, my product studio
Duration
Ongoing, version 1.0.41
Stack
JavaScript, Chrome Manifest V3, service worker, chrome.alarms, chrome.storage, license server
Role
Product, design, engineering, release, support
Updated

The bug no review mentioned

The main feature puts idle tabs to sleep on a timer. On 15 October I found that it mostly didn’t work for anyone who kept using Chrome.

Chrome stops an extension’s service worker after about 30 seconds of idle and starts it again on any event. On every restart the startup code cleared each tab’s alarm and set it again from zero. A tab switch or a page load was enough, so the timer never reached its end.

Nobody reported it. People used the Suspend all button, which worked, and blamed their own settings for the rest.

How I found it

I ran one orchestrating session that sent 18 agents through the code, the store reviews and a test browser in about two and a half hours. A code audit came back with 21 defects, 2 of them critical. The timer reset was the first.

Seven of the 21 traced back to one choice. All settings lived in one synced storage item with an 8 KB cap, so a long site list stopped saving while the screen still said Added.

QA made it concrete. With DevTools closed, the way people run it, 0 of 2 background tabs slept in 212 seconds. After the fix, 2 of 2 slept at 60 seconds and 16 of 16 tests passed.

Never lose a tab

A research agent read reviews and issue trackers for 15 rival extensions. The top complaint wasn’t memory, it was losing tabs after a crash, an update or an uninstall, in 11 separate reports.

So every tab goes into a local ledger as it sleeps, with its address, title and icon. Settings has a Recovery section that reopens today’s tabs in one click, and pulling a card brings the page back at the same scroll position.

The look

The old design was a violet gradient like every rival. I scored three new directions cold, and Card Catalog won with 56 of 60 against 48 and 43.

An open browser is a desk buried in paper, and a sleeping tab is an index card filed in a drawer with its tab still showing. Paper, manila, lamp green and brass, a serif for numbers, and one card shape with a clipped corner on every surface, in light and dark.

The illustrations cost 72 cents for 24 images, and each one was checked for stray text and logos before it shipped.

My own product. The screenshots come from the 1.0.41 build, rendered with sample tabs and sample totals.

[+]More case studies

More case studies

All case studies

Next step

Send me your project, or the part your team can’t get to.

Send me your project

My last client result, a reports page cut from 3,800 requests per load to 3. The brief and the repo are enough to start.

How it starts

  1. [1]Send your project
  2. [2]Get a free plan
  3. [3]Approve the first milestone