A browser extension that automatically manages tab groups based on external APIs like GitHub PRs.
- Modular Adapter Architecture - Easily add new integrations (GitHub, GitLab, Jira, etc.)
- GitHub Integration - Your open PRs grouped per repo, plus a single group for PRs awaiting your review; stale PRs (no activity in 2 months) are skipped
- Automatic Tab Grouping - Creates and manages tab groups seamlessly
- Configurable Polling - Set sync intervals (1, 5, 10, or 30 minutes)
- Two Fetch Modes:
- Run together - All adapters sync with a shared interval
- Run individually - Each adapter has its own polling interval
New here? See SETUP.md for a step-by-step Chrome guide, including how to create the right GitHub token.
- Build the extension:
npm run build - Open
chrome://extensions/ - Enable "Developer mode"
- Click "Load unpacked" and select
.output/chrome-mv3/
- Build the extension:
npm run build:firefox - Open
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on" and select
.output/firefox-mv2/manifest.json
Note: Firefox requires version 138+ for tab groups support.
# Install dependencies
npm install
# Development (Chrome)
npm run dev
# Development (Firefox)
npm run dev:firefox
# Build for Chrome
npm run build
# Build for Firefox
npm run build:firefoxTo add a new adapter (e.g., GitLab, Jira):
- Create
src/adapters/[adapter-name].ts:
import{AdapterWithInstall}from'./types';import{getAdapterConfig,setAdapterConfig}from'../core/Storage';exportconstmyAdapter: AdapterWithInstall<MyItem>={name: 'myadapter',groupTitle: '🔄 My Adapter',description: 'Description of what this adapter does',asyncinstall(){awaitsetAdapterConfig('myadapter',{enabled: true,pollingInterval: 5,config: {},});},asyncuninstall(){// Cleanup if needed},asyncfetchItems(){// Fetch data from external API},getItemUrl(item){returnitem.url;},getItemId(item){returnitem.id;},getItemTitle(item){returnitem.title;},};- Register in
src/adapters/index.ts:
import{myAdapter}from'./myadapter';exportconstadapterRegistry={github: githubAdapter,myadapter: myAdapter,};exportconstavailableAdapters={github: {name: 'github',groupTitle: '🔄 GitHub Reviews',description: '...'},myadapter: {name: 'myadapter',groupTitle: '🔄 My Adapter',description: '...'},};- WXT - Web Extension Framework
- React 19
- TypeScript
- Chrome/Firefox Manifest V3
tabs- Create and manage tabstabGroups- Create and manage tab groupsstorage- Store adapter configurationsalarms- Schedule periodic pollinghttps://api.github.com/- Access GitHub APIhttps://*/*(optional) - Requested only when you configure a custom GitHub Enterprise host
- Use a minimally-scoped, expiring token. The GitHub integration only needs
read access to pull requests where you're a requested reviewer. Prefer a
fine-grained personal access token
with read-only Pull requests access and a short expiry. Avoid classic
tokens with broad
reposcope. - Token storage. Your token is stored in the browser's extension-local
storage (
browser.storage.local) so it can be used for background polling. Like all extension storage this is unencrypted at rest, so only install on a machine you trust, and revoke the token in GitHub settings if you uninstall. - Custom hosts. If you point the extension at a custom/Enterprise host, your token is sent to that host as an authorization credential. The extension validates the URL and asks you to confirm before sending — only use hosts you trust.
- Dependency audit.
npm auditcurrently reports advisories, but they all originate from build/dev tooling (wxt→web-ext-run→tmp/fx-runner/node-notifier) that is not bundled into the shipped extension. The project already tracks the latestwxt; these will clear when the upstream toolchain updates its transitive dependencies.