1"use strict";(self.webpackChunktms=self.webpackChunktms||[]).push([["3242"],{4872(e,t,s){s.r(t),s.d(t,{metadata:()=>r,default:()=>h,frontMatter:()=>o,contentTitle:()=>a,toc:()=>d,assets:()=>l});var r=JSON.parse('{"id":"TMS/troubleshooting/extension-repair-recovery","title":"Chrome/Edge extension corruption and repair","description":"What to do if Chrome or Edge flags TMS as corrupted and offers to repair it, and how to recover session data if that reset your local storage.","source":"@site/docs/TMS/troubleshooting/extension-repair-recovery.md","sourceDirName":"TMS/troubleshooting","slug":"/TMS/troubleshooting/extension-repair-recovery","permalink":"/docs/TMS/troubleshooting/extension-repair-recovery","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"TMS","permalink":"/docs/tags/tms"},{"inline":true,"label":"The Marvellous Suspender","permalink":"/docs/tags/the-marvellous-suspender"},{"inline":true,"label":"recovery","permalink":"/docs/tags/recovery"},{"inline":true,"label":"backup","permalink":"/docs/tags/backup"},{"inline":true,"label":"Chrome","permalink":"/docs/tags/chrome"},{"inline":true,"label":"Edge","permalink":"/docs/tags/edge"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Chrome/Edge extension corruption and repair","sidebar_label":"Extension corruption & repair","description":"What to do if Chrome or Edge flags TMS as corrupted and offers to repair it, and how to recover session data if that reset your local storage.","tags":["TMS","The Marvellous Suspender","recovery","backup","Chrome","Edge"]},"sidebar":"mainSidebar","previous":{"title":"Permissions","permalink":"/docs/TMS/permissions"},"next":{"title":"File descriptor limit (Linux)","permalink":"/docs/TMS/troubleshooting/too-many-file-descriptors"}}'),n=s(4848),i=s(8453);let o={sidebar_position:1,title:"Chrome/Edge extension corruption and repair",sidebar_label:"Extension corruption & repair",description:"What to do if Chrome or Edge flags TMS as corrupted and offers to repair it, and how to recover session data if that reset your local storage.",tags:["TMS","The Marvellous Suspender","recovery","backup","Chrome","Edge"]},a="Chrome/Edge extension corruption and repair",l={},d=[{value:"What actually happens",id:"what-actually-happens",level:2},{value:"Where TMS actually stores things",id:"where-tms-actually-stores-things",level:2},{value:"Recovery steps",id:"recovery-steps",level:2},{value:"1. Check if anything is still there",id:"1-check-if-anything-is-still-there",level:3},{value:"2. Compare extension IDs",id:"2-compare-extension-ids",level:3},{value:"3. Extract tab URLs from raw IndexedDB files (safest option)",id:"3-extract-tab-urls-from-raw-indexeddb-files-safest-option",level:3},{value:"4. Restore the raw leveldb folder directly (riskier, last resort)",id:"4-restore-the-raw-leveldb-folder-directly-riskier-last-resort",level:3},{value:"5. If nothing above turns anything up",id:"5-if-nothing-above-turns-anything-up",level:3},{value:"Avoiding this in the future",id:"avoiding-this-in-the-future",level:2},{value:"Related",id:"related",level:2}];function c(e){let t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"chromeedge-extension-corruption-and-repair",children:"Chrome/Edge extension corruption and repair"})}),"\n",(0,n.jsxs)(t.p,{children:['Chromium-based browsers (Chrome, Edge) occasionally flag an installed extension as "corrupted" and prompt you to remove or repair it. This is a browser-side integrity check, unrelated to any specific TMS update, and it has been observed on both Chrome and Edge. See ',(0,n.jsx)(t.a,{href:"https://github.com/gioxx/MarvellousSuspender/issues/410",children:"issue #410"})," for the original report and the full recovery thread this page is based on."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Chrome's extensions list showing a corrupted-extension repair warning",src:s(5891).A+"",width:"1867",height:"328"})}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.h2,{id:"what-actually-happens",children:"What actually happens"}),"\n",(0,n.jsxs)(t.p,{children:["TMS pins a fixed extension ID via the ",(0,n.jsx)(t.code,{children:"key"}),' field in its manifest, so a "repair" reinstall does ',(0,n.jsx)(t.strong,{children:"not"})," change the extension ID. In principle that should leave ",(0,n.jsx)(t.code,{children:"chrome.storage"})," and IndexedDB untouched. In practice, on some machines the repair flow resets the extension's local storage anyway, as a side effect of reinstalling its files, even though the ID stays identical before and after."]}),"\n",(0,n.jsxs)(t.p,{children:["This is Chromium's own corruption/repair mechanism at work, not something a TMS update triggers. The most likely culprit is ",(0,n.jsx)(t.code,{children:"computed_hashes.json"}),", a file-integrity manifest Chromium generates under the extension's install directory to detect tampering with the extension's own files. Its presence/absence lining up with what \"repair\" touches fits a check that's about the extension's ",(0,n.jsx)(t.em,{children:"files"}),", not its ",(0,n.jsx)(t.em,{children:"data"}),": storage gets reset as a side effect of the reinstall, not because anything was wrong with it."]}),"\n",(0,n.jsx)(t.p,{children:"Confirmed so far:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Same behavior on ",(0,n.jsx)(t.strong,{children:"Chrome and Edge"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Extension ID stays identical before and after repair."}),"\n",(0,n.jsx)(t.li,{children:"Settings/whitelist and sessions are lost together, since both live under the same install, in different storage areas (see below)."}),"\n"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.h2,{id:"where-tms-actually-stores-things",children:"Where TMS actually stores things"}),"\n",(0,n.jsx)(t.p,{children:"Two separate storage areas are involved, both
1LevelDB-backed but different APIs, and a repair can reset either or both:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Data"}),(0,n.jsx)(t.th,{children:"Storage API"}),(0,n.jsx)(t.th,{children:"Path (Chrome, adjust for Edge)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["Sessions (recent + saved), same ",(0,n.jsx)(t.code,{children:"tgs"})," database used by ",(0,n.jsx)(t.a,{href:"../pages/session-management",children:"Session management"})]}),(0,n.jsx)(t.td,{children:"IndexedDB"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"<profile>\\IndexedDB\\chrome-extension_<id>_0.indexeddb.leveldb\\"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Settings, never-suspend whitelist"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"chrome.storage.local"})}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"<profile>\\Local Extension Settings\\<id>\\"})})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:['"Recent sessions" and "saved sessions" are ',(0,n.jsx)(t.strong,{children:"not"})," in different locations, they're two object stores inside the same IndexedDB database, so one folder covers both."]}),"\n",(0,n.jsxs)(t.p,{children:["If you'd already set up ",(0,n.jsx)(t.a,{href:"../pages/backup-sync",children:"automatic backup"})," (local or Google Drive) before the corruption hit, recovery is simple: just restore from your latest backup file via ",(0,n.jsx)(t.strong,{children:"Backup & Sync \u2192 Restore from backup"}),". The rest of this page is for when no such backup exists and you need to recover from raw browser profile data."]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.h2,{id:"recovery-steps",children:"Recovery steps"}),"\n",(0,n.jsx)(t.h3,{id:"1-check-if-anything-is-still-there",children:"1. Check if anything is still there"}),"\n",(0,n.jsxs)(t.p,{children:["Open ",(0,n.jsx)(t.strong,{children:"Session management"})," (from the popup, or right-click the icon \u2192 Options \u2192 Session management) and check ",(0,n.jsx)(t.strong,{children:"Recent sessions"}),". Also check if a ",(0,n.jsx)(t.a,{href:"../pages/system-pages#recovery-screen",children:"Recovery screen"})," appeared after the update, it looks for your last session automatically. If both are empty, local storage really was reset."]}),"\n",(0,n.jsx)(t.h3,{id:"2-compare-extension-ids",children:"2. Compare extension IDs"}),"\n",(0,n.jsxs)(t.p,{children:["Go to ",(0,n.jsx)(t.code,{children:"chrome://extensions"})," (or ",(0,n.jsx)(t.code,{children:"edge://extensions"}
1),"), enable Developer mode, and note the current ID. Compare it to the folder name in any backup you have of the profile, ",(0,n.jsx)(t.code,{children:"chrome-extension_<ID>_0.indexeddb.leveldb"}),". Matching IDs confirm any old data you find is still valid for the currently-running install, just not attached to it anymore."]}),"\n",(0,n.jsx)(t.h3,{id:"3-extract-tab-urls-from-raw-indexeddb-files-safest-option",children:"3. Extract tab URLs from raw IndexedDB files (safest option)"}),"\n",(0,n.jsxs)(t.p,{children:["IndexedDB stores tab URLs as plain UTF-8 text inside its ",(0,n.jsx)(t.code,{children:".ldb"})," and ",(0,n.jsx)(t.code,{children:".log"})," files, even though the file format itself isn't JSON. You can pull them out without touching Chrome's live profile at all, this works against any backup copy of the ",(0,n.jsx)(t.code,{children:"indexeddb.leveldb"}),' folder (system backup, "previous versions" snapshot, manual copy):']}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",children:'Select-String -Path ".\\chrome-extension_<ID>_0.indexeddb.leveldb\\*.ldb",".\\chrome-extension_<ID>_0.indexeddb.leveldb\\*.log" -Pattern "https?://[^\\x00-\\x1f\\"\\\\]+" -AllMatches |\n ForEach-Object { $_.Matches.Value } | Sort-Object -Unique | Out-File recovered-urls.txt\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Clean up ",(0,n.jsx)(t.code,{children:"recovered-urls.txt"})," a little (remove obvious garbage/duplicates, optionally separate windows with a blank line), then in ",(0,n.jsx)(t.strong,{children:"Session management"}),", use ",(0,n.jsx)(t.strong,{children:"Import"})," and select that ",(0,n.jsx)(t.code,{children:".txt"})," file to rebuild a session from the plain URL list. You lose favicons and titles, but get your tabs back."]}),"\n",(0,n.jsxs)(t.p,{children:["If a snapshot only partially recovers data (e.g. recent sessions come back but saved sessions don't), run the same extraction pass against ",(0,n.jsx)(t.strong,{children:"every"})," file in the folder, not just whatever a structured reader already parsed. LevelDB spreads records across multiple ",(0,n.jsx)(t.code,{children:".ldb"}),"/",(0,n.jsx)(t.code,{children:".log"})," files depending on when they were written and whether they've been compacted, so a snapshot can catch some data mid-compaction while less-recently-touched records are still sitting only in an uncompacted ",(0,n.jsx)(t.code,{children:".log"})," file. A plain-text scan can still find URLs there even when a structured reader can't make sense of the file."]}),"\n",(0,n.jsx)(t.h3,{id:"4-restore-the-raw-leveldb-folder-directly-riskier-last-resort",children:"4. Restore the raw leveldb folder directly (riskier, last resort)"}),"\n",(0,n.jsxs)(t.p,{children:["If the extension ID matches and you're comfortable with the risk: fully quit the browser, back up your current profile, then copy your saved ",(0,n.jsx)(t.code,{children:"chrome-extension_<ID>_0.indexeddb.leveldb"})," folder back over the reset one at the same path, and relaunch. This has been ",(0,n.jsx)(t.strong,{children:"confirmed working end-to-end on Edge"}),'. It isn\'t guaranteed on every version, since the storage-bucket architecture has changed internals over time, so treat it as a "nothing to lose" attempt on a backup copy of your profile, not your main one.']}),"\n",(0,n.jsxs)(t.p,{children:["To bring back settings/whitelist as well, restore the matching ",(0,n.jsx)(t.code,{children:"Local Extension Settings\\<id>"})," folder the same way, alongside the IndexedDB one."]}),"\n",(0,n.jsx)(t.h3,{id:"5-if-nothing-above-turns-anything-up",children:"5. If nothing above turns anything up"}),"\n",(0,n.jsx)(t.p,{children:"There is no way for TMS to read from an arbitrary folder path you point it at, extensions can only open their own IndexedDB database for the profile they're running in. Steps 3 and 4 above are the only recovery paths that exist for this scenario, this is a platform limitation, not a UI gap."}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.h2,{id:"avoiding-this-in-the-future",children:"Avoiding this in the future"}),"\n",(0,n.jsxs)(t.p,{children:["Turn on ",(0,n.jsx)(t.a,{href:"../pages/backup-sync",children:"automatic backup"})," (local or Google Drive). It exists specifically to reduce how often anyone needs the manual recovery process above. TMS also nudges you to enable it if it's been off for a while, see ",(0,n.jsx)(t.a,{href:"../pages/backup-sync#backup-activation-nudge",children:"Backup activation nudge"}),"."]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.h2,{id:"related",children:"Related"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"../pages/backup-sync",children:"Backup & Sync"}),": set this up so raw-file recovery is never needed again"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"../pages/session-management",children:"Session management"}),": where recovered sessions are imported and reopened"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"./tgs-recover-lost-tabs",children:"Recovering lost tabs (TGS archive)"}),": the older recovery guide, for tabs lost when the extension itself is removed or disabled rather than corrupted/repaired"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"../pages/system-pages#recovery-screen",children:"System & recovery pages"}),": the in-extension recovery screen shown after a browser restart or crash"]}),"\n"]})]})}function h(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},5891(e,t,s){s.d(t,{A:()=>r});let r=s.p+"assets/images/01-repair-warning-51af6654629b1dc5e27eaade9cc9dec6.webp"},8453(e,t,s){s.d(t,{R:()=>o,x:()=>a});var r=s(6540);let n={},i=r.createContext(n);function o(e){let t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]);
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.