Gmail One-Click Cleaner

Changelog - Gmail One-Click Cleaner

All notable changes to this project will be documented in this file. This log tracks user-visible behavior, UI changes, and important internal fixes.

10.1.0 - Protected stays protected

Some things you had already settled could come undone in 10.0. With Settings open in a tab, a sender you protected from Sender Triage or the Stats page dropped off your whitelist the next time you saved anything in Settings. A triage run that finished while the popup was open again went back to waiting on your next key press. And the triage decisions the privacy policy says are forgotten after 90 days were only hidden, never deleted.

Added

Changed

Fixed

Internal

10.0.0 - One sender at a time

Every other way to clean with this extension starts from a rule: pick a category, an age or a size, and it finds the mail that fits. Sender Triage starts from the people instead. It picks up the senders your scans have already found and shows them one card at a time, heaviest first. For each one you pick Keep, Archive, Delete or Unsubscribe. Nothing moves while you sort. Your decisions are saved as you make them, and each kind runs as its own group when you press its button.

Added

Changed

Internal

9.9.0 - Stay with what you picked

Most of this release is about the extension holding on to a choice you made. With Gmail open in two windows, one account in each, the popup went with the first window's account rather than the one you clicked it from, so a run could land in the other mailbox. On the Unsubscribe tab, a run that took twenty-five of your forty ticked senders finished with the other fifteen unticked. And the daily housekeeping job, the one that prunes old activity and clears a census once it is three months old, reset its own countdown every time the browser started. On a browser that gets closed every night it never ran at all.

Changed

Fixed

Internal

9.8.0 - Count the senders the button reaches

The census Clear button has a cap. It has had one since the feature shipped: twenty-five senders become rules on one run, and the rest wait for the next press. The line under the button did not know that. Tick forty senders and it quoted what forty would give back, over a button that cleared twenty-five.

This is the bug 9.1 fixed on the button directly beneath it, on the same tab. The receipts clear measures only the senders its cap reaches, and reports the rest as stranded. One card up, the census clear went on measuring every one of them.

The two halves also disagreed about which twenty-five. The subtitle walked the ranked list, biggest sender first. The handler sliced the set of ticked addresses, which is in the order the boxes were ticked. On any selection past the cap those are different senders, so the number was wrong twice over: too big, and about mail the run was never going to touch.

Changed

Fixed

Internal

9.7.0 - Put it back where it came from

Every run surface since 9.2 has been careful about which signed-in account it acts on. The one record that exists so a run can be undone never said. Restore on the Stats page took whichever Gmail tab was in front, searched that account for a label that lived in another one, and reported "Nothing left to restore" about mail sitting in the other Trash. With Google Chat in front, which lives under mail.google.com, it did worse: it injected the engine into Chat, the engine refused with a dialog nobody was looking at and no message back, and the page sat on "Starting restore..." with the button reading Cancel.

The erase button 9.6 called complete missed the two stores it had seeded wrong in its own test: the top senders list on the Stats page, sampled from every delete batch and drawn with a Protect button beside each address, and the search strings the run history keeps, which for a census clear are a list of addresses. Same shape as 9.6's own finding, one release later.

Changed

Fixed

Internal

9.6.0 - Erase means erase

The Options page has a button reading Erase Stored Sender Data, under a heading reading Stored Sender Data. It cleared six things. Eight more stores held the addresses of people who email you, and nothing in the extension removed any of them.

They were not hidden. The Diagnostics page said, in as many words, that the mailbox report and the subscription, storage and suggestion scans "keep their own sender lists, which this card does not count and the Erase button does not clear", and the confirmation dialog said the same thing at greater length. That is a control whose own copy explains why it does not do what its label says. It is the same shape as the word "Freed" in 9.5, in a smaller room, and it has the same answer: make the control do the thing, then delete the paragraph that existed to excuse it.

Two other numbers turned out to be measured through the wrong filter, which is this project's oldest habit, and the guidance panel 9.5 shipped inside Gmail was going to the wrong tab.

Changed

Fixed

Internal

9.5.0 - Say where the space went

This extension is sold on freeing up Gmail storage, and every delete run moves mail to Trash rather than destroying it, which is deliberate: it is what the labelling, the 30-day window and the Restore button are all built on. Google counts Trash against your storage limit until it empties. So the bar this thing exists to move does not move for up to 30 days after a run, and four places said "Freed" about that moment: the popup result card, the progress done card, the Stats tile, and the notification, which is the only surface a scheduled sweep ever reaches.

