Installation
The extension is not published to the Chrome Web Store, so it has to be built once and loaded unpacked.
Requirements
Section titled “Requirements”- A Chromium-based browser with Manifest V3 support: Chrome, Edge, Brave, Vivaldi or Opera.
- Node.js 20 or newer and npm, to run the webpack build.
Build and load
Section titled “Build and load”-
Clone and install dependencies
Terminal window git clone https://github.com/rennerdo30/mail-thread-export.gitcd mail-thread-exportnpm install -
Build the extension
Terminal window npm run buildThis runs webpack in
productionmode. It bundlessrc/content/scanner.js(and everything it imports, includingjspdfandhtml2canvas) into a singledist/content.js, and copies the manifest, the injected stylesheet, the icons, the popup and the background script intodist/. -
Open the extensions page
Navigate to
chrome://extensions(edge://extensionson Edge,brave://extensionson Brave). -
Enable Developer mode
The toggle sits in the top-right corner of the extensions page.
-
Load the
dist/directoryClick Load unpacked and select the
dist/folder — not the repository root. The manifest lives indist/manifest.jsonafter the build. -
Reload any open Gmail tab
Content scripts are only injected on page load, so a Gmail tab that was already open before installing will not have the Export button until you reload it.
Verify it works
Section titled “Verify it works”- Open
https://mail.google.com/and open any conversation. - An Export button should appear immediately to the right of the subject heading.
- The browser console should contain
Mail Thread Export: content script loaded.
If the button is missing, see Development.
Rebuilding while you work
Section titled “Rebuilding while you work”npm run watchWebpack stays running and rebuilds dist/ on every save. You still have to press the reload icon on
the extension card in chrome://extensions and reload the Gmail tab, because content scripts are not
hot-reloaded.
Uninstalling
Section titled “Uninstalling”Remove the extension from chrome://extensions. Nothing is stored outside the extension directory —
there are no preferences, no cached data and no server-side state to clean up.