If you keep 30 tabs open because closing one feels risky, this post is for you. And if you build browser extensions, it's for you too: here are the bugs, the confusing screens and the store rejection from my first release, and what I changed for the next one.

I build Tabby, a free tab manager for Chrome and Firefox. No account, and everything stays on your device. Version 1.0 went live on October 8. Version 1.1 is in review now.

The pitch was wrong: Chrome already shows your open tabs

Tabby 1.0 led with "save and organize your tabs". That isn't the problem people have.

Chrome already shows you your tabs. What it can't do is let you close them without the fear of losing something. A Carnegie Mellon study of tab habits (CHI 2021) found that more than half of the participants felt they couldn't close any of their tabs, and the main reason was fear of losing information.

So 1.1 leads with one promise: close tabs without losing them. Everything else hangs off it:

  • Save to Later, then close. A ✓ on each open tab shows it's already saved, so closing is safe.
  • Bring it back. Closed a window by mistake, or the browser crashed? Tabby keeps every window for 14 days and restores it in one click. I tested it by killing Chrome with SIGKILL: Chrome restored nothing, and Tabby brought back all 29 tabs.
  • Sleep. Unused tabs let go of their memory but stay in your tab bar. Tabby measures free memory before and after, so the number you see is real, not a guess.
  • Close the copies. Same page open four times? One click closes the extras. The newest copy stays, and Undo is right there.

A Gmail tab quietly stopped my backups

This was the worst bug in 1.0: any tab whose title keeps changing stopped the automatic backups.

Tabby takes a snapshot of your windows about 30 seconds after your tabs change, plus one every 10 minutes as a safety net. Think of the 30-second one as a kitchen timer you start whenever something happens.

Before you read on, guess what a Gmail tab does to that timer.

Gmail changes its title every time mail arrives: "(3) Inbox", then "(4) Inbox". Each title change counted as "your tabs changed", so it restarted the timer. Slack and chat apps do the same. With one of those tabs open, the 30-second timer never got to ring. Only the 10-minute snapshot ran, and on a fresh install the first one came 10 minutes late.

The cause is a quiet detail of the chrome.alarms API: creating an alarm with a name that already exists replaces it. So every title change pushed the deadline back again. Engineers call this kind of timer that keeps getting reset a debounce that never settles.

The fix has two parts: only start the timer if none is waiting, and ignore changes that don't matter (title, favicon, audio).

For engineers: the one-line difference

// Before: every tab event re-created the alarm, which replaces it (and its deadline). await browser.alarms.create('snapshot-soon', { delayInMinutes: 0.5 }); // After: schedule only when no snapshot is already pending. if (!(await browser.alarms.get('snapshot-soon'))) await browser.alarms.create('snapshot-soon', { delayInMinutes: 0.5 }); 

The regression test opens a page whose title changes every second and checks that the quick snapshot still happens. It fails on the old code and passes on the new.

What it costs: a change that happens while a snapshot is already waiting doesn't push it back. That snapshot might miss a tab opened a few seconds later. The next one picks it up, and the 10-minute snapshot is still there as a backstop.

Quitting mid-switch saved the wrong tabs into a space

A reviewer's test idea found a real bug: quitting the browser halfway through a space switch could write tabs into the wrong space.

Tabby can switch a window between "spaces" (say, Work and Personal), each with its own open tabs. An outside reviewer suggested a brutal test: quit the browser at every step of a switch, restart it, and compare everything with the original.

One step failed. If you quit after the new space's tabs had opened but before the old ones closed, the window held both sets. On restart, Tabby matched that window to the old space and autosaved the new space's tab into it. No tab was lost, but the old space ended up with a tab that wasn't its own.

The fix: Tabby now writes down "switching from A to B" before it starts and erases it when the switch is done. At startup, if that note is still there, a half-switched window is left alone, with all its tabs still open, and neither space is changed.

New users didn't know what to do

1.0 explained features. It didn't lead people through them.

My own reaction after using it for a while was blunt: "It's not clean, it confuses me." Review rounds with three profiles (a brand-new user, someone switching from Toby, and a designer) found the same. Here's what changed:

  • Plainer words. "Inbox" became Later. Closed windows, closed tabs and Trash became one place, History.
  • Advanced stuff hidden. Switching windows between spaces is now an opt-in setting. People who already used it keep it.
  • A first run that does something. New users pick a look, start with ready-made spaces (Work, Chat & social, Shopping), or import from Toby, OneTab or bookmarks.
  • A tour you do, not read. Six tiny tasks run in a practice browser, so none of your real tabs are touched. Each task is a numbered checklist that ticks itself, a "Click here" bubble sits on the one thing to click, and a green banner with Next says when you're done. It never moves on by itself; you go at your own pace.
  • "Get started" on Home. Four basics that tick themselves when you do them for real. "Show me" scrolls to the actual button and makes it pulse.

The Chrome Web Store rejected 1.1 for five theme names

My first submission of 1.1 was rejected for "keyword stuffing", because the description listed theme names.

1.1 adds color themes based on popular open-source palettes. The description said "Tokyo Night, Rosé Pine, Gruvbox, Aurora and Linen with Pro". Google's review flagged that line under its "Yellow Argon" policy: too many, or irrelevant, keywords in the listing. The rule also covers screenshots, and one of mine had the same names in its subtitle.

The fix was one line in the description, "Eight color themes, light or dark: three free, five more with Pro", plus a re-rendered screenshot. The theme names still appear inside the app, where people pick them.

If you ship an extension, the lesson travels: don't list other projects' names in your store text, captions or screenshots.

What's coming next

  • A "What's new" card. Chrome updates extensions silently, so 1.0 users won't hear about any of this unless they spot it. Version 1.1.1 adds a one-time card on Home that says what's new and points at the new buttons. No surprise tab opening on update.
  • Faster with huge collections. A new tab with 5,000 saved links opens in about 170 ms; my target is 100 ms.
  • Smarter duplicates. Login redirects open many "different" URLs for the same page (?code=…). I'd like to catch those safely without merging pages that really are different.
  • On the list, not promised: tracking AI chats (Claude, ChatGPT, Gemini) as saved items, and optional end-to-end encrypted sync. Both need design work first.

Takeaways

  • Lead with the fear, not the feature. People don't need to see their tabs; they need to feel safe closing them.
  • Same-name timers replace each other. In chrome.alarms, re-creating a pending alarm pushes its deadline back. Check before you create.
  • Kill your app at every step. Quitting mid-operation found a bug that no normal test did.

Tabby is free for Chrome and Firefox: tabby.taewoo.me. I built it, and I'd love to hear what's missing. Corrections welcome in the comments.