Five notes elsewhere did say storage frees up once Trash empties. None of them said how much was sitting in there, or how to get to it, and the uninstall page already lists "something went to Trash" among the reasons people leave.

The rule this release settles: no surface may call storage freed while the mail is still inside Gmail's window unless the same surface shows the part that is still waiting and where it is. The waiting figure is measured through the recovery log's own eligibility rules, the ones the Restore button obeys, so what this says is in Trash is exactly what Restore will still bring back.

Changed

Added

9.4.0 - Ask whose markup it is before clicking it

The unsubscribe run asks three times whether a control belongs to Gmail before it clicks the first one, because a link inside a message was written by whoever sent it and following one takes the tab somewhere they chose. The confirmation that comes next asked nothing at all. It looked for the dialog anywhere on the page, and a sender who puts a dialog in their own message wins that search, because their copy is higher up the page than the one Gmail adds. So a stranger could get their link clicked, in a signed-in mailbox, without the person who owns it touching anything. The same unscoped search sat in the confirmation for a bulk delete, which is the click that turns a page into a whole result set.

The rest of the release is a sweep, and most of it is the extension being made to stop saying things it had not established.

Fixed

9.3.0 - Reach the mailbox that is already open

Last release put a cleaner button in the corner of Gmail, because everything this extension does had been sitting behind a toolbar icon Chrome hides until you pin it. It worked on the next Gmail you opened. It did not work on the Gmail you already had open, which for most people is the tab they were looking at when they installed it. A browser only runs a page script when the page loads, and it does not go back and run it in tabs that loaded earlier, so the one thing built for that moment was missing from it. The button and its one-time greeting now arrive in the mailboxes that are open right now, on a fresh install and on an update.

The rest is a sweep. The panel was printing "0+ MB" on any mailbox whose old mail is all small, the selection pill on the popup's tabs was landing a few pixels off the tab it selects, a custom rule written with brackets was skipping a warning it should have got, and four places in the engine could still read the conversation list Gmail leaves behind for a moment while it renders a search.

Fixed

9.2.0 - Be where the mailbox is

Everything this extension does has lived behind the toolbar icon, and Chrome folds that icon into the puzzle-piece menu until you pin it. So the mailbox report, the storage x-ray and the whole recovery net sat one click behind a button plenty of people never found. An install could go months without ever scanning anything, which is a strange thing to be true of a cleaner.

There is a small button in the corner of Gmail now. It draws inside a closed shadow root, so nothing it defines can reach Gmail's page, nothing on that page can reach into it, and the counts it shows are not readable by anything else running on mail.google.com. It reads no mail and walks none of Gmail's interface. The only thing it can start is the free read-only report, which is the same scan the popup runs and the one worth running first. Anything that moves mail stays in the popup, behind the confirmations that are already there.

The first mailbox you open after installing gets a greeting, once. After that the button sits closed until you click it, and it opens on whatever the last scan found.

Added

Changed

9.1.0 - Say it before the click, not after

Three screens in this extension put a number next to a button. Each number is measured through your safety switches, and each button reads those switches fresh at the moment you press it. When you change one in between, the number stops describing the button.

The Mailbox Report learned to say so two releases back. Smart Suggestions learned it one release later. The sender census, added last release, shipped the half that records what it measured through and none of the half that checks. The record sat in storage with a note on it explaining what it was for and nothing read it.

That check is on all three now, and most of this release is that one idea applied everywhere it was missing.

The rest of it is about time rather than switches. Two of the lists this extension builds are made from your mail: the sender census, which is who fills your mailbox, and the unsubscribe receipts, which is who you asked to stop. Both hold real addresses, both sat here with no end date, and there was no button anywhere that removed them. There is one now, and the two stores age out on their own besides. They age out differently, because a census is a photograph and goes out of date, while a receipt is a record of something you did whose whole value is being old enough to prove a sender ignored you.

Added

Changed

Fixed

9.0.0 - Count what the button clears

The last release taught this extension to find the senders that actually fill a mailbox. It then printed the wrong number beside them. A sender would be listed with five emails, you would tick it, press Clear, and get nothing back.

The count came from a plain search for that sender. The button ran a narrower one: mail older than six months, skipping anything starred, important, unread, or filed under a label of your own. On a newsletter sender, unread alone is most of it. Both numbers were true. They were answers to different questions, and only one of them was the question you were asking.

Every count in this extension is now measured through the same filter as the button sitting next to it. That has been the rule here for a long time and the two features added last release were never held to it.

