PageSourceSearch

https://kb.marvellouscode.works/assets/js/5e066819.2ec844d3.js

js marvellouscode.works collected 2026-10-02 02:13:51 UTC 14,346 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunktms=self.webpackChunktms||[]).push([["6416"],{1776(e,t,n){n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var s=n(643),a=n(4848),o=n(8453);let i={slug:"tms-release-9-0-3",title:"The Marvellous Suspender 9.0.3 - battery-aware suspend, tab-group actions, favicon and Drive fixes",description:"9.0.3 ships a battery-power auto-suspend timeout, tab-group and app-window suspend controls, a real fix for suspended-tab favicons on Brave/Vivaldi/Dia, and a proper Drive backup fix for Brave and Vivaldi. Live now on the Chrome Web Store.",date:new Date("2026-09-17T11:03:00.000Z"),authors:["gioxx"],tags:["release","tms"]},r,d={authorsImageUrls:[void 0]},l=[{value:"What's new",id:"whats-new",level:2},{value:"Separate auto-suspend timeout for battery power",id:"separate-auto-suspend-timeout-for-battery-power",level:3},{value:""Never suspend app windows"",id:"never-suspend-app-windows",level:3},{value:"Suspend/unsuspend every tab in a tab group",id:"suspendunsuspend-every-tab-in-a-tab-group",level:3},{value:""Always reopen suspended tabs scrolled to the top"",id:"always-reopen-suspended-tabs-scrolled-to-the-top",level:3},{value:"Reload also unsuspends background tabs",id:"reload-also-unsuspends-background-tabs",level:3},{value:"A "What's new" screen after updates",id:"a-whats-new-screen-after-updates",level:3},{value:"What's fixed",id:"whats-fixed",level:2},{value:"A rare but real out-of-memory crash",id:"a-rare-but-real-out-of-memory-crash",level:3},{value:"Google Drive backup disconnecting on Brave and Vivaldi",id:"google-drive-backup-disconnecting-on-brave-and-vivaldi",level:3},{value:"Suspended-tab favicons stuck on the extension icon after a restart",id:"suspended-tab-favicons-stuck-on-the-extension-icon-after-a-restart",level:3},{value:"The battery-specific timeout not reacting to unplugging",id:"the-battery-specific-timeout-not-reacting-to-unplugging",level:3},{value:"A bright white flash switching between suspended tabs",id:"a-bright-white-flash-switching-between-suspended-tabs",level:3},{value:"The reload link on suspended tabs, too bright in dark mode",id:"the-reload-link-on-suspended-tabs-too-bright-in-dark-mode",level:3},{value:"Smaller fixes",id:"smaller-fixes",level:3},{value:"What's next",id:"whats-next",level:2}];function u(e){let t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",hr:"hr",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:["TMS 9.0.3 is ",(0,a.jsx)(t.a,{href:"https://chromewebstore.google.com/detail/the-marvellous-suspender/noogafoofpebimajpfpamcfhoaifemoa",children:"live on the Chrome Web Store"})," as of today. Two of the fixes in it were significant enough to get their own deep-dive posts while they were still in progress, so this one pulls everything together in one place, plus the smaller things that didn't get their own writeup."]}),"\n","\n",(0,a.jsx)(t.h2,{id:"whats-new",children:"What's new"}),"\n",(0,a.jsx)(t.h3,{id:"separate-auto-suspend-timeout-for-battery-power",children:"Separate auto-suspend timeout for battery power"}),"\n",(0,a.jsx)(t.p,{children:'A new "Suspend tabs on battery power after" select, right alongside the existing plugged-in timeout in Settings. Set it once and tabs suspend more aggressively the moment you unplug, without touching your normal AC timeout at all. Defaults to "Same as when plugged in", so nothing changes unless you go set it.'}),"\n",(0,a.jsx)(t.h3,{id:"never-suspend-app-windows",children:'"Never suspend app windows"'}),"\n",(0,a.jsx)(t.p,{children:'On by default, like the pinned/audio/active-tab protections it sits next to. Keeps tabs open in an app-mode window, an installed PWA, or a site opened via "Create Shortcut \u2192 Open as window", out of automatic suspension. A manual "suspend this tab now" still works regardless, this only affects the automatic timer.'}),"\n",(0,a.jsx)(t.h3,{id:"suspendunsuspend-every-tab-in-a-tab-group",children:"Suspend/unsuspend every tab in a tab group"}),"\n",(0,a.jsxs)(t.p,{children:["New page and tab-strip right-click menu items, plus two bindable keyboard shortcuts, acting on every tab sharing the clicked tab's group. Thanks to ",(0,a.jsx)(t.strong,{children:(0,a.jsx)(t.a,{href:"https://github.com/mherkazandjian",children:"@mherkazandjian"})})," for building this, his first contribution to the project (",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/pull/438",children:"#438"}),") and part of a bigger ",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/133",children:"tab-groups feature set"})," still in progress for upcoming releases."]}),"\n",(0,a.jsx)(t.h3,{id:"always-reopen-suspended-tabs-scrolled-to-the-top",children:'"Always reopen suspended tabs scrolled to the top"'}),"\n",(0,a.jsxs)(t.p,{children:["Opt-in. If you'd rather a suspended tab always reopen at the top of the page instead of wherever you left it scrolled, this does that, and overrides a ",(0,a.jsx)(t.code,{children:"#section"})," link anchor in the URL too."]}
1),"\n",(0,a.jsx)(t.h3,{id:"reload-also-unsuspends-background-tabs",children:"Reload also unsuspends background tabs"}),"\n",(0,a.jsx)(t.p,{children:"Reloading a suspended tab you're not currently looking at, via a multi-tab selection, or right-click \u2192 Reload on an inactive tab, used to silently do nothing. Turn this on and it counts as an explicit unsuspend request, same as reloading the tab you're actively viewing already did."}),"\n",(0,a.jsx)(t.h3,{id:"a-whats-new-screen-after-updates",children:'A "What\'s new" screen after updates'}),"\n",(0,a.jsx)(t.p,{children:"Exactly what you're reading the substance of right now, just inside the extension: a one-time modal on the Settings page after an update, showing only that version's changes, not the entire history."}),"\n",(0,a.jsx)(t.h2,{id:"whats-fixed",children:"What's fixed"}),"\n",(0,a.jsx)(t.h3,{id:"a-rare-but-real-out-of-memory-crash",children:"A rare but real out-of-memory crash"}),"\n",(0,a.jsxs)(t.p,{children:["Reproduced live, traced all the way to its actual mechanism, and fixed at the root rather than patched around the symptom: ",(0,a.jsx)(t.code,{children:"chrome.storage.onChanged"})," was quietly broadcasting a full multi-megabyte copy of the diagnostic log buffer to every open suspended tab, every time anything was logged, and none of those copies ever got released. The whole log buffer moved to IndexedDB, which has no such broadcast, closing the gap entirely. Mostly invisible unless you use the debug page's ",(0,a.jsx)(t.code,{children:"captureLogs"})," option, but the extension is more resilient across the board regardless. Full story: ",(0,a.jsx)(t.a,{href:"/blog/tms903-stability-debug-page",children:"9.0.3 in progress: chasing down a crash in TMS's own debug tooling"}),"."]}),"\n",(0,a.jsx)(t.h3,{id:"google-drive-backup-disconnecting-on-brave-and-vivaldi",children:"Google Drive backup disconnecting on Brave and Vivaldi"}),"\n",(0,a.jsxs)(t.p,{children:['9.0.2 stopped the Drive connect flow from hanging on these browsers, but the token it fell back to was still short-lived and unreliable to renew, so accounts kept flipping back to "disconnected" after a backup or two. 9.0.3 replaces it with an authorization-code + PKCE exchange that mints a genuine long-lived refresh token, renewed by a direct call that doesn\'t depend on the browser at all, with the OAuth client secret moved server-side into a small proxy (',(0,a.jsx)(t.code,{children:"tms-oauth-proxy"}),") so it no longer ships inside the extension package. ",(0,a.jsx)(t.strong,{children:"If you're on Brave or Vivaldi with Drive backup enabled, you'll need to reconnect once"})," (Options \u2192 Backup \u2192 Connect) after updating, then it stays connected reliably. Full story: ",(0,a.jsx)(t.a,{href:"/blog/tms903-drive-pkce-refresh-token",children:"9.0.3 in progress: a real fix for Drive backups disconnecting on Brave and Vivaldi"}),"."]}),"\n",(0,a.jsx)(t.h3,{id:"suspended-tab-favicons-stuck-on-the-extension-icon-after-a-restart",children:"Suspended-tab favicons stuck on the extension icon after a restart"}),"\n",(0,a.jsxs)(t.p,{children:["Mostly reported on Brave, Vivaldi, and Dia, where the automatic repair pass depended on a startup event those browsers don't fire reliably, so favicons reverted to TMS's own icon on every restart until manually fixed via Tab Health. A dedicated, restart-independent backstop now retries on its own on every service worker wake, and again the instant you open a suspended tab, so it recovers without you doing anything (",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/474",children:"#474"}),", ",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/397",children:"#397"}),", ",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/260",children:"#260"}),"). Thanks to everyone who tested pre-release builds and sent back debug reports to help pin this down."]}),"\n",(0,a.jsx)(t.h3,{id:"the-battery-specific-timeout-not-reacting-to-unplugging",children:"The battery-specific timeout not reacting to unplugging"}),"\n",(0,a.jsx)(t.p,{children:"It needed a manual trigger to take effect before; now it responds immediately when you unplug."}),"\n",(0,a.jsx)(t.h3,{id:"a-bright-white-flash-switching-between-suspended-tabs",children:"A bright white flash switching between suspended tabs"}),"\n",(0,a.jsxs)(t.p,{children:["Especially noticeable in dark mode. Reported as far back as v7.1.6.2 (",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/168",children:"#168"}),"), finally tracked down: a render-blocking stylesheet now paints the background immediately instead of showing the browser default until the real styles load."]}),"\n",(0,a.jsx)(t.h3,{id:"the-reload-link-on-suspended-tabs-too-bright-in-dark-mode",children:"The reload link on suspended tabs, too bright in dark mode"}),"\n",(0,a.jsx)(t.p,{children:"Toned down from accent-blue to a subdued gray that actually fits the rest of that page's quiet dark-mode look."}),"\n",(0,a.jsx)(t.h3,{id:"smaller-fixes",children:"Smaller fixes"}),"\n",(0,a.jsx)(t.p,{children:'Tab reload/unsuspend determinism across a multi-tab selection, the debug page\'s tab-status list getting permanently stuck on "unknown" for a tab whose script had genuinely died, and a spacing inconsistency in Options.'}),"\n",(0,a.jsx)(t.h2,{id:"whats-next",children:"What's next"}),"\n",(0,a.jsxs)(t.p,{children:["The ",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/133",children:"tab-groups feature set"})," that @mherkazandjian and, more recently, ",(0,a.jsx)(t.strong,{children:(0,a.jsx)(t.a,{href:"https://github.com/jadsh
1aker",children:"@jadshaker"})}),' have been building out continues past this release: a "suspend/unsuspend all tabs not in a group" counterpart and a global "never suspend tabs in a tab group" toggle have already landed on the development branch, with a per-group override still going through review, all targeting the next release. Ukrainian was added as a supported language, with translation now underway thanks to a community volunteer. Beyond that, 9.1.0 is shaping up around wider platform reach (Edge Add-ons Store, Group Policy for managed deployments) and finer control over suspend behaviour and UI.']}),"\n",(0,a.jsx)(t.p,{children:"I wish you all the best on your journey."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.em,{children:"Giovanni"})}),"\n",(0,a.jsx)(t.hr,{}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsxs)(t.em,{children:["Full changelog on GitHub: ",(0,a.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/blob/master/CHANGELOG.md",children:"CHANGELOG.md"})]})})]})}function h(e={}){let{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},8453(e,t,n){n.d(t,{R:()=>i,x:()=>r});var s=n(6540);let a={},o=s.createContext(a);function i(e){let t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}},643(e){e.exports=JSON.parse('{"permalink":"/blog/tms-release-9-0-3","source":"@site/blog/2026-09-17-tms-release-9-0-3/index.md","title":"The Marvellous Suspender 9.0.3 - battery-aware suspend, tab-group actions, favicon and Drive fixes","description":"9.0.3 ships a battery-power auto-suspend timeout, tab-group and app-window suspend controls, a real fix for suspended-tab favicons on Brave/Vivaldi/Dia, and a proper Drive backup fix for Brave and Vivaldi. Live now on the Chrome Web Store.","date":"2026-09-17T11:03:00.000Z","tags":[{"inline":false,"label":"Release","permalink":"/blog/tags/release","description":"Extension release notes and changelogs"},{"inline":false,"label":"The Marvellous Suspender","permalink":"/blog/tags/tms","description":"Updates concerning The Marvellous Suspender"}],"readingTime":5.27,"hasTruncateMarker":true,"authors":[{"name":"Giovanni Solone","title":"Co-founder of Marvellous Codeworks. Rescued The Great Suspender, built The Marvellous Suspender","url":"https://gioxx.org","page":{"permalink":"/blog/authors/gioxx"},"socials":{"x":"https://x.com/gioxx","linkedin":"https://www.linkedin.com/in/gioxx/","github":"https://github.com/gioxx"},"imageURL":"https://github.com/gioxx.png","key":"gioxx"}],"frontMatter":{"slug":"tms-release-9-0-3","title":"The Marvellous Suspender 9.0.3 - battery-aware suspend, tab-group actions, favicon and Drive fixes","description":"9.0.3 ships a battery-power auto-suspend timeout, tab-group and app-window suspend controls, a real fix for suspended-tab favicons on Brave/Vivaldi/Dia, and a proper Drive backup fix for Brave and Vivaldi. Live now on the Chrome Web Store.","date":"2026-09-17T11:03:00.000Z","authors":["gioxx"],"tags":["release","tms"]},"unlisted":false,"prevItem":{"title":"Introducing logdrop: a private way to share debug reports","permalink":"/blog/introducing-logdrop"},"nextItem":{"title":"9.0.3 in progress: chasing down a crash in TMS\'s own debug tooling","permalink":"/blog/tms903-stability-debug-page"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.