A Chrome and Firefox extension for managing tabs: automatic categorization and bulk tab closing.
- Node.js (v18+)
- npm
npm installBuild for Firefox (default):
npm run buildBuild for Chrome:
npm run build:chromeOutput is written to .output/firefox-mv3/ and .output/chrome-mv3/ respectively.
To build and produce a zip for store submission:
npm run zip # Firefox
npm run zip:chrome # Chromenpm run dev # Firefox
npm run dev:chrome # ChromeThen load the extension from .output/chrome-mv3/ or .output/firefox-mv3/ as described below. WXT will rebuild on file changes and reload the extension automatically.
- Run
npm run build:chrome(ornpm run dev:chromefor live reload). - Go to
chrome://extensions. - Enable Developer mode (toggle in the top right).
- Click Load unpacked.
- Select the
.output/chrome-mv3/folder.
- Run
npm run build(ornpm run devfor live reload). - Go to
about:debugging. - Click This Firefox.
- Click Load Temporary Add-On.
- Open any file inside the
.output/firefox-mv3/folder (e.g.manifest.json).
| Command | Description |
|---|---|
npm test |
Run the test suite |
npm run compile |
TypeScript typecheck |
npm run test:coverage |
Run tests with coverage report |
- CI is defined in
.github/workflows/ci.ymland runs:npm run compilenpm testnpm run build(Firefox)npm run build:chrome(Chrome)
- Release packaging is defined in
.github/workflows/release.yml.- On tag pushes (
v*), it creates and publishes browser-specific zip artifacts. - It can also be run manually via
workflow_dispatch.
- On tag pushes (
- Runtime libraries are managed via npm dependencies in
package.json. - Version pinning is enforced by
package-lock.json.
Most runtime debug logs are routed through js/shared/logger.ts and are off by default.
Enable debug logs in extension contexts from the browser console:
globalThis.__TABCLOSER_DEBUG__ = truePersist debug logs across reloads in page contexts:
localStorage.setItem('tabcloser:debug', '1')Disable again:
globalThis.__TABCLOSER_DEBUG__ = false
localStorage.setItem('tabcloser:debug', '0')