Added

Fixed

8.26.0 - Find the bulk, not the buckets

Every scan in this extension used to describe your mailbox with a Gmail search written before your mailbox existed: promotions, big attachments, mail with the word unsubscribe in it, anything over a year old. Those find mail that fits a bucket. Most mailboxes are not buckets. They are tens of thousands of ordinary small messages from a few dozen senders, and no search on that list names them, so every tool reported a small number and did a small thing.

Tested against a real mailbox while this was built: promotions older than six months returned nothing. Mail older than two years returned nothing. Two broad searches found sixty senders.

Added

Fixed

8.25.0 - Say it when it is a floor

8.24 taught the Mailbox Report to admit when Gmail had given it a page instead of a total. Three other screens were still stating the same kind of number flatly, and one of them is Dry Run, which exists to be believed before you delete anything.

Fixed

Safety

Changed

8.24.0 - Fifty is not a total

Gmail sorts most searches by relevance now, and when it does that it stops saying how many conversations matched. The pager reads "1-50 of many". The cleaner fell back to counting the rows it could see, which is fifty, and printed that as the answer.

So the Mailbox Report, the screen the store listing tells you to run first, showed 50 beside a step holding thousands. Two mailboxes with wildly different amounts of old mail in them got the same report.

Fixed

None of these numbers moved. The report counts what it always counted; it now tells you when what it counted was a page rather than a total.

8.23.0 - It says what it is doing

The Mailbox Report, the Storage X-ray scan, the subscription scan, the suggestion scan and bulk unsubscribe all work inside your Gmail tab, and the popup closes the moment you click anything outside it. So the natural thing to do, click into Gmail to watch, took away the only thing telling you a scan was running. Reopening the popup showed a window with nothing happening in it while your mailbox was visibly being searched.

Fixed

The progress dashboard is deliberately not offered for these runs. It is built for cleanups, and the recovery button on it re-injects the last cleanup settings, which is not a thing that should ever be one click away from a read-only scan.

8.22.0 - It counts the list it is looking at

Gmail changed how it draws search results, and it stopped clearing the previous list away. The list you were looking at before the search stays in the page, invisible, with its own counter still attached to it. The cleaner was reading that counter.

Fixed

8.21.0 - It reads the mailbox, not the mail

Fourteen fixes. The one that matters most: on a Japanese, Korean, Chinese, Russian, Arabic, Swedish, Danish, Norwegian, Polish, Turkish, Dutch, Italian, Spanish or Portuguese Gmail, the cleaner could not use Gmail's "select all conversations that match" offer at all, so big cleanups crawled fifty at a time and gave up with most of the mail still there. That is fixed for every language the cleaner speaks.

The rest are mostly the same shape twice over: a number read out of your mail instead of out of Gmail's own toolbar, and a guard that had been added in one place and not in the identical place next to it.

Fixed

Changed

8.20.0 - Skip means skip, and done means done

Eight fixes. Most are the same complaint wearing different clothes: a button, a message or a report told you something had happened when it had not.

Fixed

8.19.0 - Things that happened while nobody was watching

Four fixes, and three of them are the same problem: the extension worked out something true and then wrote it down somewhere that stops existing the moment you look away.

Fixed

Internal

8.18.1 - The privacy policy lives with the source now

Changed

8.18.0 - A calmer popup, and motion that means something

The Clean tab showed thirteen things at once while every other tab showed three or four, and the six controls at the middle of it were one decision pretending to be six. They are drawn as one group now. Nothing was removed and nothing was hidden: the safety and privacy lines still sit right under the button they describe, where they have been since 8.7.

The rest is motion, and the point of it is that the parts you drive now respond. Switching tabs, a scan filling a list, a count landing, a button being pressed: all of those used to happen between one frame and the next. The parts that already animated were mostly the parts nobody touches.

Added

Fixed

8.17.0 - Three free unsubscribes so you can see it work

Bulk unsubscribe is the one paid feature you cannot try with a Clean-tab rule. You could scan, tick the senders you hate, and then hit a paywall for something you had never seen work. Every unpaid install now gets three real unsubscribes on its own mail, once. After that the usual paywall takes over, and it can name the number you just watched be real.

Added

8.16.0 - Runs that stopped are not runs that finished

A tidy-up release, and most of it comes from one thing being true in more places than anyone had noticed: pressing Cancel, or a rule running out of room, left the extension believing the job was done. The other half is a batch of settings pages that could paint an empty list when storage had a bad second, and then save it.

Fixed

Changed

8.15.0 - Quality of life, and the safety lists that would not say no

A tidy-up release. Most of it is small things that were quietly in the way: steps you had already cleaned that would not offer to run again, lists that made you scroll to find out what you could still undo, and a Pro setting that did not do what it said. One fix underneath all of that matters more than the rest, and it is the first one below.

Fixed

Changed

8.14.0 - Imports that say what they drop, and a recovery log that stays put

A tidy-up release. Nothing new to learn: importing a settings backup now tells you the truth about what it kept, your recovery log stops shrinking when it should not, and buying Pro updates the page you are already looking at.

Fixed

Changed

8.13.0 - The whole storage list, and one-click activation

A smaller release. The Storage X-ray stops hiding most of what it found, buying Pro no longer means copying a long key by hand, and the Pro Settings card gained three more knobs.

Changed

Added

8.12.0 - The views mail does not come back from, and settings for Pro

Two halves. The first closes the ways a cleanup could reach Trash and Spam, which are the only two places in Gmail where deleting is permanent and where nothing this extension does can get your mail back. The second is a new Pro Settings card: three things buyers have asked to control, none of which take anything away from the free version.

Fixed

Added

8.11.0 - The paid half, and previews that say they were previews

Most of this release is on the parts of the extension you only see after you have paid for it. Five of the fixes are on Pro controls, three of them are the same problem in three places: a button that quietly did less than you asked it to and never said so.

Fixed

Improved

8.10.0 - What the numbers promise, the runs deliver

Fixed

8.9.1 - Store listing wording

Changed

8.9.0 - Release notes, a proper goodbye, and honest storage numbers

Added

Changed

Fixed

8.8.0 - Unattended runs work again

Fixed

8.7.0 - Bulk actions do what the card says

Fixed

Changed

8.6.0 - Suggestions count what they clean

Fixed

Note

8.5.1 - Unsubscribe actually unsubscribes

Fixed

Changed

8.5.0 - The number matches the run

Fixed

8.4.0 - Sender marks, and a way out of a stuck run

Added

Fixed

8.3.0 - Real result counts

Fixed

8.2.0 - The guards you could not see

Reported from real use: "unsubscribe doesn't work, storage doesn't work, it gets randomly stuck a lot". All of it traced back to guards and state the product never showed you.

Fixed

Added

Fixed

8.0.0 - Mailbox Report, and a popup that finally explains itself

The biggest release since Pro shipped. It adds the thing the product was missing, which is an answer to "what is actually in here", and it rebuilds the two screens where that answer matters: the popup you open, and the dashboard you watch a run finish on.

Added

Changed

Fixed

7.15.0 - Safety, locale and scheduling fixes

A second sweep, in the same spirit as 7.14.2 and reaching the places that one did not: the paths that only run when nobody is watching, and the ones that only misbehave when Gmail is not in English.

Fixed

Changed

Privacy

7.14.2 - Safety and reliability fixes

Fixed

7.14.1 - Pro is now $19.99 lifetime

Changed

7.14.0 - Key recovery, safer unattended runs

Added

Fixed

Changed

7.13.1 - Steadier progress tab

Fixed

Changed

7.13.0 - Speaks your language

Added

Changed

Internal

7.12.1 - Auto-Pilot

Added

Changed

7.8.1 - Light theme contrast

Fixed

7.8.0 - Smart Suggestions

Added

Internal

7.7.0 - Popup redesign

Changed

7.6.0 - Restore runs

Added

7.5.0 - Locale support

Fixed

Changed

Added

7.4.0 - Ratings and trust

Added

7.3.0 - Tabbed popup

Changed

7.2.0 - Storage X-ray

Added

Changed

7.1.0 - Firefox and Edge support

Added

Changed

7.0.2 - Neon icon artwork

Changed

7.0.1 - New brand icon

Changed

Fixed

7.0.0 - Subscription scan + bulk unsubscribe (Pro)

Deleting hides old mail; unsubscribing stops new mail. This release adds a way to see every mailing list that emails you and unsubscribe from the ones you never read, in one pass, plus a one-time $5 Pro unlock to run it. Everything that was free stays free forever. No existing feature moved behind the paywall.

Added

Changed

Security / privacy

6.1.0 - Protected keywords (subject shield)

A content-based safety net to sit alongside the sender Whitelist. The hardcoded Safe-Mode subject guard (receipts, invoices, shipping) is now joined by a list you control.

Added

Safety / internals

6.0.0 - Recovery overflow-menu fix, focused targets, accurate counts

The big one. Restores the recovery-by-label safety net, makes large cleanups actually clean past the first screen, fixes affected counts, and adds one-click category targeting.

Fixed

Added

Removed

5.0.7 - Per-row selection fallback (real fix for the silent-no-delete bug)

Diagnosed by inspecting the live Gmail DOM against mail.google.com. The "selecting it then just not deleting anything" report turned out to be a far deeper Gmail behavior than the v5.0.6 verification fix addressed:

Also discovered the same way:

Fixes:

Tag-before-delete (the "Label button not found" warning) still goes through the old finder; that path is queued for a follow-up patch that opens the "More email options" menu first. Deletions now work correctly without the tag step, the undo log still records the metadata, just without the searchable label.

5.0.6 - Delete verification + accurate affected counts

Diagnosed from a user report: "it's selecting it then just not deleting anything." Two compounding bugs:

  1. extractSelectedCount() returns null when Gmail's "N selected" text drifts to a layout the function doesn't recognise.
  2. waitForActionProcessing() treated null as success, so the engine reported 0 affected and moved on, regardless of whether the delete actually fired. Silent false-positive.

Fixes:

If Gmail genuinely refuses the click (UI state, focus, etc.), the engine now throws TimeoutError and the retry loop re-attempts: better to fail loudly than silently lie about success.

5.0.5 - Empty-search fast path + still-waiting beats

Diagnosed from another stuck-run log (query 1: larger:20M taking ~2 minutes before any retry, then retrying 6 times). openSearch()'s wait condition only returned true when the result grid contained at least one row, so any query that legitimately matched zero mail (very common once global guards strip starred / important / unread / user-labeled threads) sat for the full 20s wait, threw a TimeoutError, and retried 6 times before either skipping (5.0.2) or killing the run (≤5.0.1).

5.0.4 - Spinner stays animated under reduced motion

The blanket prefers-reduced-motion: reduce rule in shared.css killed every animation on the page via animation-iteration-count: 1 !important, including the loading spinner. The spinner is a state indicator ("system is busy"), not decoration, so reduced motion shouldn't freeze it (WCAG carves out essential animation explicitly).

Added a follow-up rule inside the same media query that re-enables the spin animation for .spinner (0.6s) and the primary-button busy spinner (.primary.loading::after, 0.8s). Higher specificity beats the universal selector under equal !important, so the override wins reliably.

5.0.3 - CSP data: fix for inline SVG chevrons

The meta CSP on every extension page declared img-src 'self', which blocks data: URLs. The select-dropdown chevron (an inline url("data:image/svg+xml,...") background image in popup.html and options.html) tripped this on every render, producing a console error and dropping the down-arrow glyph on the rule-intensity / age selects.

Added data: to img-src on all five extension pages. No new external origins; the directive still rejects any non-data: / non-self image source.

5.0.2 - Per-query failure isolation

Caught from another real-world log: in v5.0.0 / v5.0.1, when a single query exhausted its 6 retries, processQuery() re-threw the TimeoutError, which propagated up to main() and aborted the entire run on the first stubborn rule. A user with one slow search (has:attachment larger:10M older_than:6m matching too many results for Gmail's UI to render in time) lost all 11 queries.

5.0.1 - Engine resilience

Diagnosed from a real-world stuck-run progress log: a single Gmail search (has:attachment larger:10M older_than:6m) hit the action- processing timeout, the engine entered exponential backoff, and the log just said "Backoff 1758ms (timeout)" with no indication what was actually waiting or how many retries were left.

5.0.0 - Extended Upgrade

A major release closing every open GitHub issue, adding ten substantial new features, and shipping a deep deglitch + test pass across the codebase.

New features

Issue fixes

Internal / DX

Folded-in 4.3.x cleanup (previously listed as Unreleased)

4.3.1

4.0.0

3.5.0

3.4.0

3.3.0

3.2.0

3.0.0

2.10.5

> Note: 2.10.1-2.10.4 were internal / pre-release iterations. Their changes are folded into the 2.10.5 notes above.

2.10.0

2.9.8

2.9.7

2.9.6

2.9.5

2.9.4

2.9.3

2.9.2

2.9.1

2.9.0

---

2.8.x

---

2.7.x

---

2.6.x

---

2.5.x

---

2.0.0 - MV3 Rewrite

---

1.x - Initial Releases